Repository: PreTeXtBook/pretext Branch: master Commit: 4276a7de3dc8 Files: 1077 Total size: 65.9 MB Directory structure: gitextract_8b_dyh9h/ ├── .git-blame-ignore-revs ├── .gitignore ├── CONTRIBUTING.md ├── COPYING ├── README.md ├── contrib/ │ ├── hitchman/ │ │ ├── README.md │ │ ├── tjh-law-html.xsl │ │ └── tjh-law-print.xsl │ └── ups-writers/ │ ├── README.md │ ├── ups-writers-html.xsl │ └── ups-writers-latex.xsl ├── css/ │ ├── README.md │ ├── colors/ │ │ ├── _color-helpers.scss │ │ ├── _color-vars.scss │ │ ├── _palette-dark.scss │ │ ├── _palette-dual.scss │ │ ├── _palette-quad-chunks.scss │ │ ├── _palette-single-bold.scss │ │ ├── _palette-single-muted.scss │ │ └── _palette-single.scss │ ├── components/ │ │ ├── README.md │ │ ├── _google-search.scss │ │ ├── _mystery.scss │ │ ├── _pretext-search.scss │ │ ├── _pretext-web.scss │ │ ├── _pretext.scss │ │ ├── _printing.scss │ │ ├── _spacing.scss │ │ ├── _worksheet.scss │ │ ├── chunks/ │ │ │ ├── README.md │ │ │ ├── _asides-basic.scss │ │ │ ├── _asides-floating.scss │ │ │ ├── _codelike.scss │ │ │ ├── _discussion-inline.scss │ │ │ ├── _exercises.scss │ │ │ ├── _knowls.scss │ │ │ ├── _sidebyside.scss │ │ │ ├── _solutions.scss │ │ │ └── helpers/ │ │ │ ├── README.md │ │ │ ├── _C-box-mixin.scss │ │ │ ├── _L-mixin.scss │ │ │ ├── _box-mixin.scss │ │ │ ├── _heading-box-mixin.scss │ │ │ ├── _horizontal-bars-mixin.scss │ │ │ ├── _inline-heading-mixin.scss │ │ │ └── _sidebar-mixin.scss │ │ ├── elements/ │ │ │ ├── README.md │ │ │ ├── _description-lists.scss │ │ │ ├── _figures.scss │ │ │ ├── _fillin.scss │ │ │ ├── _footnotes.scss │ │ │ ├── _front-matter.scss │ │ │ ├── _headings.scss │ │ │ ├── _index.scss │ │ │ ├── _links.scss │ │ │ ├── _list-styles.scss │ │ │ ├── _lists.scss │ │ │ ├── _math.scss │ │ │ ├── _media.scss │ │ │ ├── _misc-content.scss │ │ │ ├── _permalinks.scss │ │ │ ├── _poem.scss │ │ │ ├── _prism.scss │ │ │ ├── _summary-links.scss │ │ │ ├── _tables.scss │ │ │ └── extras/ │ │ │ └── _heading-underlines.scss │ │ ├── helpers/ │ │ │ ├── README.md │ │ │ ├── _buttons-default.scss │ │ │ ├── _cols.scss │ │ │ └── _expandable.scss │ │ ├── interactives/ │ │ │ ├── README.md │ │ │ ├── _calculators.scss │ │ │ ├── _other.scss │ │ │ ├── _runestone.scss │ │ │ ├── _sagecell.scss │ │ │ └── _webwork.scss │ │ └── page-parts/ │ │ ├── README.md │ │ ├── _banner.scss │ │ ├── _body.scss │ │ ├── _footer.scss │ │ ├── _navbar.scss │ │ ├── _toc-basics.scss │ │ ├── _toc-default.scss │ │ ├── _toc-overlay.scss │ │ └── extras/ │ │ ├── README.md │ │ ├── _navbar-btn-borders.scss │ │ ├── _toc-borders.scss │ │ ├── _toc-expand-chevrons.scss │ │ ├── _toc-hidden-scrollbar.scss │ │ └── _toc-last-level-plain.scss │ ├── dist/ │ │ ├── epub.css │ │ ├── kindle.css │ │ ├── pretext-reveal.css │ │ ├── print-worksheet.css │ │ ├── theme-boulder.css │ │ ├── theme-crc-legacy.css │ │ ├── theme-default-legacy.css │ │ ├── theme-default-modern.css │ │ ├── theme-denver.css │ │ ├── theme-greeley.css │ │ ├── theme-min-legacy.css │ │ ├── theme-oscarlevin-legacy.css │ │ ├── theme-salem.css │ │ ├── theme-soundwriting-legacy.css │ │ ├── theme-tacoma.css │ │ └── theme-wide-legacy.css │ ├── fonts/ │ │ └── _fonts-google.scss │ ├── legacy/ │ │ ├── colors/ │ │ │ ├── all_colors.scss │ │ │ ├── colors_blue_green.css │ │ │ ├── colors_blue_grey.css │ │ │ ├── colors_blue_red.css │ │ │ ├── colors_blue_red_dark.css │ │ │ ├── colors_bluegreen_grey.css │ │ │ ├── colors_brown_gold.css │ │ │ ├── colors_darkmartiansands.css │ │ │ ├── colors_default.css │ │ │ ├── colors_focused_gray_aqua.css │ │ │ ├── colors_focused_light.css │ │ │ ├── colors_green_blue.css │ │ │ ├── colors_green_plum.css │ │ │ ├── colors_maroon_grey.css │ │ │ ├── colors_martiansands.css │ │ │ ├── colors_orange_navy.css │ │ │ ├── colors_pastel_blue_orange.css │ │ │ ├── colors_red_blue.css │ │ │ ├── colors_ruby_amethyst.css │ │ │ ├── colors_ruby_emerald.css │ │ │ ├── colors_ruby_turquoise.css │ │ │ └── setcolors.css │ │ ├── pretext.css │ │ ├── pretext_add_on.css │ │ └── pretext_search.css │ ├── other/ │ │ └── catalog.css │ └── targets/ │ ├── ebook/ │ │ ├── ebook-common.scss │ │ ├── epub/ │ │ │ └── epub.scss │ │ └── kindle/ │ │ └── kindle.scss │ ├── html/ │ │ ├── README.md │ │ ├── boulder/ │ │ │ ├── _customization.scss │ │ │ └── theme-boulder.scss │ │ ├── default-modern/ │ │ │ ├── _chunks-default.scss │ │ │ ├── _customization.scss │ │ │ ├── _parts-default.scss │ │ │ └── theme-default-modern.scss │ │ ├── denver/ │ │ │ ├── _chunks-denver.scss │ │ │ ├── _customizations.scss │ │ │ ├── _parts-paper.scss │ │ │ └── theme-denver.scss │ │ ├── greeley/ │ │ │ ├── _chunks-greeley.scss │ │ │ ├── _customization.scss │ │ │ └── theme-greeley.scss │ │ ├── legacy/ │ │ │ ├── crc/ │ │ │ │ ├── banner_crc.css │ │ │ │ ├── navbar_crc.css │ │ │ │ ├── shell_crc.css │ │ │ │ ├── theme-crc.scss │ │ │ │ └── toc_crc.css │ │ │ ├── default/ │ │ │ │ ├── banner_default.css │ │ │ │ ├── knowls_default.css │ │ │ │ ├── navbar_default.css │ │ │ │ ├── shell_default.css │ │ │ │ ├── style_default.css │ │ │ │ ├── theme-default.scss │ │ │ │ └── toc_default.css │ │ │ ├── min/ │ │ │ │ ├── shell_min.css │ │ │ │ ├── theme-min.scss │ │ │ │ └── toc_min.css │ │ │ ├── oscarlevin/ │ │ │ │ ├── style_oscarlevin.css │ │ │ │ └── theme-oscarlevin.scss │ │ │ ├── soundwriting/ │ │ │ │ ├── style_soundwriting.css │ │ │ │ └── theme-soundwriting.scss │ │ │ └── wide/ │ │ │ ├── banner_wide.scss │ │ │ ├── navbar_wide.scss │ │ │ ├── shell_wide.scss │ │ │ ├── style_wide.scss │ │ │ ├── theme-wide.scss │ │ │ └── toc_wide.scss │ │ ├── salem/ │ │ │ ├── _chunks-salem.scss │ │ │ ├── _heading-tweaks.scss │ │ │ ├── _other-widen.scss │ │ │ ├── _parts-salem.scss │ │ │ ├── _rs-widen.scss │ │ │ ├── _sizing-globals.scss │ │ │ └── theme-salem.scss │ │ └── tacoma/ │ │ ├── _chunks-minimal.scss │ │ ├── _customization.scss │ │ ├── _parts-tacoma.scss │ │ └── theme-tacoma.scss │ ├── print-worksheet/ │ │ ├── _chunks-worksheet.scss │ │ └── print-worksheet.scss │ └── revealjs/ │ └── reveal.scss ├── doc/ │ ├── guide/ │ │ ├── COPYING │ │ ├── README.md │ │ ├── appendices/ │ │ │ ├── cli-transition.xml │ │ │ ├── cli-v1vsv2.xml │ │ │ ├── editors.xml │ │ │ ├── gfdl-pretext.xml │ │ │ ├── git.xml │ │ │ ├── glossary.xml │ │ │ ├── journals-table.xml │ │ │ ├── journals.xml │ │ │ ├── latex-conversion.xml │ │ │ ├── liblouis.xml │ │ │ ├── mac-os.xml │ │ │ ├── node-npm.xml │ │ │ ├── offline-mathjax.xml │ │ │ ├── python.xml │ │ │ ├── references.xml │ │ │ ├── schema-install.xml │ │ │ ├── welcome.xml │ │ │ ├── windows-cli.xml │ │ │ ├── windows-wsl.xml │ │ │ └── windows.xml │ │ ├── author/ │ │ │ ├── advice.xml │ │ │ ├── author-faq.xml │ │ │ ├── overview.xml │ │ │ ├── processing.xml │ │ │ ├── schema.xml │ │ │ ├── topics.xml │ │ │ └── webwork.xml │ │ ├── backmatter.xml │ │ ├── basics/ │ │ │ ├── README.md │ │ │ ├── aside.ptx │ │ │ ├── axiom.ptx │ │ │ ├── basics-part.xml │ │ │ ├── blockquote.ptx │ │ │ ├── definition.ptx │ │ │ ├── example-simple.ptx │ │ │ ├── example-structured.ptx │ │ │ ├── exercise-task.ptx │ │ │ ├── exercise.ptx │ │ │ ├── exercisegroup.ptx │ │ │ ├── figure.ptx │ │ │ ├── image.ptx │ │ │ ├── md-bare.ptx │ │ │ ├── md.ptx │ │ │ ├── ol.ptx │ │ │ ├── p.ptx │ │ │ ├── porism.ptx │ │ │ ├── project.ptx │ │ │ ├── reading-questions.ptx │ │ │ ├── remark.ptx │ │ │ ├── sage.ptx │ │ │ ├── sageplot.ptx │ │ │ ├── sbsgroup.ptx │ │ │ ├── section-sub.ptx │ │ │ ├── section.ptx │ │ │ ├── sidebyside.ptx │ │ │ ├── sidebyside2.ptx │ │ │ ├── table.ptx │ │ │ ├── theorem.ptx │ │ │ ├── tikz.ptx │ │ │ ├── ul.ptx │ │ │ └── worksheet.ptx │ │ ├── developer/ │ │ │ ├── code-style.xml │ │ │ ├── coding.xml │ │ │ ├── debugging.xml │ │ │ ├── git.xml │ │ │ ├── localization.xml │ │ │ ├── pretext-script.xml │ │ │ └── xsltproc.xml │ │ ├── frontmatter.xml │ │ ├── generated/ │ │ │ ├── asymptote/ │ │ │ │ ├── gaussian-histogram.html │ │ │ │ └── vimodes.html │ │ │ └── qrcode/ │ │ │ ├── joren-falls-video-url.xml │ │ │ ├── mozart-piano-sonata-url.xml │ │ │ ├── topic-youtube-video-8-2-url.xml │ │ │ ├── tutorial-videos-video-url.xml │ │ │ ├── video-hotel-california-url.xml │ │ │ └── windows-cli-3-3-url.xml │ │ ├── guide.xml │ │ ├── guideinfo.xml │ │ ├── introduction/ │ │ │ ├── start-here.xml │ │ │ └── tutorial.xml │ │ ├── preface.xml │ │ ├── project.ptx │ │ ├── publication-styled.xml │ │ ├── publication.xml │ │ └── publisher/ │ │ ├── ancillaries.xml │ │ ├── braille.xml │ │ ├── conversions.xml │ │ ├── cover-design.xml │ │ ├── custom-versions.xml │ │ ├── epub.xml │ │ ├── further-customizations.xml │ │ ├── instructor-version.xml │ │ ├── jupyter-notebook.xml │ │ ├── latex-fonts.xml │ │ ├── latex-styling.xml │ │ ├── online-html.xml │ │ ├── open-licenses.xml │ │ ├── pdf-print.xml │ │ ├── print-on-demand.xml │ │ ├── production.xml │ │ ├── publication-file.xml │ │ ├── publisher-faq.xml │ │ ├── runestone.xml │ │ ├── slides.xml │ │ ├── web-hosting.xml │ │ └── webwork.xml │ └── quickref/ │ ├── README.md │ ├── quickref-cli.tex │ └── quickref-pretext.tex ├── examples/ │ ├── README.md │ ├── braille/ │ │ ├── braille-test-book.xml │ │ ├── braille-test.xml │ │ └── publication.xml │ ├── custom-theming/ │ │ ├── README.md │ │ ├── assets/ │ │ │ └── css/ │ │ │ ├── more-styles.css │ │ │ ├── my-styles.css │ │ │ └── salem-color-vars.css │ │ ├── mytheme/ │ │ │ ├── _chunks-customized.scss │ │ │ └── mytheme.scss │ │ ├── project.ptx │ │ ├── publication/ │ │ │ ├── publication-custom-colors.ptx │ │ │ ├── publication-custom-theme.ptx │ │ │ ├── publication-salem.ptx │ │ │ └── publication.ptx │ │ └── source/ │ │ ├── ch-chapter-title.ptx │ │ ├── docinfo.ptx │ │ ├── frontmatter.ptx │ │ ├── main.ptx │ │ └── sec-section-name.ptx │ ├── epub/ │ │ ├── README.md │ │ ├── epub-sampler.xml │ │ ├── gen/ │ │ │ └── prefigure/ │ │ │ └── prefigure-tangent-annotations.xml │ │ └── publication.xml │ ├── errors/ │ │ └── sample-errors-and-warnings.xml │ ├── fonts/ │ │ ├── README.md │ │ └── fonts-and-characters.xml │ ├── hello-world/ │ │ ├── README.md │ │ ├── hello-world.xml │ │ └── publication.xml │ ├── humanities/ │ │ ├── README.md │ │ ├── codechat_config.yaml │ │ ├── generated-assets/ │ │ │ └── .gitkeep │ │ ├── project.ptx │ │ ├── publication/ │ │ │ └── publication.ptx │ │ ├── requirements.txt │ │ └── source/ │ │ ├── hia.xml │ │ ├── music.xml │ │ └── poetry.xml │ ├── letter/ │ │ ├── README.md │ │ └── sample-letter.xml │ ├── memo/ │ │ ├── README.md │ │ └── sample-memo.xml │ ├── minimal/ │ │ ├── README.md │ │ ├── assets/ │ │ │ └── .keep │ │ ├── codechat_config.yaml │ │ ├── generated-assets/ │ │ │ └── .keep │ │ ├── project.ptx │ │ ├── publication/ │ │ │ └── publication.ptx │ │ ├── requirements.txt │ │ └── source/ │ │ └── main.ptx │ ├── pug/ │ │ ├── .gitignore │ │ ├── authors-guide/ │ │ │ └── windows.pug │ │ ├── build.sh │ │ ├── package.json │ │ ├── pug-include.pug │ │ └── pug.pug │ ├── sample-article/ │ │ ├── bibliography.xml │ │ ├── customizations-one.xml │ │ ├── customizations-two.xml │ │ ├── gen/ │ │ │ ├── asymptote/ │ │ │ │ ├── asymptote-contour-sbs.html │ │ │ │ ├── asymptote-contour.html │ │ │ │ ├── asymptote-lever-integral.html │ │ │ │ ├── asymptote-lever-sbs.html │ │ │ │ ├── asymptote-lever-solo.html │ │ │ │ ├── asymptote-lever.html │ │ │ │ ├── asymptote-surface.html │ │ │ │ └── asymptote-workcone.html │ │ │ ├── dynamic_subs/ │ │ │ │ └── dynamic_substitutions.xml │ │ │ ├── prefigure/ │ │ │ │ ├── prefigure-fibonacci-a-annotations.xml │ │ │ │ ├── prefigure-fibonacci-b-annotations.xml │ │ │ │ ├── prefigure-tangent-annotations.xml │ │ │ │ └── prefigure-worksheet-vectors-annotations.xml │ │ │ ├── problems/ │ │ │ │ ├── mom-2168.xml │ │ │ │ ├── mom-2572.xml │ │ │ │ ├── mom-7492.xml │ │ │ │ └── mom-930582.xml │ │ │ ├── qrcode/ │ │ │ │ ├── airborne-midnight-1-url.xml │ │ │ │ ├── audio-bach-url.xml │ │ │ │ ├── audio-organ-finale-url.xml │ │ │ │ ├── audio-piano-trill-two-url.xml │ │ │ │ ├── audio-piano-trill-url.xml │ │ │ │ ├── bareilles-love-song-url.xml │ │ │ │ ├── big-buck-bunny-best-format-url.xml │ │ │ │ ├── big-buck-bunny-frame-one-url.xml │ │ │ │ ├── big-buck-bunny-margins-url.xml │ │ │ │ ├── big-buck-bunny-mp4-url.xml │ │ │ │ ├── big-buck-bunny-ogg-url.xml │ │ │ │ ├── big-buck-bunny-subtitles-url.xml │ │ │ │ ├── big-buck-bunny-two-subtitles-url.xml │ │ │ │ ├── big-buck-bunny-webm-url.xml │ │ │ │ ├── calcplot3d-full-application-url.xml │ │ │ │ ├── calcplot3d-intersection-planes-url.xml │ │ │ │ ├── calcplot3d-probability-wavefunction-url.xml │ │ │ │ ├── desmos-natural-log-url.xml │ │ │ │ ├── drone-flight-clip-url.xml │ │ │ │ ├── drone-flight-full-url.xml │ │ │ │ ├── drone-flight-sbs-url.xml │ │ │ │ ├── geogebra-SAS-url.xml │ │ │ │ ├── geogebra-astroid-original-url.xml │ │ │ │ ├── geogebra-astroid-url.xml │ │ │ │ ├── geogebra-cycloid-url.xml │ │ │ │ ├── geogebra-right-triangle-url.xml │ │ │ │ ├── geogebra-seed-head-url.xml │ │ │ │ ├── geogebra-train-distance-url.xml │ │ │ │ ├── ggb_3d-direction-vector_interactive-url.xml │ │ │ │ ├── interactive-animation-url.xml │ │ │ │ ├── interactive-archimedian-spiral-url.xml │ │ │ │ ├── interactive-bspline-url.xml │ │ │ │ ├── interactive-circuitjs-attribute-url.xml │ │ │ │ ├── interactive-circuitjs-url.xml │ │ │ │ ├── interactive-d3-collision-url.xml │ │ │ │ ├── interactive-d3-graph-layout-url.xml │ │ │ │ ├── interactive-d3-welsh-url.xml │ │ │ │ ├── interactive-doenetml-example-url.xml │ │ │ │ ├── interactive-eigenvectors-url.xml │ │ │ │ ├── interactive-fermats-spiral-url.xml │ │ │ │ ├── interactive-infinity-url.xml │ │ │ │ ├── interactive-layout-circuitjs-big-url.xml │ │ │ │ ├── interactive-layout-circuitjs-small-url.xml │ │ │ │ ├── interactive-layout-desmos-url.xml │ │ │ │ ├── interactive-layout-grow-one-url.xml │ │ │ │ ├── interactive-layout-grow-three-url.xml │ │ │ │ ├── interactive-layout-grow-two-url.xml │ │ │ │ ├── interactive-layout-map-medium-url.xml │ │ │ │ ├── interactive-layout-map-tall-url.xml │ │ │ │ ├── interactive-layout-map-wide-url.xml │ │ │ │ ├── interactive-map-california-url.xml │ │ │ │ ├── interactive-numerical-integral-url.xml │ │ │ │ ├── interactive-oscillating-secant-url.xml │ │ │ │ ├── interactive-phet-fourier-url.xml │ │ │ │ ├── interactive-piecewise-url.xml │ │ │ │ ├── interactive-quadratic-tangent-url.xml │ │ │ │ ├── interactive-sage-jupyter-iframe-url.xml │ │ │ │ ├── interactive-simple-eigenvector-url.xml │ │ │ │ ├── interactive-simple-js-script-url.xml │ │ │ │ ├── interactive-slopes-url.xml │ │ │ │ ├── interactive-threejs-catenoid-surface-url.xml │ │ │ │ ├── interactive-threejs-saddle-url.xml │ │ │ │ ├── js-module-test-url.xml │ │ │ │ ├── kinematics-url.xml │ │ │ │ ├── led-zeppelin-kashmir-generic-url.xml │ │ │ │ ├── led-zeppelin-kashmir-solo-url.xml │ │ │ │ ├── led-zeppelin-kashmir-url.xml │ │ │ │ ├── minelli-newyork-newyork-url.xml │ │ │ │ ├── pre-roll-countdown-1-url.xml │ │ │ │ ├── pre-roll-countdown-10-url.xml │ │ │ │ ├── pre-roll-countdown-11-url.xml │ │ │ │ ├── pre-roll-countdown-12-url.xml │ │ │ │ ├── pre-roll-countdown-13-url.xml │ │ │ │ ├── pre-roll-countdown-14-url.xml │ │ │ │ ├── pre-roll-countdown-2-url.xml │ │ │ │ ├── pre-roll-countdown-3-url.xml │ │ │ │ ├── pre-roll-countdown-4-url.xml │ │ │ │ ├── pre-roll-countdown-5-url.xml │ │ │ │ ├── pre-roll-countdown-6-url.xml │ │ │ │ ├── pre-roll-countdown-7-url.xml │ │ │ │ ├── pre-roll-countdown-8-url.xml │ │ │ │ ├── pre-roll-countdown-9-url.xml │ │ │ │ ├── section-video-5-5-2-url.xml │ │ │ │ ├── ups-promo-1-url.xml │ │ │ │ ├── ups-promo-10-url.xml │ │ │ │ ├── ups-promo-11-url.xml │ │ │ │ ├── ups-promo-12-url.xml │ │ │ │ ├── ups-promo-13-url.xml │ │ │ │ ├── ups-promo-14-url.xml │ │ │ │ ├── ups-promo-2-url.xml │ │ │ │ ├── ups-promo-3-url.xml │ │ │ │ ├── ups-promo-4-url.xml │ │ │ │ ├── ups-promo-5-url.xml │ │ │ │ ├── ups-promo-6-url.xml │ │ │ │ ├── ups-promo-7-url.xml │ │ │ │ ├── ups-promo-8-url.xml │ │ │ │ ├── ups-promo-9-url.xml │ │ │ │ ├── ups-promo-frame-one-url.xml │ │ │ │ ├── ups-promo-generic-url.xml │ │ │ │ ├── ups-promo-preview-url.xml │ │ │ │ ├── ups-promo-sbs-url.xml │ │ │ │ ├── ups-promo-side-by-side-url.xml │ │ │ │ ├── vimeo-move-url.xml │ │ │ │ ├── yt-list-vars-url.xml │ │ │ │ ├── zeppelin-playlist-named-url.xml │ │ │ │ └── zeppelin-playlist-url.xml │ │ │ ├── sageplot/ │ │ │ │ └── sageplot-implicit-surface.html │ │ │ ├── stack/ │ │ │ │ ├── stack-integration.ptx │ │ │ │ ├── stack-matrix.ptx │ │ │ │ ├── stack-mcq.ptx │ │ │ │ ├── stack-plot.ptx │ │ │ │ └── stack-typesetting.ptx │ │ │ └── trace/ │ │ │ └── python-hello-world-code-lens.js │ │ ├── media/ │ │ │ ├── code/ │ │ │ │ ├── asymptote/ │ │ │ │ │ └── bezier-patch.js │ │ │ │ ├── austin/ │ │ │ │ │ ├── animation.js │ │ │ │ │ ├── eigenvectors.js │ │ │ │ │ ├── figures.js │ │ │ │ │ └── simple-ev.js │ │ │ │ ├── d3/ │ │ │ │ │ ├── collision.js │ │ │ │ │ ├── graph-layout.js │ │ │ │ │ ├── mention_network.json │ │ │ │ │ ├── welsh.css │ │ │ │ │ └── welsh.js │ │ │ │ ├── dray/ │ │ │ │ │ └── SAS.ggb │ │ │ │ ├── haynes/ │ │ │ │ │ ├── 3d-direction-vector.ggb │ │ │ │ │ └── 3d-direction-vector.js │ │ │ │ ├── jsxgraph/ │ │ │ │ │ ├── archimedian.js │ │ │ │ │ ├── bspline.js │ │ │ │ │ ├── cts-not-diff-oscillate.jc │ │ │ │ │ ├── fermats-spiral.js │ │ │ │ │ ├── infinity.js │ │ │ │ │ └── piecewise.js │ │ │ │ ├── mcclure/ │ │ │ │ │ ├── slope.css │ │ │ │ │ └── slope.js │ │ │ │ ├── roesler/ │ │ │ │ │ └── kinematics.js │ │ │ │ ├── rosoff/ │ │ │ │ │ ├── astroid.ggb │ │ │ │ │ └── epi-hypocycloids-default.ggb │ │ │ │ ├── splice/ │ │ │ │ │ └── splice-resize.js │ │ │ │ └── threejs/ │ │ │ │ ├── catenoid.js │ │ │ │ ├── saddle.js │ │ │ │ └── splines.js │ │ │ ├── favicon/ │ │ │ │ └── README.md │ │ │ ├── iframe/ │ │ │ │ └── sage-jupyter.html │ │ │ ├── images/ │ │ │ │ └── complete-graph.tex │ │ │ ├── pytutor/ │ │ │ │ └── happy.json │ │ │ ├── stack/ │ │ │ │ ├── 01_integration_with_feedback.xml │ │ │ │ ├── Adding-vectors-in-triangles.xml │ │ │ │ ├── Checkbox.xml │ │ │ │ ├── Matrix.xml │ │ │ │ └── basic-plot.xml │ │ │ └── video/ │ │ │ ├── BigBuckBunnyAcapella.vtt │ │ │ └── ups-visitor-guide-360.webm │ │ ├── numerical/ │ │ │ └── spreadsheet/ │ │ │ └── runningstatisticstemplate.ots │ │ ├── privatesolutions.xml │ │ ├── project.ptx │ │ ├── publication-crc.xml │ │ ├── publication-oscarlevin.xml │ │ ├── publication-print.xml │ │ ├── publication-solution-manual.xml │ │ ├── publication.xml │ │ └── sample-article.xml │ ├── sample-book/ │ │ ├── README.md │ │ ├── appendix-two.xml │ │ ├── backmatter.xml │ │ ├── bookinfo.xml │ │ ├── code/ │ │ │ └── symmetric-group-8.sage │ │ ├── codechat_config.yaml │ │ ├── cyclic.xml │ │ ├── exercises/ │ │ │ ├── cyclic.xml │ │ │ ├── groups.xml │ │ │ ├── integers.xml │ │ │ └── sets.xml │ │ ├── ext/ │ │ │ ├── datafiles/ │ │ │ │ └── stackoverflow.csv │ │ │ └── splice/ │ │ │ └── splice-resize.js │ │ ├── frontmatter.xml │ │ ├── gen/ │ │ │ ├── datafile/ │ │ │ │ ├── beach-datafile.xml │ │ │ │ ├── file-picture-classes-jar.xml │ │ │ │ ├── flower1-datafile.xml │ │ │ │ ├── flower2-datafile.xml │ │ │ │ ├── golden-gate.xml │ │ │ │ ├── golden-gate2.xml │ │ │ │ ├── luther-bell.xml │ │ │ │ └── stack-overflow-survey.xml │ │ │ ├── dynamic_subs/ │ │ │ │ └── dynamic_substitutions.xml │ │ │ ├── qrcode/ │ │ │ │ ├── OpenDSA-integration-bs-url.xml │ │ │ │ ├── OpenDSA-integration-dijkstra-url.xml │ │ │ │ ├── OpenDSA-list-insertion-exercise-url.xml │ │ │ │ ├── OpenDSA-list-insertion-url.xml │ │ │ │ ├── doenet-velocity-url.xml │ │ │ │ ├── interactive-doenetml-example-url.xml │ │ │ │ ├── interactive-horstmann-codecheck-url.xml │ │ │ │ ├── opendsa-slideshow-pop-url.xml │ │ │ │ ├── show-eval-visualization-url.xml │ │ │ │ ├── splice-resize-example-url.xml │ │ │ │ ├── youtube-list-vars-eight-url.xml │ │ │ │ ├── youtube-list-vars-eleven-url.xml │ │ │ │ ├── youtube-list-vars-five-url.xml │ │ │ │ ├── youtube-list-vars-four-url.xml │ │ │ │ ├── youtube-list-vars-nine-url.xml │ │ │ │ ├── youtube-list-vars-one-url.xml │ │ │ │ ├── youtube-list-vars-seven-url.xml │ │ │ │ ├── youtube-list-vars-six-url.xml │ │ │ │ ├── youtube-list-vars-ten-url.xml │ │ │ │ ├── youtube-list-vars-three-url.xml │ │ │ │ ├── youtube-list-vars-two-url.xml │ │ │ │ └── youtube-list-vars-url.xml │ │ │ └── trace/ │ │ │ ├── c-hello-world-code-lens.js │ │ │ ├── exploration-with-always-static-program.js │ │ │ ├── java-hello-world-code-lens.js │ │ │ ├── program-codelens-cpp-questions.js │ │ │ ├── python-code-lens-questions.js │ │ │ ├── python-hello-world-code-lens.js │ │ │ ├── sieve-codelens-cpp.js │ │ │ ├── sieve-codelens-java.js │ │ │ └── sieve-codelens-python.js │ │ ├── gfdl-mathbook.xml │ │ ├── groups.xml │ │ ├── integers.xml │ │ ├── project.ptx │ │ ├── publication-decorative.xml │ │ ├── publication-noparts.xml │ │ ├── publication-runestone-academy.xml │ │ ├── publication-solution-manual.xml │ │ ├── publication-structural.xml │ │ ├── rune-examples/ │ │ │ ├── activecode-ambles.xml │ │ │ ├── activecode-unittest.xml │ │ │ └── static-listing-java.xml │ │ ├── rune.xml │ │ ├── sage/ │ │ │ ├── cyclic-info.xml │ │ │ ├── cyclic-sage-exercises.xml │ │ │ ├── groups-info.xml │ │ │ ├── groups-sage-exercises.xml │ │ │ ├── groups-sage.xml │ │ │ ├── integers-info.xml │ │ │ ├── integers-sage-exercises.xml │ │ │ ├── integers-sage.xml │ │ │ ├── sets-info.xml │ │ │ ├── sets-sage-exercises.xml │ │ │ └── sets-sage.xml │ │ ├── sample-book-parts.xml │ │ ├── sample-book-solutions-manual.xml │ │ ├── sample-book-solutions-manual.xsl │ │ ├── sample-book.xml │ │ ├── sets.xml │ │ └── tikz/ │ │ └── cyclic-roots-unity.tex │ ├── sample-slideshow/ │ │ ├── external/ │ │ │ └── custom.css │ │ ├── generated/ │ │ │ ├── asymptote/ │ │ │ │ └── img-asymptote.html │ │ │ └── prefigure/ │ │ │ └── annotated-prefigure-network-annotations.xml │ │ ├── publication.xml │ │ └── sample-slideshow.xml │ ├── showcase/ │ │ ├── README.md │ │ ├── generated/ │ │ │ ├── asymptote/ │ │ │ │ ├── AreaUnderCurve.asy │ │ │ │ ├── AreaUnderCurve.eps │ │ │ │ ├── AreaUnderCurve.html │ │ │ │ ├── Deathstar.asy │ │ │ │ ├── Deathstar.eps │ │ │ │ ├── Deathstar.html │ │ │ │ ├── FiveVenn.asy │ │ │ │ ├── FiveVenn.eps │ │ │ │ ├── FiveVenn.html │ │ │ │ ├── cflag.asy │ │ │ │ ├── cflag.eps │ │ │ │ ├── cflag.html │ │ │ │ ├── eflag.asy │ │ │ │ ├── eflag.eps │ │ │ │ ├── eflag.html │ │ │ │ ├── image-rotational-solid.eps │ │ │ │ ├── image-washer.eps │ │ │ │ ├── usflag.asy │ │ │ │ ├── usflag.eps │ │ │ │ └── usflag.html │ │ │ ├── latex-image/ │ │ │ │ ├── image-building-parabola.eps │ │ │ │ ├── image-building-parabola.tex │ │ │ │ ├── image-gaussian-sum-proof.eps │ │ │ │ ├── image-gaussian-sum-proof.tex │ │ │ │ ├── image-implicitly-defined-curve.eps │ │ │ │ ├── image-implicitly-defined-curve.tex │ │ │ │ ├── image-parametrized-surface.eps │ │ │ │ ├── image-parametrized-surface.tex │ │ │ │ ├── worksheet-midpoints-of-quadrilateral.eps │ │ │ │ ├── worksheet-midpoints-of-quadrilateral.tex │ │ │ │ ├── worksheet-triangle-cyclic-medians-copy.eps │ │ │ │ ├── worksheet-triangle-cyclic-medians-copy.tex │ │ │ │ ├── worksheet-triangle-cyclic-medians.eps │ │ │ │ ├── worksheet-triangle-cyclic-medians.tex │ │ │ │ ├── worksheet-triangle-cyclic-vectors.eps │ │ │ │ └── worksheet-triangle-cyclic-vectors.tex │ │ │ └── webwork/ │ │ │ ├── answer-type-variety.xml │ │ │ ├── images/ │ │ │ │ └── string-answers-image-1.tex │ │ │ ├── open-problem-library.xml │ │ │ ├── pg/ │ │ │ │ └── PreTeXt_Showcase/ │ │ │ │ ├── 6_1-Answer_Type_Variety.pg │ │ │ │ ├── 6_2-Special_Feedback.pg │ │ │ │ ├── 6_3-String_Answers.pg │ │ │ │ ├── 6_5-Structured_with_Tasks.pg │ │ │ │ ├── 6_6-Units_in_Answers.pg │ │ │ │ ├── def/ │ │ │ │ │ └── setPreTeXt_Showcase.def │ │ │ │ ├── header/ │ │ │ │ │ └── PreTeXt_Showcase.pg │ │ │ │ └── macros/ │ │ │ │ └── PTXSC.pl │ │ │ ├── special-feedback.xml │ │ │ ├── string-answers.xml │ │ │ ├── structured-with-tasks.xml │ │ │ └── units-in-answers.xml │ │ ├── project.ptx │ │ ├── publisher/ │ │ │ └── publication.xml │ │ └── source/ │ │ ├── environments.ptx │ │ ├── exercises.ptx │ │ ├── latex-image.ptx │ │ ├── mathematics.ptx │ │ ├── pretext-showcase.ptx │ │ ├── webwork.ptx │ │ └── worksheets.ptx │ ├── stack/ │ │ ├── README.md │ │ └── minimal/ │ │ ├── assets/ │ │ │ └── stack/ │ │ │ └── 01_integration_with_feedback.xml │ │ ├── project.ptx │ │ ├── publication/ │ │ │ └── publication.ptx │ │ └── source/ │ │ └── main.ptx │ ├── webwork/ │ │ ├── Makefile │ │ ├── Makefile.paths.example │ │ ├── Makefile.paths.original │ │ ├── README.md │ │ ├── minimal/ │ │ │ ├── generated/ │ │ │ │ └── webwork/ │ │ │ │ ├── add-integers.xml │ │ │ │ ├── cylinder-volume.xml │ │ │ │ ├── pg/ │ │ │ │ │ └── WeBWorK_Minimal_Example/ │ │ │ │ │ ├── 1-WeBWorK_Minimal_Section/ │ │ │ │ │ │ ├── 1_1.pg │ │ │ │ │ │ └── 1_3.pg │ │ │ │ │ ├── def/ │ │ │ │ │ │ └── set1-WeBWorK_Minimal_Section.def │ │ │ │ │ ├── header/ │ │ │ │ │ │ └── 1-WeBWorK_Minimal_Section.pg │ │ │ │ │ └── macros/ │ │ │ │ │ └── WeBWorK_Minimal_Example.pl │ │ │ │ └── value-of-pi.xml │ │ │ ├── mini.xml │ │ │ ├── pg/ │ │ │ │ └── newProblem.pg │ │ │ └── publication.xml │ │ └── sample-chapter/ │ │ ├── my-generated/ │ │ │ ├── .gitkeep │ │ │ └── webwork/ │ │ │ ├── an-exercisegroup-exercise.xml │ │ │ ├── answer-arrays.xml │ │ │ ├── antiderivative-exp.xml │ │ │ ├── antiderivative-sin.xml │ │ │ ├── box-diagonal-five.xml │ │ │ ├── box-diagonal-thirteen.xml │ │ │ ├── choose-one.xml │ │ │ ├── copy-webwork-add-numbers-exploration.xml │ │ │ ├── copy-webwork-add-numbers.xml │ │ │ ├── copy-with-tasks.xml │ │ │ ├── cylinder-volume.xml │ │ │ ├── deep-nested-lists.xml │ │ │ ├── divisional-bare.xml │ │ │ ├── divisional-conclusion.xml │ │ │ ├── divisional-introduction-conclusion.xml │ │ │ ├── divisional-introduction.xml │ │ │ ├── divisional-title-conclusion.xml │ │ │ ├── divisional-title-introduction-conclusion.xml │ │ │ ├── divisional-title-introduction.xml │ │ │ ├── divisional-title.xml │ │ │ ├── empty-statement.xml │ │ │ ├── exercisegroup-bare.xml │ │ │ ├── exercisegroup-conclusion.xml │ │ │ ├── exercisegroup-introduction-conclusion.xml │ │ │ ├── exercisegroup-introduction.xml │ │ │ ├── exercisegroup-title-conclusion.xml │ │ │ ├── exercisegroup-title-introduction-conclusion.xml │ │ │ ├── exercisegroup-title-introduction.xml │ │ │ ├── exercisegroup-title.xml │ │ │ ├── function-with-domain-issues.xml │ │ │ ├── images/ │ │ │ │ ├── box-diagonal-five-image-1.tex │ │ │ │ ├── box-diagonal-thirteen-image-1.tex │ │ │ │ ├── latex-image-with-preamble-image-1.tex │ │ │ │ ├── randomized-latex-image-image-1.tex │ │ │ │ ├── special-characters-image-1.tex │ │ │ │ └── static-latex-image-image-1.tex │ │ │ ├── inline-bare.xml │ │ │ ├── inline-conclusion.xml │ │ │ ├── inline-introduction-conclusion.xml │ │ │ ├── inline-introduction.xml │ │ │ ├── inline-title-conclusion.xml │ │ │ ├── inline-title-introduction-conclusion.xml │ │ │ ├── inline-title-introduction.xml │ │ │ ├── inline-title.xml │ │ │ ├── integer-addition-with-control-seed.xml │ │ │ ├── integer-addition-with-seed.xml │ │ │ ├── integer-addition.xml │ │ │ ├── intertext.xml │ │ │ ├── latex-image-with-preamble.xml │ │ │ ├── list-indentation-with-images-and-tables.xml │ │ │ ├── list-indentation.xml │ │ │ ├── local-pg-file.xml │ │ │ ├── local-pg.xml │ │ │ ├── math-and-alignment.xml │ │ │ ├── mathobject-string-answers.xml │ │ │ ├── multiple-choice-popup-or-radio-buttons.xml │ │ │ ├── multiple-choice.xml │ │ │ ├── nested-tasks.xml │ │ │ ├── no-random.xml │ │ │ ├── number-or-function.xml │ │ │ ├── options-subset-auto-label.xml │ │ │ ├── options-subset-explicit-labeling.xml │ │ │ ├── options-subset.xml │ │ │ ├── pg/ │ │ │ │ └── Integrating_WeBWorK_into_Textbooks/ │ │ │ │ ├── 1-Instructive_Examples/ │ │ │ │ │ ├── 1_1-Arithmetic/ │ │ │ │ │ │ ├── 1_1_1-Adding_SingleDigit_Integers.pg │ │ │ │ │ │ ├── 1_1_3-Controlling_Randomness.pg │ │ │ │ │ │ ├── 1_1_4-Special_Answer_Checking.pg │ │ │ │ │ │ ├── 1_1_5-Using_Hints.pg │ │ │ │ │ │ ├── 1_1_6-No_Randomization.pg │ │ │ │ │ │ ├── 1_1_7-Local_PG.pg │ │ │ │ │ │ ├── 1_1_8-Local_PG_File.pg │ │ │ │ │ │ ├── Exploration-1_1_2-Inside_an_exploration.pg │ │ │ │ │ │ └── Project-1_1_1-Inside_a_project.pg │ │ │ │ │ ├── 1_2-The_Quadratic_Formula/ │ │ │ │ │ │ ├── 1_2_2-Solving_Quadratic_Equations.pg │ │ │ │ │ │ └── 1_2_3-Nested_tasks.pg │ │ │ │ │ ├── 1_4-Antidifferentiation/ │ │ │ │ │ │ ├── 1_4_2_2-Every_Continuous_Function_has_an_Antiderivative.pg │ │ │ │ │ │ ├── 1_4_2_3-Inverse_Processes.pg │ │ │ │ │ │ ├── 1_4_2_4.pg │ │ │ │ │ │ ├── 1_4_2_5.pg │ │ │ │ │ │ └── 1_4_2_6-Show_Your_Work.pg │ │ │ │ │ ├── 1_5-Math_Content/ │ │ │ │ │ │ ├── 1_5_1-Math_Elements_and_Alignment.pg │ │ │ │ │ │ └── 1_5_2-Intertext.pg │ │ │ │ │ ├── 1_6-Multiple_Choice/ │ │ │ │ │ │ ├── 1_6_1-DropdownPopup.pg │ │ │ │ │ │ ├── 1_6_2-Choose_one.pg │ │ │ │ │ │ ├── 1_6_3-Choose_a_Subset_of_Options.pg │ │ │ │ │ │ ├── 1_6_4-Choose_a_Subset_of_Options_with_Automated_Labeling.pg │ │ │ │ │ │ └── 1_6_5-Choose_a_Subset_of_Options_with_Explicit_Labeling.pg │ │ │ │ │ ├── 1_7-Tables/ │ │ │ │ │ │ └── 1_7_1-Complete_this_Table.pg │ │ │ │ │ └── 1_8-Graphics_in_Exercises/ │ │ │ │ │ ├── 1_8_1-A_static_lateximage_graph.pg │ │ │ │ │ ├── 1_8_1.pg │ │ │ │ │ ├── 1_8_2-A_randomized_lateximage_graph.pg │ │ │ │ │ ├── 1_8_2.pg │ │ │ │ │ ├── 1_8_3-A_lateximage_graph_affected_by_lateximagepreamble.pg │ │ │ │ │ ├── 1_8_4-Special_characters.pg │ │ │ │ │ └── 1_8_5-Solve_using_a_graph.pg │ │ │ │ ├── 2-Technical_Examples/ │ │ │ │ │ ├── 2_1-PGML_Formatting_and_Verbatim_Calisthenics/ │ │ │ │ │ │ ├── 2_1_1-PGML_Formatting.pg │ │ │ │ │ │ ├── 2_1_2.pg │ │ │ │ │ │ └── 2_1_3.pg │ │ │ │ │ ├── 2_2-Subject_Area_Templates/ │ │ │ │ │ │ ├── 2_2_1-Answer_is_a_number_or_a_function.pg │ │ │ │ │ │ ├── 2_2_2-Answer_is_a_function_with_domain_issues.pg │ │ │ │ │ │ ├── 2_2_3-Multiple_Choice_by_Popup_Radio_Buttons_or_Checkboxes.pg │ │ │ │ │ │ ├── 2_2_4.pg │ │ │ │ │ │ ├── 2_2_5-Tables.pg │ │ │ │ │ │ └── 2_2_6-Answer_Arrays.pg │ │ │ │ │ ├── 2_3-Stress_Tests/ │ │ │ │ │ │ ├── 2_3_1-PTX_problem_source_with_servergenerated_images.pg │ │ │ │ │ │ ├── 2_3_2-Checking_Proper_Indentation_In_Lists.pg │ │ │ │ │ │ ├── 2_3_3-Checking_Proper_Indentation_In_Lists_with_Images_and_Tables.pg │ │ │ │ │ │ ├── 2_3_4-Deepnested_lists.pg │ │ │ │ │ │ ├── 2_3_5.pg │ │ │ │ │ │ └── 2_3_6.pg │ │ │ │ │ ├── 2_4-Layout_Configuration_Testing/ │ │ │ │ │ │ ├── 2_4_1.pg │ │ │ │ │ │ ├── 2_4_2-Has_a_Title.pg │ │ │ │ │ │ ├── 2_4_2_1.pg │ │ │ │ │ │ ├── 2_4_2_10-Has_a_Title.pg │ │ │ │ │ │ ├── 2_4_2_11.pg │ │ │ │ │ │ ├── 2_4_2_12-Has_a_Title.pg │ │ │ │ │ │ ├── 2_4_2_13.pg │ │ │ │ │ │ ├── 2_4_2_14-Has_a_Title.pg │ │ │ │ │ │ ├── 2_4_2_15.pg │ │ │ │ │ │ ├── 2_4_2_16-Has_a_Title.pg │ │ │ │ │ │ ├── 2_4_2_2-Has_a_Title.pg │ │ │ │ │ │ ├── 2_4_2_3.pg │ │ │ │ │ │ ├── 2_4_2_4-Has_a_Title.pg │ │ │ │ │ │ ├── 2_4_2_5.pg │ │ │ │ │ │ ├── 2_4_2_6-Has_a_Title.pg │ │ │ │ │ │ ├── 2_4_2_7.pg │ │ │ │ │ │ ├── 2_4_2_8-Has_a_Title.pg │ │ │ │ │ │ ├── 2_4_2_9.pg │ │ │ │ │ │ ├── 2_4_3.pg │ │ │ │ │ │ ├── 2_4_4-Has_a_Title.pg │ │ │ │ │ │ ├── 2_4_5.pg │ │ │ │ │ │ ├── 2_4_6-Has_a_Title.pg │ │ │ │ │ │ ├── 2_4_7.pg │ │ │ │ │ │ └── 2_4_8-Has_a_Title.pg │ │ │ │ │ └── 2_5-Runestone_Assignment_Testing/ │ │ │ │ │ └── 2_5_1.pg │ │ │ │ ├── def/ │ │ │ │ │ ├── set1_1-Arithmetic.def │ │ │ │ │ ├── set1_2-The_Quadratic_Formula.def │ │ │ │ │ ├── set1_3-Open_Problem_Library.def │ │ │ │ │ ├── set1_4-Antidifferentiation_Exercises.def │ │ │ │ │ ├── set1_5-Math_Content.def │ │ │ │ │ ├── set1_6-Multiple_Choice.def │ │ │ │ │ ├── set1_7-Tables.def │ │ │ │ │ ├── set1_8-Graphics_in_Exercises.def │ │ │ │ │ ├── set1_8-Graphics_in_Exercises_Exercises.def │ │ │ │ │ ├── set2_1-PGML_Formatting_and_Verbatim_Calisthenics.def │ │ │ │ │ ├── set2_2-Subject_Area_Templates.def │ │ │ │ │ ├── set2_3-Stress_Tests.def │ │ │ │ │ ├── set2_4-Layout_Configuration_Testing.def │ │ │ │ │ ├── set2_4-Layout_Configuration_Testing_Exercises.def │ │ │ │ │ └── set2_5-Runestone_Assignment_Testing_Exercises.def │ │ │ │ ├── header/ │ │ │ │ │ ├── 1_1-Arithmetic.pg │ │ │ │ │ ├── 1_2-The_Quadratic_Formula.pg │ │ │ │ │ ├── 1_3-Open_Problem_Library.pg │ │ │ │ │ ├── 1_4-Antidifferentiation_Exercises.pg │ │ │ │ │ ├── 1_5-Math_Content.pg │ │ │ │ │ ├── 1_6-Multiple_Choice.pg │ │ │ │ │ ├── 1_7-Tables.pg │ │ │ │ │ ├── 1_8-Graphics_in_Exercises.pg │ │ │ │ │ ├── 1_8-Graphics_in_Exercises_Exercises.pg │ │ │ │ │ ├── 2_1-PGML_Formatting_and_Verbatim_Calisthenics.pg │ │ │ │ │ ├── 2_2-Subject_Area_Templates.pg │ │ │ │ │ ├── 2_3-Stress_Tests.pg │ │ │ │ │ ├── 2_4-Layout_Configuration_Testing.pg │ │ │ │ │ ├── 2_4-Layout_Configuration_Testing_Exercises.pg │ │ │ │ │ └── 2_5-Runestone_Assignment_Testing_Exercises.pg │ │ │ │ └── macros/ │ │ │ │ └── WWSC.pl │ │ │ ├── pgml-data-attribute.xml │ │ │ ├── ptx-source-with-server-images.xml │ │ │ ├── quadratic-equation.xml │ │ │ ├── radio-buttons-with-math.xml │ │ │ ├── randomized-latex-image.xml │ │ │ ├── single-quote-in-table-cell.xml │ │ │ ├── solving-with-graph.xml │ │ │ ├── special-answer-checking.xml │ │ │ ├── special-characters.xml │ │ │ ├── static-latex-image.xml │ │ │ ├── table-completion.xml │ │ │ ├── tables.xml │ │ │ ├── using-hints.xml │ │ │ ├── ww-PGML-format.xml │ │ │ ├── ww-antiderivatives.xml │ │ │ ├── ww-discuss-always-antiderivative.xml │ │ │ ├── ww-discuss-inverse-processes.xml │ │ │ └── ww-use-the-definition-of-the-derivative.xml │ │ ├── pg/ │ │ │ └── Adding_SingleDigit_Integers.pg │ │ ├── project.ptx │ │ ├── publisher/ │ │ │ ├── publication-academy.xml │ │ │ └── publication.xml │ │ └── sample-chapter.ptx │ └── workbook/ │ ├── README.md │ ├── workbook-article-publication.xml │ ├── workbook-article.xml │ ├── workbook-book-publication.xml │ ├── workbook-book.xml │ ├── ws-activity-with-task.xml │ ├── ws-dot-products.xml │ ├── ws-exercisegroup.xml │ ├── ws-geometric-prelude.xml │ ├── ws-networks.xml │ └── ws-testing.xml ├── journals/ │ ├── README.md │ ├── build.sh │ ├── journals-to-table.xsl │ ├── journals.xml │ └── texstyles/ │ ├── ams.xml │ ├── dependents/ │ │ ├── bull-amer-math-soc.xml │ │ ├── conform-geom-dyn.xml │ │ ├── j-algebraic-geom.xml │ │ ├── j-amer-math-soc.xml │ │ ├── math-comp.xml │ │ ├── proc-amer-math-soc.xml │ │ ├── quart-appl-math.xml │ │ ├── represent-theory.xml │ │ ├── theory-probab-math-statist.xml │ │ └── trans-ams.xml │ ├── electron-j-combin.xml │ ├── elsevier.xml │ ├── springer-nature.xml │ └── taylor-francis.xml ├── js/ │ ├── diagcess/ │ │ └── diagcess.js │ ├── knowl.js │ ├── lti_iframe_resizer.js │ ├── mathjax_startup.js │ ├── pretext-stack/ │ │ ├── stackapicalls.js │ │ └── stackjsvle.js │ ├── pretext-webwork/ │ │ ├── 2.16/ │ │ │ └── pretext-webwork.js │ │ ├── 2.17/ │ │ │ └── pretext-webwork.js │ │ ├── 2.18/ │ │ │ └── pretext-webwork.js │ │ ├── 2.19/ │ │ │ └── pretext-webwork.js │ │ └── 2.20/ │ │ └── pretext-webwork.js │ ├── pretext.js │ ├── pretext_add_on.js │ ├── pretext_search.js │ ├── ptx_scorm_events.js │ └── ptx_search.js ├── legal/ │ ├── gpl-license-v2.txt │ └── gpl-license-v3.txt ├── pretext/ │ ├── README.md │ ├── __init__.py │ ├── lib/ │ │ ├── __init__.py │ │ ├── braille_format.py │ │ └── pretext.py │ ├── module-test.py │ ├── pretext │ ├── pretext.cfg │ └── requirements.txt ├── release-notes.md ├── schema/ │ ├── README.md │ ├── build.sh │ ├── pf.xsd │ ├── pretext-dev.rnc │ ├── pretext-dev.rng │ ├── pretext-schematron.xsl │ ├── pretext-validation-plus.xsl │ ├── pretext.rnc │ ├── pretext.rng │ ├── pretext.xml │ ├── pretext.xsd │ ├── publication-schema.rnc │ ├── publication-schema.rng │ ├── publication-schema.xml │ ├── publication-schema.xsd │ ├── publication.xml │ └── xml.xsd ├── script/ │ ├── README.md │ ├── cssbuilder/ │ │ ├── README.md │ │ ├── cssbuilder.mjs │ │ └── package.json │ ├── dynsub/ │ │ ├── README.md │ │ ├── dynamic_extract.mjs │ │ └── package.json │ ├── mbx │ ├── mjsre/ │ │ ├── README.md │ │ ├── mj-sre-page.js │ │ ├── package.json │ │ └── update-sre │ └── webwork/ │ └── pg-ptx.pl └── xsl/ ├── README.md ├── entities.ent ├── extract-asymptote.xsl ├── extract-biblio-csl.xsl ├── extract-datafile.xsl ├── extract-dynamic.xsl ├── extract-identity.xsl ├── extract-interactive.xsl ├── extract-latex-image.xsl ├── extract-mermaid.xsl ├── extract-mom.xsl ├── extract-pg.xsl ├── extract-prefigure.xsl ├── extract-qrcode.xsl ├── extract-sageplot.xsl ├── extract-stack.xsl ├── extract-trace.xsl ├── extract-youtube.xsl ├── html-symbols.xsl ├── latex/ │ ├── pretext-latex-AIM.xsl │ ├── pretext-latex-CLP.xsl │ ├── pretext-latex-chaos.xsl │ ├── pretext-latex-dyslexic-font.xsl │ ├── pretext-latex-guide.xsl │ └── pretext-latex-texstyle.xsl ├── localizations/ │ ├── README.md │ ├── af-ZA.xml │ ├── bg-BG.xml │ ├── ca-ES.xml │ ├── cs-CZ.xml │ ├── de-DE.xml │ ├── en-US.xml │ ├── es-ES.xml │ ├── fi-FI.xml │ ├── fr-CA.xml │ ├── fr-FR.xml │ ├── hu-HU.xml │ ├── it-IT.xml │ ├── ku-CKB.xml │ ├── localizations.xml │ ├── nl-NL.xml │ ├── pt-BR.xml │ ├── pt-PT.xml │ └── zh-HANS.xml ├── pretext-assembly.xsl ├── pretext-basic-html.xsl ├── pretext-beamer.xsl ├── pretext-braille-preprint.xsl ├── pretext-common.xsl ├── pretext-dynamic.xsl ├── pretext-epub.xsl ├── pretext-html.xsl ├── pretext-json-manifest.xsl ├── pretext-jupyter.xsl ├── pretext-latex-classic.xsl ├── pretext-latex-common.xsl ├── pretext-latex.xsl ├── pretext-litprog.xsl ├── pretext-merge.xsl ├── pretext-numbers.xsl ├── pretext-revealjs.xsl ├── pretext-runestone-fitb.xsl ├── pretext-runestone-static.xsl ├── pretext-runestone.xsl ├── pretext-sage-doctest.xsl ├── pretext-smc.xsl ├── pretext-solution-manual-latex.xsl ├── pretext-text-utilities.xsl ├── pretext-text.xsl ├── pretext-units.xsl ├── pretext-view-source.xsl ├── pretext-ww-problem-sets.xsl ├── publisher-variables.xsl ├── support/ │ ├── README.md │ ├── extract-math.xsl │ ├── package-math.xsl │ ├── play-button/ │ │ └── README.md │ ├── pretext-pg-macros.xsl │ └── webpack_static_imports.xml ├── tests/ │ ├── README.md │ ├── null.xml │ └── pretext-text-utilities-test.xsl ├── utilities/ │ ├── README.md │ ├── author-report.xsl │ ├── deprecate-autoname.sed │ ├── deprecate-index.sed │ ├── fix-deprecations.xsl │ ├── pretext-enhanced-source.xsl │ └── report-publisher-variables.xsl ├── xml-to-json.xsl └── xml-to-string.xsl ================================================ FILE CONTENTS ================================================ ================================================ FILE: .git-blame-ignore-revs ================================================ # PreTeXt whitespace/formatting commits # Commit message (e.g.): "Add whitespace commit to git blame ignore revisions" # May 2021: "black" formatting on Python pretext script 56a27b3a41ece5a2eee1975e190e49b6cf98c500 # Oct 2023: restructure WW chapter as a book, indentation 87f4f5e712e03024ae85589c8086d273d8241fd3 # Mar 2025: empty elements in sample article 36decdaa299138281dd461d021483a83fb7d1964 ================================================ FILE: .gitignore ================================================ user/* doc/guide/webwork-representations.ptx script/mjsre/node_modules/ script/mjsre/package-lock.json script/dynsub/node_modules/ script/dynsub/package-lock.json pretext/__pycache__/** pretext/lib/__pycache__/** .error_schema.log # WW examples examples/webwork/Makefile.paths # any file ending in ~ (backups, usually) *~ .vscode **/_build **/output **/cli.log **/rsbuild **/build **/node_modules/ # cssbuilder output css/dist/*.map ================================================ FILE: CONTRIBUTING.md ================================================ Contributing ------------ Thanks for your interest in contributing to [PreTeXt](https://pretextbook.org). Details on participation in the PreTeXt Community can be found at [Welcome to the PreTeXt Community](https://pretextbook.org/doc/guide/html/welcome.html) In particular, discussion almost always begins in the Google Groups, and once there is consensus about what needs to be done (bug-fix, new feature, etc.), then an issue is created. Please do not use issues for support questions and please initiate feature requests in one of the Google Groups. Pull requests are welcome without discussion when something is clearly in error and the change is readily apparent. Thanks for adapting to the idosyncracies of our project! Some specific details follow. (2022-06-19) Reporting Errors ---------------- If you have output that you think might be incorrect or misbehaved, please follow this procedure: * Check that your input conforms to the schema [Author's Guide](https://pretextbook.org/doc/author-guide/html/schema.html) * Add a small example of your problem to the "minimal" example in the `examples/minimal` directory and test there * Search the [pretext-support](https://groups.google.com/forum/#!forum/pretext-support) and [pretext-dev](https://groups.google.com/forum/#!forum/pretext-dev) Google Groups, and the [GitHub issues](https://github.com/rbeezer/mathbook/issues), to see if the problem is known (if so, please add any new information there) * Post on one of the Google Groups, and include the source of your adjusted minimal example, along with a copy of the problematic output * If your problem involves HTML output, it is usually easier for us to understand if you host a live example and provide a URL in your post * If you have discovered a new problem, you can help when asked by filing an issue on GitHub (and it is OK to cut/paste from th Google Group discussion and/or link to a discussion there) Thanks for your help keeping all the volunteers on this project working efficiently. (2018-08-27) Contributing to PreTeXt ----------------------- Thanks for your interest in making PreTeXt better. Contributions from users are an important part of its development. The following suggestions are meant to make the process of creating and accepting a contribution easier for you, and easier for the maintainers. * Use the [pretext-dev](https://groups.google.com/forum/#!forum/pretext-dev) Google Group to float your idea before starting. You will get some good feedback that will make your contribution better and you may get some cautions that will save you some effort. * Pull requests on GitHub are the easiest way to contribute and are really the only practical way for us to review, test, and incorporate your work. If you are new to Git, there is lots of information on the Internet, and some of it is even helpful and accurate. You can also read a guide we put together, [Git for Authors](https://pretextbook.org/gfa/html/). Despite the title, it has general principles and techniques that work equally well for software. * **Always** begin a new branch for a contribution. And keep topically distinct contributions on different branches. Small and compact is better than large and diverse. * Pull frequently from the main line of development for official PreTeXt (`master` at this writing) to update current progress. Then **rebase** your topic branch onto the tip of this official branch as you work, as follows. ``` git switch master git pull origin master git switch topic git rebase master ``` * In particular, **do not merge** `master` into your `topic` branch, that makes our job harder when we add your work into the official repository. * Once you have your branch in good shape, be sure you update `master` one last time and rebase onto the tip of `master`. Then make a pull request with that branch. * While your work is being reviewed, do not add any new commits to your branch, and do not rebase it again, unless you are asked to add changes. If you later need to build on your work, then say so in the discussion area and we can plot how to accomodate that. But it would be better to not make a pull request until you are completely finished with a task. * We are likely to combine your commits, and maybe even then distribute them into logical chunks. We will edit your commit messages, deleting anything beyond a single line (so do not spend time on that). * We will preserve your authorship, and mark the commit(s) with the pull request number so there is a record of where it came from and how (or we will merge and put the pull request number on the merge commit). * Once we incorporate your work into the mainline of the official repository, then you can pull those changes and delete your topic branch. (2018-08-27) ================================================ FILE: COPYING ================================================ Copyright 2013 Robert A. Beezer This file is part of PreTeXt. PreTeXt is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 or version 3 of the License (at your option). PreTeXt is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with PreTeXt. If not, see . ================================================ FILE: README.md ================================================ PreTeXt ======= An authoring and publishing system for authors of textbooks, research articles, and monographs, especially in STEM disciplines. GPL License. Quickstart instructions at project website: [pretextbook.org](https://pretextbook.org) Help and development discussions: * Support forum/mailing-list: [pretext-support](https://groups.google.com/forum/#!forum/pretext-support) * Announcements only, low-volume: [pretext-announce](https://groups.google.com/forum/#!forum/pretext-announce) * Submitting an issue is the last option for receiving help. See the [Contributing Guide](CONTRIBUTING.md). PreTeXt is guided by the following principles: ---------------------------------------------- 1. PreTeXt is a markup language that captures the structure of textbooks and research papers. 2. PreTeXt is human-readable and human-writable. 3. PreTeXt documents serve as a single source which can be easily converted to multiple other formats, current and future. 4. PreTeXt respects the good design practices which have been developed over the past centuries. 5. PreTeXt makes it easy for authors to implement features which are both common and reasonable. 6. PreTeXt supports online documents which make use of the full capabilities of the Web. 7. PreTeXt output is styled by selecting from a list of available templates, relieving the author of the burden involved in micromanaging the output format. 8. PreTeXt is free: the software is available at no cost, with an open license. The use of PreTeXt does not impose any constraints on documents prepared with the system. 9. PreTeXt is not a closed system: documents can be converted to LaTeX and then developed using standard LaTeX tools. 10. PreTeXt recognizes that scholarly documents involve the interaction of authors, publishers, scholars, curators, instructors, students, and readers, with each group having its own needs and goals. 11. PreTeXt recognizes the inherent value in producing material that is accessible to everyone. ================================================ FILE: contrib/hitchman/README.md ================================================ Hitchman's Linear Algebra Workbook ================================== Compatibility layers to support TJ Hitchman's Linear Algebra workbook for his IBL course. First used Fall 2014. Principally a new "Task" environment was added. But with the addition of a `task` element, and its subsequent re-purposing in Summer 2017, that code has been removed. ================================================ FILE: contrib/hitchman/tjh-law-html.xsl ================================================ 2 1 ================================================ FILE: contrib/hitchman/tjh-law-print.xsl ================================================ yes 2 1 \clearpage ================================================ FILE: contrib/ups-writers/README.md ================================================ University of Puget Sound's "Writer's Handbook" =============================================== Compatibility layers to support extra features for discussing aspects of writing. * Different styles of underlining. * Colors to indicate parts of bibliography entries. * A different ellipsis for text use. First used Fall 2016. None of this should be taken as especially semantic, so is not a good example of the PreTeXt philosophy. ================================================ FILE: contrib/ups-writers/ups-writers-html.xsl ================================================ padding-left: 2em; text-indent: -2em; underline-single border-bottom: 1px solid; underline-double border-bottom: 3px double; underline-dashed border-bottom: 1px dashed; underline-dotted border-bottom: 1px dotted; . . . font-style: italic; color: black; color: red; color: lightblue; color: lightgreen; color: violet; color: maroon; color: pink; color: darkred; color: blue; color: orange; color: teal; color: darkviolet; color: lightpink; color: green; color: darkgreen; color: navy; color: gray; ================================================ FILE: contrib/ups-writers/ups-writers-latex.xsl ================================================ %entities; ]> \par \hangindent=\parindent{}\hangafter=1{}\noindent{} % \usepackage{ulem} \normalem \raggedbottom \uline{ } \uuline{ } \dashuline{ } \dotuline{ } {.~.~.} \textit{ } \textcolor{black}{ } \textcolor{red}{ } \textcolor{LightBlue}{ } \textcolor{LightGreen}{ } \textcolor{Lavender}{ } \textcolor{Maroon}{ } \textcolor{pink}{ } \textcolor{DarkRed}{ } \textcolor{blue}{ } \textcolor{orange}{ } \textcolor{teal}{ } \textcolor{DarkViolet}{ } \textcolor{LightPink}{ } \textcolor{green}{ } \textcolor{DarkGreen}{ } \textcolor{Navy}{ } \textcolor{gray}{ } ================================================ FILE: css/README.md ================================================ # Notes on CSS structure and development PreTeXt books expect to use a `theme.css` file for its styling. SCSS is used to build that CSS file. A few themes (the default-modern one and legacy ones that predate SCSS overhaul) are provided "prerolled" in `css/dist`. These can be used without rebuilding from SCSS and even gently modified via the appending of CSS `variables` to customize things like `primary-color`. Other themes, or using `options` to more substantially change a "prerolled" theme, require that the theme is rebuilt. ## Building If a book's theme requires building, the pretext script or CLI should handle all of the build details. If you are using the CLI, it should handle installing the build tools as well. If you are using the pretext script, you will need to [install Node and the build script dependencies manually](../script/cssbuilder/README.md#installing-node-and-dependencies) For more advanced use, including rebuilding themes by hand, see the [CSS Builder script README](../script/cssbuilder/README.md) ### Installing NPM You will need to [install node](https://nodejs.org/en/download/package-manager). Install the needed dependencies by switching to the `pretext/script/cssbuilder` and doing `npm install`. Run `npm run build` to build all the default targets to the output directory (default is `pretext/css/dist`). You can change the directory the build product is produced into with `-o PATH`. If using a relative path, make sure to specify it from the `cssbuilder` folder. ## Folders ### colors Color palettes that ideally can be used across multiple themes, though it is not expected every palette will be available in every theme. These are all designed to produce a variable `$colors` containing a map of variable definitions. The theme is responsible for turning that map into CSS variables via the `scss-to-css` function. If a shared palette needs slight modifications by a given theme, the theme can simply override the individual variables (or add new ones). See the comment in `theme-default-modern` for an example. ### components Shared files that are (or are expected to be) used across many **targets**. Some of these files are in need of refactoring and modularization. See README.md in subfolders of `components/` for tips on organization of subcomponents. ### dist Built CSS ready for inclusion by pretext. Files in the directory **should not be modified by hand**. The CSS build script in `script/cssbuilder` will produce these files from the items in the `targets` directory. ### fonts Mechanisms for selection of fonts by a theme ### legacy Files only used by legacy (pre scss) styles ### targets Root targets that produce a CSS file. Anything that represents a self-contained final product belongs here. Any files that are designed only to be used in one target also belong here, grouped with the target they belong to. For example, if `foo.scss` is only intended to be used by the `reveal` target, that file should be placed in the `revealjs` folder. ### other CSS that is not a part of producing PreTeXt volumes and is not bundled into any target in `dist/` e.g. CSS related to the PreTeXt catalog. ## File "ownership", @use, and copy/paste Files in the `target` folder are considered "owned" by the folder they are in. When making changes to those files you are encouraged to think about other targets in the same "family" that may @use the files, but are not expected to go out of your way to fix issues in those other targets that result from the changes. Files in `components` are "shared". Changes to them should consider (and test) all targets that @use the component. There is a balancing act between the complexity of the include tree for targets and avoiding duplication of effort. Avoid coping/pasting large numbers of rules from one target to another. If you want to reuse some of the rules from another target, consider factoring out those rules into a `component` that the old file and your new one can both @use. But doing so to reuse a small number of CSS rules likely creates more complexity than simply duplicating those rules in your target. ## Tips on differentiating theme code 1) In cases of significantly different CSS, we try to provide different scss files that themes can choose to import (see `_toc-default` vs `_toc-overlay`). As any given theme will only (hopefully) import one of the options, we don't have to worry about cross talk between the CSS. Common features of the two can be factored out into a sheet they both import (`_toc-basics`). 2) In cases of more minor variations, especially those that end up affecting multiple rules (e.g. how much margin to apply, whether or not to round off border corners) we try to pass in a variable to the scss file to control that aspect. Those variables can have defaults that are applied if a theme does not specify a default. The downside here is that variables need to be passed all the way down through any stylesheets that are between the theme and the target sheet. So in this case a theme file like `theme-default-modern` would have to pass $toc-expander-style to `_toc-default` as it imports that and `_to-default` would then have to pass it to `_toc-basics` where it is applied. 3) Differences that are only value differences in CSS properties can be set as cssvaraibles. We use that for lots of the colors. A low level file can set `border-right: 1px solid var(--toc-border-color);`. Then a theme can change --toc-border-color` and the new color is used. 4) The last approach is to just define CSS in the theme SCSS file that adds to or overrides what is produced in the import. This works well if the change only makes sense in the context of a particular theme AND if they are extending what is already there instead of undoing all of the defaults to replace them with something new. We do this for things like Salem making a bunch of the RS elements wider. If the same logic needs to be applied to multiple themes, consider making a mixin file that they can opt into (see `toc-expand-chevrons`). ================================================ FILE: css/colors/_color-helpers.scss ================================================ // This file contains functions and mixins for working with colors in SCSS @use "sass:map"; @use "sass:color"; @mixin set-root-colors($colors, $dark-colors: null) { :root { color-scheme: light; // prevent variable leak through to dark &:not(.dark-mode) { @include scss-to-css($colors); } } @if $dark-colors { :root.dark-mode { color-scheme: dark; @include scss-to-css($dark-colors); } } } // Renders a map of SCSS variables as CSS variables @mixin scss-to-css($colors) { @each $name, $value in $colors { --#{$name}: #{$value}; } } // Create a map of colors that blend $color with $other at $mix-amounts // The resulting map will have keys of the form 'color-other-10' // Indicating 10% of other mixed into color @function mixes($color, $other, $mix-amounts) { $result: (); @each $i in $mix-amounts { $result: map.set($result, '#{$color}-#{$other}-#{$i}', 'color-mix(in oklab, var(--#{$color}), #{$other} #{$i}%)'); } @return $result; } $std-mixes: (1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 65, 70, 75, 80, 85, 90, 95, 96, 97, 98, 99); // Creates a map of color blends for a given color // By default it creates blends with black, white, and gray at $std-mixes amounts // Mixing is done using css color-mix function so that if a theme file has the base // css variable overridden, the blends will be updated accordingly @function get-blends($color, $shades: $std-mixes, $tints: $std-mixes, $tones: $std-mixes, ) { $shades: mixes($color, black, $std-mixes); $tints: mixes($color, white, $std-mixes); $tones: mixes($color, gray, $std-mixes); $blends: map.merge( $tints, $shades ); $blends: map.merge( $blends, $tones ); @return $blends; } //-------------------------------------------------------------------------- // https://jonnykates.medium.com/automating-colour-contrast-ratios-with-sass-e201f3b52797 // Formula there has a typo, need parens around the sum of the three color channels @function text-contrast($color, $light: #ffffff, $dark: #000000) { $color-brightness: round( ( (color.red($color) * 299) + (color.green($color) * 587) + (color.blue($color) * 114) ) / 1000 ); $light-color: round( ( (color.red(#ffffff) * 299) + (color.green(#ffffff) * 587) + (color.blue(#ffffff) * 114) ) / 1000 ); @if abs($color-brightness) < calc($light-color / 2){ @return $light; } @else { @return $dark; } } // @debug "text-contrast(#7b7b55) should be #ffffff: " text-contrast(#7b7b55); // @debug "text-contrast(#9b9b70) should be #000000: " text-contrast(#9b9b70); // @debug "text-contrast(#766f7a) should be #ffffff: " text-contrast(#766f7a); // @debug "text-contrast(#70909b) should be #000000: " text-contrast(#70909b); //--------------------------------------------rgb(25, 25, 24)----------------------- ================================================ FILE: css/colors/_color-vars.scss ================================================ /* Master list of color variables and default values. Variables are defined in SCSS to allow for calculation of values. They are then converted to CSS variables for use in the HTML so authors can, if need be, override them with custom CSS. Any new variable should be added to this file and either defined to another variable or given a reasonable default value for the red-blue default theme. Variables should be semantic, not descriptive i.e. --link-color, not --pretty-blue */ @use "sass:map"; // ============================================================================== // Light theme // ============================================================================== // Page structures $colors: ( // Background of page (gutters if any) "page-color": white, // Background of content area "content-background": white, // Border around content area - also possibly used for internal borders "page-border-color": #ccc, // ------------------------------------------------------------------------------ // Banner/nav related "doc-title-color": #932919, "byline-color": #333, "banner-background": #fafafa, "navbar-background": #ededed, "footer-background": var(--banner-background), // ------------------------------------------------------------------------------ // TOC related "toc-border-color": #666, "toc-background": var(--content-background), "tocitem-background": var(--toc-background), "toc-text-color": var(--body-text-color), // highlight styles are used for hover "tocitem-highlight-background": #671d12, "tocitem-highlight-text-color": white, "tocitem-highlight-border-color": var(--toc-border-color), // active styles are used for the current toc item "tocitem-active-background": #671d12, "tocitem-active-text-color": white, "tocitem-active-border-color": var(--toc-border-color), // level based colors for TOC // levels are not necessarily all used // see the toc-basics.scss for how these are determined "toclevel1-background": var(--content-background), "toclevel1-text-color": var(--toc-text-color), "toclevel2-background": var(--content-background), "toclevel2-text-color": var(--toc-text-color), "toclevel3-background": var(--content-background), "toclevel3-text-color": var(--toc-text-color), // ============================================================================== // Content // ============================================================================== // ------------------------------------------------------------------------------ // Text & titles "body-text-color": #000, "body-title-color": #000, "ptx-image-bg": transparent, "activated-content-bg": rgba(241, 185, 255, 30%), "summary-link-background": var(--button-background), "summary-link-text-color": var(--button-text-color), "summary-link-hover-background": var(--button-hover-background), "summary-link-hover-text-color": var(--button-hover-text-color), // ------------------------------------------------------------------------------ // Links & knowls "link-text-color": #2B5F82, "link-background": transparent, "link-active-text-color": var(--link-text-color), "link-active-background": #cad2e1, "link-alt-text-color": #A62E1C, "link-alt-background": transparent, "link-alt-active-text-color": var(--link-alt-text-color), "link-alt-active-background": #e3d1ce, "knowl-link-color": var(--link-text-color), "knowl-background": #f5f8ff, "knowl-border-color": #e0e9ff, "knowl-nested-1-background": #f5f5ff, "knowl-nested-2-background": #fffff5, "knowl-nested-3-background": #f5ffff, "knowl-nested-4-background": #fff5f5, // ------------------------------------------------------------------------------ // Blocks // Fall back generic block colors: "block-body-background": var(--content-background), "block-border-color": var(--knowl-border-color), "block-head-color": var(--body-text-color), // See below for specific block types "aside-like-link-color": var(--link-text-color), // ------------------------------------------------------------------------------ // Buttons & Widgets "button-background": #ededed, "button-text-color": #333333, "button-border-color": #ccc, "button-hover-background": #c7c7c7, "button-hover-text-color": var(--button-text-color), "dropdown-background": var(--content-background), "dropdown-border-color": var(--toc-border-color), "dropdown-text-color": var(--toc-text-color), "dropdown-hover-background": var(--tocitem-active-background), "dropdown-hover-text-color": var(--tocitem-active-text-color), // ------------------------------------------------------------------------------ // Other "code-background": #fdfdfd, "code-inline-background": #ededed, ); // ============================================================================== // Block types // Variables for specific block types should look like those below. In this file // only "top level" blocks from the -like families are defined. // Other themes/color palettes may define // more specific ones - see palette_quad_chunks.scss for an example. // block-types based on those in entities.ent $block-types: "assemblage-like", "definition-like", "theorem-like", "theorem-like", "axiom-like", "remark-like", "computation-like", "openproblem-like", "aside-like", "proof-like", "example-like", "project-like", "goal-like", "solution-like"; // TODO - "proof" should probably be updated to "proof-like" in HTML css @each $block in $block-types { $colors: map.merge( $colors, ( // define background and border, but default to generic block colors "#{$block}-body-background": var(--block-body-background), "#{$block}-border-color": var(--block-border-color), ) ); } ================================================ FILE: css/colors/_palette-dark.scss ================================================ // Implements a dark theme single color palette using a --primary-color @use "sass:meta"; @use "sass:color"; @use "sass:map"; @use "colors/color-helpers" as colorHelpers; @use "colors/color-vars.scss" as color-vars; $primary-color: #6285ca !default; $background-color: #23241f !default; // Grab all color variables, override some for palette $colors: map.merge( color-vars.$colors, ( "primary-color": $primary-color, "background-color": $background-color, // Background of page (gutters if any) "page-color": var(--background-color), // Background of content area "content-background": var(--page-color), // Border around content area - also possibly used for internal borders "page-border-color": var(--background-color-white-25), // ------------------------------------------------------------------------------ // Banner/nav related "doc-title-color": var(--primary-color), "banner-background": $background-color, "navbar-background": var(--background-color-gray-15), "footer-background": var(--background-color-black-10), // ------------------------------------------------------------------------------ // TOC related "toc-border-color": #555, "toc-text-color": var(--body-text-color), // highlight styles are used for hover/active states "tocitem-highlight-background": var(--primary-color-gray-5), // "tocitem-highlight-text-color": white, "tocitem-highlight-text-color": var(--background-color-black-50), "tocitem-active-background": var(--primary-color-gray-5), // "tocitem-active-text-color": white, "tocitem-active-text-color": var(--background-color-black-50), "toclevel1-background": var(--background-color-gray-10), "toclevel1-text-color": var(--primary-color-white-40), "toclevel2-background": var(--toclevel1-background), "toclevel2-text-color": var(--toclevel1-text-color), "toclevel3-background": var(--content-background), "toclevel3-text-color": var(--toc-text-color), // ============================================================================== // Content // ============================================================================== // ------------------------------------------------------------------------------ // Text & titles "body-text-color": #f2f2f2, "body-title-color": var(--primary-color-white-20), "byline-color": var(--background-color-white-50), "ptx-image-bg": white, "activated-content-bg": rgba(255, 237, 185, 20%), // ------------------------------------------------------------------------------ // Links & knowls "link-text-color": var(--primary-color-white-10), "link-active-background": var(--background-color-gray-30), "link-active-text-color": var(--primary-color-white-40), "link-alt-text-color": var(--link-text-color), "link-alt-active-background": var(--link-active-text-color), "knowl-link-color": var(--doc-title-color), "knowl-background": var(--background-color-black-10), "knowl-border-color": var(--background-color-white-20), "knowl-nested-1-background": var(--background-color-gray-10), "knowl-nested-2-background": var(--background-color-black-10), "knowl-nested-3-background": var(--background-color-gray-10), "knowl-nested-4-background": var(--background-color-black-10), // ------------------------------------------------------------------------------ // Groupings (assemblages, etc...) // ------------------------------------------------------------------------------ // Buttons & Widgets "button-background": var(--background-color-gray-15), "button-border-color": var(--background-color-white-25), "button-hover-background": var(--primary-color-black-50), "button-text-color": var(--body-text-color), // ------------------------------------------------------------------------------ // Other "code-background": var(--background-color-gray-20), "code-inline-background": var(--background-color-gray-20), ) ); // Compute color blends and add them as variables $blends: colorHelpers.get-blends('background-color'); $colors: map.merge( $colors, $blends ); // Compute color blends and add them as variables $blends: colorHelpers.get-blends('primary-color'); $colors: map.merge( $colors, $blends ); ================================================ FILE: css/colors/_palette-dual.scss ================================================ // Implements a palette with two main colors, --primary-color and --secondary-color @use "sass:meta"; @use "sass:color"; @use "sass:map"; @use "colors/color-helpers" as colorHelpers; @use "colors/color-vars" as color-vars; $schemes: ( "blue-red": ( "primary-color": #195684, "secondary-color": #932c1c, ), "blue-green": ( "primary-color": #195684, "secondary-color": #28803f, ), "green-blue": ( "primary-color": #1a602d, "secondary-color": #2a5ea4, ), "greens": ( "primary-color": #193e1c, "secondary-color": #347a3a, ), "blues": ( "primary-color": hsl(217, 70%, 20%), "secondary-color": hsl(216, 42%, 47%), ), ); $palette: 'red-blue' !default; @if not map.has-key($schemes, $palette) { @error "Unknown color scheme #{$palette} for theme. Valid schemes are: #{map.keys($schemes)}"; } // if primary-color or secondary-color are not set, use the scheme colors $primary-color: null !default; $secondary-color: null !default; @if $primary-color == null { $scheme-primary-color: map.get(map.get($schemes, $palette), "primary-color"); $primary-color: $scheme-primary-color; } @if $secondary-color == null { $scheme-secondary-color: map.get(map.get($schemes, $palette), "secondary-color"); $secondary-color: $scheme-secondary-color; } // Start with values from color-vars $colors: map.merge( color-vars.$colors, () ); // Compute color blends and add them as variables $blends: colorHelpers.get-blends('primary-color'); $colors: map.merge( $colors, $blends ); $blends: colorHelpers.get-blends('secondary-color'); $colors: map.merge( $colors, $blends ); // Override some colors $colors: map.merge( $colors, ( "primary-color": $primary-color, "secondary-color": $secondary-color, "link-text-color": var(--primary-color), "link-active-text-color": var(--primary-color-black-20), "link-background": var(--primary-color-white-97), "link-active-background": var(--link-background), "link-alt-text-color": var(--secondary-color-black-10), "link-alt-active-background": var(--secondary-color-white-97), "link-alt-background": var(--secondary-color-white-97), "toc-border-color": var(--primary-color-white-30), "toclevel1-background": var(--primary-color), "toclevel1-text-color": white, "toclevel2-background": var(--primary-color-white-10), "toclevel2-text-color": var(--toclevel1-text-color), "tocitem-highlight-background": var(--secondary-color-white-10), "tocitem-highlight-text-color": white, "tocitem-active-background": var(--secondary-color), "tocitem-active-text-color": white, "doc-title-color": var(--primary-color), "aside-like-body-background": var(--knowl-background), "aside-like-border-color": var(--knowl-border-color), "assemblage-like-body-background": var(--knowl-background), "assemblage-like-border-color": var(--knowl-border-color), "activated-content-bg": color.scale($secondary-color, $lightness: 90%), "goal-like-border-color": var(--secondary-color-white-20), "knowl-background": var(--primary-color-white-97), "knowl-border-color": var(--primary-color-white-30), "knowl-nested-1-background": var(--secondary-color-white-97), "knowl-nested-2-background": var(--primary-color-white-97), "knowl-nested-3-background": var(--secondary-color-white-97), "knowl-nested-4-background": var(--primary-color-white-97), ) ); ================================================ FILE: css/colors/_palette-quad-chunks.scss ================================================ // Defines colors for grouping elements based on four colors to identify // block elements as either main, do, fact, or meta. // Intended to be used as a supplement to a palette that handles non-block elements // See theme-denver.scss for an example // Hint: color palettes general make the most sense if all four colors are distinct // or, if they are not, the close/identical colors are main/fact or do/meta @use 'sass:color'; @use 'sass:map'; $schemes: ( "earth-sea": ( "color-main": #573d31, "color-do": #0f6385, "color-fact": #997562, "color-meta": #358292, ), "leaves": ( "color-main": #105b2f, "color-do": #987436, "color-fact": #29895c, "color-meta": #c7522a, ), "ice-fire": ( "color-main": hsl(210, 45%, 27%), "color-do": hsl(208, 7%, 49%), "color-fact": #0f80b0, "color-meta": #a13838, ), "slate": ( "color-main": hsl(210, 12%, 20%), "color-do": #165976, "color-fact": hsl(210, 5%, 32%), "color-meta": #021e2a, ), "bold": ( "color-main": hsl(221, 61%, 21%), "color-do": #51b39a, "color-fact": #9a51b3, "color-meta": #b3516a, ), "bold2": ( "color-main": hsl(221, 61%, 21%), "color-do": hsl(118, 51%, 42%), "color-fact": hsl(182, 90%, 35%), "color-meta": hsl(51, 84%, 63%), ), "primaries": ( "color-main": #195684, "color-do": #28803f, "color-fact": #195684, "color-meta": #932c1c, ), "primaries2": ( "color-main": #28803f, "color-do": #195684, "color-fact": #28803f, "color-meta": #932c1c, ), ); $palette: 'bold' !default; @if not map.has-key($schemes, $palette) { @error "Unknown color scheme #{$palette} in theme. Valid schemes are: #{map.keys($schemes)}"; } // color-main is for basic groupings and knowls $color-main: null !default; // color-do is for examples and things for the reader to do $color-do: null !default; // color-fact is for statements of fact (definitions/theorems/etc...) $color-fact: null !default; // color-meta is for meta information for the reader (notes/objectives/etc...) $color-meta: null !default; // if a color is not set, use the scheme colors @if $color-main == null { $scheme-color: map.get(map.get($schemes, $palette), "color-main"); $color-main: $scheme-color; } @if $color-do == null { $scheme-color: map.get(map.get($schemes, $palette), "color-do"); $color-do: $scheme-color; } @if $color-fact == null { $scheme-color: map.get(map.get($schemes, $palette), "color-fact"); $color-fact: $scheme-color; } @if $color-meta == null { $scheme-color: map.get(map.get($schemes, $palette), "color-meta"); $color-meta: $scheme-color; } // text color for headings $heading-text-color: white !default; $body-light: 96%; $body-light-alt: 93%; $body-sat: -20%; //lighter version of color-main for knowl borders $color-main-alt: color.adjust(color.scale($color-main, $lightness: 25%), $saturation: $body-sat); //Make light versions of the 4 colors for backgrounds behind $color-main-light: color.adjust(color.change($color-main, $lightness: $body-light), $saturation: $body-sat); $color-do-light: color.adjust(color.change($color-do, $lightness: $body-light), $saturation: $body-sat); $color-fact-light: color.adjust(color.change($color-fact, $lightness: $body-light), $saturation: $body-sat); $color-meta-light: color.adjust(color.change($color-meta, $lightness: $body-light), $saturation: $body-sat); //and an alt of color-main for nested knowls $color-main-light-alt: color.change($color-main, $lightness: $body-light-alt); $colors: ( "color-main": $color-main, "color-meta": $color-meta, "color-do": $color-do, "color-fact": $color-fact, // color-main "block-body-background": $color-main-light, "block-border-color": $color-main-alt, "block-head-color": $heading-text-color, "knowl-background": $color-main-light, "knowl-border-color": $color-main-alt, "knowl-nested-1-background": $color-main-light-alt, "knowl-nested-2-background": $color-main-light, "knowl-nested-3-background": $color-main-light-alt, "knowl-nested-4-background": $color-main-light, ); // block-types based on those in entities.ent $do-types: "exercise-like", "project-like", "solution-like", "example-like"; @each $block in $do-types { $colors: map.merge( $colors, ( // define background and border, but default to generic block colors "#{$block}-body-background": $color-do-light, "#{$block}-border-color": $color-do, ) ); } $fact-types: "definition-like", "proof-like", "theorem-like", "computation-like"; @each $block in $fact-types { $colors: map.merge( $colors, ( // define background and border, but default to generic block colors "#{$block}-body-background": $color-fact-light, "#{$block}-border-color": $color-fact, ) ); } $meta-types: "goal-like", "asside-like", "remark-like"; @each $block in $meta-types { $colors: map.merge( $colors, ( // define background and border, but default to generic block colors "#{$block}-body-background": $color-meta-light, "#{$block}-border-color": $color-meta, ) ); } ================================================ FILE: css/colors/_palette-single-bold.scss ================================================ // Implements a palette with one main --primary-color // More dramatic than _palette-single.scss @use "sass:meta"; @use "sass:color"; @use "sass:map"; @use "colors/color-helpers" as colorHelpers; @use "colors/color-vars" as color-vars; $primary-color: #2a5ea4 !default; // Start with values from color-vars $colors: map.merge( color-vars.$colors, () ); // Compute color blends and add them as variables $blends: colorHelpers.get-blends('primary-color'); $colors: map.merge( $colors, $blends ); $slate: #3a3a3a; // Override some colors $colors: map.merge( $colors, ( "primary-color": $primary-color, "doc-title-color": var(--primary-color), "banner-background": #f8f8f8, "toc-text-color": var(--primary-color-black-30), "toc-border": var(--primary-color-gray-10), "tocitem-highlight-background": $slate, "tocitem-highlight-text-color": #fff, "tocitem-highlight-border-color": $slate, "tocitem-active-background": var(--primary-color-white-15), "toclevel1-text-color": var(--toc-text-color), "toclevel1-background": var(--content-background), "toclevel2-background": var(--primary-color-white-98), "toclevel3-background": var(--primary-color-white-96), "link-text-color": var(--primary-color), "link-active-text-color": var(--primary-color), "link-active-background": var(--primary-color-white-96), "link-alt-text-color": var(--link-text-color), "link-alt-active-background": var(--primary-color-white-96), "body-title-color": var(--primary-color-black-20), "navbar-background": var(--primary-color), "button-background": var(--primary-color), "button-border-color": $slate, "button-text-color": var(--primary-color-white-90), "button-hover-background": $slate, "knowl-background": #f8f8f8, "knowl-border-color": var(--primary-color-gray-80), ) ); ================================================ FILE: css/colors/_palette-single-muted.scss ================================================ // Implements a palette with one main --primary-color used in a very sparing fashion @use "sass:meta"; @use "sass:color"; @use "sass:map"; @use "colors/color-helpers" as colorHelpers; @use "colors/color-vars" as color-vars; $primary-color: #2a5ea4 !default; // Start with values from color-vars $colors: map.merge( color-vars.$colors, () ); // Compute color blends and add them as variables $blends: colorHelpers.get-blends('primary-color'); $colors: map.merge( $colors, $blends ); // Override some colors $colors: map.merge( $colors, ( "primary-color": $primary-color, "link-text-color": var(--primary-color), "link-active-text-color": var(--primary-color-white-40), "link-active-background": var(--background-color-gray-30), "link-alt-text-color": var(--link-text-color), "link-alt-active-background": var(--link-active-text-color), "banner-background": "#fafafa", "toc-border-color": #c9c9c9, "toc-text-color": var(--primary-color-black-30), "tocitem-background": #f2f2f2, "tocitem-active-background": var(--primary-color), "tocitem-highlight-background": var(--primary-color-white-10), // "toclevel1-background": var(--primary-color-white-95), "toclevel2-background": var(--primary-color-white-98), "toclevel3-background": var(--primary-color-white-95), "doc-title-color": var(--primary-color), "body-title-color": "black", "knowl-background": #f8f8f8, "knowl-nested-1-background": var(--knowl-background), "knowl-nested-2-background": var(--knowl-background), "knowl-nested-3-background": var(--knowl-background), "knowl-nested-4-background": var(--knowl-background), "knowl-border-color": var(--primary-color-gray-80), "block-border-color": black, "goal-border-color": var(--primary-color-white-20), ) ); ================================================ FILE: css/colors/_palette-single.scss ================================================ // Implements a palette with one main --primary-color @use "sass:meta"; @use "sass:color"; @use "sass:map"; @use "colors/color-helpers" as colorHelpers; @use "colors/color-vars" as color-vars; $primary-color: #2a5ea4 !default; // Start with values from color-vars $colors: map.merge( color-vars.$colors, () ); // Compute color blends and add them as variables $blends: colorHelpers.get-blends('primary-color'); $colors: map.merge( $colors, $blends ); // Override some colors $colors: map.merge( $colors, ( "primary-color": $primary-color, "banner-background": "#fafafa", "link-text-color": var(--primary-color), "link-active-text-color": var(--primary-color-white-40), "link-active-background": var(--background-color-gray-30), "link-alt-text-color": var(--link-text-color), "link-alt-active-background": var(--link-active-text-color), "toc-border-color": var(--primary-color-white-80), "toc-text-color": var(--primary-color-black-30), "tocitem-active-background": var(--primary-color-white-15), "tocitem-highlight-background": var(--primary-color-white-15), "toclevel2-background": var(--primary-color-white-95), "toclevel3-background": var(--primary-color-white-90), "doc-title-color": var(--primary-color), "body-title-color": var(--primary-color-black-20), "button-hover-background": var(--primary-color-white-80), "assemb-border-color": var(--primary-color-white-50), "block-head-color": white, "knowl-background": var(--primary-color-white-95), "knowl-border-color": var(--primary-color), ) ); ================================================ FILE: css/components/README.md ================================================ # Notes on components folder Components contains pieces shared by all modern scss themes. They are divided into: ## chunks Grouping elements that are generally PreTeXt specific - exercises, knowls, etc... Generally all these will be included by a `chunks-XXXX` file like `_chunks-default.scss`. ## elements Small, relatively self contained pieces of content. These are all included from `components/_pretext.scss` ## helpers Mixins used to help build multiple other components ## interactives Interactive widgets like Runestone, Sage, etc... `interactives/extras` contains optional modifications that a theme can use. ## page-parts Macro structures of the page - TOC, navbar, etc... `page-parts/extras` contains optional modifications that a theme can use. ================================================ FILE: css/components/_google-search.scss ================================================ // TODO - refactor // Make conditional on use of google search??? .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .pretext .searchwrapper .cse .gsc-control-cse input, .searchwrapper .gsc-control-cse { padding: 5px; } // .pretext .searchwrapper .cse .gsc-search-button input.gsc-search-button-v2, // .searchwrapper input.gsc-search-button-v2 { // padding: 2px 2px; // } // .pretext .searchwrapper form.gsc-search-box { // margin: 0; // } // .pretext .searchwrapper table.gsc-search-box { // margin: 0; // } // .pretext .searchwrapper .gsc-search-box-tools .gsc-search-box .gsc-input { // padding: 0; // } // .pretext .searchwrapper .gsib_a { // padding: 0 0 0 5px; // } // .pretext .searchwrapper .gsc-input-box { // height: 3.0ex; // } // .pretext .searchwrapper form.gsc-search-box { // font-size: 12px; // } ================================================ FILE: css/components/_mystery.scss ================================================ // Chunks of code that seem like one off fixes for books that may not exist // This file is not included anywhere else - kept around temporarily for reference .APEXlogo { white-space: nowrap; } .APEXlogo .A { margin-right: -0.07em; } .APEXlogo .P { margin-right: -0.33em; position: relative; top: -0.30em; } .APEXlogo .E { position: relative; top: 0.33em; } #aboelkins-ACS .ptx-main .ptx-content > section:first-of-type > section:first-of-type > .project-like:first-of-type li { font-size: 300% } .toolBPanel { overflow: hidden !important; } .toolBPanel:hover { overflow: auto !important; } .unprocessed { padding: 8px; background-color: rgb(255,230,230) } .unprocessed .unprocessed { margin: 8px; background-color: rgb(255,200,255) } .unprocessed .unprocessed .unprocessed { margin: 8px; background-color: rgb(205,205,255) } .ptx-navbar .preferences_menu_holder .active > li { color: #ddd; } .ptx-navbar .preferences_menu_holder > ol > li:focus { background: #eef; border: 2px solid #909; padding: 2px 24px 2px 8px; } .ptx-navbar .preferences_menu_holder > ol > li > ol > li:focus { background: #eef; border: 2px solid #909; padding: 4px 4px 2px 4px; } .ptx-navbar .preferences_menu_holder .active .selected { background: #eef; color: #111; } .ptx-navbar .button.user-preferences-button { overflow: visible; display: none; } .preferences_menu_holder { z-index: 30; background: #fee; color: #222; position: absolute; left: -11em; top: 4em; } .preferences_menu_holder ol { list-style-type: none; padding: 0; margin: 0; } .preferences_menu_holder > ol { width: 12.5em; } .preferences_menu_holder > ol > li { padding: 4px 26px 4px 10px; } .preferences_menu_holder ol li ol { z-index: 40; position: absolute; left: 13em; top: -2em; background: #fee; } .preferences_menu_holder ol li ol li { padding: 6px 6px 4px 6px; display: flex; align-items: center; } .preferences_menu_holder ol.fonts:not(.hidden) { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; } .preferences_menu_holder ol.fonts li:nth-child(8n+1), .preferences_menu_holder ol.fonts li:nth-child(8n+2), .preferences_menu_holder ol.fonts li:nth-child(8n+3), .preferences_menu_holder ol.fonts li:nth-child(8n+4) { background-color: #eff; } .preferences_menu_holder ol.fonts li:nth-child(4n+2) { width: 4em; justify-content: center; text-align: center; align-items: center; } .preferences_menu_holder ol.fonts li:nth-child(4n+1) { padding-left: 14px; } .preferences_menu_holder .wrap_to_submenu { float: right; line-height: 0.95em; margin-right: -7px; } .preferences_menu_holder .to_submenu { position: absolute; } .preferences_menu_holder .avatars li { font-size: 200%; text-align: center; } .preferences_menu_holder .fontfamily .name { margin-right: 2em; } .preferences_menu_holder .fontfamily .sample { margin-left: auto; } .preferences_menu_holder .fonts .byunits { font-size: 80%; margin-bottom: -0.3em; } #choose_topic { background: #eef; } .ffcheck, .atmospherecheck, .avatarcheck, .rulercheck, .motioncheck { width: 1em; margin-left: 0.2em; margin-right: 0.7em; font-size: 11pt; } .preferences_menu_holder .moveQ { padding-top: 0.5em; border-top: 0.3em solid #eef; } .preferences_menu_holder .moveQ, .preferences_menu_holder .moveQ ~ li { background: #efe; } // No sign of continuation class .para.continuation { margin-top: 0; } pre + .para.continuation, pre + form, div + form { margin-top: 1em; } ul + .para.continuation, ol + .para.continuation, dl + .para.continuation { margin-top: 0.75em; } // theoretically in colophon, but do not match actual html section .para.credit + .para.credit { margin-top: 0.25em; } section .para.credit > .title { font-weight: 700; margin-right: 0.5em; } // No sign of contributors class .frontmatter .contributors, .book .contributors { text-align: center; font-style: normal; } // exercise-stage?? article .exercise-stage { font-family: var(--font-headings); font-weight: 700; color: inherit; font-size: 100%; margin-top: 0.4em; } // .status ??? .discussion-like.status > .heading { display: none; } .discussion-like.status > .heading + .para, .discussion-like.status > .para { font-style: italic; display: block; padding-left: 1em; } // schema doesn't allow for title in paragraph? .paragraphs .para .title { font-family: var(--font-headings); font-size: 1.125em; font-weight: 700; } // --------------------------------------------------- // bug chunk of styles for older style knowls // This entire section causes issues with non-white backgounds. Can't identify actual problem it solves // /* show wide equation overflow even when no scroll bars, // from Jiří Lebl */ // .MJXc-display, .knowl-output .knowl-output .knowl-output .knowl-output .MJXc-display , // pre.prettyprint, // pre.plainprint, // pre.console, // .code-box { // // background-image: linear-gradient(to right, white, white), linear-gradient(to right, white, white), linear-gradient(to right, rgba(0,0,0,.25), rgba(255,255,255,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(255,255,255,0)); // // background-position: left center, right center, left center, right center; // // background-repeat: no-repeat; // // background-color: inherit; // // background-size: 20px 100%, 20px 100%, 10px 100%, 10px 100%; // // background-attachment: local, local, scroll, scroll; // } // .knowl-output .MJXc-display { // background-image: linear-gradient(to right, var(--knowl-background), var(--knowl-background)), linear-gradient(to right, var(--knowl-background), var(--knowl-background)), linear-gradient(to right, rgba(0,0,0,.25), var(--knowl-background)), linear-gradient(to left, rgba(0,0,0,.25), var(--knowl-background)); // } // /* this should have a variable name, maybe? */ // .knowl-output.original .MJXc-display { // background: inherit; // } // .assemblage-like .MJXc-display { // /* // background-image: none; // background-image: linear-gradient(to right, #f4f4fe, #f4f4fe), linear-gradient(to right, #f4f4fe, #f4f4fe), linear-gradient(to right, rgba(0,0,0,.25), rgba(242,242,254,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(242,242,254,0)); // */ // background-image: linear-gradient(to right, var(--assemb-body-background), var(--assemb-body-background)), linear-gradient(to right, var(--assemb-body-background), var(--assemb-body-background)), linear-gradient(to right, rgba(0,0,0,.25), var(--assemb-body-background)), linear-gradient(to left, rgba(0,0,0,.25), var(--assemb-body-background)); // } // .knowl-output .knowl-output .MJXc-display { // background-image: none; // background-image: linear-gradient(to right, #fffff5, #fffff5), linear-gradient(to right, #fffff5, #fffff5), linear-gradient(to right, rgba(0,0,0,.25), rgba(255,255,243,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(255,255,243,0)); // } // .knowl-output .knowl-output .knowl-output .MJXc-display { // background-image: none; // background-image: linear-gradient(to right, #fff5fe, #fff5fe), linear-gradient(to right, #fff5fe, #fff5fe), linear-gradient(to right, rgba(0,0,0,.25), rgba(255,243,254,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(255,243,254,0)); // } /* not sure where this was being used, but it made short knowls * look bad, like the hint here: * SAFurtherReading.html */ .knowl-output .knowl-content > *:last-child:not(.incontext) { margin-bottom: 0.5em; } .knowl-output .knowl .knowl-content > .solution-like, .knowl-output .knowl .knowl-content > .solution-like:not(.incontext) { margin-bottom: 0.15em; } .knowl-output .knowl .knowl-content > .solution-like.hint { border-left: 1px solid #0f0; padding-left: 0.35em; background: #efe; } .knowl-output .knowl .knowl-content > .solution-like.answer { border-left: 2px solid #00f; padding-left: 0.35em; background: #eef; } .knowl-output .knowl .knowl-content > .solution-like.solution { border-left: 3px solid #c0c; padding-left: 0.5em; background: #fef; } .knowl-content > article:first-child, .knowl-content > .solution-like:first-child { /* padding, not margin, to get colored background (and not be absorbed) */ padding-top: 0.25em; } .hidden-knowl-wrapper [data-knowl]::after, .hidden-knowl-wrapper [data-knowl]:hover::after, .hidden-knowl-wrapper .active[data-knowl]::after { right: 7px; } .exercisegroup .exercisegroup-exercises.cols1 .knowl-output { display: block; } .standalone.worksheet article > .knowl-output.original { margin: 0; } .cols2 .knowl-output, .cols3 .knowl-output, .cols4 .knowl-output, .cols5 .knowl-output, .cols5 .knowl-output { width: 100%; } .standalone.worksheet .knowl-content { padding: 0; } // --------------------------------------------------- // Obsoluete mathjax styling? /* maybe the remainder of this case is subsumed by the above, and also does not apply to MJ3 */ .mjx-chtml.MJXc-display { /*Allow users on smaller screens to scroll equations*/ /*horizontally when they don't fit on the screen*/ overflow-x: auto; overflow-y: hidden; } #MathJax_ZoomFrame { position: static; background: white; } #MathJax_Zoom { background-color: inherit; border: 0; padding: 0; position: absolute; overflow-x: auto; overflow-y: visible; left: 10% !important; max-height: none !important; } /* http://sites.wcsu.edu/mbxml/OER_Linear_Alg/glossary.html to fix the extra margin on top of the next term when the previous definition ends in display math May need to make less specific */ dd .displaymath:last-child .MJXc-display { margin-bottom: 0; } /* Example 4.8 of sample article (compare main page of sample book (4^{th} edition)`*/ a .heading .mjx-chtml { z-index: 1; background: #fff; } /* solution to Example 4.2.12 in http://spot.pcc.edu/math/orcca-draft/orcca/section-radical-expressions-and-rational-exponents.html */ .solution ol li > .para:first-child, .solution ol li > .displaymath:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .solution ol li > .displaymath:first-child .MJXc-display { margin-top: 0; } /* to stop things being blue when rendering MathJax with SVG */ a.mjx-svg-href { fill: inherit; stroke: inherit; } // Old UI for sage cell? .ui-dialog.ui-widget.ui-widget-content.ui-corner-all.ui-draggable.ui-resizable { left: 0 !important; top: 0 !important; } // no sign of posterior /* Currently only for Solution to example */ .posterior .heading { font-weight: normal; font-size: 1.125em; line-height: 1.125em; margin-top: 0; } /* if hints and solutions are in .posterior, then * some of the above styling does not apply */ article.exercise-like + .posterior { margin-top: -0.75em; } // Currently only for Solution to example .posterior .heading { font-weight: normal; font-size: 1.125em; line-height: 1.125em; margin-top: 0; } // Can't find use of .wrap figcaption .wrap { margin: 10px; font-size: 100%; text-align: center; } no sign of wrap class &.wrap img { width: 250px; } figure.wrap { float: right; margin-right: 0; margin-left: 30px; } figure img.wrap { float: right; margin: 0; } // Permalinks break these and have for years... currently useless figure.table-like figcaption:first-child { font-style: oblique; margin-top: 0; } figure.table-like figcaption:first-child .type, figure.table-like figcaption:first-child .codenumber { font-style: normal; } // autoterm?? .autoterm [knowl], .autoterm [knowl]:after { font-weight: inherit; color: inherit; padding: 0; margin-bottom: inherit; border-bottom: inherit; border-bottom-color: inherit; } .autoterm [knowl]:hover { background: #ffddff; border-top: 2px dotted purple; border-bottom: 1px dotted red; border-top-left-radius: 0; border-top-right-radius: 0; } // floatnav?? .floatnav { margin-top: 8px; margin-left: 50px; } .floatnav a { padding-left: 3px; /* * omitted, because we put a space in the source padding-right: 3px; */ margin-right: -1px; color: inherit; } .floatnav a:hover { background: #eeaaff; } // tt ?? a > tt { font-size: 110%; } /* next is for the old code formatting js */ pre.prettyprint, pre.plainprint { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; /* preveiously turned off the border and padding from pretty.css */ } pre.prettyprint:before, pre.plainprint:before { content:''; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 2.5em; } /* math directly adajacent to words is wrapped to avoid bad line breaks */ .mathword { white-space: nowrap; } /* Born-hidden example with a very long title */ /* http://physics.thomasmore.edu/ConnectedPhysics/sss-netforce.html */ a .heading { white-space: normal; } .minipage + .minipage { display: inline-block; } // Early attempt at merging Runestone??? /* Runestone nav for Runestone-wide features */ .pretext #brand-navbar, .pretext .brand-navbar { left: 0; position: fixed; right: 0; z-index: 1030; height: 50px; border-width: 0 0 1px; top: 0; margin-bottom: 0; } .pretext #brand-navbar > .container::before, .pretext .brand-navbar > .container::before, .pretext #brand-navbar > .container::after, .pretext .brand-navbar > .container::after { display: none; } .pretext #brand-navbar + .ptx-masthead, .pretext .brand-navbar + .ptx-masthead { margin-top: 50px; } .pretext #brand-navbar .navbar-collapse.collapse, .pretext .brand-navbar .navbar-collapse.collapse { overflow: hidden !important; } .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: 50px; } @media screen and (max-width: 800px) { .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: auto; } } // does not match any current output from xsl hr.ptx-pagebreak { width: 30em; text-align: center; margin-left: auto; margin-right: auto; margin-bottom: 2.0em; margin-top: 0; height: 4em; border: 0; border-bottom: 1px dashed #ccc; } hr.ptx-pagebreak:after { content: "page"; display: inline-block; position: relative; top: 4.0em; font-size: 80%; padding: 0 0.25em; background: white; } // consecutive headings? need sample .exercise-like .task > .heading + .heading { font-weight: 600; /* should be slightly less bold, but some browsers make it bold */ } .exercise-like .task > .heading + .heading + .para, .exercise-like .task > .heading + .heading + div { display: block; margin-top: 0; } // --------------------------------------------------- // spacing rules - these were in pretext/pretext_add_on // attempting to forgo them with simpler spacing rules // table + article { // margin-top: 1em; // } // .image-box + table, // .image-box + .sidebyside > .sbsrow:first-child > .sbspanel > table:first-child { // margin-top: 1.5em; // } // section.introduction + section { // margin-top: 2em; // } // section section + section { // margin-top: 3em; // } // .solution > ol li + li { // margin-top: 0.5em; // } // section > ol:last-child, // section > ul:last-child { // margin-bottom: 1.5em; // } // .objectives { // margin-bottom: 1.25em; // } // li > .heading + ol, // li > .heading + ul { // margin-top: 0.25em; // } // li > .heading + ol > li:nth-child(1), // li > .heading + ul > li:nth-child(1) { // margin-top: 0; // } // li > .heading + ol.cols2 > li:nth-child(2), // li > .heading + ul.cols2 > li:nth-child(2) { // margin-top: 0; // } // /* http://spot.pcc.edu/math/APEXCalculus/sec_prod_quot_rules.html // * solution to Example 2.4.14 // */ // .solution ol li { // margin-top: 1em; // padding-left: 0.5em; // } // /* // nested tasks. see // https://pretextbook.org/examples/sample-article/html/interesting-corollary.html#aBc // */ // article.example-like > .heading + .introduction { // display: inline; // } // article.example-like > .heading + .introduction > .para:first-child { // display: inline; // } // article.example-like > .exercise-like > .para { // margin-top: 1.25em; // } /* end of nested tasks */ // /* // See 10.1.8c in http://faculty.valpo.edu/calculus3ibl/ch10_01_gradient.html // and condider having this replace line 3338 of the general code (which uses .heading + p) // */ // .example-like > .exercise-like > .para:first-of-type { // display: inline; // } // .example-like > .exercise-like > .aside-like { // margin-top: -3em; // } // .example-like > .exercise-like > .aside-like.front { // margin-top: 0; // } // don't appear to work due to permalinks. But not needed // /* we use .para as a wrapper around some "compound" p, so the // first p in .para is block-like because of the .pare */ // .para > p:first-child, // .para > .para:first-child { // display: inline; // } // .paragraphs + .paragraphs { // margin-top: 3em; // } // /* spacing around and after .para, and around and after article */ // .aside-like > .para:first-child, // td > .para:first-child, // .solution-like > .para:first-child { // margin-top: 0; // } // /* for assemblages without a title */ // .assemblage-like > .para:first-of-type { // margin-top: 0; // } // .assemblage-like > .heading + .para { // margin-top: 0.25em; // } // .assemblage-like + .para { // margin-top: 1.75em; // } // .para + table { // margin-top: 1em; // } // table tr td .para + .para { // margin-top: 1em; // } // table + .para { // margin-top: 1.5em; // } // .para + figure.figure-like > table { // margin-top: 1em; // } // .para + pre.prettyprint, // .para + pre.plainprint { // margin-top: 1.25em; // } // .para + .code-box { // margin-top: 1.25em; // } // /* 1.25 = ol top + li top ? looked too big with 0.75 below */ // .exercise-like .para + ol { // margin-top: 0.5em; // } // /* this > may be too restrictive. The purpose is to not put a // top margin on an article at the top of a knowl */ // section > article, section > section.paragraphs, .paragraphs > article { // margin-top: 1.25em; // } // section article + article, // section .introduction + article, // section .para + article, // section .posterior + article { // margin-top: 1.75em; // } // section article > .introduction + article { // margin-top: 1em; // } // section article > .discussion-like { // margin-top: 1em; // } // section article > .discussion-like .para { // margin-top: 1em; // } // article + .posterior { // margin-top: 0.5em; // } // section .para + .tabular-box { // margin-top: 0.75em; // } // section .tabular-box + .tabular-box { // margin-top: 1.0em; // } // section .proof, // section .hiddenproof { // margin-top: 0.75em; // } // section > pre, .para + pre { // margin-top: 1.25em; // } // ol .para + .para, ul .para + .para { // margin-top: 1em; // } // /* see Ex 29 https://yoshiwarabooks.org/linear-functions.html // and ex 2.91 in // https://yoshiwarabooks.org/mfg/MathModels.html */ // .introduction + .sidebyside, // .para + .sidebyside, // ol + .sidebyside, // ul + .sidebyside { // margin-top: 1em; // } // section .heading + .para, // section .title + .para, /* list items have bare .title, not in a .heading */ // section .heading + .introduction > .para:first-child, // section .blob > .para:first-child { // margin-top: 0.25em; // } // /* // * Contents of articles // */ // .conclusion { // margin-top: 1em; // } // .conclusion > .para:first-child { // margin-top: 0.5em; // } // .exercise-like > ol:first-child, // .exercise-like > ul:first-child { // margin-top: 0; // } // .heading + ol, .heading + ul { // margin-top: 0.45em; // } // article .para:first-child { // margin-top: 0; // } ================================================ FILE: css/components/_pretext-search.scss ================================================ @use 'components/helpers/buttons-default' as buttons; .searchbox { .searchwidget { height: 100%; } .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; padding: 1em; left: max(10vw, calc(100vw - 800px) / 2); width: 80vw; max-width: 800px; border: 2px solid var(--body-text-color); background: var(--knowl-background, #eaf0f6); z-index: 5000; display: flex; flex-direction: column; } .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; height: 35px; } .ptxsearch { flex: 1 1; } .closesearchresults { @include buttons.ptx-button; } .detailed_result { margin-bottom: 10px; } .searchresults a:hover { text-decoration: underline; background: var(--link-active-background); } .searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; background: var(--content-background, white); border: 1px solid var(--page-border-color, #ccc); } .searchresults:empty { display: none; } .search-result-bullet { list-style-type: none; } .search-result-score { display: none; } //result qualities .no_result { font-size: 90%; font-weight: 200; } .low_result { font-weight: 200; } .medium_result { font-weight: 500; } .high_result { font-weight: 700; } .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .search-results-unshown-count { margin-top: 0.6em; } .search-result-clip-highlight { background: var(--searchresultshighlight); } .searchresultsbackground { position: fixed; top: 0; background: var(--searchresultsbackground, white); width: 100vw; height: 100%; left: 0; z-index: 4999; } @media screen and (max-width: 800px) { .searchresultsplaceholder { bottom: 10vh; } } } :root { --searchresultsbackground: #fff8; --searchresultshighlight: rgba(255, 255, 0, 50%); } :root.dark-mode { --searchresultsbackground: #0008; --searchresultshighlight: rgba(255, 255, 0, 15%); } ================================================ FILE: css/components/_pretext-web.scss ================================================ // Entry point for web-based themes. Incorporates common PreTeXt styles // and web-specific styles. // Todo - analyze interactives/ and other scss files for items // that belong here // Breakpoint at which the navbar moves to the bottom of the screen $navbar-breakpoint: 800px !default; @use 'components/pretext'; @use 'printing'; @use 'worksheet'; @use 'google-search'; @use 'pretext-search'; @use 'interactives/runestone'; @use 'interactives/other'; @use 'interactives/webwork'; @use 'interactives/sagecell'; @use 'interactives/calculators' with ( $navbar-breakpoint: $navbar-breakpoint, ); @use 'elements/permalinks'; ================================================ FILE: css/components/_pretext.scss ================================================ // Entry point for common styling // It is assumed these are used by both web and epub stylesheets // page-parts/ and chunks/ are not included here as they vary more from theme to theme @use 'spacing'; @use 'elements/lists'; @use 'elements/fillin'; @use 'elements/headings'; @use 'elements/links'; @use 'elements/tables'; @use 'elements/front-matter'; @use 'elements/summary-links'; @use 'elements/footnotes'; @use 'elements/index'; @use 'elements/media'; @use 'elements/figures'; @use 'elements/poem'; @use 'elements/prism'; @use 'elements/math'; @use 'elements/misc-content'; ================================================ FILE: css/components/_printing.scss ================================================ // Basic rules for printing a standard PreTeXt page // Get rid of UI elements. // Leave margin fiddling for system print dialog. // Worksheet and handout printing is handled in print-worksheet.scss @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display:none; } .ptx-page, .ptx-main, .ptx-main .ptx-content { all: unset !important; width: 100%; border: none; padding: 0; margin: 0; } .ptx-sagecell, .tabular, .table-like, .figure-like, .exercise-like { break-inside: avoid; } .heading { break-after: avoid; } .code-inline { border: unset; background: unset; } @page { margin: 0.75in 0.75in 0.75in 0.75in; } } ================================================ FILE: css/components/_spacing.scss ================================================ // Basic spacing for content // Breakpoint at which the navbar moves to the bottom of the screen $navbar-breakpoint: 800px !default; // all styling assumes border-box layout measurement * { box-sizing: border-box; } //---------------------------------------------------------- // Inter item vertical spacing // // Set some baseline minimal inter-item vertical spacings // // Individual items can override this with their own margin. The // user of @layer here forces these rules to all have less precedence // than any rules not in a layer. // Most spacing should be done with margin-top. @layer spacing { // inter-item spacing high level containers :is(section, article, .knowl__content) > *:not(:first-child) { margin-top: 1.5em; } // but tighten up spacing slightly for adjacent paragraphs in a section :is(section, article, .knowl__content) > .para + .para { margin-top: 1em; } // lower-level container elements that are expected to contain sequences of items // tighter spacing here to avoid visually breaking up the minor container .ptx-content :is(ul, td, li, dd, .blockquote, .sbspanel, .para.logical) > *:not(:first-child) { margin-top: 0.5em; } } ================================================ FILE: css/components/_worksheet.scss ================================================ // TODO refactor // Rules in this file apply to both screen and print // Print specific rules should go in a file in targets/print-worksheet stylesheet @use 'components/helpers/buttons-default' as buttons; .heading .print-links { float: right; position: relative; z-index: 100; vertical-align: bottom; .print-link { font-family: var(--font-body); padding: 0.1em 0.2em; } .material-symbols-outlined { margin-top:5pt; } } ================================================ FILE: css/components/chunks/README.md ================================================ Styling for "chunks" of content - containers that are designed to hold other elements and are likely to vary significantly from theme to theme. _chunks-default.scss in css/targets/html/default-modern is a sample aggregator file that provides a one import way to get styling for the chunks. ================================================ FILE: css/components/chunks/_asides-basic.scss ================================================ $border-width: 2px !default; $side-margins: 30px !default; .aside-like { & > .knowl__link { color: var(--aside-like-link-color); border-bottom-color: var(--aside-like-link-color); } & > .knowl__content{ margin-left: $side-margins; margin-right: $side-margins; border: $border-width solid var(--aside-like-border-color); background-color: var(--aside-like-body-background); } } ================================================ FILE: css/components/chunks/_asides-floating.scss ================================================ $float-width: 200px !default; $float-offset: -248px !default; $min-float-width: 1280px !default; @use 'asides-basic'; @media screen and (min-width: $min-float-width) { details.aside-like { position: relative; margin-left: $float-offset; width: $float-width; right: $float-offset; float: right; clear: right; } /* disable in any multicolumn list/exercisegroup */ .multicolumn details.aside-like { position: relative; margin-left: inherit; width: auto; right: 0; float: none; clear: none; } details.aside-like > .knowl__content { margin-left:0; margin-right:0; background-color: var(--aside-like-body-background); z-index: 100; } } ================================================ FILE: css/components/chunks/_codelike.scss ================================================ @mixin code-text { font-family: var(--font-monospace); background: var(--code-background); font-size: .93rem; line-height: 1.2; } @mixin code-inline-spacing { line-height: normal; //prevent extra "padding" based on line-height padding: 0.0625em .15em; } // wide programs need to be scrollable .code-box { overflow-x: auto; } .code-display { overflow-x: auto; //scroll if overflowing font-family: var(--font-monospace); // code-display appears inside .paras and may need space around it margin: 0.5em 0; } .console, .program { border: 1px solid var(--page-border-color); padding: 5px 15px; overflow-x: auto; margin: 0; @include code-text(); } .code-inline { font-family: var(--font-monospace); white-space: pre; color: var(--body-text-color); background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); border-radius: 0.2em; display: inline-block; overflow-x: auto; max-width: 100%; vertical-align: middle; @include code-inline-spacing(); } .prompt.unselectable { user-select: none; } // code blocks are preformatted text that is not a program .code-block { border-left: 1px solid #aaa; padding: 0 15px 5px; overflow-x: auto; background: var(--code-background); margin-top: 0; margin-bottom: 0; @include code-text(); } .code-block::before { content:' '; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3.0em; } @media print { .code-copy { display: none; } } ================================================ FILE: css/components/chunks/_discussion-inline.scss ================================================ @use './helpers/inline-heading-mixin'; .discussion-like { @include inline-heading-mixin.heading; & > .heading { ::after { content: "\2009"; } & + .para { display: inline; } .space, .codenumber, .period { display: none; } .type::after { content: ". "; } } } ================================================ FILE: css/components/chunks/_exercises.scss ================================================ @use '../helpers/cols'; // generate multi column rules for exercises @include cols.allow-cols('.exercise-like'); .exercise-like > .heading { // exercise heading/numbers regular size font-size: inherit; } .exercisegroup { .exercise-like { margin-top: 1em; } > .heading { font-size: 1.10em; line-height: 1.05em; margin-top: 0.75em; display: inline; & + .introduction { display: inline; & > .para:first-child { display: inline; } } } // push the actual exercises down from any possible heading/intro .exercisegroup-exercises { margin-top: 1em; //indent items with padding so cols works correctly on them padding-left: 40px; } .conclusion { margin-left: 40px; // match the padding of the exercisegroup-exercises .heading { // exercise heading/numbers regular size font-size: inherit; } } } // subtasks are indented .exercise-like > .exercise-like.task { margin-left: 20px; } // --------------------------------------------------------- // exercise-wrapper is used for WW problems // these rules need testing/refactoring .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .exercise-wrapper form button:active { background-color: #f0f0f0; } .exercise-wrapper form button + button { margin-left: 0.8em; } .exercise-wrapper, .exercise-wrapper form, .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; /* for live ww to open at 100% wide */ } .knowl .exercise-wrapper, .knowl .exercise-wrapper form, .knowl .exercise-wrapper form > div:first-child { width: 100%; } .exercise-wrapper > .para:first-child, .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } /* next is related to having exercises start in-line with their exercise number, including when a static WW problem is made interactive */ /* not sure this was the right way to do it */ /* see https://opentext.uleth.ca/apex-calculus/sec_antider.html#exercise-722 */ .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .cols2 .heading + .exercise-wrapper { width: auto; } ================================================ FILE: css/components/chunks/_knowls.scss ================================================ /* main knowls styles */ $border-radius: 0px !default; $border-width: 3px !default; $pad: 12px !default; .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowl-link-color); border-bottom: 1px dotted var(--knowl-link-color); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--knowl-background); border-bottom-color: transparent; } .source-view__content { margin: 0.2em 0; } .knowl__content { margin: 0.75em 0; //at least this much space above/below border: $border-width solid var(--knowl-border-color); border-radius: $border-radius; padding: $pad; background-color: var(--knowl-background); .incontext { display: block; font-size: 85%; text-align: right; } } /* nested knowl alt colors */ .knowl__content .knowl__content { background-color: var(--knowl-nested-1-background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-2-background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-3-background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-4-background); } /* spacing tweaks inside knowls */ .knowl__content > figure { margin-left: 0; margin-right: 0; } ================================================ FILE: css/components/chunks/_sidebyside.scss ================================================ // Space all rows in a sbsgroup, no other styling .sbsgroup > *:not(:first-child) { margin-top: 1.5em; } // sidebysides get laid out into a grid with two rows. "Plain panels" without // a caption are in the first row. Panels with things like tables/figures with // captions we want to align are decomposed across two rows. // If there is no content (no captions) in a second row, it will collapse. // 1| plain panel | figure-like/table-like // 2| | figcaption .sbsrow { display: grid; grid-template-rows: auto auto; } .sbspanel { // most sbspanels are in the first row grid-row: 1; // tables and their captions get centered when in panels & > .table > figcaption { text-align: center; } .tabular { overflow-x: auto; margin-left: auto; margin-right: auto; } } // panel content alignment options .sbspanel--top { align-self: start; } .sbspanel--middle { align-self: center; } .sbspanel--bottom { align-self: end; } // sbspanels with figures or tables get decomposed into two rows // both the panel and the figure-like/table-like element should // be ignored by the grid layout so we can place the items inside // the *-like into the grid .sbspanel:has(.figure-like, .table-like), .sbspanel > :is(.figure-like, .table-like) { display: contents; } // first child of decomposed *-like goes to the first row .sbspanel > :is(.figure-like, .table-like) > *:first-child { grid-row: 1; align-items: start; align-self: start; } // and gets alignment info .sbspanel--top > :is(.figure-like, .table-like) > *:first-child { align-items: start; align-self: start; } .sbspanel--middle > :is(.figure-like, .table-like) > *:first-child { align-items: center; align-self: center; } .sbspanel--bottom > :is(.figure-like, .table-like) > *:first-child { align-items: end; align-self: end; } // second child of decomposed *-like goes to the second row .sbspanel > :is(.figure-like, .table-like) > *:nth-child(2) { margin-top: 0.5em; grid-row: 2; width: 100%; } // make sure content for a panel stays in the correct column // otherwise captions may shift left into columns that do not have // second row content @for $col from 2 through 10 { .sbspanel:nth-of-type(#{$col}) * { grid-column: #{$col}; } } ================================================ FILE: css/components/chunks/_solutions.scss ================================================ // /* stacked headings in the solutions backmatter */ section.solutions > .heading + .heading { margin-top: 0.5em; } section.solutions > h3.heading, section.solutions section > h3.heading { font-size: 1.6em; } section.solutions > h4.heading, section.solutions section > h4.heading { font-size: 1.45em; } section.solutions > h5.heading, section.solutions section > h5.heading { font-size: 1.35em; } section.solutions > h6.heading, section.solutions section > h6.heading { font-size: 1.25em; } ================================================ FILE: css/components/chunks/helpers/README.md ================================================ Helpers used to style block elements ================================================ FILE: css/components/chunks/helpers/_C-box-mixin.scss ================================================ // These values can be set on @use to avoid repeating values in each @import $padding: 20px !default; $padding-top: $padding !default; $padding-bottom: $padding !default; $padding-left: $padding !default; $padding-right: $padding !default; $border-radius: 0px !default; $border-width: 3px !default; $font-style: 'normal' !default; $box-padding: 5px !default; $background-color: var(--content-background-background) !default; $border-color: var(--block-border-color) !default; $heading-background: var(--block-border-color) !default; $heading-color: var(--block-head-color) !default; // Block title and left/bottom wrapper @mixin box($border-width: $border-width, $background-color: $background-color, $border-color: $border-color, $heading-background: $heading-background, $heading-color: $heading-color, $padding: $padding, $padding-top: $padding-top, $padding-bottom: $padding-bottom, $padding-right: $padding-right, $padding-left: $padding-left, $font-style: $font-style, $border-radius: $border-radius, $box-padding: $box-padding, $hide-number: false) { &:not(.knowl__content, .born-hidden-knowl) { border-left: $border-width solid $border-color; border-bottom: $border-width solid $border-color; background-color: $background-color; //top padding turns into margin below header padding: 0 $padding-right $padding-bottom $padding-left; @if $border-radius > 0 { border-bottom-left-radius: $border-radius; } & > .heading:first-child { background-color: $heading-background; display: inline-block; color: $heading-color; padding: $box-padding (2 * $box-padding); margin-left: -$padding-left; margin-top: 0; @if $font-style != 'normal' { font-style: $font-style; } @if $hide-number { .codenumber { display: none; } } @if $border-radius > 0 { border-top-right-radius: $border-radius; border-bottom-right-radius: $border-radius; } &:after { //disable any extra junk display: none; } // fake padding under the heading & { //turn off sass warning margin-bottom: $padding-bottom; } //prevent child from adding space & + * { margin-top: 0; } } } } ================================================ FILE: css/components/chunks/helpers/_L-mixin.scss ================================================ // These values can be set on @use to avoid repeating values in each @import $pad: 10px !default; // Generate styles for an L shaped border @mixin border( $border-width: 2px, $style: solid, $head-color: var(--block-head-color), $border-color: var(--block-border-color), $padding: $pad, $L-side: left) { //determine side opposite L $alt-side: if($L-side ==left, right, left); &:not(.knowl__content, .born-hidden-knowl) { padding-#{$L-side}: $padding; border-#{$L-side}: $border-width $style $border-color; & > .heading:first-child { color: $head-color; } &::after { content: ''; border-bottom: $border-width $style $border-color; display: block; margin-#{$alt-side}: auto; margin-#{$L-side}: -$padding; padding-top: $padding; width: 1.5em; } } @at-root .knowl__content & { padding-#{$L-side}: 0; border-#{$L-side}: 0; &::after { display: none; } } } ================================================ FILE: css/components/chunks/helpers/_box-mixin.scss ================================================ // These values can be set on @use to avoid repeating values in each @import $pad: 10px !default; $border-radius: 0px !default; $border-width: 2px !default; // Generate styles for a surrounding box @mixin box($border-width: $border-width, $style: solid, $background-color: var(--block-body-background), $border-color: var(--block-border-color), $head-color: var(--block-head-color), $padding: $pad, $border-radius: $border-radius) { &:not(.knowl__content, .born-hidden-knowl) { border: $border-width $style $border-color; background-color: $background-color; padding: $padding; @if $border-radius > 0 { border-radius: $border-radius; } & > .heading:first-child { display: block; color: $head-color; margin-bottom: 0.5em; } & > *:first-child { margin-top: 0; } } } ================================================ FILE: css/components/chunks/helpers/_heading-box-mixin.scss ================================================ // These values can be set on @use to avoid repeating values in each @import $pad: 20px !default; $border-radius: 0px !default; $border-width: 3px !default; $margin-top: 2.5em !default; $font-style: 'normal' !default; // $font-size: 1.25em !default; $box-padding: 5px !default; $background-color: var(--block-body-background) !default; $border-color: var(--block-border-color) !default; $heading-background: var(--content-background) !default; $heading-color: var(--block-head-color) !default; $side-borders: true !default; // Generate styles for a box with inset heading @mixin box($border-width: $border-width, $style: solid, $background-color: $background-color, $border-color: $border-color, $heading-background: $heading-background, $heading-color: $heading-color, $padding: $pad, $border-radius: $border-radius, $side-borders: $side-borders, $margin-top: $margin-top, $font-style: $font-style, $box-padding: $box-padding, // $font-size: $font-size, $hide-number: false) { // this *should* always work well for reasonable padding/font sizes //$heading-top: calc(-1 * $box-padding - 1.65ex); $heading-top: calc(-1 * ($padding + $box-padding) - 1.65ex); &:not(.knowl__content, .born-hidden-knowl) { border: $border-width $style $border-color; @if not $side-borders { border-left: 0; border-right: 0; } background-color: $background-color; padding: $pad; //extra top-padding to make room for heading padding-top: calc($pad + 0.25ex); // need to control margin to overcome negative margin on heading // !important to override default article styling margin-top: $margin-top !important; @if $border-radius > 0 { border-radius: $border-radius; } & > .heading:first-child { background-color: $heading-background; display: block; color: $heading-color; margin-bottom: 0.5em; padding: $box-padding (2 * $box-padding); // font-size: $font-size; margin-top: $heading-top; width: fit-content; border: 0; //in case picking up border from elsewhere @if $font-style != 'normal' { font-style: $font-style; } @if $border-radius > 0 { border-radius: $border-radius; } @if $hide-number { .codenumber { display: none; } } &:after { //disable any extra junk display: none; } } } // if the first child of a knowl, need just enough margin to clear exposed heading @at-root { .knowl__content *:first-child & { margin-top: 1em; } } } ================================================ FILE: css/components/chunks/helpers/_horizontal-bars-mixin.scss ================================================ // These values can be set on @use to avoid repeating values in each @import $pad: 0px !default; //all sides $border-color: var(--block-border-color) !default; $background-color: var(--content-background) !default; $border-width: 3px !default; $title-pos: "border" !default; // can be "border", "inside", or "outside" $heading-background: var(--content-background) !default; $heading-color: var(--body-text-colorolor) !default; $font-style: 'normal' !default; // Generate styles for a box with horizontal rules @mixin bars($border-width: $border-width, $style: solid, $border-color: $border-color, $background-color: $background-color, $padding: $pad, $title-pos: $title-pos, $heading-background: $heading-background, $heading-color: $heading-color, $font-style: $font-style ) { $heading-top: 0; $heading-left: 0; @if $title-pos == "border" { $heading-top: -1.5em; $heading-left: 10px; } @else if $title-pos == "inside" { $heading-top: 0; } @else if $title-pos == "outside" { $heading-top: 3em; } &:not(.knowl__content, .born-hidden-knowl) { padding: $padding; border-top: $border-width $style $border-color; border-bottom: $border-width $style $border-color; border-left: none; border-right: none; background-color: $background-color; margin-top: 2em; margin-bottom: 1em; } & > .heading:first-child { background-color: $heading-background; display: block; color: $heading-color; margin-bottom: 0.5em; // font-size: $font-size; margin-top: $heading-top; margin-left: $heading-left; width: fit-content; padding: 5px 1em; $font-style: $font-style; } } ================================================ FILE: css/components/chunks/helpers/_inline-heading-mixin.scss ================================================ // Generate styles for an inline heading @mixin heading { & > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; // disable underline that may come from underlined headings &:after { content: "\2009"; } // Following sibling also needs to be inline for heading to line up correctly // For now limit to logical paragraphs and introductions as they seem to cover // the plain text cases. Not clear we would want same treatment for other // kinds of content & + :is(.para, .para.logical, .introduction) { display: inline; // possible first child that is the actual text & > .para:first-child { display: inline; } // an introduction could have a para.logical with a para & > .para.logical:first-child > .para:first-child { display: inline; } } } } ================================================ FILE: css/components/chunks/helpers/_sidebar-mixin.scss ================================================ // These values can be set on @use to avoid repeating values in each @import $pad: 10px !default; //all sides $padside: 15px !default; //on side with border $border-radius: 0px !default; //on side with border $border-color: var(--block-border-color) !default; $background-color: var(--content-background) !default; $side: left !default; $border-width: 2px !default; // Generate styles for a sidebar down left or right of content @mixin box($border-width: $border-width, $style: solid, $border-color: $border-color, $background-color: $background-color, $padding: $pad, $padside: $padside, $side: $side, $border-radius: $border-radius) { &:not(.knowl__content, .born-hidden-knowl) { padding: $padding; padding-#{$side}: $padside; border-#{$side}: $border-width $style $border-color; background-color: $background-color; @if $border-radius > 0 { border-radius: $border-radius; } > .heading:first-child { margin-top: 0; } } } ================================================ FILE: css/components/elements/README.md ================================================ Styling for basic content elements ================================================ FILE: css/components/elements/_description-lists.scss ================================================ /* dl is used for glossaries and descriptions lists. Glossaries are simple: bold word by itself on a line. Definition indented on the next line. Vertical space before the next term. Description lists are more complicated. The wider version (refering to the horizontal indentation of the definition; this is the default) has the (wrapped) term inline with the definition. The narrow version is complicated because the term is inline with its definition if it fits, otherwise it is on the line above. That means the vertical space between entries can't be handled by a top margin on the dt. Instead we have an ::after on the dd . */ $wide-dt-width: 25ex; dl:is(.description-list, .glossary) { margin: 0; //overflow: hidden; // Removed to show permalinks dt { font-weight: bold; max-width: 55ex; } dd::after { content: ""; display: block; clear: both; } } .para > dl:is(.description-list) { // add some space when inside a .para margin-top: 0.5em; margin-bottom: 0.5em; } dl.glossary { dt { margin-top: 1.25em; &:first-of-type { margin-top: 0; } } dd { margin-left: 5ex; } } dl.description-list { dt, dd { margin-top: 1em; &:first-of-type { margin-top: 0; } } dt { float: left; clear: both; text-align: right; width: 18ex; margin-right: 1ex; } dd { margin-left: 22ex; } &.narrow { dt { width: 11ex; } dd { margin-left: 15ex; } } &.wide { dt { width: $wide-dt-width; } dd { margin-left: 29ex; } } } dl.description-list dt:first-of-type { clear: none; } .description-list + * { clear: both; } /* where do we have nested dl? */ dl.description-list dl dt { width: 8ex; } dl.description-list dd dd { margin-left: 18ex; } dl.description-list dl dd { margin-left: 12ex; } @media screen and (max-width: 480px) { dl.description-list dt, dl.description-list.narrow dt { float: none; margin-left: 0; text-align: left; width: $wide-dt-width; } dl.description-list dd, dl.description-list.narrow dd, dl.description-list.wide dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } ================================================ FILE: css/components/elements/_figures.scss ================================================ figure { clear: both; position: relative; // override browser margins margin-left: 0; margin-right: 0; } figcaption { margin-left: auto; margin-right: auto; margin-top: 0.5em; code.code-inline { white-space: pre; } .codenumber, .type { font-weight: 700; } // add n-dashes .codenumber::after, .type:last-of-type::after { content: "\2002"; } // make sure first para comes right after title .para:first-of-type { display: inline; } } // tables are inset figure.table-like { margin-left: 30px; margin-right: 30px; // but lists can go full right .list { margin-right: 0; } } @media (max-width <= 943px){ .figure-like { overflow-x: auto; } } ================================================ FILE: css/components/elements/_fillin.scss ================================================ .fillin { display: inline-block; border: none; border-width: 1px; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; &.underline { border-bottom-style: solid; border-width: 1px; } &.box { outline: 1px solid var(--body-text-color); height: 1.3em; } &.shade { background-color: var(--fillin-background-color, #eee); height: 1.3em; } } :root.dark-mode { --fillin-background-color: #444; } ================================================ FILE: css/components/elements/_footnotes.scss ================================================ $border-radius: 0px !default; .ptx-footnote { display: inline-block; position: relative; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: smaller; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote[open] .ptx-footnote__number sup { display: none; } .ptx-footnote__number { display: inline-block; cursor: pointer; min-width: 1em; //hopefully enough space... } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowl-background); border-radius: $border-radius; padding: 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowl-border-color); //reset color/weight/size in case used in block that changed them // e.g. theorem title in denver color: var(--body-text-color); font-weight: normal; font-size: var(1rem); } ================================================ FILE: css/components/elements/_front-matter.scss ================================================ // Styles for the items that are (at least generally) a part of the front matter // There are some pretty generic class names. Those get wrapped with a class // limiting their scope to the expected page .frontmatter { & > .heading { display: block; text-align: center; } & > .heading .title, .book > .heading .title { font-size: 1.3em; } & > .heading .subtitle, .book > .heading .subtitle { display: block; font-weight: normal; color: var(--byline-color); font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } & > .para:first-of-type { margin-top: 4em; } & > .author, & > .credit { margin-top: 2em; text-align: center; } .author:first-of-type { margin-top: 4em; } & > .author .author-name { font-size: 120%; } .date { display: block; margin-top: 2em; text-align: center; } .credit .title { font-size: 1em; } .credit .author { font-size: 0.9em; margin-top: 0.75em; } .author-info { font-size: 90%; } .summary-links { margin-top: 4em; } .abstract { margin: 4em 2em; } .keywords, .support { margin-top: 2em; } .abstract, .keywords, .support { & > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } & > .title::after { content: ".\2009\2009\2009"; } & > .title + .para { display: inline; } } .colophon { .copyright { margin-top: 2.5em; } .license { margin-top: 2.5em; } } } ================================================ FILE: css/components/elements/_headings.scss ================================================ // headings for standard page elements - sections/articles/etc... // more specialized headings (exercises) should be defined in the specific component // complex stylizing (like boxes) should be done by "chunks" // reset size/margin for headings .heading:is(h1, h2, h3, h4, h5, h6) { margin: 0; font-size: unset; } .heading { line-height: 1.1; font-family: var(--font-headings); font-weight: 700; margin-top: 0; margin-bottom: 0; } section > .heading { font-size: 1.75em; color: var(--body-title-color); line-height: 1.25em; margin-top: 2.5em; margin-bottom: 0.5em; // pull in any following items that default to a larger top margin & + * { margin-top: 0.5em; } } .ptx-content > section > .heading { //first heading on page margin-top: 0.5em; } section section > .heading { font-size: 1.5em; margin-top: 2em; } section section section > .heading { font-size: 1.40em; margin-top: 2em; } article > .heading { font-size: 1.25em; margin-top: 1.5em; // pull in any following items that default to a larger top margin & + * { margin-top: 0.5em; } } .paragraphs > .heading { font-size: 1.125em; } // heading followed by no content and then a subsection that starts with heading :is(section, article) > .heading + :is(section, article) > .heading { margin-top: 0.5em; } // smaller headings on phone screens @media screen and (max-width: 480px) { section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } section section > .heading { font-size: 1.3em; line-height: 1.15em; } section section section > .heading { font-size: 1.15em; line-height: 1em; } } .heading.hide-type > .type { display: none; } ================================================ FILE: css/components/elements/_index.scss ================================================ /* the index at the back of the book */ // TODO - refactor .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; /* * * omitted, because we put a space in the source * padding-right: 3px; * */ margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after{ content: ""; display: inline-block; } .indexjump a:nth-of-type(14){ padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: var(--activated-content-bg); } .indexitem { margin-top: 4px; } .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .indexknowl { margin-left: 0.11em; } em + .indexknowl { margin-left: -0.25em; } .indexknowl a { margin-left: 2em; } .indexitem .see, .subindexitem .see, .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .indexitem .seealso, .subindexitem .seealso, .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .indexitem .see em, .subindexitem .see em, .subsubindexitem .see em, .indexitem .seealso em, .subindexitem .seealso em, .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } /* note that multiple things after "see" are in separate spans */ .indexitem .see + .see, .subindexitem .see + .see, .subsubindexitem .see + .see, .indexitem .seealso + .seealso, .subindexitem .seealso + .seealso, .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .indexitem .indexknowl { font-size: 90%; } .indexitem [data-knowl], .subindexitem [data-knowl], .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .indexknowl [data-knowl]:hover, .indexknowl .active[data-knowl] { margin-left: 2em; } .subindexitem .indexknowl { font-size: 95%; } .subsubindexitem .indexknowl { font-size: 95%; } .indexletter { margin-top: 1.5em; } ================================================ FILE: css/components/elements/_links.scss ================================================ // Reset for all links a { color: var(--link-text-color); text-decoration: none; &:hover, &:focus { text-decoration: none; } } a[href^="mailto:"] { white-space: pre; } // Body links. .ptx-content to avoid hitting navbar, toc, etc... .ptx-content { a.internal { color: var(--link-text-color); font-weight: bold; } a.external { color: var(--link-alt-text-color); font-weight: bold; } a.internal:hover, a.internal:hover *, a.internal:focus, a.internal:focus * { color: var(--link-active-text-color); background-color: var(--link-active-background); font-weight: bold; } a.external:hover, a.external:hover *, a.external:focus, a.external:focus * { color: var(--link-alt-active-text-color); background-color: var(--link-alt-active-background); font-weight: bold; } } ================================================ FILE: css/components/elements/_list-styles.scss ================================================ // Types of ol/ul - used by web and ebooks // Any spacing should be in _lists.scss, not here ol.no-marker, ul.no-marker, li.no-marker { list-style-type: none; } ol.decimal { list-style-type: decimal; } ol.lower-alpha { list-style-type: lower-alpha; } // Match LaTeX style for second level (i.e. level="1") lists ol.lower-alpha-level-1 > li::marker { content: "("counter(list-item,lower-alpha)") "; } ol.upper-alpha { list-style-type: upper-alpha; } ol.lower-roman { list-style-type: lower-roman; } ol.upper-roman { list-style-type: upper-roman; } ul.disc { list-style-type: disc; } ul.square { list-style-type: square; } ul.circle { list-style-type: circle; } ================================================ FILE: css/components/elements/_lists.scss ================================================ // Entry point for ol/ul/dl web styling @use "list-styles"; @use "description-lists"; @use '../helpers/cols'; // generate multi column rules for lists @include cols.allow-cols('li'); // use .ptx-content to avoid styling lists in toc/header/etc... .ptx-content { ol, ul { ol, ul { // margin-top: 0.5em; } } li { margin-top: 0.5em; // margin-bottom: 0; // & > .para:first-child { // margin-top: 0; // } .li--heading-title { font-size: 100%; font-weight: normal; font-style: italic; } } } // .ptx-content .para > :is(ol, ul) { // add some space when inside a .para margin-top: 0.5em; margin-bottom: 0.5em; } // provide space for custom markers ol > li { padding-left: 0.25em; } ================================================ FILE: css/components/elements/_math.scss ================================================ // TODO - refactor .displaymath { overflow-x: auto; overflow-y: hidden; } .displaymath mjx-container[jax="CHTML"][display="true"] { margin: 0 0 0 0; // container is going to apply margin, so remove it from mjx-container padding-top: .3em; // backport MJ4 padding to MJ3 } .process-math mjx-container svg { // remove the background that is normally applied to svg's by PreTeXt CSS // we use .process-math instead of .displaymath to get inline math as well. background: none; } // ? [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } /* remove this when MathJax fixes the bug that was setting the width to 0 */ /* as in $x=0$. becomes $x=0\text{.}$ */ .knowl mjx-mtext > mjx-utext, mjx-mtext > mjx-utext { width: revert !important; } mjx-msup mjx-utext, mjx-msub mjx-utext { display: inline; } ================================================ FILE: css/components/elements/_media.scss ================================================ // --------------------------------------------- // containers for images, audio, video, and asymptote .image-box, .audio-box, .video-box, .asymptote-box { position: relative; } .image-box .asymptote-box iframe.asymptote, iframe.asymptote, .video-box .video, .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } // images in containers should grow to fit space .image-box img, img.contained { width: 100%; } .asymptote-fullsize-link { text-align: center; font-size: 0.9em; } // --------------------------------------------- // images .ptx-content img, .ptx-content svg { // for body images in dark mode, we want to be able to force a light colored background // as most transparent images will assume that the background is white background: var(--ptx-image-bg); } // but mermaid svg should always have a transparent background .mermaid > svg { background: none; } .image-description { summary { list-style: none; // no marker cursor: pointer; } } // download links after an image .image-archive { margin: 0.75em auto 0; font-family: var(--font-monospace); justify-content: center; display: flex; gap: 0.5em; } // TODO - refactor mag_popup JS and CSS // was .ptx-content .image-box > img:not(.draw_on_me):not(.mag_popup) .image-box > img:not(.mag_popup) { cursor: zoom-in; } img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; } .mag_popup_container { width:100%; position:absolute; z-index:1001; overflow-x: visible; } // --------------------------------------------- // other .audio { width: 100%; } .video-poster { cursor: pointer; } ================================================ FILE: css/components/elements/_misc-content.scss ================================================ // Miscellaneous stylized content blocks that are not complex enough // to warrant their own file em.alert { font-weight: bold; } .bib { margin-top: 0.25em; .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .bibitem + .bibentry { display: inline-block; width: 90%; margin-top: 0; } } .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .contributor { margin-top: 1.5ex; &:first-child { margin-top: 0em; } & + .para { margin-top: 3ex; } .contributor-name { font-variant: small-caps; } .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } } // Icon font settings .material-symbols-outlined { font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 } iframe { margin: 0; border: none; } .kbdkey { background: #f1f1f1; color: #333; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .unit, .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; sub, sup { word-spacing: normal; } } .terminology { font-style: italic; font-weight: bold; } .times-sign { font-size: larger; vertical-align: -0.15ex; } .emphasis { font-style: italic; .emphasis { font-weight: bold; } } .definition-like .emphasis { font-weight: 700; } article.theorem-like .emphasis { font-weight: 700; } .para { line-height: 1.35; } .hidden { display: none !important; } /* genus and species in italics */ .taxon { font-style: italic; } .quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .booktitle { font-style: oblique; } /* Adapted from William Hammond (attributed to David Carlisle) */ /* "mathjax-users" Google Group, 2015-12-27 */ .latex-logo {font-family: "PT Serif", "Times New Roman", Times, serif;} .latex-logo .A {font-size: 75%; text-transform: uppercase; vertical-align: .5ex; margin-left: -.48em; margin-right: -.2em;} .latex-logo .E {vertical-align:-.5ex; text-transform: uppercase; margin-left: -.18em; margin-right: -.12em; } ================================================ FILE: css/components/elements/_permalinks.scss ================================================ // TODO - refactor $opacity: 0.0 !default; /* So that we can position things (like .autopermalink) absolutely wrt these items. Any element whose permalink should be positioned directly to the left of it should be in this list. */ section, article, li, blockquote, figcaption, dt, .exercisegroup, .discussion-like, .solution-like, .para { position: relative; } .autopermalink { position: absolute; display: inline-block; top: 0.5ex; left: -2em; font-size: 85%; // variable allows theme to set different opacities for dark/light opacity: var(--permalink-opacity, $opacity); transition: opacity 0.2s; margin-top: 0 !important; user-select: none; } li > .autopermalink { left: -3.5em; } .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } // Move permalink for division titles etc a little bit lower .appendix > .autopermalink, .chapter > .autopermalink, .index > .autopermalink, .section > .autopermalink, .subsection > .autopermalink, .references > .autopermalink, .exercises > .autopermalink { top: 1.5ex; } // In some styles, the autopermalink for paras land right on the border line. // This is an attempt to fix that. TODO: find a more robust solution, maybe // using a variable for the left offset of paras inside blocks. .assemblage-like > .para > .autopermalink, .example-like > .para > .autopermalink, .example-like > .exercise-like > .autopermalink, .project-like > .para > .autopermalink, .project-like > .exercise-like > .autopermalink, .project-like > .exercise-like > .introduction > .para > .autopermalink, .project-like > .exercise-like > .conclusion > .para > .autopermalink, .remark-like > .para > .autopermalink { left: -2.9em; } .axiom-like, .example-like, .exercise-like, .solution-like, .assemblage-like, .definition-like, .remark-like, .project-like, .openproblem-like, .computation-like, .theorem-like, .proof, .case, li, dd { > .para:first-of-type > .autopermalink { display:none; } > .introduction > .para:first-of-type > .autopermalink { display:none; } } // Hover effects .ptx-content:has(.autopermalink:hover) .autopermalink { opacity: 0.2; } .ptx-content:has(.autopermalink:hover) .autopermalink:hover { opacity: 1; } .autopermalink:has(a:focus-visible) { opacity: 1; } .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: var(--content-background); border: 3px solid var(--page-border-color); z-index: 2001; } /* when jumping to a permalink, push down so sticky navbar does not cover */ :target { scroll-margin-top: 45px; // the "pink flash" when navigating to a target animation: target-fade 10s 1; } @keyframes target-fade { 0% { background-color: var(--activated-content-bg) } 100% { background-color: inherit; opacity: 1; } } ================================================ FILE: css/components/elements/_poem.scss ================================================ /* style for poems */ .poem { display: table; margin: 0 auto; width: auto; max-width: 90%; } .poem > .heading { display: block; text-align: center; } section article.poem > .heading::after { content: ""; } .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .poem .author { font-style: italic; margin-top: 0.75em; } .poem .author.left { text-align: left; } .poem .author.center { text-align: center; } .poem .author.right { text-align: right; } .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .poem .stanza + .stanza { margin-top: 1em; } .poem .heading + .stanza { margin-top: 0.2em; } .poem .heading + .line { margin-top: 0.2em; } .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .poem .line.center { text-align: center; } .poem .line.right { text-align: right; } .poem .tab { margin-left: 2em; } ================================================ FILE: css/components/elements/_prism.scss ================================================ @use '../chunks/codelike'; // Prism stylesheets built locally as default ones don't support light/dark switching // this is a merged version of the default and dark themes // Default prism styling // Blocks pre[class*="language-"] { margin: 0; overflow: auto; border: 1px solid #e1e1e1; } // Inline code :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } code[class*="language-"], pre[class*="language-"] { color: black; background: #fdfdfd; text-shadow: none; font-family: var(--font-monospace); text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.2; tab-size: 4; hyphens: none; &.code-inline { // unclobber some inline code styles @include codelike.code-inline-spacing(); } &::selection, & ::selection { background: #b3d4fc; } .token { &:is(.comment, .prolog, .doctype, .cdata) { color: #2a9716; } &.punctuation { color: #000; } &.namespace { opacity: .9; } &:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: rgb(41, 120, 15); } &:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #a11; } &:is(.operator, .entity, .url) { color: #000; background: none; } &:is(.atrule, .attr-value, .keyword) { color: #0679B7; } &.function, &.class-name { color: #30a; } &.important, &.variable { color: rgb(0, 0, 0); } &.important, &.bold { font-weight: bold; } &.italic { font-style: italic; } &.entity { cursor: help; } } // ------------------------------------------- // Line numbers &.line-numbers { position: relative; padding-left: 3.8em; counter-reset: linenumber; overflow: auto; > code { position: relative; white-space: inherit } .line-numbers-rows { position: absolute; pointer-events: none; top: 0; font-size: 100%; left: -3.8em; width: 3em; letter-spacing: -1px; border-right: 1px solid #999; user-select: none } .line-numbers-rows > span { display: block; counter-increment: linenumber } .line-numbers-rows > span::before { content: counter(linenumber); color: #999; display: block; padding-right: .8em; text-align: right } } // ------------------------------------------- // Line highlighting .line-highlight { position: absolute; margin-top: 4px; // tune to match padding of containing pre left: 0; right: 0; padding: inherit 0; font-size: inherit; background: hsla(24, 20%, 50%, 8%); pointer-events: none; line-height: inherit; white-space: pre } } // ------------------------------------------- // Dark mode :root.dark-mode { /* Code blocks */ pre[class*="language-"] { border: 1px solid #3d3d3d; } // Darker styling to match Runesone's code mirror theme code[class*="language-"], pre[class*="language-"] { color: white; background: hsl(0, 0%, 8%); &::selection, & ::selection { background: hsl(200, 4%, 16%); } /* Make the tokens sit above the line highlight so the colours don't look faded. */ .token { position: relative; z-index: 1; &:is(.comment, .prolog, .doctype, .cdata) { color: #68a950; } &.punctuation { color: white; opacity: 1; } &.namespace { opacity: .9; } &:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: #abc792; } &:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #ca9147; } &:is(.operator, .entity, .url) { color: white; } &:is(.atrule, .attr-value, .keyword) { color: #2d94fb; } &.function, &.class-name { color: #e3e1c2; } &.important, &.bold { font-weight: bold; } &.italic { font-style: italic; } &.entity { cursor: help; } } } .line-highlight { background: hsla(0, 0%, 33%, 10%); border-bottom: 1px dashed hsl(0, 0%, 33%); border-top: 1px dashed hsl(0, 0%, 33%); z-index: 0; } } @media print { code[class*="language-"], pre[class*="language-"] { .line-highlight { color-adjust: exact } } } ================================================ FILE: css/components/elements/_summary-links.scss ================================================ /* Start of division toc links */ // .ptx-content to override _links rules .ptx-content .summary-links { font-family: var(--font-headings); display: block; margin-top: 1em; a { color: var(--summary-link-text-color); background: var(--summary-link-background); font-size: 1.5em; line-height: 1.25em; padding: 10px 20px; padding-right: 60px; border-radius: 3px; position: relative; display: block; font-weight: unset; .title{ font-style: normal; } .codenumber { margin-right: 0.41667em; } &::after { // triangles right: 0.83333em; content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid var(--summary-link-text-color); } &:hover { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); // need to override work done in _links * { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .title { font-weight: normal; } &::after { border-left: 0.4em solid var(--summary-link-hover-text-color); } } } ul { list-style-type: none; padding: 0; margin-top: 0; } li { margin-top: 5px; } } @media screen and (width <= 480px) { .ptx-content .summary-links a { //shrink on mobile font-size: 100%; line-height: 1.25em; } } ================================================ FILE: css/components/elements/_tables.scss ================================================ // limit rules targeting basic elements to just content area .ptx-content { table { border-spacing: 0; border-collapse: collapse; } td { padding: 2px 5px; font-size: 90%; img { max-width: 200px; margin-right: 30px; } } th { padding: 2px 5px; } // generate alignment/border mixin classes for both th and td @each $cell-type in (th, td) { #{$cell-type} { .lines { white-space: nowrap; } // horizontal alignment options @each $class, $align in (l: left, c: center, r: right, j: justify) { &.#{$class} { text-align: $align; } } // vertical alignment options @each $class, $align in (t: top, b: bottom, m: middle) { &.#{$class} { vertical-align: $align; } } // border options @each $side, $side-symbol in (left: l, right: r, top: t, bottom: b) { @for $i from 0 through 3 { &.#{$side-symbol}#{$i} { @if $i ==0 { border-#{$side}: none; } @else { border-#{$side}: #{$i}px solid var(--body-text-color); } } } } } } // when cells do not have a border on left and right, add padding th.r0.l0, td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } tr.header-vertical { th { writing-mode: vertical-rl; transform: rotate(180deg); // match LaTeX's vertical header orientation padding-top: 5px; // bottom after rotation } } .center { table { text-align: center; margin-left: auto; margin-right: auto; } } } // Rules with non-generic targeting .tabular-box { margin-top: 0.5em; //minimum space above to separate from figcaption overflow-x: auto; } .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } // More specific types of tables table.notation-list { tr { th { text-align: left; margin-left: 1em; } td { text-align: left; vertical-align: top; } } } ================================================ FILE: css/components/elements/extras/_heading-underlines.scss ================================================ $color-light: var(--primary-color-white-30) !default; $color-dark: var(--primary-color-black-30) !default; $thickness: 2px !default; $padding: 3px !default; $thickness-h2: 4px !default; $thickness-h3: 3px !default; section > .heading { padding-bottom: $padding; border-bottom: $thickness solid $color-light; } section > h2.heading { border-bottom-width: $thickness-h2; } section > h3.heading { border-bottom-width: $thickness-h3; } :root.dark-mode { section > .heading { border-bottom-color: $color-dark; } } ================================================ FILE: css/components/helpers/README.md ================================================ Mixins used to build style rules in other files ================================================ FILE: css/components/helpers/_buttons-default.scss ================================================ $border-radius: 0 !default; @mixin ptx-button( $border-radius: $border-radius ) { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: $border-radius; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; // Disable accidental text-selection user-select: none; &:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } &:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } &.disabled { opacity: .4; cursor: not-allowed; } &.hidden { display: none; } &.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } } @mixin ptx-dropdown-button { position: relative; .dropdown-content { display: none; position: absolute; background-color: var(--dropdown-background); min-width: 160px; z-index: 100; border: 1px solid var(--dropdown-border-color); right: 0; top: 35px; text-align: start; padding: 0; a { display: block; text-decoration: none; color: var(--dropdown-text-color); padding: 2px 8px; &:is(:hover, :focus-visible) { background-color: var(--dropdown-hover-background); color: var(--dropdown-hover-text-color); } } hr { color: var(--dropdown-border-color); margin: 4px 0; } } &:is(:hover, :focus-visible, :focus-within) { overflow: visible; .dropdown-content { display: block; } } } ================================================ FILE: css/components/helpers/_cols.scss ================================================ // columns are arranged in row-major order to match print output in LaTeX :is(.cols2, .cols3, .cols4, .cols5, .cols6) { display: flex; flex-wrap: wrap; justify-content: start; } // see lists and exercises for sample use @mixin allow-cols($el, $col-gap: 2em) { @for $i from 2 through 6 { .cols#{$i} > #{$el} { // columns are a suggestion enforced by a minimum size // content that needs to be wider can reduce number of columns // in its row min-width: calc(100% / $i - #{$col-gap}); width: min-content; margin-right: $col-gap; } } } ================================================ FILE: css/components/helpers/_expandable.scss ================================================ // Styling for elements in ptx-main that are allowed to expand past normal width // of ptx-content. // Assumes that $content-padding is set to the padding of ptx-content // and that element normally takes up 100% of parent width. (Like display-math) // for responsive elements $width-hard-cap: 900px !default; $base-content-width: 600px !default; $content-padding: 48px !default; $always-expand: false !default; // whether to always expand to the max width $centered: false !default; // whether to center the content if not max width $content-with-padding-width: $base-content-width + 2 * $content-padding; // for scrollable $overflow-y-scroll: hidden !default; // An element that has some minimum authored width which may be larger // than the available width. We want it to scroll horizontally. @mixin scrollable( $overflow-y-scroll: $overflow-y-scroll ) { overflow-x: auto; $overflow-y: $overflow-y-scroll; } // An element with no minimum width that we want to allow to expand // to whatever width is available to maximize the display area. @mixin responsive( $base-content-width: $base-content-width, $width-hard-cap: $width-hard-cap, $content-padding: $content-padding, $always-expand: $always-expand, $centered: $centered ) { @container ptx-main (width > #{$base-content-width + 2 * $content-padding}) { --max-width: calc(min((100cqw - 2 * #{$content-padding}), #{$width-hard-cap})); min-width: 100%; clear: right; // clear any floats @if $always-expand { width: var(--max-width); } @else { width: fit-content; //grow if space needed } max-width: var(--max-width); @if $centered { margin-left: calc(-0.5 * (100cqw - #{$content-with-padding-width})); } } } // An element that has some minimum authored width which we want to allow to expand // to whatever width is available to maximize visible content. // Content that is still not visible will be scrollable. @mixin expandable( $base-content-width: $base-content-width, $width-hard-cap: $width-hard-cap, $content-padding: $content-padding, $always-expand: $always-expand, $centered: $centered, $overflow-y-scroll: $overflow-y-scroll ) { @include scrollable( $overflow-y-scroll: $overflow-y-scroll ); @include responsive( $base-content-width: $base-content-width, $width-hard-cap: $width-hard-cap, $content-padding: $content-padding, $always-expand: $always-expand, $centered: $centered ); } ================================================ FILE: css/components/interactives/README.md ================================================ Interactive elements. These could be made conditional in the build process if we passed the requisite info from PTX to cssbuilder. ================================================ FILE: css/components/interactives/_calculators.scss ================================================ // GeoGebra calculator $navbar-breakpoint: 856px !default; .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: $navbar-breakpoint) { .calculator-container { //assumes navbar moves to bottom of screen bottom: 50px !important; } } ================================================ FILE: css/components/interactives/_other.scss ================================================ // Misc styles for interactive bits that should only be incldued in a web context // (not ebook) .interactive-iframe-container { max-width: 100%; overflow: auto; & > iframe { margin-left: auto; margin-right: auto; display: block; } } .interactive__instructions { // ensure interactive instructions stay normal width max-width: var(--base-content-width); } // center instructions and iframes on standalone pages .standalone-page .interactive-iframe-container { margin-left: auto; margin-right: auto; } .standalone-page .interactive__instructions { margin: 5px auto 20px; } .interactive-iframe-container__opener { display: block; margin-right: 5px; margin-top: 11px; margin-bottom: 5px; font-size: 0.8rem; & .icon { font-size: 18px; } // if figcaption or instructions follow, this should float next to that &:has(+ figcaption, + .instructions) { float: left; z-index: 1; // place above fig caption in render stack position: relative; // for z-index } // and if both, the figcaption should clear + .instructions + figcaption { clear: left; } + .instructions { margin-top: .5em; } } .clipboardable { position: relative; // To anchor the code-copy button display: flow-root; .code-copy { position: absolute; right: 0; top: 0; opacity: 0.25; border-width: 0; background: none; cursor: pointer; z-index: 1; white-space-collapse: collapse; padding: 1px; scale: 0.85; &:hover { opacity: 0.7; } .checkmark { display: none; } &.copied { opacity: 1; color: mediumseagreen; cursor: not-allowed; pointer-events: none; .copyicon { display: none; } .checkmark { display: inline; } } } } // if code-display clipboardable, move margin to that container and turn some into padding // to help make sure clipboard icon is contained inside the code-display in dark mode .clipboardable:has(.code-display) { margin: 0.25em 0; .code-display { margin: 0; padding: 0.25em 0; } } ================================================ FILE: css/components/interactives/_runestone.scss ================================================ // extra specific to override Runestone margin .ptx-content .ptx-runestone-container .runestone { margin: unset; border-radius: 0; border-width: 1px; } // avoid label splitting into multiple lines .multiplechoice_section label > .para { display: inline; } // extra specific to override Runestone margin .ptx-content .ptx-runestone-container .ac_question { max-width: var(--base-content-width); margin: 0 auto 10px; } .runestone .runestone_caption { // caption is always just something like "ActiveCode" in PTX display: none; } /* to undo Runestone's draganddrop.css */ .ptx-content .ptx-runestone-container .rsdraggable { font-size: 100%; } // Unsure if still needed /* hack for runestone */ /* to undo Runestone's presentermode.css */ .ptx-content .bottom { position: unset; } // override Runestone's pre formatting with these extra specific rules .ptx-runestone-container .runestone code, .ptx-runestone-container .runestone pre { font-size: .93rem; line-height: 1.2; font-family: var(--font-monospace); } // override Runestone's pre formatting with these extra specific rules .ptx-runestone-container code[class*="language-"], .ptx-runestone-container pre[class*="language-"] { color: black; background: #fdfdfd; } //Fixup datafile captions .runestone.datafile { .datafile_caption { background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); display: block; width: fit-content; margin: 0 auto; } img { margin: 0 auto; display: block; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); } pre, textarea { margin: 0 auto; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); background-color: var(--page-color); } } .runestone.datafile + .program { margin-top: 0; } // RS does not care what kind of element is used // PTX chooses to use a ul, so we will fix margins for it here instead of RS ul[data-component="timedAssessment"] { margin: 0; padding: 0; } :root.dark-mode { // Darker styling to match Runesone's code mirror theme .ptx-runestone-container code[class*="language-"], .ptx-runestone-container pre[class*="language-"] { color: white; background: hsl(0, 0%, 8%); } } // Similar to rules in _spacing.scss // exercise content divs that are hoisted into a RS interactive // should get one of these classes. @layer spacing { .runestone :is(.exercise-statement, .exercise-content) > *:not(:first-child) { margin-top: 1em; } .ptx-runestone-container + .solutions { margin-top: 0.5em; } } ================================================ FILE: css/components/interactives/_sagecell.scss ================================================ // TODO - refactor .sagecell_sessionOutput pre { font-family: var(--font-monospace); } .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .sage-interact.sagecell { margin: 0; } .sagecell_evalButton { font-family: var(--font-body); font-size: 16px; padding: 0 0.65em; } .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; /* Disable accidental text-selection */ user-select: none; /* Truncate overflowing text with ellipsis */ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .sagecell_evalButton:focus, .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .sagecell .sagecell_editor { margin-bottom: 8px; } .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .sageanswer .output { display: inline-block; vertical-align: top; } ================================================ FILE: css/components/interactives/_webwork.scss ================================================ // TODO - needs refactoring and dark mode update @use 'components/helpers/buttons-default' as buttons; /* WW problems */ .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } /* interactive WeBWorK */ label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } label.feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } // Make the default margin for items inside the exercise-wrapper similar to // default for items in a section .exercise-wrapper > *:not(:first-child) { margin-top: 1.5em; } .ptx-content .problem-buttons { display: flex; } .ptx-content .webwork-button { @include buttons.ptx-button; } //.hidden-content used to be used for knowls and got repurposed for hiding webwork contents // now just used by webwork .problem-buttons.hidden-content, .problem-contents.hidden-content { display: none; } ================================================ FILE: css/components/page-parts/README.md ================================================ Styling for large display regions on the page It is expected that a file like `_parts-default.scss` will be used to aggregate the parts. Themes that wish to use a different mix of parts should provide their own version of a parts file. ================================================ FILE: css/components/page-parts/_banner.scss ================================================ $max-width: 1200px !default; // 0 == no max width $navbar-breakpoint: 800px !default; $centered-content: false !default; .ptx-masthead { position: relative; background: var(--banner-background); width: 100%; display:flex; justify-content: center; .ptx-banner { border-top: 1px solid transparent; overflow: hidden; padding: 10px 10px; border-bottom: none; display:flex; width: 100%; align-items: center; @if $max-width > 0 { max-width: $max-width; } @if $centered-content { justify-content: center; } } a { color: var(--doc-title-color, #2a5ea4); } a:active { color: var(--link-active-text-color); } .title-container { font-family: var(--font-headings); font-size: 2em; padding-left: 9.68px; overflow: hidden; flex: 1; .heading { font-weight: 700; font-size: 100%; line-height: 1.25em; } .title:has(+ .subtitle)::after { content: ":"; } .subtitle { font-weight: normal; } } .logo-link { height: 5em; display: flex; img { max-height: 100%; //fix rendering bug on safari with large images } img[src$=".svg"] { height: 100%; //svg's in safari don't get a correct width with max-height // don't use this for all images as we wouldn't want to stretch raster images } } // // Insert a placeholder icon if the logo-link is empty // .logo-link:empty::before { // display: flex; // font-family: var(--font-body); // font-size: 4rem; // margin-top: -0.7rem; // content: "\2211"; //sigma symbol // color: var(--page-border-color) // } .byline { color: var(--byline-color); font-weight: normal; margin: 0; font-size: 62.5%; min-height: inherit; } } @media screen and (max-width: $navbar-breakpoint) { .ptx-masthead { border-bottom: 1px solid var(--page-border-color); .ptx-banner { padding: 10px 28px; display: flex; justify-content: center; } .logo-link::before { font-size: 1rem; margin-top: 0; } .title-container { width: fit-content; flex: unset; .heading { line-height: 1em; .subtitle { /* Force the subtitle onto a separate line */ display: block; font-size: 80%; line-height: 1em; } } } .byline { font-size: 50%; } } } @media screen and (width <= 480px) { .ptx-masthead { .title-container { padding: 0; text-align: center; font-size: 1em; } .logo-link { display: none; } .byline { display: none; } } } ================================================ FILE: css/components/page-parts/_body.scss ================================================ // Body level styling $max-width: 1200px !default; // 0 == no max width $standalone-max-width: 1600px !default; // used for iframe standalones $content-width: 600px !default; // without padding $content-side-padding: 48px !default; $centered-content: false !default; $footer-button-border-radius: 0 !default; $content-with-padding-width: $content-width + 2 * $content-side-padding; @use 'components/helpers/buttons-default' as buttons; // set content width up as a CSS variables so other files can ask // "how wide is standard content?" :root { --base-content-width: #{$content-width}; --content-padding: #{$content-side-padding}; } // hits regular pages and generated iframe pages body { margin: 0; min-height: 100vh; display: flex; flex-direction: column; align-items: stretch; &.pretext { color: var(--body-text-color); font-family: var(--font-body); } } .ptx-page { position: relative; display: flex; flex-grow: 1; // fill space in body width: 100%; } .ptx-main { flex-grow: 1; position: relative; max-width: 100%; container-name: ptx-main; // for container queries elsewhere container-type: inline-size; // for container queries elsewhere } // Base width/padding // ptx-main ensures iframe pages don't get these .ptx-main .ptx-content { max-width: $content-with-padding-width; // bad for worksheets padding: 24px $content-side-padding 60px; @if $centered-content { margin-left: auto; margin-right: auto; } } .worksheet .ptx-main .ptx-content { max-width: 960px; } @if $max-width > 0 { .ptx-page { max-width: $max-width; margin-left: auto; margin-right: auto; } } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; background: var(--page-color, white); } // Hide print preview header div in normal view .ptx-content .print-preview-header { display: none; } body.pretext > a.assistive { padding:6px; position: absolute; top:-40px; // hide off screen until keyboard focus left: 0px; color:white; border-right:1px solid white; border-bottom:1px solid white; border-bottom-right-radius:8px; background:#BF1722; // always have correct contrast z-index: 10000; &:focus { top:0px; // move into view when keyboard focus outline:0; transition: top .1s ease-in, background .5s linear; } } .ptx-content-footer { display: flex; justify-content: space-around; max-width: $content-with-padding-width; padding-top: 2em; padding-bottom: 2em; padding-left: $content-side-padding; padding-right: $content-side-padding; @if $centered-content { margin-left: auto; margin-right: auto; } .button { @include buttons.ptx-button( $border-radius: $footer-button-border-radius ); .icon { margin: 0 -7px; // current icons have lots of whitespace } } } // Give iframe popout pages a wider max width, since they have no sidebars // and content should be free to grow to reasonable size body.standalone-page .ptx-page { max-width: $standalone-max-width; } ================================================ FILE: css/components/page-parts/_footer.scss ================================================ $max-width: 0 !default; // 0 == no max width $navbar-breakpoint: 856px !default; $nav-height: 36px !default; @use 'components/helpers/buttons-default' as buttons; .ptx-page-footer { background: var(--footer-background); padding-top: 0; border-top: 2px solid var(--page-border-color); border-bottom: 2px solid var(--page-border-color); display: flex; flex-direction: row; justify-content: center; width: 100%; gap: 90px; position: relative; @if $max-width > 0 { max-width: $max-width; } & > a { margin: 1em 0; color: var(--body-text-color); } & > a > .logo:first-child { height: 3em; width: unset; margin: 0; } .feedback-link { @include buttons.ptx-button; } } @media screen and (max-width: $navbar-breakpoint) { .ptx-page-footer { // prevent icons from spreading too much gap: 20px; justify-content: center; margin-bottom: $nav-height - 2; & > a > .logo:first-child { height: 2em; } } } ================================================ FILE: css/components/page-parts/_navbar.scss ================================================ $max-width: 1200px !default; // 0 == no max width // applied to the contents of the navbar $nav-height: 36px !default; $border-width: 1px !default; $navbar-breakpoint: 800px !default; $center-content: true !default; @use 'components/helpers/buttons-default' as buttons; @use 'components/page-parts/extras/navbar-btn-borders'; .ptx-navbar { position: sticky; top: 0; height: $nav-height; width: 100%; background: var(--navbar-background); border: 0; border-top: 1px solid var(--page-border-color); border-bottom: 1px solid var(--page-border-color); margin: 0; z-index: 500; overflow: visible; display: flex; .ptx-navbar-contents { position: relative; display: flex; flex: 1; justify-content: center; align-items: center; max-width: $max-width; @if $center-content { margin: 0 auto; } } .button { @include buttons.ptx-button; & { height: 100%; //always fill container // Disable normal borders - top/bottom provided by container // Use extras/_navbar-btn-borders.scss for side borders if desired border-width: 0; } } .toc-toggle { width: 240px; gap: 0.4em; margin-left: 0; //assumes is first button } :is(.treebuttons, .nav-runestone-controls, .nav-other-controls) { display: flex; } .treebuttons { flex: 1 1 210px; justify-content: end; } .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .pretext .navbar .dropdown { height: 34px; } .embed-popup { padding: 10px; background-color: var(--navbar-background); position: absolute; margin-top: $nav-height; border: 1px solid var(--page-border-color); border-radius: 3px; box-shadow: 0 0 5px var(--primary-color-gray-80); color: var(--button-text-color); .embed-code-container { width: "100%"; padding:5px; .embed-code-textbox { width: 100%; padding: 10px; height: 5em; } } } .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .treebuttons .icon { margin: 0 -7px; // chevrons have lots of horizontal padding } :is(.index-button) .icon { display: none; } :is(.runestone-profile, .activecode-toggle, .searchbutton, .calculator-toggle, .light-dark-button, .embed-button) .name { display: none; } .index-button { min-width: 70px; } } // Button in the navbar, but needs to be less specific so not nested in previous .runestone-profile { @include buttons.ptx-dropdown-button; } @if $max-width > 0 { @media screen and (min-width: $max-width) { body.pretext .ptx-navbar { //forces navbar to line up cleanly with sidebar // need padding because there is no container around the items in navbar // padding: 0 calc((100% - $max-width) / 2); // border-left-width: 1px; // //tug contents of first button to left // & .ptx-navbar-contents > *:first-child { // justify-content: start; // } } } } @media screen and (max-width: $navbar-breakpoint) { @include navbar-btn-borders.navbar-btn-borders(); .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; z-index: 1100; background: var(--button-border-color); max-width: 100vw; .ptx-navbar-contents { max-width: 100vw; } .nav-runestone-controls { flex: 0; } .toc-toggle { flex: 2 1 100px; } .treebuttons { flex: 3 1 150px; /* 3:2 ratio with toc-toggle */ } .treebuttons > * { flex: 1 1; min-width: 35px } .index-button { display: none; } .embed-popup { margin-top: unset; bottom: $nav-height; } .dropdown-content { top: unset; bottom: $nav-height; } :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button, .embed-button) .name { display: none; } } } ================================================ FILE: css/components/page-parts/_toc-basics.scss ================================================ // shared toc styling used by _toc-default, etc... $sidebar-width: 240px !default; $nav-height: 36px !default; .ptx-sidebar { align-self: flex-start; // needed for sticky inside a flex &.visible { display: block; } &.hidden { display: none; height: 0; } } .ptx-toc { --codenumber-pad-left: 0.3rem; --codenumber-pad-right: 0.5rem; --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); background: var(--toc-background); margin: 0; font-size: 0.9rem; /* -------------------toc-items-------------------- */ // will be less indentation, add some padding &:is(.depth1, .parts.depth2) { --codenumber-pad-right: 0.5rem; } .toc-item-list { margin: 0; padding: 0; list-style: none; background: var(--tocitem-background); .active { list-style: none; // clobber runestone css } } .toc-item { background-color: var(--tocitem-background); color: var(--toc-text-color); border-color: var(--toc-border-color); a { color: inherit; } // only highlight lowest level active item // need !important to override later depth based css &.active:not(:has(.toc-item.active)) { color: var(--tocitem-active-text-color) !important; background-color: var(--tocitem-active-background) !important; border-color: var(--tocitem-active-border-color) !important; } // hoving over a toc item & > .toc-title-box > a:is(:hover, :focus) { color: var(--tocitem-highlight-text-color); background-color: var(--tocitem-highlight-background); border-color: var(--tocitem-highlight-border-color); } } /* -------------------title-box------------------- */ .toc-title-box { display: flex; } .toc-title-box > .internal { position: relative; display: flex; flex-grow: 1; padding: 0.2em; font-weight: 500; } /* at second level, switch fonts */ .toc-item-list .toc-item-list .toc-title-box > .internal { font-weight: normal; } /* -------------------codenumbers-------------------- */ .codenumber { min-width: var(--toc-indent-first); padding-left: var(--codenumber-pad-left); padding-right: var(--codenumber-pad-right); display: inline-block; text-align: left; flex-grow: 0; } } // -------------------------------------------------------------------------- // Conditional styling based on depth .ptx-toc .toc-item { color: var(--toclevel1-text-color); background-color: var(--toclevel1-background); } .ptx-toc .toc-item .toc-item { color: var(--toclevel2-text-color); background-color: var(--toclevel2-background); } .ptx-toc .toc-item .toc-item .toc-item { color: var(--toclevel3-text-color); background-color: var(--toclevel3-background); } /* second level of numbering */ /* anything 1+ levels deeper than a chapter in a book */ .book .ptx-toc .toc-chapter .toc-item-list .codenumber, /* anything 1+ levels deeper than a section in an article */ .article .ptx-toc .toc-section .toc-item-list .codenumber, /* anything 1+ levels deeper than backmatter */ .ptx-toc .toc-backmatter .toc-item-list .codenumber { font-size: 80%; padding-top: 0.16em; min-width: var(--toc-indent-second); } /* third level of numbering */ /* anything 2+ levels deeper than a chapter in a book */ .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber, /* anything 2+ levels deeper than a section in an article */ .article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber, /* anything 2+ levels deeper than backmatter */ .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber { min-width: var(--toc-indent-third); visibility: hidden; } /* reveal hidden numbers on interaction */ .ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber { visibility: visible; } /* Any toc item without a codenumber needs indentation Can't select absence of a preceeding, so indent all titles and then clear indent if there is a codenumber */ .ptx-toc .toc-item .toc-title-box .title { margin-left: var(--toc-indent-first); } /* second level as defined by codenumber selectors */ .book .ptx-toc .toc-chapter .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .title { margin-left: var(--toc-indent-second); } /* third level as defined by codenumber selectors */ .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { margin-left: var(--toc-indent-third); } /* unless there is a codenumber */ .ptx-toc .toc-item > .toc-title-box .codenumber + .title { margin-left: 0 !important; } // -------------------------------------------------------------------------- // Conditional styling based on depth .ptx-toc .toc-chapter .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .title, /* 2 levels deep in back matter */ .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { font-size: 90%; } .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .toc-item-list .title, /* 3 levels deep in back matter */ .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title { font-style: italic; } /* -------------------depth controls-------------------- */ .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } /* if depth is shallow, identify best available toc item */ .ptx-toc.depth1 ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-backgrounde); color: var(--tocitem-active-text-color); } .ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-background); color: var(--tocitem-active-text-color); } // -------------------------------------------------------------------------- // Focused toc /* Hide all but active area of book */ .ptx-toc.focused { ul.structural:not(.contains-active) > .toc-item { display: none; &.visible { display: block; } } ul.structural .toc-item.active > ul.structural > .toc-item { display: block; &.hidden { display: none; } } .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; .icon { font-size: 1.25em; line-height: 18px; font-variation-settings: 'wght' 200; } &:is(:hover) { background-color: var(--tocitem-highlight-background); color: var(--tocitem-highlight-text-color); .icon { fill: var(--tocitem-highlight-text-color); } } } /* ---------------icon customization----------------- */ .toc-item > .toc-title-box > .toc-expander > .icon:before { content: "add"; } .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before { content: "remove"; } } ================================================ FILE: css/components/page-parts/_toc-default.scss ================================================ $scrolling: true !default; $sidebar-width: 240px !default; $nav-height: 36px !default; $sidebar-breakpoint: 856px !default; $navbar-breakpoint: 800px !default; @use 'toc-basics' with ( $sidebar-width: $sidebar-width, $nav-height: $nav-height ); .ptx-sidebar { flex: 0 0 $sidebar-width; @if $scrolling { position: sticky; top: $nav-height; overflow-y: hidden; } } .ptx-toc { @if $scrolling { position: sticky; top: $nav-height; overflow-y: auto; overflow-x: hidden; height: calc(100vh - $nav-height); margin-top: -1px; // partially hide top border of first toc item // border under the last item before the pretext icon & > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 3px solid var(--toc-border-color); } } @else { // not scrolling scrollbar-width: none; padding: 10px 0; box-sizing: border-box; border-right: 1px solid var(--toc-border-color); } } // Hide once we get too narrow @media screen and (max-width: $sidebar-breakpoint) { .ptx-sidebar { display: none; position: sticky; top: $nav-height; background: var(--content-background); min-height: 30vh; border-right: 2px solid var(--toc-border-color); border-bottom: 2px solid var(--toc-border-color); width: $sidebar-width; } @if not $scrolling { .ptx-sidebar { overflow-y: scroll; } } } // flip sidebar to bottom one navbar moves @media screen and (max-width: min($sidebar-breakpoint, $navbar-breakpoint)) { .ptx-sidebar { position: fixed; z-index: 1000; top: unset; height: auto; max-height: 80vh; max-width: 80vw; bottom: $nav-height; border-right: 2px solid var(--toc-border-color); border-top: 2px solid var(--toc-border-color); } .ptx-toc { border-top: 2px solid var(--toc-border-color); border-bottom: 0; max-height: 80vh; } } ================================================ FILE: css/components/page-parts/_toc-overlay.scss ================================================ $sidebar-width: 240px !default; $nav-height: 36px !default; $navbar-breakpoint: 800px !default; $border-width: 1px !default; $initially-visible: false !default; @use 'toc-basics' with ( $sidebar-width: 0, $nav-height: $nav-height ); .ptx-sidebar { position: sticky; width: 0; @if $initially-visible { display: block; } @else { display: none; } z-index: 200; height: 0; top: 35px; } .ptx-toc { border-right: $border-width solid var(--toc-border-color); border-bottom: $border-width solid var(--toc-border-color); max-height: calc(100vh - 200px); overflow-y: auto; background: var(--page-color); width: $sidebar-width; // border under the last item before the pretext icon & > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 3px solid var(--toc-border-color); } } // flip sidebar to bottom one navbar moves @media screen and (max-width: $navbar-breakpoint) { .ptx-sidebar { position: fixed; top: unset; height: auto; max-height: 80vh; max-width: 80vw; bottom: $nav-height; border-right: 2px solid var(--toc-border-color); border-top: 2px solid var(--toc-border-color); } .ptx-toc { border-top: 2px solid var(--toc-border-color); border-bottom: 0; max-height: 80vh; } } ================================================ FILE: css/components/page-parts/extras/README.md ================================================ Options that can be added by a theme to tweak a parts file ================================================ FILE: css/components/page-parts/extras/_navbar-btn-borders.scss ================================================ $border-width: 1px !default; @mixin navbar-btn-borders { .ptx-navbar { .button { border-left-width: $border-width; border-right-width: $border-width; border-color: var(--page-border-color); } & > *:not(:first-child) { //hide double borders margin-left: -1 * $border-width; } } } ================================================ FILE: css/components/page-parts/extras/_toc-borders.scss ================================================ $border-width: 1px !default; // apply some borders to the TOC .toc-item { border-top: $border-width solid var(--toc-border-color); } .ptx-toc.focused .toc-title-box > a:hover { border-right: $border-width solid var(--toc-border-color); } .ptx-toc.focused .toc-expander:is(:hover) { border-left: $border-width solid var(--toc-border-color); } // Extra border above top level items .ptx-toc > .toc-item-list > .toc-item { border-top: $border-width + 1 solid var(--toc-border-color); } ================================================ FILE: css/components/page-parts/extras/_toc-expand-chevrons.scss ================================================ // Use chevrons instead of +/- in ToC expander control .ptx-toc.focused { .toc-item > .toc-title-box > .toc-expander > .icon { font-size: 30px; &:before { content: "chevron_left"; } } .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); &:before { content: "chevron_left"; } } } ================================================ FILE: css/components/page-parts/extras/_toc-hidden-scrollbar.scss ================================================ // blend in with page until hover .ptx-toc { scrollbar-color: var(--content-background) var(--content-background); // reveal scroll on hover &:hover { scrollbar-color: var(--page-border-color) var(--content-background); } } ================================================ FILE: css/components/page-parts/extras/_toc-last-level-plain.scss ================================================ // levels 2 & 3 only get new colors if they contain further levels // that way bottom level has default styling .ptx-toc:is(.depth0, .depth1, .depth2) .toc-item .toc-item { background-color: var(--tocitem-background); color: var(--toc-text-color); } .ptx-toc:is(.depth0, .depth1, .depth2, .depth3) .toc-item .toc-item .toc-item { background-color: var(--tocitem-background); color: var(--toc-text-color); } ================================================ FILE: css/dist/epub.css ================================================ @charset "UTF-8"; /* ../../css/targets/ebook/epub/epub.scss */ * { box-sizing: border-box; } @layer spacing { :is(section, article, .knowl__content) > *:not(:first-child) { margin-top: 1.5em; } :is(section, article, .knowl__content) > .para + .para { margin-top: 1em; } .ptx-content :is(ul, td, li, dd, .blockquote, .sbspanel, .para.logical) > *:not(:first-child) { margin-top: 0.5em; } } ol.no-marker, ul.no-marker, li.no-marker { list-style-type: none; } ol.decimal { list-style-type: decimal; } ol.lower-alpha { list-style-type: lower-alpha; } ol.lower-alpha-level-1 > li::marker { content: "(" counter(list-item, lower-alpha) ") "; } ol.upper-alpha { list-style-type: upper-alpha; } ol.lower-roman { list-style-type: lower-roman; } ol.upper-roman { list-style-type: upper-roman; } ul.disc { list-style-type: disc; } ul.square { list-style-type: square; } ul.circle { list-style-type: circle; } dl:is(.description-list, .glossary) { margin: 0; } dl:is(.description-list, .glossary) dt { font-weight: bold; max-width: 55ex; } dl:is(.description-list, .glossary) dd::after { content: ""; display: block; clear: both; } .para > dl:is(.description-list) { margin-top: 0.5em; margin-bottom: 0.5em; } dl.glossary dt { margin-top: 1.25em; } dl.glossary dt:first-of-type { margin-top: 0; } dl.glossary dd { margin-left: 5ex; } dl.description-list dt, dl.description-list dd { margin-top: 1em; } dl.description-list dt:first-of-type, dl.description-list dd:first-of-type { margin-top: 0; } dl.description-list dt { float: left; clear: both; text-align: right; width: 18ex; margin-right: 1ex; } dl.description-list dd { margin-left: 22ex; } dl.description-list.narrow dt { width: 11ex; } dl.description-list.narrow dd { margin-left: 15ex; } dl.description-list.wide dt { width: 25ex; } dl.description-list.wide dd { margin-left: 29ex; } dl.description-list dt:first-of-type { clear: none; } .description-list + * { clear: both; } dl.description-list dl dt { width: 8ex; } dl.description-list dd dd { margin-left: 18ex; } dl.description-list dl dd { margin-left: 12ex; } @media screen and (max-width: 480px) { dl.description-list dt, dl.description-list.narrow dt { float: none; margin-left: 0; text-align: left; width: 25ex; } dl.description-list dd, dl.description-list.narrow dd, dl.description-list.wide dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } :is(.cols2, .cols3, .cols4, .cols5, .cols6) { display: flex; flex-wrap: wrap; justify-content: start; } .cols2 > li { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > li { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > li { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > li { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > li { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .ptx-content li { margin-top: 0.5em; } .ptx-content li .li--heading-title { font-size: 100%; font-weight: normal; font-style: italic; } .para > :is(ol, ul) { margin-top: 0.5em; margin-bottom: 0.5em; } ol > li { padding-left: 0.25em; } .fillin { display: inline-block; border: none; border-width: 1px; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; } .fillin.underline { border-bottom-style: solid; border-width: 1px; } .fillin.box { outline: 1px solid var(--body-text-color); height: 1.3em; } .fillin.shade { background-color: var(--fillin-background-color, #eee); height: 1.3em; } :root.dark-mode { --fillin-background-color: #444; } .heading:is(h1, h2, h3, h4, h5, h6) { margin: 0; font-size: unset; } .heading { line-height: 1.1; font-family: var(--font-headings); font-weight: 700; margin-top: 0; margin-bottom: 0; } section > .heading { font-size: 1.75em; color: var(--body-title-color); line-height: 1.25em; margin-top: 2.5em; margin-bottom: 0.5em; } section > .heading + * { margin-top: 0.5em; } .ptx-content > section > .heading { margin-top: 0.5em; } section section > .heading { font-size: 1.5em; margin-top: 2em; } section section section > .heading { font-size: 1.4em; margin-top: 2em; } article > .heading { font-size: 1.25em; margin-top: 1.5em; } article > .heading + * { margin-top: 0.5em; } .paragraphs > .heading { font-size: 1.125em; } :is(section, article) > .heading + :is(section, article) > .heading { margin-top: 0.5em; } @media screen and (max-width: 480px) { section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } section section > .heading { font-size: 1.3em; line-height: 1.15em; } section section section > .heading { font-size: 1.15em; line-height: 1em; } } .heading.hide-type > .type { display: none; } a { color: var(--link-text-color); text-decoration: none; } a:hover, a:focus { text-decoration: none; } a[href^="mailto:"] { white-space: pre; } .ptx-content a.internal { color: var(--link-text-color); font-weight: bold; } .ptx-content a.external { color: var(--link-alt-text-color); font-weight: bold; } .ptx-content a.internal:hover, .ptx-content a.internal:hover *, .ptx-content a.internal:focus, .ptx-content a.internal:focus * { color: var(--link-active-text-color); background-color: var(--link-active-background); font-weight: bold; } .ptx-content a.external:hover, .ptx-content a.external:hover *, .ptx-content a.external:focus, .ptx-content a.external:focus * { color: var(--link-alt-active-text-color); background-color: var(--link-alt-active-background); font-weight: bold; } .ptx-content table { border-spacing: 0; border-collapse: collapse; } .ptx-content td { padding: 2px 5px; font-size: 90%; } .ptx-content td img { max-width: 200px; margin-right: 30px; } .ptx-content th { padding: 2px 5px; } .ptx-content th .lines { white-space: nowrap; } .ptx-content th.l { text-align: left; } .ptx-content th.c { text-align: center; } .ptx-content th.r { text-align: right; } .ptx-content th.j { text-align: justify; } .ptx-content th.t { vertical-align: top; } .ptx-content th.b { vertical-align: bottom; } .ptx-content th.m { vertical-align: middle; } .ptx-content th.l0 { border-left: none; } .ptx-content th.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content th.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content th.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content th.r0 { border-right: none; } .ptx-content th.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content th.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content th.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content th.t0 { border-top: none; } .ptx-content th.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content th.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content th.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content th.b0 { border-bottom: none; } .ptx-content th.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content th.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content th.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content td .lines { white-space: nowrap; } .ptx-content td.l { text-align: left; } .ptx-content td.c { text-align: center; } .ptx-content td.r { text-align: right; } .ptx-content td.j { text-align: justify; } .ptx-content td.t { vertical-align: top; } .ptx-content td.b { vertical-align: bottom; } .ptx-content td.m { vertical-align: middle; } .ptx-content td.l0 { border-left: none; } .ptx-content td.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content td.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content td.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content td.r0 { border-right: none; } .ptx-content td.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content td.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content td.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content td.t0 { border-top: none; } .ptx-content td.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content td.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content td.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content td.b0 { border-bottom: none; } .ptx-content td.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content td.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content td.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content th.r0.l0, .ptx-content td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content tr.header-vertical th { writing-mode: vertical-rl; transform: rotate(180deg); padding-top: 5px; } .ptx-content .center table { text-align: center; margin-left: auto; margin-right: auto; } .tabular-box { margin-top: 0.5em; overflow-x: auto; } .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } table.notation-list tr th { text-align: left; margin-left: 1em; } table.notation-list tr td { text-align: left; vertical-align: top; } .frontmatter > .heading { display: block; text-align: center; } .frontmatter > .heading .title, .frontmatter .book > .heading .title { font-size: 1.3em; } .frontmatter > .heading .subtitle, .frontmatter .book > .heading .subtitle { display: block; font-weight: normal; color: var(--byline-color); font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .frontmatter > .para:first-of-type { margin-top: 4em; } .frontmatter > .author, .frontmatter > .credit { margin-top: 2em; text-align: center; } .frontmatter .author:first-of-type { margin-top: 4em; } .frontmatter > .author .author-name { font-size: 120%; } .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .frontmatter .credit .title { font-size: 1em; } .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .frontmatter .author-info { font-size: 90%; } .frontmatter .summary-links { margin-top: 4em; } .frontmatter .abstract { margin: 4em 2em; } .frontmatter .keywords, .frontmatter .support { margin-top: 2em; } .frontmatter .abstract > .title, .frontmatter .keywords > .title, .frontmatter .support > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .frontmatter .abstract > .title::after, .frontmatter .keywords > .title::after, .frontmatter .support > .title::after { content: ".\2009\2009\2009"; } .frontmatter .abstract > .title + .para, .frontmatter .keywords > .title + .para, .frontmatter .support > .title + .para { display: inline; } .frontmatter .colophon .copyright { margin-top: 2.5em; } .frontmatter .colophon .license { margin-top: 2.5em; } .ptx-content .summary-links { font-family: var(--font-headings); display: block; margin-top: 1em; } .ptx-content .summary-links a { color: var(--summary-link-text-color); background: var(--summary-link-background); font-size: 1.5em; line-height: 1.25em; padding: 10px 20px; padding-right: 60px; border-radius: 3px; position: relative; display: block; font-weight: unset; } .ptx-content .summary-links a .title { font-style: normal; } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a::after { right: 0.83333em; content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid var(--summary-link-text-color); } .ptx-content .summary-links a:hover { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover * { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover .title { font-weight: normal; } .ptx-content .summary-links a:hover::after { border-left: 0.4em solid var(--summary-link-hover-text-color); } .ptx-content .summary-links ul { list-style-type: none; padding: 0; margin-top: 0; } .ptx-content .summary-links li { margin-top: 5px; } @media screen and (width <= 480px) { .ptx-content .summary-links a { font-size: 100%; line-height: 1.25em; } } .ptx-footnote { display: inline-block; position: relative; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: smaller; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote[open] .ptx-footnote__number sup { display: none; } .ptx-footnote__number { display: inline-block; cursor: pointer; min-width: 1em; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowl-background); border-radius: 0px; padding: 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowl-border-color); color: var(--body-text-color); font-weight: normal; font-size: var(1rem); } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: var(--activated-content-bg); } .indexitem { margin-top: 4px; } .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .indexknowl { margin-left: 0.11em; } em + .indexknowl { margin-left: -0.25em; } .indexknowl a { margin-left: 2em; } .indexitem .see, .subindexitem .see, .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .indexitem .seealso, .subindexitem .seealso, .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .indexitem .see em, .subindexitem .see em, .subsubindexitem .see em, .indexitem .seealso em, .subindexitem .seealso em, .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .indexitem .see + .see, .subindexitem .see + .see, .subsubindexitem .see + .see, .indexitem .seealso + .seealso, .subindexitem .seealso + .seealso, .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .indexitem .indexknowl { font-size: 90%; } .indexitem [data-knowl], .subindexitem [data-knowl], .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .indexknowl [data-knowl]:hover, .indexknowl .active[data-knowl] { margin-left: 2em; } .subindexitem .indexknowl { font-size: 95%; } .subsubindexitem .indexknowl { font-size: 95%; } .indexletter { margin-top: 1.5em; } .image-box, .audio-box, .video-box, .asymptote-box { position: relative; } .image-box .asymptote-box iframe.asymptote, iframe.asymptote, .video-box .video, .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .image-box img, img.contained { width: 100%; } .asymptote-fullsize-link { text-align: center; font-size: 0.9em; } .ptx-content img, .ptx-content svg { background: var(--ptx-image-bg); } .mermaid > svg { background: none; } .image-description summary { list-style: none; cursor: pointer; } .image-archive { margin: 0.75em auto 0; font-family: var(--font-monospace); justify-content: center; display: flex; gap: 0.5em; } .image-box > img:not(.mag_popup) { cursor: zoom-in; } img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; } .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .audio { width: 100%; } .video-poster { cursor: pointer; } figure { clear: both; position: relative; margin-left: 0; margin-right: 0; } figcaption { margin-left: auto; margin-right: auto; margin-top: 0.5em; } figcaption code.code-inline { white-space: pre; } figcaption .codenumber, figcaption .type { font-weight: 700; } figcaption .codenumber::after, figcaption .type:last-of-type::after { content: "\2002"; } figcaption .para:first-of-type { display: inline; } figure.table-like { margin-left: 30px; margin-right: 30px; } figure.table-like .list { margin-right: 0; } @media (max-width <= 943px) { .figure-like { overflow-x: auto; } } .poem { display: table; margin: 0 auto; width: auto; max-width: 90%; } .poem > .heading { display: block; text-align: center; } section article.poem > .heading::after { content: ""; } .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .poem .author { font-style: italic; margin-top: 0.75em; } .poem .author.left { text-align: left; } .poem .author.center { text-align: center; } .poem .author.right { text-align: right; } .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .poem .stanza + .stanza { margin-top: 1em; } .poem .heading + .stanza { margin-top: 0.2em; } .poem .heading + .line { margin-top: 0.2em; } .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .poem .line.center { text-align: center; } .poem .line.right { text-align: right; } .poem .tab { margin-left: 2em; } .code-box { overflow-x: auto; } .code-display { overflow-x: auto; font-family: var(--font-monospace); margin: 0.5em 0; } .console, .program { border: 1px solid var(--page-border-color); padding: 5px 15px; overflow-x: auto; margin: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-inline { font-family: var(--font-monospace); white-space: pre; color: var(--body-text-color); background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); border-radius: 0.2em; display: inline-block; overflow-x: auto; max-width: 100%; vertical-align: middle; line-height: normal; padding: 0.0625em 0.15em; } .prompt.unselectable { user-select: none; } .code-block { border-left: 1px solid #aaa; padding: 0 15px 5px; overflow-x: auto; background: var(--code-background); margin-top: 0; margin-bottom: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-block::before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } @media print { .code-copy { display: none; } } pre[class*=language-] { margin: 0; overflow: auto; border: 1px solid #e1e1e1; } :not(pre) > code[class*=language-] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } code[class*=language-], pre[class*=language-] { color: black; background: #fdfdfd; text-shadow: none; font-family: var(--font-monospace); text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.2; tab-size: 4; hyphens: none; } code[class*=language-].code-inline, pre[class*=language-].code-inline { line-height: normal; padding: 0.0625em 0.15em; } code[class*=language-]::selection, code[class*=language-] ::selection, pre[class*=language-]::selection, pre[class*=language-] ::selection { background: #b3d4fc; } code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #2a9716; } code[class*=language-] .token.punctuation, pre[class*=language-] .token.punctuation { color: #000; } code[class*=language-] .token.namespace, pre[class*=language-] .token.namespace { opacity: 0.9; } code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: rgb(41, 120, 15); } code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #a11; } code[class*=language-] .token:is(.operator, .entity, .url), pre[class*=language-] .token:is(.operator, .entity, .url) { color: #000; background: none; } code[class*=language-] .token:is(.atrule, .attr-value, .keyword), pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #0679B7; } code[class*=language-] .token.function, code[class*=language-] .token.class-name, pre[class*=language-] .token.function, pre[class*=language-] .token.class-name { color: #30a; } code[class*=language-] .token.important, code[class*=language-] .token.variable, pre[class*=language-] .token.important, pre[class*=language-] .token.variable { color: rgb(0, 0, 0); } code[class*=language-] .token.important, code[class*=language-] .token.bold, pre[class*=language-] .token.important, pre[class*=language-] .token.bold { font-weight: bold; } code[class*=language-] .token.italic, pre[class*=language-] .token.italic { font-style: italic; } code[class*=language-] .token.entity, pre[class*=language-] .token.entity { cursor: help; } code[class*=language-].line-numbers, pre[class*=language-].line-numbers { position: relative; padding-left: 3.8em; counter-reset: linenumber; overflow: auto; } code[class*=language-].line-numbers > code, pre[class*=language-].line-numbers > code { position: relative; white-space: inherit; } code[class*=language-].line-numbers .line-numbers-rows, pre[class*=language-].line-numbers .line-numbers-rows { position: absolute; pointer-events: none; top: 0; font-size: 100%; left: -3.8em; width: 3em; letter-spacing: -1px; border-right: 1px solid #999; user-select: none; } code[class*=language-].line-numbers .line-numbers-rows > span, pre[class*=language-].line-numbers .line-numbers-rows > span { display: block; counter-increment: linenumber; } code[class*=language-].line-numbers .line-numbers-rows > span::before, pre[class*=language-].line-numbers .line-numbers-rows > span::before { content: counter(linenumber); color: #999; display: block; padding-right: 0.8em; text-align: right; } code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { position: absolute; margin-top: 4px; left: 0; right: 0; padding: inherit 0; font-size: inherit; background: hsla(24, 20%, 50%, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } :root.dark-mode { } :root.dark-mode pre[class*=language-] { border: 1px solid #3d3d3d; } :root.dark-mode code[class*=language-], :root.dark-mode pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } :root.dark-mode code[class*=language-]::selection, :root.dark-mode code[class*=language-] ::selection, :root.dark-mode pre[class*=language-]::selection, :root.dark-mode pre[class*=language-] ::selection { background: hsl(200, 4%, 16%); } :root.dark-mode code[class*=language-] .token, :root.dark-mode pre[class*=language-] .token { position: relative; z-index: 1; } :root.dark-mode code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), :root.dark-mode pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #68a950; } :root.dark-mode code[class*=language-] .token.punctuation, :root.dark-mode pre[class*=language-] .token.punctuation { color: white; opacity: 1; } :root.dark-mode code[class*=language-] .token.namespace, :root.dark-mode pre[class*=language-] .token.namespace { opacity: 0.9; } :root.dark-mode code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), :root.dark-mode pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: #abc792; } :root.dark-mode code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), :root.dark-mode pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #ca9147; } :root.dark-mode code[class*=language-] .token:is(.operator, .entity, .url), :root.dark-mode pre[class*=language-] .token:is(.operator, .entity, .url) { color: white; } :root.dark-mode code[class*=language-] .token:is(.atrule, .attr-value, .keyword), :root.dark-mode pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #2d94fb; } :root.dark-mode code[class*=language-] .token.function, :root.dark-mode code[class*=language-] .token.class-name, :root.dark-mode pre[class*=language-] .token.function, :root.dark-mode pre[class*=language-] .token.class-name { color: #e3e1c2; } :root.dark-mode code[class*=language-] .token.important, :root.dark-mode code[class*=language-] .token.bold, :root.dark-mode pre[class*=language-] .token.important, :root.dark-mode pre[class*=language-] .token.bold { font-weight: bold; } :root.dark-mode code[class*=language-] .token.italic, :root.dark-mode pre[class*=language-] .token.italic { font-style: italic; } :root.dark-mode code[class*=language-] .token.entity, :root.dark-mode pre[class*=language-] .token.entity { cursor: help; } :root.dark-mode .line-highlight { background: hsla(0, 0%, 33%, 0.1); border-bottom: 1px dashed hsl(0, 0%, 33%); border-top: 1px dashed hsl(0, 0%, 33%); z-index: 0; } @media print { code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { color-adjust: exact; } } .displaymath { overflow-x: auto; overflow-y: hidden; } .displaymath mjx-container[jax=CHTML][display=true] { margin: 0 0 0 0; padding-top: 0.3em; } .process-math mjx-container svg { background: none; } [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .knowl mjx-mtext > mjx-utext, mjx-mtext > mjx-utext { width: revert !important; } mjx-msup mjx-utext, mjx-msub mjx-utext { display: inline; } em.alert { font-weight: bold; } .bib { margin-top: 0.25em; } .bib .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .bib .bibitem + .bibentry { display: inline-block; width: 90%; margin-top: 0; } .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .contributor { margin-top: 1.5ex; } .contributor:first-child { margin-top: 0em; } .contributor + .para { margin-top: 3ex; } .contributor .contributor-name { font-variant: small-caps; } .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } iframe { margin: 0; border: none; } .kbdkey { background: #f1f1f1; color: #333; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .unit, .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .unit sub, .unit sup, .quantity sub, .quantity sup { word-spacing: normal; } .terminology { font-style: italic; font-weight: bold; } .times-sign { font-size: larger; vertical-align: -0.15ex; } .emphasis { font-style: italic; } .emphasis .emphasis { font-weight: bold; } .definition-like .emphasis { font-weight: 700; } article.theorem-like .emphasis { font-weight: 700; } .para { line-height: 1.35; } .hidden { display: none !important; } .taxon { font-style: italic; } .quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .booktitle { font-style: oblique; } .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } .cols2 > .exercise-like { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > .exercise-like { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > .exercise-like { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > .exercise-like { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > .exercise-like { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .exercise-like > .heading { font-size: inherit; } .exercisegroup .exercise-like { margin-top: 1em; } .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .exercisegroup > .heading + .introduction { display: inline; } .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .exercisegroup .exercisegroup-exercises { margin-top: 1em; padding-left: 40px; } .exercisegroup .conclusion { margin-left: 40px; } .exercisegroup .conclusion .heading { font-size: inherit; } .exercise-like > .exercise-like.task { margin-left: 20px; } .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .exercise-wrapper form button:active { background-color: #f0f0f0; } .exercise-wrapper form button + button { margin-left: 0.8em; } .exercise-wrapper, .exercise-wrapper form, .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .knowl .exercise-wrapper, .knowl .exercise-wrapper form, .knowl .exercise-wrapper form > div:first-child { width: 100%; } .exercise-wrapper > .para:first-child, .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .cols2 .heading + .exercise-wrapper { width: auto; } section.solutions > .heading + .heading { margin-top: 0.5em; } section.solutions > h3.heading, section.solutions section > h3.heading { font-size: 1.6em; } section.solutions > h4.heading, section.solutions section > h4.heading { font-size: 1.45em; } section.solutions > h5.heading, section.solutions section > h5.heading { font-size: 1.35em; } section.solutions > h6.heading, section.solutions section > h6.heading { font-size: 1.25em; } .sbsgroup > *:not(:first-child) { margin-top: 1.5em; } .sbsrow { display: grid; grid-template-rows: auto auto; } .sbspanel { grid-row: 1; } .sbspanel > .table > figcaption { text-align: center; } .sbspanel .tabular { overflow-x: auto; margin-left: auto; margin-right: auto; } .sbspanel--top { align-self: start; } .sbspanel--middle { align-self: center; } .sbspanel--bottom { align-self: end; } .sbspanel:has(.figure-like, .table-like), .sbspanel > :is(.figure-like, .table-like) { display: contents; } .sbspanel > :is(.figure-like, .table-like) > *:first-child { grid-row: 1; align-items: start; align-self: start; } .sbspanel--top > :is(.figure-like, .table-like) > *:first-child { align-items: start; align-self: start; } .sbspanel--middle > :is(.figure-like, .table-like) > *:first-child { align-items: center; align-self: center; } .sbspanel--bottom > :is(.figure-like, .table-like) > *:first-child { align-items: end; align-self: end; } .sbspanel > :is(.figure-like, .table-like) > *:nth-child(2) { margin-top: 0.5em; grid-row: 2; width: 100%; } .sbspanel:nth-of-type(2) * { grid-column: 2; } .sbspanel:nth-of-type(3) * { grid-column: 3; } .sbspanel:nth-of-type(4) * { grid-column: 4; } .sbspanel:nth-of-type(5) * { grid-column: 5; } .sbspanel:nth-of-type(6) * { grid-column: 6; } .sbspanel:nth-of-type(7) * { grid-column: 7; } .sbspanel:nth-of-type(8) * { grid-column: 8; } .sbspanel:nth-of-type(9) * { grid-column: 9; } .sbspanel:nth-of-type(10) * { grid-column: 10; } .discussion-like > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .discussion-like > .heading:first-child:after { content: "\2009"; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } .discussion-like > .heading ::after { content: "\2009"; } .discussion-like > .heading + .para { display: inline; } .discussion-like > .heading .space, .discussion-like > .heading .codenumber, .discussion-like > .heading .period { display: none; } .discussion-like > .heading .type::after { content: ". "; } .ptx-content.epub img { display: block; } .ptx-content.epub .solutions { margin-top: 1em; } .ptx-content.epub .solutions .solution .type, .ptx-content.epub .solutions .answer .type { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: bold; } .ptx-content.epub .solutions .solution .type + .period, .ptx-content.epub .solutions .answer .type + .period { margin-right: 0.75em; } .ptx-content.epub .solutions .solution .type + p, .ptx-content.epub .solutions .answer .type + p { display: inline; } .ptx-content.epub article.theorem-like, .ptx-content.epub article.definition-like, .ptx-content.epub article.example-like, .ptx-content.epub article.project-like, .ptx-content.epub article.remark-like, .ptx-content.epub article.openproblem-like, .ptx-content.epub article.openproblems-like, .ptx-content.epub article.computation-like { margin-left: 1px; } .ptx-content.epub .proof { margin-right: 1px; } .ptx-content pre { font-size: 95%; padding-top: 0.3em; padding-bottom: 0.5em; padding-left: 0.5em; background: #f0f0f0; } .ptx-content pre.code.input { background: #f0f0ff; } .ptx-content pre.code.output { background: #f0fff0; } .ptx-content section > .heading { display: block; margin-top: 0; break-after: avoid !important; } .ptx-content section > .heading + p { display: block; break-before: avoid !important; } .ptx-content figcaption { break-before: avoid !important; } .ptx-content figure { break-inside: avoid !important; } .ptx-content figure .image-box, .ptx-content figure .tabular-box { break-after: avoid !important; } .mjpage .MJX-monospace { font-family: monospace; } .mjpage .MJX-sans-serif { font-family: sans-serif; } .mjpage { display: inline; font-style: normal; font-weight: normal; line-height: normal; font-size: 100%; font-size-adjust: none; text-indent: 0; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; max-width: none; max-height: none; min-width: 0; min-height: 0; border: 0; padding: 0; margin: 0; } .mjpage * { transition: none; -webkit-transition: none; -moz-transition: none; -ms-transition: none; -o-transition: none; } .mjx-svg-href { fill: blue; stroke: blue; } .MathJax_SVG_LineBox { display: table !important; } .MathJax_SVG_LineBox span { display: table-cell !important; width: 10000em !important; min-width: 0; max-width: none; padding: 0; border: 0; margin: 0; } .mjpage__block { text-align: center; margin: 1em 0em; position: relative; display: block !important; text-indent: 0; max-width: none; max-height: none; min-width: 0; min-height: 0; width: 100%; } /*! Theme: epub */ /*# sourceMappingURL=epub.css.map */ ================================================ FILE: css/dist/kindle.css ================================================ @charset "UTF-8"; /* ../../css/targets/ebook/kindle/kindle.scss */ * { box-sizing: border-box; } @layer spacing { :is(section, article, .knowl__content) > *:not(:first-child) { margin-top: 1.5em; } :is(section, article, .knowl__content) > .para + .para { margin-top: 1em; } .ptx-content :is(ul, td, li, dd, .blockquote, .sbspanel, .para.logical) > *:not(:first-child) { margin-top: 0.5em; } } ol.no-marker, ul.no-marker, li.no-marker { list-style-type: none; } ol.decimal { list-style-type: decimal; } ol.lower-alpha { list-style-type: lower-alpha; } ol.lower-alpha-level-1 > li::marker { content: "(" counter(list-item, lower-alpha) ") "; } ol.upper-alpha { list-style-type: upper-alpha; } ol.lower-roman { list-style-type: lower-roman; } ol.upper-roman { list-style-type: upper-roman; } ul.disc { list-style-type: disc; } ul.square { list-style-type: square; } ul.circle { list-style-type: circle; } dl:is(.description-list, .glossary) { margin: 0; } dl:is(.description-list, .glossary) dt { font-weight: bold; max-width: 55ex; } dl:is(.description-list, .glossary) dd::after { content: ""; display: block; clear: both; } .para > dl:is(.description-list) { margin-top: 0.5em; margin-bottom: 0.5em; } dl.glossary dt { margin-top: 1.25em; } dl.glossary dt:first-of-type { margin-top: 0; } dl.glossary dd { margin-left: 5ex; } dl.description-list dt, dl.description-list dd { margin-top: 1em; } dl.description-list dt:first-of-type, dl.description-list dd:first-of-type { margin-top: 0; } dl.description-list dt { float: left; clear: both; text-align: right; width: 18ex; margin-right: 1ex; } dl.description-list dd { margin-left: 22ex; } dl.description-list.narrow dt { width: 11ex; } dl.description-list.narrow dd { margin-left: 15ex; } dl.description-list.wide dt { width: 25ex; } dl.description-list.wide dd { margin-left: 29ex; } dl.description-list dt:first-of-type { clear: none; } .description-list + * { clear: both; } dl.description-list dl dt { width: 8ex; } dl.description-list dd dd { margin-left: 18ex; } dl.description-list dl dd { margin-left: 12ex; } @media screen and (max-width: 480px) { dl.description-list dt, dl.description-list.narrow dt { float: none; margin-left: 0; text-align: left; width: 25ex; } dl.description-list dd, dl.description-list.narrow dd, dl.description-list.wide dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } :is(.cols2, .cols3, .cols4, .cols5, .cols6) { display: flex; flex-wrap: wrap; justify-content: start; } .cols2 > li { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > li { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > li { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > li { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > li { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .ptx-content li { margin-top: 0.5em; } .ptx-content li .li--heading-title { font-size: 100%; font-weight: normal; font-style: italic; } .para > :is(ol, ul) { margin-top: 0.5em; margin-bottom: 0.5em; } ol > li { padding-left: 0.25em; } .fillin { display: inline-block; border: none; border-width: 1px; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; } .fillin.underline { border-bottom-style: solid; border-width: 1px; } .fillin.box { outline: 1px solid var(--body-text-color); height: 1.3em; } .fillin.shade { background-color: var(--fillin-background-color, #eee); height: 1.3em; } :root.dark-mode { --fillin-background-color: #444; } .heading:is(h1, h2, h3, h4, h5, h6) { margin: 0; font-size: unset; } .heading { line-height: 1.1; font-family: var(--font-headings); font-weight: 700; margin-top: 0; margin-bottom: 0; } section > .heading { font-size: 1.75em; color: var(--body-title-color); line-height: 1.25em; margin-top: 2.5em; margin-bottom: 0.5em; } section > .heading + * { margin-top: 0.5em; } .ptx-content > section > .heading { margin-top: 0.5em; } section section > .heading { font-size: 1.5em; margin-top: 2em; } section section section > .heading { font-size: 1.4em; margin-top: 2em; } article > .heading { font-size: 1.25em; margin-top: 1.5em; } article > .heading + * { margin-top: 0.5em; } .paragraphs > .heading { font-size: 1.125em; } :is(section, article) > .heading + :is(section, article) > .heading { margin-top: 0.5em; } @media screen and (max-width: 480px) { section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } section section > .heading { font-size: 1.3em; line-height: 1.15em; } section section section > .heading { font-size: 1.15em; line-height: 1em; } } .heading.hide-type > .type { display: none; } a { color: var(--link-text-color); text-decoration: none; } a:hover, a:focus { text-decoration: none; } a[href^="mailto:"] { white-space: pre; } .ptx-content a.internal { color: var(--link-text-color); font-weight: bold; } .ptx-content a.external { color: var(--link-alt-text-color); font-weight: bold; } .ptx-content a.internal:hover, .ptx-content a.internal:hover *, .ptx-content a.internal:focus, .ptx-content a.internal:focus * { color: var(--link-active-text-color); background-color: var(--link-active-background); font-weight: bold; } .ptx-content a.external:hover, .ptx-content a.external:hover *, .ptx-content a.external:focus, .ptx-content a.external:focus * { color: var(--link-alt-active-text-color); background-color: var(--link-alt-active-background); font-weight: bold; } .ptx-content table { border-spacing: 0; border-collapse: collapse; } .ptx-content td { padding: 2px 5px; font-size: 90%; } .ptx-content td img { max-width: 200px; margin-right: 30px; } .ptx-content th { padding: 2px 5px; } .ptx-content th .lines { white-space: nowrap; } .ptx-content th.l { text-align: left; } .ptx-content th.c { text-align: center; } .ptx-content th.r { text-align: right; } .ptx-content th.j { text-align: justify; } .ptx-content th.t { vertical-align: top; } .ptx-content th.b { vertical-align: bottom; } .ptx-content th.m { vertical-align: middle; } .ptx-content th.l0 { border-left: none; } .ptx-content th.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content th.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content th.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content th.r0 { border-right: none; } .ptx-content th.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content th.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content th.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content th.t0 { border-top: none; } .ptx-content th.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content th.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content th.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content th.b0 { border-bottom: none; } .ptx-content th.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content th.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content th.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content td .lines { white-space: nowrap; } .ptx-content td.l { text-align: left; } .ptx-content td.c { text-align: center; } .ptx-content td.r { text-align: right; } .ptx-content td.j { text-align: justify; } .ptx-content td.t { vertical-align: top; } .ptx-content td.b { vertical-align: bottom; } .ptx-content td.m { vertical-align: middle; } .ptx-content td.l0 { border-left: none; } .ptx-content td.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content td.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content td.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content td.r0 { border-right: none; } .ptx-content td.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content td.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content td.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content td.t0 { border-top: none; } .ptx-content td.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content td.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content td.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content td.b0 { border-bottom: none; } .ptx-content td.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content td.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content td.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content th.r0.l0, .ptx-content td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content tr.header-vertical th { writing-mode: vertical-rl; transform: rotate(180deg); padding-top: 5px; } .ptx-content .center table { text-align: center; margin-left: auto; margin-right: auto; } .tabular-box { margin-top: 0.5em; overflow-x: auto; } .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } table.notation-list tr th { text-align: left; margin-left: 1em; } table.notation-list tr td { text-align: left; vertical-align: top; } .frontmatter > .heading { display: block; text-align: center; } .frontmatter > .heading .title, .frontmatter .book > .heading .title { font-size: 1.3em; } .frontmatter > .heading .subtitle, .frontmatter .book > .heading .subtitle { display: block; font-weight: normal; color: var(--byline-color); font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .frontmatter > .para:first-of-type { margin-top: 4em; } .frontmatter > .author, .frontmatter > .credit { margin-top: 2em; text-align: center; } .frontmatter .author:first-of-type { margin-top: 4em; } .frontmatter > .author .author-name { font-size: 120%; } .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .frontmatter .credit .title { font-size: 1em; } .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .frontmatter .author-info { font-size: 90%; } .frontmatter .summary-links { margin-top: 4em; } .frontmatter .abstract { margin: 4em 2em; } .frontmatter .keywords, .frontmatter .support { margin-top: 2em; } .frontmatter .abstract > .title, .frontmatter .keywords > .title, .frontmatter .support > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .frontmatter .abstract > .title::after, .frontmatter .keywords > .title::after, .frontmatter .support > .title::after { content: ".\2009\2009\2009"; } .frontmatter .abstract > .title + .para, .frontmatter .keywords > .title + .para, .frontmatter .support > .title + .para { display: inline; } .frontmatter .colophon .copyright { margin-top: 2.5em; } .frontmatter .colophon .license { margin-top: 2.5em; } .ptx-content .summary-links { font-family: var(--font-headings); display: block; margin-top: 1em; } .ptx-content .summary-links a { color: var(--summary-link-text-color); background: var(--summary-link-background); font-size: 1.5em; line-height: 1.25em; padding: 10px 20px; padding-right: 60px; border-radius: 3px; position: relative; display: block; font-weight: unset; } .ptx-content .summary-links a .title { font-style: normal; } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a::after { right: 0.83333em; content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid var(--summary-link-text-color); } .ptx-content .summary-links a:hover { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover * { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover .title { font-weight: normal; } .ptx-content .summary-links a:hover::after { border-left: 0.4em solid var(--summary-link-hover-text-color); } .ptx-content .summary-links ul { list-style-type: none; padding: 0; margin-top: 0; } .ptx-content .summary-links li { margin-top: 5px; } @media screen and (width <= 480px) { .ptx-content .summary-links a { font-size: 100%; line-height: 1.25em; } } .ptx-footnote { display: inline-block; position: relative; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: smaller; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote[open] .ptx-footnote__number sup { display: none; } .ptx-footnote__number { display: inline-block; cursor: pointer; min-width: 1em; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowl-background); border-radius: 0px; padding: 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowl-border-color); color: var(--body-text-color); font-weight: normal; font-size: var(1rem); } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: var(--activated-content-bg); } .indexitem { margin-top: 4px; } .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .indexknowl { margin-left: 0.11em; } em + .indexknowl { margin-left: -0.25em; } .indexknowl a { margin-left: 2em; } .indexitem .see, .subindexitem .see, .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .indexitem .seealso, .subindexitem .seealso, .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .indexitem .see em, .subindexitem .see em, .subsubindexitem .see em, .indexitem .seealso em, .subindexitem .seealso em, .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .indexitem .see + .see, .subindexitem .see + .see, .subsubindexitem .see + .see, .indexitem .seealso + .seealso, .subindexitem .seealso + .seealso, .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .indexitem .indexknowl { font-size: 90%; } .indexitem [data-knowl], .subindexitem [data-knowl], .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .indexknowl [data-knowl]:hover, .indexknowl .active[data-knowl] { margin-left: 2em; } .subindexitem .indexknowl { font-size: 95%; } .subsubindexitem .indexknowl { font-size: 95%; } .indexletter { margin-top: 1.5em; } .image-box, .audio-box, .video-box, .asymptote-box { position: relative; } .image-box .asymptote-box iframe.asymptote, iframe.asymptote, .video-box .video, .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .image-box img, img.contained { width: 100%; } .asymptote-fullsize-link { text-align: center; font-size: 0.9em; } .ptx-content img, .ptx-content svg { background: var(--ptx-image-bg); } .mermaid > svg { background: none; } .image-description summary { list-style: none; cursor: pointer; } .image-archive { margin: 0.75em auto 0; font-family: var(--font-monospace); justify-content: center; display: flex; gap: 0.5em; } .image-box > img:not(.mag_popup) { cursor: zoom-in; } img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; } .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .audio { width: 100%; } .video-poster { cursor: pointer; } figure { clear: both; position: relative; margin-left: 0; margin-right: 0; } figcaption { margin-left: auto; margin-right: auto; margin-top: 0.5em; } figcaption code.code-inline { white-space: pre; } figcaption .codenumber, figcaption .type { font-weight: 700; } figcaption .codenumber::after, figcaption .type:last-of-type::after { content: "\2002"; } figcaption .para:first-of-type { display: inline; } figure.table-like { margin-left: 30px; margin-right: 30px; } figure.table-like .list { margin-right: 0; } @media (max-width <= 943px) { .figure-like { overflow-x: auto; } } .poem { display: table; margin: 0 auto; width: auto; max-width: 90%; } .poem > .heading { display: block; text-align: center; } section article.poem > .heading::after { content: ""; } .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .poem .author { font-style: italic; margin-top: 0.75em; } .poem .author.left { text-align: left; } .poem .author.center { text-align: center; } .poem .author.right { text-align: right; } .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .poem .stanza + .stanza { margin-top: 1em; } .poem .heading + .stanza { margin-top: 0.2em; } .poem .heading + .line { margin-top: 0.2em; } .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .poem .line.center { text-align: center; } .poem .line.right { text-align: right; } .poem .tab { margin-left: 2em; } .code-box { overflow-x: auto; } .code-display { overflow-x: auto; font-family: var(--font-monospace); margin: 0.5em 0; } .console, .program { border: 1px solid var(--page-border-color); padding: 5px 15px; overflow-x: auto; margin: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-inline { font-family: var(--font-monospace); white-space: pre; color: var(--body-text-color); background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); border-radius: 0.2em; display: inline-block; overflow-x: auto; max-width: 100%; vertical-align: middle; line-height: normal; padding: 0.0625em 0.15em; } .prompt.unselectable { user-select: none; } .code-block { border-left: 1px solid #aaa; padding: 0 15px 5px; overflow-x: auto; background: var(--code-background); margin-top: 0; margin-bottom: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-block::before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } @media print { .code-copy { display: none; } } pre[class*=language-] { margin: 0; overflow: auto; border: 1px solid #e1e1e1; } :not(pre) > code[class*=language-] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } code[class*=language-], pre[class*=language-] { color: black; background: #fdfdfd; text-shadow: none; font-family: var(--font-monospace); text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.2; tab-size: 4; hyphens: none; } code[class*=language-].code-inline, pre[class*=language-].code-inline { line-height: normal; padding: 0.0625em 0.15em; } code[class*=language-]::selection, code[class*=language-] ::selection, pre[class*=language-]::selection, pre[class*=language-] ::selection { background: #b3d4fc; } code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #2a9716; } code[class*=language-] .token.punctuation, pre[class*=language-] .token.punctuation { color: #000; } code[class*=language-] .token.namespace, pre[class*=language-] .token.namespace { opacity: 0.9; } code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: rgb(41, 120, 15); } code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #a11; } code[class*=language-] .token:is(.operator, .entity, .url), pre[class*=language-] .token:is(.operator, .entity, .url) { color: #000; background: none; } code[class*=language-] .token:is(.atrule, .attr-value, .keyword), pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #0679B7; } code[class*=language-] .token.function, code[class*=language-] .token.class-name, pre[class*=language-] .token.function, pre[class*=language-] .token.class-name { color: #30a; } code[class*=language-] .token.important, code[class*=language-] .token.variable, pre[class*=language-] .token.important, pre[class*=language-] .token.variable { color: rgb(0, 0, 0); } code[class*=language-] .token.important, code[class*=language-] .token.bold, pre[class*=language-] .token.important, pre[class*=language-] .token.bold { font-weight: bold; } code[class*=language-] .token.italic, pre[class*=language-] .token.italic { font-style: italic; } code[class*=language-] .token.entity, pre[class*=language-] .token.entity { cursor: help; } code[class*=language-].line-numbers, pre[class*=language-].line-numbers { position: relative; padding-left: 3.8em; counter-reset: linenumber; overflow: auto; } code[class*=language-].line-numbers > code, pre[class*=language-].line-numbers > code { position: relative; white-space: inherit; } code[class*=language-].line-numbers .line-numbers-rows, pre[class*=language-].line-numbers .line-numbers-rows { position: absolute; pointer-events: none; top: 0; font-size: 100%; left: -3.8em; width: 3em; letter-spacing: -1px; border-right: 1px solid #999; user-select: none; } code[class*=language-].line-numbers .line-numbers-rows > span, pre[class*=language-].line-numbers .line-numbers-rows > span { display: block; counter-increment: linenumber; } code[class*=language-].line-numbers .line-numbers-rows > span::before, pre[class*=language-].line-numbers .line-numbers-rows > span::before { content: counter(linenumber); color: #999; display: block; padding-right: 0.8em; text-align: right; } code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { position: absolute; margin-top: 4px; left: 0; right: 0; padding: inherit 0; font-size: inherit; background: hsla(24, 20%, 50%, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } :root.dark-mode { } :root.dark-mode pre[class*=language-] { border: 1px solid #3d3d3d; } :root.dark-mode code[class*=language-], :root.dark-mode pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } :root.dark-mode code[class*=language-]::selection, :root.dark-mode code[class*=language-] ::selection, :root.dark-mode pre[class*=language-]::selection, :root.dark-mode pre[class*=language-] ::selection { background: hsl(200, 4%, 16%); } :root.dark-mode code[class*=language-] .token, :root.dark-mode pre[class*=language-] .token { position: relative; z-index: 1; } :root.dark-mode code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), :root.dark-mode pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #68a950; } :root.dark-mode code[class*=language-] .token.punctuation, :root.dark-mode pre[class*=language-] .token.punctuation { color: white; opacity: 1; } :root.dark-mode code[class*=language-] .token.namespace, :root.dark-mode pre[class*=language-] .token.namespace { opacity: 0.9; } :root.dark-mode code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), :root.dark-mode pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: #abc792; } :root.dark-mode code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), :root.dark-mode pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #ca9147; } :root.dark-mode code[class*=language-] .token:is(.operator, .entity, .url), :root.dark-mode pre[class*=language-] .token:is(.operator, .entity, .url) { color: white; } :root.dark-mode code[class*=language-] .token:is(.atrule, .attr-value, .keyword), :root.dark-mode pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #2d94fb; } :root.dark-mode code[class*=language-] .token.function, :root.dark-mode code[class*=language-] .token.class-name, :root.dark-mode pre[class*=language-] .token.function, :root.dark-mode pre[class*=language-] .token.class-name { color: #e3e1c2; } :root.dark-mode code[class*=language-] .token.important, :root.dark-mode code[class*=language-] .token.bold, :root.dark-mode pre[class*=language-] .token.important, :root.dark-mode pre[class*=language-] .token.bold { font-weight: bold; } :root.dark-mode code[class*=language-] .token.italic, :root.dark-mode pre[class*=language-] .token.italic { font-style: italic; } :root.dark-mode code[class*=language-] .token.entity, :root.dark-mode pre[class*=language-] .token.entity { cursor: help; } :root.dark-mode .line-highlight { background: hsla(0, 0%, 33%, 0.1); border-bottom: 1px dashed hsl(0, 0%, 33%); border-top: 1px dashed hsl(0, 0%, 33%); z-index: 0; } @media print { code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { color-adjust: exact; } } .displaymath { overflow-x: auto; overflow-y: hidden; } .displaymath mjx-container[jax=CHTML][display=true] { margin: 0 0 0 0; padding-top: 0.3em; } .process-math mjx-container svg { background: none; } [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .knowl mjx-mtext > mjx-utext, mjx-mtext > mjx-utext { width: revert !important; } mjx-msup mjx-utext, mjx-msub mjx-utext { display: inline; } em.alert { font-weight: bold; } .bib { margin-top: 0.25em; } .bib .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .bib .bibitem + .bibentry { display: inline-block; width: 90%; margin-top: 0; } .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .contributor { margin-top: 1.5ex; } .contributor:first-child { margin-top: 0em; } .contributor + .para { margin-top: 3ex; } .contributor .contributor-name { font-variant: small-caps; } .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } iframe { margin: 0; border: none; } .kbdkey { background: #f1f1f1; color: #333; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .unit, .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .unit sub, .unit sup, .quantity sub, .quantity sup { word-spacing: normal; } .terminology { font-style: italic; font-weight: bold; } .times-sign { font-size: larger; vertical-align: -0.15ex; } .emphasis { font-style: italic; } .emphasis .emphasis { font-weight: bold; } .definition-like .emphasis { font-weight: 700; } article.theorem-like .emphasis { font-weight: 700; } .para { line-height: 1.35; } .hidden { display: none !important; } .taxon { font-style: italic; } .quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .booktitle { font-style: oblique; } .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } .cols2 > .exercise-like { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > .exercise-like { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > .exercise-like { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > .exercise-like { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > .exercise-like { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .exercise-like > .heading { font-size: inherit; } .exercisegroup .exercise-like { margin-top: 1em; } .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .exercisegroup > .heading + .introduction { display: inline; } .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .exercisegroup .exercisegroup-exercises { margin-top: 1em; padding-left: 40px; } .exercisegroup .conclusion { margin-left: 40px; } .exercisegroup .conclusion .heading { font-size: inherit; } .exercise-like > .exercise-like.task { margin-left: 20px; } .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .exercise-wrapper form button:active { background-color: #f0f0f0; } .exercise-wrapper form button + button { margin-left: 0.8em; } .exercise-wrapper, .exercise-wrapper form, .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .knowl .exercise-wrapper, .knowl .exercise-wrapper form, .knowl .exercise-wrapper form > div:first-child { width: 100%; } .exercise-wrapper > .para:first-child, .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .cols2 .heading + .exercise-wrapper { width: auto; } section.solutions > .heading + .heading { margin-top: 0.5em; } section.solutions > h3.heading, section.solutions section > h3.heading { font-size: 1.6em; } section.solutions > h4.heading, section.solutions section > h4.heading { font-size: 1.45em; } section.solutions > h5.heading, section.solutions section > h5.heading { font-size: 1.35em; } section.solutions > h6.heading, section.solutions section > h6.heading { font-size: 1.25em; } .sbsgroup > *:not(:first-child) { margin-top: 1.5em; } .sbsrow { display: grid; grid-template-rows: auto auto; } .sbspanel { grid-row: 1; } .sbspanel > .table > figcaption { text-align: center; } .sbspanel .tabular { overflow-x: auto; margin-left: auto; margin-right: auto; } .sbspanel--top { align-self: start; } .sbspanel--middle { align-self: center; } .sbspanel--bottom { align-self: end; } .sbspanel:has(.figure-like, .table-like), .sbspanel > :is(.figure-like, .table-like) { display: contents; } .sbspanel > :is(.figure-like, .table-like) > *:first-child { grid-row: 1; align-items: start; align-self: start; } .sbspanel--top > :is(.figure-like, .table-like) > *:first-child { align-items: start; align-self: start; } .sbspanel--middle > :is(.figure-like, .table-like) > *:first-child { align-items: center; align-self: center; } .sbspanel--bottom > :is(.figure-like, .table-like) > *:first-child { align-items: end; align-self: end; } .sbspanel > :is(.figure-like, .table-like) > *:nth-child(2) { margin-top: 0.5em; grid-row: 2; width: 100%; } .sbspanel:nth-of-type(2) * { grid-column: 2; } .sbspanel:nth-of-type(3) * { grid-column: 3; } .sbspanel:nth-of-type(4) * { grid-column: 4; } .sbspanel:nth-of-type(5) * { grid-column: 5; } .sbspanel:nth-of-type(6) * { grid-column: 6; } .sbspanel:nth-of-type(7) * { grid-column: 7; } .sbspanel:nth-of-type(8) * { grid-column: 8; } .sbspanel:nth-of-type(9) * { grid-column: 9; } .sbspanel:nth-of-type(10) * { grid-column: 10; } .discussion-like > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .discussion-like > .heading:first-child:after { content: "\2009"; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } .discussion-like > .heading ::after { content: "\2009"; } .discussion-like > .heading + .para { display: inline; } .discussion-like > .heading .space, .discussion-like > .heading .codenumber, .discussion-like > .heading .period { display: none; } .discussion-like > .heading .type::after { content: ". "; } .ptx-content.epub img { display: block; } .ptx-content.epub .solutions { margin-top: 1em; } .ptx-content.epub .solutions .solution .type, .ptx-content.epub .solutions .answer .type { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: bold; } .ptx-content.epub .solutions .solution .type + .period, .ptx-content.epub .solutions .answer .type + .period { margin-right: 0.75em; } .ptx-content.epub .solutions .solution .type + p, .ptx-content.epub .solutions .answer .type + p { display: inline; } .ptx-content.epub article.theorem-like, .ptx-content.epub article.definition-like, .ptx-content.epub article.example-like, .ptx-content.epub article.project-like, .ptx-content.epub article.remark-like, .ptx-content.epub article.openproblem-like, .ptx-content.epub article.openproblems-like, .ptx-content.epub article.computation-like { margin-left: 1px; } .ptx-content.epub .proof { margin-right: 1px; } .ptx-content pre { font-size: 95%; padding-top: 0.3em; padding-bottom: 0.5em; padding-left: 0.5em; background: #f0f0f0; } .ptx-content pre.code.input { background: #f0f0ff; } .ptx-content pre.code.output { background: #f0fff0; } .ptx-content section article > .heading, .ptx-content section > .heading { display: block; margin-top: 0; break-after: avoid !important; } .ptx-content section article > .heading + p, .ptx-content section article > .heading + .introduction, .ptx-content section > .heading + p { display: block; break-before: avoid !important; } .ptx-content figcaption { break-before: avoid !important; } .ptx-content figure { break-inside: avoid !important; } .ptx-content figure .image-box, .ptx-content figure .tabular-box { break-after: avoid !important; } .mjpage .MJX-monospace { font-family: monospace; } .mjpage .MJX-sans-serif { font-family: sans-serif; } .mjpage { display: inline; font-style: normal; font-weight: normal; line-height: normal; font-size: 100%; font-size-adjust: none; text-indent: 0; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; max-width: none; max-height: none; min-width: 0; min-height: 0; border: 0; padding: 0; margin: 0; } .mjpage * { transition: none; -webkit-transition: none; -moz-transition: none; -ms-transition: none; -o-transition: none; } .mjx-svg-href { fill: blue; stroke: blue; } .MathJax_SVG_LineBox { display: table !important; } .MathJax_SVG_LineBox span { display: table-cell !important; width: 10000em !important; min-width: 0; max-width: none; padding: 0; border: 0; margin: 0; } .mjpage__block { text-align: center; margin: 1em 0em; position: relative; display: block !important; text-indent: 0; max-width: none; max-height: none; min-width: 0; min-height: 0; width: 100%; } .ptx-content .mjpage { margin-bottom: 0 !important; vertical-align: -0.68ex; } .ptx-content .mjpage + p { margin-top: -0.5em !important; } .ptx-content .solution-like > .type { font-weight: bold; } .ptx-content .solution-like .type + p { display: inline; } .ptx-content article.theorem-like::after, .ptx-content article.definition-like::after, .ptx-content article.example-like::after, .ptx-content article.project-like::after, .ptx-content article.remark-like::after, .ptx-content article.computation-like::after { margin-top: -1em; } .ptx-content section { padding-top: 0 !important; } .ptx-content .subsection { margin-top: 1.5em !important; } /*! Theme: kindle */ /*# sourceMappingURL=kindle.css.map */ ================================================ FILE: css/dist/pretext-reveal.css ================================================ /* ../../css/targets/revealjs/reveal.scss */ ol.no-marker, ul.no-marker, li.no-marker { list-style-type: none; } ol.decimal { list-style-type: decimal; } ol.lower-alpha { list-style-type: lower-alpha; } ol.lower-alpha-level-1 > li::marker { content: "(" counter(list-item, lower-alpha) ") "; } ol.upper-alpha { list-style-type: upper-alpha; } ol.lower-roman { list-style-type: lower-roman; } ol.upper-roman { list-style-type: upper-roman; } ul.disc { list-style-type: disc; } ul.square { list-style-type: square; } ul.circle { list-style-type: circle; } ul { display: block !important; } .cols1 li, .cols2 li, .cols3 li, .cols4 li, .cols5 li, .cols6 li { float: left; padding-right: 2em; } .sidebyside { width: 100%; } .definition-like, .theorem-like, .proof, .project-like { border-width: 0.5px; border-style: solid; border-radius: 2px 10px 2px; padding: 1%; margin-bottom: var(--r-block-margin); } .definition-like { background: color-mix(in srgb, var(--r-background-color) 75%, #006080); } .theorem-like { background: color-mix(in srgb, var(--r-background-color) 75%, #a00); } .proof { background: color-mix(in srgb, var(--r-background-color) 75%, #aaa); } .project-like { background: color-mix(in srgb, var(--r-background-color) 75%, #608000); } .reveal img { border: 0.5px !important; border-radius: 2px 10px; padding: 4px; } .image-box, .audio-box, .video-box, .asymptote-box { position: relative; } iframe.asymptote, .video-box .video, .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } div[style*="display:table-cell"] img { width: 100%; } .code-inline { background: color-mix(in srgb, var(--r-background-color) 75%, var(--r-link-color)); padding: 0 3px; border: 1px solid; margin: 3px; display: inline-block; } .sagecell_sessionOutput { background: white; color: black; border: 0.5px solid var(--r-main-color); } .program { background: color-mix(in srgb, var(--r-background-color) 75%, var(--r-link-color)); max-height: 450px; overflow: auto; border: 0.5px solid var(--r-main-color); } .ptx-sagecell, .reveal .program { font-size: calc(var(--r-main-font-size) * 0.6); } code[class*=language-], pre[class*=language-] { padding: 0; line-height: 1.2; } .reveal pre { box-shadow: none; line-height: 1; font-size: inherit; width: auto; margin: inherit; } .reveal pre code { display: block; padding: 0; overflow: unset; max-height: unset; word-wrap: normal; } dfn { font-weight: bold; } /*! Theme: reveal */ /*# sourceMappingURL=pretext-reveal.css.map */ ================================================ FILE: css/dist/print-worksheet.css ================================================ @charset "UTF-8"; @import "https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=swap"; @import "https://fonts.googleapis.com/css2?family=PT Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap"; @import "https://fonts.googleapis.com/css2?family=Inconsolata:ital,wght@0,400..700;1,400..700&display=swap"; /* ../../css/targets/print-worksheet/print-worksheet.scss */ .aside-like > .knowl__link { color: var(--aside-like-link-color); border-bottom-color: var(--aside-like-link-color); } .aside-like > .knowl__content { margin-left: 30px; margin-right: 30px; border: 2px solid var(--aside-like-border-color); background-color: var(--aside-like-body-background); } @media screen and (min-width: 1280px) { details.aside-like { position: relative; margin-left: -248px; width: 200px; right: -248px; float: right; clear: right; } .multicolumn details.aside-like { position: relative; margin-left: inherit; width: auto; right: 0; float: none; clear: none; } details.aside-like > .knowl__content { margin-left: 0; margin-right: 0; background-color: var(--aside-like-body-background); z-index: 100; } } .code-box { overflow-x: auto; } .code-display { overflow-x: auto; font-family: var(--font-monospace); margin: 0.5em 0; } .console, .program { border: 1px solid var(--page-border-color); padding: 5px 15px; overflow-x: auto; margin: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-inline { font-family: var(--font-monospace); white-space: pre; color: var(--body-text-color); background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); border-radius: 0.2em; display: inline-block; overflow-x: auto; max-width: 100%; vertical-align: middle; line-height: normal; padding: 0.0625em 0.15em; } .prompt.unselectable { user-select: none; } .code-block { border-left: 1px solid #aaa; padding: 0 15px 5px; overflow-x: auto; background: var(--code-background); margin-top: 0; margin-bottom: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-block::before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } @media print { .code-copy { display: none; } } :is(.cols2, .cols3, .cols4, .cols5, .cols6) { display: flex; flex-wrap: wrap; justify-content: start; } .cols2 > .exercise-like { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > .exercise-like { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > .exercise-like { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > .exercise-like { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > .exercise-like { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .exercise-like > .heading { font-size: inherit; } .exercisegroup .exercise-like { margin-top: 1em; } .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .exercisegroup > .heading + .introduction { display: inline; } .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .exercisegroup .exercisegroup-exercises { margin-top: 1em; padding-left: 40px; } .exercisegroup .conclusion { margin-left: 40px; } .exercisegroup .conclusion .heading { font-size: inherit; } .exercise-like > .exercise-like.task { margin-left: 20px; } .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .exercise-wrapper form button:active { background-color: #f0f0f0; } .exercise-wrapper form button + button { margin-left: 0.8em; } .exercise-wrapper, .exercise-wrapper form, .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .knowl .exercise-wrapper, .knowl .exercise-wrapper form, .knowl .exercise-wrapper form > div:first-child { width: 100%; } .exercise-wrapper > .para:first-child, .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .cols2 .heading + .exercise-wrapper { width: auto; } section.solutions > .heading + .heading { margin-top: 0.5em; } section.solutions > h3.heading, section.solutions section > h3.heading { font-size: 1.6em; } section.solutions > h4.heading, section.solutions section > h4.heading { font-size: 1.45em; } section.solutions > h5.heading, section.solutions section > h5.heading { font-size: 1.35em; } section.solutions > h6.heading, section.solutions section > h6.heading { font-size: 1.25em; } .sbsgroup > *:not(:first-child) { margin-top: 1.5em; } .sbsrow { display: grid; grid-template-rows: auto auto; } .sbspanel { grid-row: 1; } .sbspanel > .table > figcaption { text-align: center; } .sbspanel .tabular { overflow-x: auto; margin-left: auto; margin-right: auto; } .sbspanel--top { align-self: start; } .sbspanel--middle { align-self: center; } .sbspanel--bottom { align-self: end; } .sbspanel:has(.figure-like, .table-like), .sbspanel > :is(.figure-like, .table-like) { display: contents; } .sbspanel > :is(.figure-like, .table-like) > *:first-child { grid-row: 1; align-items: start; align-self: start; } .sbspanel--top > :is(.figure-like, .table-like) > *:first-child { align-items: start; align-self: start; } .sbspanel--middle > :is(.figure-like, .table-like) > *:first-child { align-items: center; align-self: center; } .sbspanel--bottom > :is(.figure-like, .table-like) > *:first-child { align-items: end; align-self: end; } .sbspanel > :is(.figure-like, .table-like) > *:nth-child(2) { margin-top: 0.5em; grid-row: 2; width: 100%; } .sbspanel:nth-of-type(2) * { grid-column: 2; } .sbspanel:nth-of-type(3) * { grid-column: 3; } .sbspanel:nth-of-type(4) * { grid-column: 4; } .sbspanel:nth-of-type(5) * { grid-column: 5; } .sbspanel:nth-of-type(6) * { grid-column: 6; } .sbspanel:nth-of-type(7) * { grid-column: 7; } .sbspanel:nth-of-type(8) * { grid-column: 8; } .sbspanel:nth-of-type(9) * { grid-column: 9; } .sbspanel:nth-of-type(10) * { grid-column: 10; } .discussion-like > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .discussion-like > .heading:first-child:after { content: "\2009"; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } .discussion-like > .heading ::after { content: "\2009"; } .discussion-like > .heading + .para { display: inline; } .discussion-like > .heading .space, .discussion-like > .heading .codenumber, .discussion-like > .heading .period { display: none; } .discussion-like > .heading .type::after { content: ". "; } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowl-link-color); border-bottom: 1px dotted var(--knowl-link-color); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--knowl-background); border-bottom-color: transparent; } .source-view__content { margin: 0.2em 0; } .knowl__content { margin: 0.75em 0; border: 3px solid var(--knowl-border-color); border-radius: 0; padding: 12px; background-color: var(--knowl-background); } .knowl__content .incontext { display: block; font-size: 85%; text-align: right; } .knowl__content .knowl__content { background-color: var(--knowl-nested-1-background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-2-background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-3-background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-4-background); } .knowl__content > figure { margin-left: 0; margin-right: 0; } .theorem-like > .heading, .definition-like > .heading, .example-like > .heading, .project-like > .heading, .remark-like > .heading, .openproblem-like > .heading, .computation-like > .heading, .assemblage-like > .heading { display: block; font-size: 1.1em; } .proof { padding-bottom: 1.5em; } .proof::after { content: "\25a1"; float: right; } .proof .heading { font-size: unset; font-weight: bold; font-style: italic; } .solution-like .heading { display: inline; font-style: italic; font-size: unset; } .goal-like:not(.knowl__content, .born-hidden-knowl) { padding: 0.5em; border-top: 1px solid var(--block-border-color); border-bottom: 1px solid var(--block-border-color); border-left: none; border-right: none; background-color: var(--content-background); margin-top: 2em; margin-bottom: 1em; } .goal-like > .heading:first-child { background-color: var(--content-background); display: block; color: var(--body-text-colorolor); margin-bottom: 0.5em; margin-top: -1.5em; margin-left: 10px; width: fit-content; padding: 5px 1em; } .paragraphs > .heading:first-child, article > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .paragraphs > .heading:first-child:after, article > .heading:first-child:after { content: "\2009"; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction), article > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child, article > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child, article > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } .assemblage-like:not(.knowl__content, .born-hidden-knowl) { border: 1px solid var(--assemblage-like-border-color); background-color: var(--block-body-background); padding: 10px; } .assemblage-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { display: block; color: var(--block-head-color); margin-bottom: 0.5em; } .assemblage-like:not(.knowl__content, .born-hidden-knowl) > *:first-child { margin-top: 0; } .assemblage-like > .heading { font-size: 1.1em; } * { box-sizing: border-box; } @layer spacing { :is(section, article, .knowl__content) > *:not(:first-child) { margin-top: 1.5em; } :is(section, article, .knowl__content) > .para + .para { margin-top: 1em; } .ptx-content :is(ul, td, li, dd, .blockquote, .sbspanel, .para.logical) > *:not(:first-child) { margin-top: 0.5em; } } ol.no-marker, ul.no-marker, li.no-marker { list-style-type: none; } ol.decimal { list-style-type: decimal; } ol.lower-alpha { list-style-type: lower-alpha; } ol.lower-alpha-level-1 > li::marker { content: "(" counter(list-item, lower-alpha) ") "; } ol.upper-alpha { list-style-type: upper-alpha; } ol.lower-roman { list-style-type: lower-roman; } ol.upper-roman { list-style-type: upper-roman; } ul.disc { list-style-type: disc; } ul.square { list-style-type: square; } ul.circle { list-style-type: circle; } dl:is(.description-list, .glossary) { margin: 0; } dl:is(.description-list, .glossary) dt { font-weight: bold; max-width: 55ex; } dl:is(.description-list, .glossary) dd::after { content: ""; display: block; clear: both; } .para > dl:is(.description-list) { margin-top: 0.5em; margin-bottom: 0.5em; } dl.glossary dt { margin-top: 1.25em; } dl.glossary dt:first-of-type { margin-top: 0; } dl.glossary dd { margin-left: 5ex; } dl.description-list dt, dl.description-list dd { margin-top: 1em; } dl.description-list dt:first-of-type, dl.description-list dd:first-of-type { margin-top: 0; } dl.description-list dt { float: left; clear: both; text-align: right; width: 18ex; margin-right: 1ex; } dl.description-list dd { margin-left: 22ex; } dl.description-list.narrow dt { width: 11ex; } dl.description-list.narrow dd { margin-left: 15ex; } dl.description-list.wide dt { width: 25ex; } dl.description-list.wide dd { margin-left: 29ex; } dl.description-list dt:first-of-type { clear: none; } .description-list + * { clear: both; } dl.description-list dl dt { width: 8ex; } dl.description-list dd dd { margin-left: 18ex; } dl.description-list dl dd { margin-left: 12ex; } @media screen and (max-width: 480px) { dl.description-list dt, dl.description-list.narrow dt { float: none; margin-left: 0; text-align: left; width: 25ex; } dl.description-list dd, dl.description-list.narrow dd, dl.description-list.wide dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } .cols2 > li { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > li { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > li { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > li { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > li { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .ptx-content li { margin-top: 0.5em; } .ptx-content li .li--heading-title { font-size: 100%; font-weight: normal; font-style: italic; } .para > :is(ol, ul) { margin-top: 0.5em; margin-bottom: 0.5em; } ol > li { padding-left: 0.25em; } .fillin { display: inline-block; border: none; border-width: 1px; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; } .fillin.underline { border-bottom-style: solid; border-width: 1px; } .fillin.box { outline: 1px solid var(--body-text-color); height: 1.3em; } .fillin.shade { background-color: var(--fillin-background-color, #eee); height: 1.3em; } :root.dark-mode { --fillin-background-color: #444; } .heading:is(h1, h2, h3, h4, h5, h6) { margin: 0; font-size: unset; } .heading { line-height: 1.1; font-family: var(--font-headings); font-weight: 700; margin-top: 0; margin-bottom: 0; } section > .heading { font-size: 1.75em; color: var(--body-title-color); line-height: 1.25em; margin-top: 2.5em; margin-bottom: 0.5em; } section > .heading + * { margin-top: 0.5em; } .ptx-content > section > .heading { margin-top: 0.5em; } section section > .heading { font-size: 1.5em; margin-top: 2em; } section section section > .heading { font-size: 1.4em; margin-top: 2em; } article > .heading { font-size: 1.25em; margin-top: 1.5em; } article > .heading + * { margin-top: 0.5em; } .paragraphs > .heading { font-size: 1.125em; } :is(section, article) > .heading + :is(section, article) > .heading { margin-top: 0.5em; } @media screen and (max-width: 480px) { section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } section section > .heading { font-size: 1.3em; line-height: 1.15em; } section section section > .heading { font-size: 1.15em; line-height: 1em; } } .heading.hide-type > .type { display: none; } a { color: var(--link-text-color); text-decoration: none; } a:hover, a:focus { text-decoration: none; } a[href^="mailto:"] { white-space: pre; } .ptx-content a.internal { color: var(--link-text-color); font-weight: bold; } .ptx-content a.external { color: var(--link-alt-text-color); font-weight: bold; } .ptx-content a.internal:hover, .ptx-content a.internal:hover *, .ptx-content a.internal:focus, .ptx-content a.internal:focus * { color: var(--link-active-text-color); background-color: var(--link-active-background); font-weight: bold; } .ptx-content a.external:hover, .ptx-content a.external:hover *, .ptx-content a.external:focus, .ptx-content a.external:focus * { color: var(--link-alt-active-text-color); background-color: var(--link-alt-active-background); font-weight: bold; } .ptx-content table { border-spacing: 0; border-collapse: collapse; } .ptx-content td { padding: 2px 5px; font-size: 90%; } .ptx-content td img { max-width: 200px; margin-right: 30px; } .ptx-content th { padding: 2px 5px; } .ptx-content th .lines { white-space: nowrap; } .ptx-content th.l { text-align: left; } .ptx-content th.c { text-align: center; } .ptx-content th.r { text-align: right; } .ptx-content th.j { text-align: justify; } .ptx-content th.t { vertical-align: top; } .ptx-content th.b { vertical-align: bottom; } .ptx-content th.m { vertical-align: middle; } .ptx-content th.l0 { border-left: none; } .ptx-content th.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content th.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content th.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content th.r0 { border-right: none; } .ptx-content th.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content th.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content th.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content th.t0 { border-top: none; } .ptx-content th.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content th.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content th.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content th.b0 { border-bottom: none; } .ptx-content th.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content th.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content th.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content td .lines { white-space: nowrap; } .ptx-content td.l { text-align: left; } .ptx-content td.c { text-align: center; } .ptx-content td.r { text-align: right; } .ptx-content td.j { text-align: justify; } .ptx-content td.t { vertical-align: top; } .ptx-content td.b { vertical-align: bottom; } .ptx-content td.m { vertical-align: middle; } .ptx-content td.l0 { border-left: none; } .ptx-content td.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content td.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content td.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content td.r0 { border-right: none; } .ptx-content td.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content td.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content td.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content td.t0 { border-top: none; } .ptx-content td.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content td.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content td.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content td.b0 { border-bottom: none; } .ptx-content td.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content td.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content td.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content th.r0.l0, .ptx-content td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content tr.header-vertical th { writing-mode: vertical-rl; transform: rotate(180deg); padding-top: 5px; } .ptx-content .center table { text-align: center; margin-left: auto; margin-right: auto; } .tabular-box { margin-top: 0.5em; overflow-x: auto; } .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } table.notation-list tr th { text-align: left; margin-left: 1em; } table.notation-list tr td { text-align: left; vertical-align: top; } .frontmatter > .heading { display: block; text-align: center; } .frontmatter > .heading .title, .frontmatter .book > .heading .title { font-size: 1.3em; } .frontmatter > .heading .subtitle, .frontmatter .book > .heading .subtitle { display: block; font-weight: normal; color: var(--byline-color); font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .frontmatter > .para:first-of-type { margin-top: 4em; } .frontmatter > .author, .frontmatter > .credit { margin-top: 2em; text-align: center; } .frontmatter .author:first-of-type { margin-top: 4em; } .frontmatter > .author .author-name { font-size: 120%; } .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .frontmatter .credit .title { font-size: 1em; } .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .frontmatter .author-info { font-size: 90%; } .frontmatter .summary-links { margin-top: 4em; } .frontmatter .abstract { margin: 4em 2em; } .frontmatter .keywords, .frontmatter .support { margin-top: 2em; } .frontmatter .abstract > .title, .frontmatter .keywords > .title, .frontmatter .support > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .frontmatter .abstract > .title::after, .frontmatter .keywords > .title::after, .frontmatter .support > .title::after { content: ".\2009\2009\2009"; } .frontmatter .abstract > .title + .para, .frontmatter .keywords > .title + .para, .frontmatter .support > .title + .para { display: inline; } .frontmatter .colophon .copyright { margin-top: 2.5em; } .frontmatter .colophon .license { margin-top: 2.5em; } .ptx-content .summary-links { font-family: var(--font-headings); display: block; margin-top: 1em; } .ptx-content .summary-links a { color: var(--summary-link-text-color); background: var(--summary-link-background); font-size: 1.5em; line-height: 1.25em; padding: 10px 20px; padding-right: 60px; border-radius: 3px; position: relative; display: block; font-weight: unset; } .ptx-content .summary-links a .title { font-style: normal; } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a::after { right: 0.83333em; content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid var(--summary-link-text-color); } .ptx-content .summary-links a:hover { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover * { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover .title { font-weight: normal; } .ptx-content .summary-links a:hover::after { border-left: 0.4em solid var(--summary-link-hover-text-color); } .ptx-content .summary-links ul { list-style-type: none; padding: 0; margin-top: 0; } .ptx-content .summary-links li { margin-top: 5px; } @media screen and (width <= 480px) { .ptx-content .summary-links a { font-size: 100%; line-height: 1.25em; } } .ptx-footnote { display: inline-block; position: relative; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: smaller; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote[open] .ptx-footnote__number sup { display: none; } .ptx-footnote__number { display: inline-block; cursor: pointer; min-width: 1em; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowl-background); border-radius: 0px; padding: 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowl-border-color); color: var(--body-text-color); font-weight: normal; font-size: var(1rem); } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: var(--activated-content-bg); } .indexitem { margin-top: 4px; } .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .indexknowl { margin-left: 0.11em; } em + .indexknowl { margin-left: -0.25em; } .indexknowl a { margin-left: 2em; } .indexitem .see, .subindexitem .see, .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .indexitem .seealso, .subindexitem .seealso, .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .indexitem .see em, .subindexitem .see em, .subsubindexitem .see em, .indexitem .seealso em, .subindexitem .seealso em, .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .indexitem .see + .see, .subindexitem .see + .see, .subsubindexitem .see + .see, .indexitem .seealso + .seealso, .subindexitem .seealso + .seealso, .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .indexitem .indexknowl { font-size: 90%; } .indexitem [data-knowl], .subindexitem [data-knowl], .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .indexknowl [data-knowl]:hover, .indexknowl .active[data-knowl] { margin-left: 2em; } .subindexitem .indexknowl { font-size: 95%; } .subsubindexitem .indexknowl { font-size: 95%; } .indexletter { margin-top: 1.5em; } .image-box, .audio-box, .video-box, .asymptote-box { position: relative; } .image-box .asymptote-box iframe.asymptote, iframe.asymptote, .video-box .video, .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .image-box img, img.contained { width: 100%; } .asymptote-fullsize-link { text-align: center; font-size: 0.9em; } .ptx-content img, .ptx-content svg { background: var(--ptx-image-bg); } .mermaid > svg { background: none; } .image-description summary { list-style: none; cursor: pointer; } .image-archive { margin: 0.75em auto 0; font-family: var(--font-monospace); justify-content: center; display: flex; gap: 0.5em; } .image-box > img:not(.mag_popup) { cursor: zoom-in; } img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; } .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .audio { width: 100%; } .video-poster { cursor: pointer; } figure { clear: both; position: relative; margin-left: 0; margin-right: 0; } figcaption { margin-left: auto; margin-right: auto; margin-top: 0.5em; } figcaption code.code-inline { white-space: pre; } figcaption .codenumber, figcaption .type { font-weight: 700; } figcaption .codenumber::after, figcaption .type:last-of-type::after { content: "\2002"; } figcaption .para:first-of-type { display: inline; } figure.table-like { margin-left: 30px; margin-right: 30px; } figure.table-like .list { margin-right: 0; } @media (max-width <= 943px) { .figure-like { overflow-x: auto; } } .poem { display: table; margin: 0 auto; width: auto; max-width: 90%; } .poem > .heading { display: block; text-align: center; } section article.poem > .heading::after { content: ""; } .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .poem .author { font-style: italic; margin-top: 0.75em; } .poem .author.left { text-align: left; } .poem .author.center { text-align: center; } .poem .author.right { text-align: right; } .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .poem .stanza + .stanza { margin-top: 1em; } .poem .heading + .stanza { margin-top: 0.2em; } .poem .heading + .line { margin-top: 0.2em; } .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .poem .line.center { text-align: center; } .poem .line.right { text-align: right; } .poem .tab { margin-left: 2em; } pre[class*=language-] { margin: 0; overflow: auto; border: 1px solid #e1e1e1; } :not(pre) > code[class*=language-] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } code[class*=language-], pre[class*=language-] { color: black; background: #fdfdfd; text-shadow: none; font-family: var(--font-monospace); text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.2; tab-size: 4; hyphens: none; } code[class*=language-].code-inline, pre[class*=language-].code-inline { line-height: normal; padding: 0.0625em 0.15em; } code[class*=language-]::selection, code[class*=language-] ::selection, pre[class*=language-]::selection, pre[class*=language-] ::selection { background: #b3d4fc; } code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #2a9716; } code[class*=language-] .token.punctuation, pre[class*=language-] .token.punctuation { color: #000; } code[class*=language-] .token.namespace, pre[class*=language-] .token.namespace { opacity: 0.9; } code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: rgb(41, 120, 15); } code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #a11; } code[class*=language-] .token:is(.operator, .entity, .url), pre[class*=language-] .token:is(.operator, .entity, .url) { color: #000; background: none; } code[class*=language-] .token:is(.atrule, .attr-value, .keyword), pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #0679B7; } code[class*=language-] .token.function, code[class*=language-] .token.class-name, pre[class*=language-] .token.function, pre[class*=language-] .token.class-name { color: #30a; } code[class*=language-] .token.important, code[class*=language-] .token.variable, pre[class*=language-] .token.important, pre[class*=language-] .token.variable { color: rgb(0, 0, 0); } code[class*=language-] .token.important, code[class*=language-] .token.bold, pre[class*=language-] .token.important, pre[class*=language-] .token.bold { font-weight: bold; } code[class*=language-] .token.italic, pre[class*=language-] .token.italic { font-style: italic; } code[class*=language-] .token.entity, pre[class*=language-] .token.entity { cursor: help; } code[class*=language-].line-numbers, pre[class*=language-].line-numbers { position: relative; padding-left: 3.8em; counter-reset: linenumber; overflow: auto; } code[class*=language-].line-numbers > code, pre[class*=language-].line-numbers > code { position: relative; white-space: inherit; } code[class*=language-].line-numbers .line-numbers-rows, pre[class*=language-].line-numbers .line-numbers-rows { position: absolute; pointer-events: none; top: 0; font-size: 100%; left: -3.8em; width: 3em; letter-spacing: -1px; border-right: 1px solid #999; user-select: none; } code[class*=language-].line-numbers .line-numbers-rows > span, pre[class*=language-].line-numbers .line-numbers-rows > span { display: block; counter-increment: linenumber; } code[class*=language-].line-numbers .line-numbers-rows > span::before, pre[class*=language-].line-numbers .line-numbers-rows > span::before { content: counter(linenumber); color: #999; display: block; padding-right: 0.8em; text-align: right; } code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { position: absolute; margin-top: 4px; left: 0; right: 0; padding: inherit 0; font-size: inherit; background: hsla(24, 20%, 50%, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } :root.dark-mode { } :root.dark-mode pre[class*=language-] { border: 1px solid #3d3d3d; } :root.dark-mode code[class*=language-], :root.dark-mode pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } :root.dark-mode code[class*=language-]::selection, :root.dark-mode code[class*=language-] ::selection, :root.dark-mode pre[class*=language-]::selection, :root.dark-mode pre[class*=language-] ::selection { background: hsl(200, 4%, 16%); } :root.dark-mode code[class*=language-] .token, :root.dark-mode pre[class*=language-] .token { position: relative; z-index: 1; } :root.dark-mode code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), :root.dark-mode pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #68a950; } :root.dark-mode code[class*=language-] .token.punctuation, :root.dark-mode pre[class*=language-] .token.punctuation { color: white; opacity: 1; } :root.dark-mode code[class*=language-] .token.namespace, :root.dark-mode pre[class*=language-] .token.namespace { opacity: 0.9; } :root.dark-mode code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), :root.dark-mode pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: #abc792; } :root.dark-mode code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), :root.dark-mode pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #ca9147; } :root.dark-mode code[class*=language-] .token:is(.operator, .entity, .url), :root.dark-mode pre[class*=language-] .token:is(.operator, .entity, .url) { color: white; } :root.dark-mode code[class*=language-] .token:is(.atrule, .attr-value, .keyword), :root.dark-mode pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #2d94fb; } :root.dark-mode code[class*=language-] .token.function, :root.dark-mode code[class*=language-] .token.class-name, :root.dark-mode pre[class*=language-] .token.function, :root.dark-mode pre[class*=language-] .token.class-name { color: #e3e1c2; } :root.dark-mode code[class*=language-] .token.important, :root.dark-mode code[class*=language-] .token.bold, :root.dark-mode pre[class*=language-] .token.important, :root.dark-mode pre[class*=language-] .token.bold { font-weight: bold; } :root.dark-mode code[class*=language-] .token.italic, :root.dark-mode pre[class*=language-] .token.italic { font-style: italic; } :root.dark-mode code[class*=language-] .token.entity, :root.dark-mode pre[class*=language-] .token.entity { cursor: help; } :root.dark-mode .line-highlight { background: hsla(0, 0%, 33%, 0.1); border-bottom: 1px dashed hsl(0, 0%, 33%); border-top: 1px dashed hsl(0, 0%, 33%); z-index: 0; } @media print { code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { color-adjust: exact; } } .displaymath { overflow-x: auto; overflow-y: hidden; } .displaymath mjx-container[jax=CHTML][display=true] { margin: 0 0 0 0; padding-top: 0.3em; } .process-math mjx-container svg { background: none; } [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .knowl mjx-mtext > mjx-utext, mjx-mtext > mjx-utext { width: revert !important; } mjx-msup mjx-utext, mjx-msub mjx-utext { display: inline; } em.alert { font-weight: bold; } .bib { margin-top: 0.25em; } .bib .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .bib .bibitem + .bibentry { display: inline-block; width: 90%; margin-top: 0; } .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .contributor { margin-top: 1.5ex; } .contributor:first-child { margin-top: 0em; } .contributor + .para { margin-top: 3ex; } .contributor .contributor-name { font-variant: small-caps; } .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } iframe { margin: 0; border: none; } .kbdkey { background: #f1f1f1; color: #333; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .unit, .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .unit sub, .unit sup, .quantity sub, .quantity sup { word-spacing: normal; } .terminology { font-style: italic; font-weight: bold; } .times-sign { font-size: larger; vertical-align: -0.15ex; } .emphasis { font-style: italic; } .emphasis .emphasis { font-weight: bold; } .definition-like .emphasis { font-weight: 700; } article.theorem-like .emphasis { font-weight: 700; } .para { line-height: 1.35; } .hidden { display: none !important; } .taxon { font-style: italic; } .quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .booktitle { font-style: oblique; } .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } :root { --font-body: Open Sans, Helvetica Neue, Helvetica, Arial, sans-serif; } :root { --font-headings: PT Serif, Times New Roman, Times, serif; } :root { --font-monospace: Inconsolata, Consolas, Monaco, monospace; } :root { --font-print: PT Serif, Times New Roman, Times, serif; } :root, :root.dark-mode { color-scheme: light; --page-color: white; --content-background: white; --page-border-color: #ccc; --doc-title-color: var(--primary-color); --byline-color: #333; --banner-background: #fafafa; --navbar-background: #ededed; --footer-background: var(--banner-background); --toc-border-color: var(--primary-color-white-80); --toc-background: var(--content-background); --tocitem-background: var(--toc-background); --toc-text-color: var(--primary-color-black-30); --tocitem-highlight-background: var(--primary-color-white-15); --tocitem-highlight-text-color: white; --tocitem-highlight-border-color: var(--toc-border-color); --tocitem-active-background: var(--primary-color-white-15); --tocitem-active-text-color: white; --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--content-background); --toclevel1-text-color: var(--toc-text-color); --toclevel2-background: var(--primary-color-white-95); --toclevel2-text-color: var(--toc-text-color); --toclevel3-background: var(--primary-color-white-90); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #000; --body-title-color: var(--primary-color-black-20); --ptx-image-bg: transparent; --activated-content-bg: rgba(241, 185, 255, 0.3); --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color); --link-background: transparent; --link-active-text-color: var(--primary-color-white-40); --link-active-background: var(--background-color-gray-30); --link-alt-text-color: var(--link-text-color); --link-alt-background: transparent; --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--link-active-text-color); --knowl-link-color: var(--link-text-color); --knowl-background: var(--primary-color-white-95); --knowl-border-color: var(--primary-color); --knowl-nested-1-background: #f5f5ff; --knowl-nested-2-background: #fffff5; --knowl-nested-3-background: #f5ffff; --knowl-nested-4-background: #fff5f5; --block-body-background: var(--content-background); --block-border-color: var(--knowl-border-color); --block-head-color: black; --aside-like-link-color: var(--link-text-color); --button-background: #ededed; --button-text-color: #333333; --button-border-color: #ccc; --button-hover-background: var(--primary-color-white-80); --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: #fdfdfd; --code-inline-background: #ededed; --assemblage-like-body-background: var(--block-body-background); --assemblage-like-border-color: var(--block-border-color); --definition-like-body-background: var(--block-body-background); --definition-like-border-color: var(--block-border-color); --theorem-like-body-background: var(--block-body-background); --theorem-like-border-color: var(--block-border-color); --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: var(--block-body-background); --remark-like-border-color: var(--block-border-color); --computation-like-body-background: var(--block-body-background); --computation-like-border-color: var(--block-border-color); --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--block-body-background); --aside-like-border-color: var(--block-border-color); --proof-like-body-background: var(--block-body-background); --proof-like-border-color: var(--block-border-color); --example-like-body-background: var(--block-body-background); --example-like-border-color: var(--block-border-color); --project-like-body-background: var(--block-body-background); --project-like-border-color: var(--block-border-color); --goal-like-body-background: var(--block-body-background); --goal-like-border-color: var(--block-border-color); --solution-like-body-background: var(--block-body-background); --solution-like-border-color: var(--block-border-color); --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); --primary-color: black; --assemb-border-color: var(--primary-color-white-50); } :root { --ws-width: 8.5in; --ws-height: 11in; --ws-top-margin: 40px; --ws-right-margin: 55px; --ws-bottom-margin: 45px; --ws-left-margin: 45px; --ws-content-width: calc(var(--ws-width) - var(--ws-right-margin) - var(--ws-left-margin)); --ws-content-height: calc(var(--ws-height) - var(--ws-top-margin) - var(--ws-bottom-margin)); } .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; } .heading .print-links { display: none; } .autopermalink { display: none; } .image-description, .ptx-content .webwork-button, .ptx-runestone-container button.btn { display: none; } section.worksheet, section.handout { font-size: 11pt; font-family: var(--font-print); } .onepage > .heading { margin-top: 0; font-size: 1.3em; } .onepage h4.heading { font-size: 1.2em; margin-top: 1em; } .onepage .instructions { display: none; } .onepage .first-page-header, .onepage .running-header, .onepage .first-page-footer, .onepage .running-footer { display: flex; justify-content: space-between; align-content: flex-start; } .onepage .first-page-header div, .onepage .running-header div, .onepage .first-page-footer div, .onepage .running-footer div { min-width: 10em; } .onepage .first-page-header .header-center, .onepage .first-page-header .footer-center, .onepage .running-header .header-center, .onepage .running-header .footer-center, .onepage .first-page-footer .header-center, .onepage .first-page-footer .footer-center, .onepage .running-footer .header-center, .onepage .running-footer .footer-center { text-align: center; } .onepage .first-page-header .header-right, .onepage .first-page-header .footer-right, .onepage .running-header .header-right, .onepage .running-header .footer-right, .onepage .first-page-footer .header-right, .onepage .first-page-footer .footer-right, .onepage .running-footer .header-right, .onepage .running-footer .footer-right { text-align: right; } .onepage .first-page-header, .onepage .running-header { margin-bottom: 1em; border-bottom: 1px dashed lightgray; } .onepage .first-page-footer, .onepage .running-footer { margin-top: 1em; border-top: 1px dashed lightgray; } .solutions { margin-top: 1em; } .solutions .solution-like.born-hidden-knowl { margin-top: 1em; padding: unset; } .solutions .solution-like.born-hidden-knowl h5 { font-weight: bolder; display: inline; font-size: 1em; } .solutions .solution-like.born-hidden-knowl > div { display: inline; } .solutions .solution-like.born-hidden-knowl .knowl__content { display: inline; border: none; background-color: unset; padding: 0; } .solutions .solution-like.born-hidden-knowl .knowl__content > :first-child { display: inline; } .solutions .solution-like.born-hidden-knowl .knowl__content .para { margin-top: 0.5em; } .code-inline { border: unset; background: unset; } .onepage article { padding-left: 0; border: none; } .onepage article::after { all: unset; } .onepage > .para:first-child, .onepage > article:first-child { margin-top: 0; } .onepage > section > .heading { margin-top: 0; } section article.task, .conclusion.subtask { margin-left: 20px; } section article.subtask, .conclusion.subsubtask { margin-left: 40px; } section article.subsubtask { margin-left: 60px; } section.worksheet > .heading, section.handout > .heading { display: inline; font-size: 1.1em; } section.worksheet > .heading + .para, section.handout > .heading + .para { display: inline; } .introduction > .heading, .conclusion > .heading { font-size: 1.1em; font-weight: bold; margin-bottom: 0; border-bottom: none; } .introduction > .heading + .para, .conclusion > .heading + .para { margin-top: 0.5em; } form.papersize-select { padding-bottom: 8px; } @media screen { .ptx-main { max-width: var(--ws-width); margin: 50px auto; } .worksheet, .handout { max-width: var(--ws-width); margin: 0 auto; } .onepage { width: 100%; height: var(--ws-height); padding: var(--ws-top-margin) var(--ws-right-margin) var(--ws-bottom-margin) var(--ws-left-margin); box-shadow: 5px 10px 40px -10px; } .onepage + .onepage { margin-top: 2.5em; } .workspace-container { display: flex; overflow: visible; } .workspace { width: 100%; } .highlight-workspace .onepage .workspace { border: 1px dashed gray; background: hsl(224, 100%, 95%); } .onepage .original-workspace { display: none; } .highlight-workspace .onepage .original-workspace { display: block; width: 10px; background: hsl(152, 29%, 65%); } .highlight-workspace .onepage .warning { background: hsl(36, 65%, 67%); } .print-button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .print-button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .print-button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .print-button.disabled { opacity: 0.4; cursor: not-allowed; } .print-button.hidden { display: none; } .print-button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .papersize-select { z-index: 1; } .papersize-select .name::after { content: ": "; } .print-controls { display: flex; justify-content: space-between; align-items: center; padding-bottom: 1em; } label, input { cursor: pointer; } .header-option, .footer-option { display: flex; gap: 1em; align-items: baseline; } .header-option .title::after, .footer-option .title::after { content: ":"; } .print-options summary { cursor: pointer; display: list-item inline; } .print-options .hide-option { display: inline-block; padding-right: 1em; } } @media print { body { margin: 0; padding: 0; width: var(--ws-content-width); } .print-preview-header { display: none; } section.worksheet, section.handout { border: none; width: 100%; } section.worksheet .onepage, section.handout .onepage { margin-top: 0; width: 100%; height: var(--ws-content-height); overflow: hidden; page-break-after: always; page-break-inside: avoid; } section.worksheet .onepage:last-of-type, section.handout .onepage:last-of-type { page-break-after: avoid; } section.worksheet .first-page-header, section.worksheet .running-header, section.handout .first-page-header, section.handout .running-header { border-bottom: none; } section.worksheet .first-page-footer, section.worksheet .running-footer, section.handout .first-page-footer, section.handout .running-footer { border-top: none; } section.worksheet div.workspace, section.worksheet div.workspace.squashed.tight, section.handout div.workspace, section.handout div.workspace.squashed.tight { border: none; padding: 0; background: none !important; } a { color: black; } @page { margin: var(--ws-top-margin, 40px) var(--ws-right-margin, 55px) var(--ws-bottom-margin, 45px) var(--ws-left-margin, 45px); } } /*! Theme: print-worksheet */ /*# sourceMappingURL=print-worksheet.css.map */ ================================================ FILE: css/dist/theme-boulder.css ================================================ @charset "UTF-8"; @import "https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=swap"; @import "https://fonts.googleapis.com/css2?family=PT Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap"; @import "https://fonts.googleapis.com/css2?family=Inconsolata:ital,wght@0,400..700;1,400..700&display=swap"; /* ../../css/targets/html/boulder/theme-boulder.scss */ * { box-sizing: border-box; } @layer spacing { :is(section, article, .knowl__content) > *:not(:first-child) { margin-top: 1.5em; } :is(section, article, .knowl__content) > .para + .para { margin-top: 1em; } .ptx-content :is(ul, td, li, dd, .blockquote, .sbspanel, .para.logical) > *:not(:first-child) { margin-top: 0.5em; } } ol.no-marker, ul.no-marker, li.no-marker { list-style-type: none; } ol.decimal { list-style-type: decimal; } ol.lower-alpha { list-style-type: lower-alpha; } ol.lower-alpha-level-1 > li::marker { content: "(" counter(list-item, lower-alpha) ") "; } ol.upper-alpha { list-style-type: upper-alpha; } ol.lower-roman { list-style-type: lower-roman; } ol.upper-roman { list-style-type: upper-roman; } ul.disc { list-style-type: disc; } ul.square { list-style-type: square; } ul.circle { list-style-type: circle; } dl:is(.description-list, .glossary) { margin: 0; } dl:is(.description-list, .glossary) dt { font-weight: bold; max-width: 55ex; } dl:is(.description-list, .glossary) dd::after { content: ""; display: block; clear: both; } .para > dl:is(.description-list) { margin-top: 0.5em; margin-bottom: 0.5em; } dl.glossary dt { margin-top: 1.25em; } dl.glossary dt:first-of-type { margin-top: 0; } dl.glossary dd { margin-left: 5ex; } dl.description-list dt, dl.description-list dd { margin-top: 1em; } dl.description-list dt:first-of-type, dl.description-list dd:first-of-type { margin-top: 0; } dl.description-list dt { float: left; clear: both; text-align: right; width: 18ex; margin-right: 1ex; } dl.description-list dd { margin-left: 22ex; } dl.description-list.narrow dt { width: 11ex; } dl.description-list.narrow dd { margin-left: 15ex; } dl.description-list.wide dt { width: 25ex; } dl.description-list.wide dd { margin-left: 29ex; } dl.description-list dt:first-of-type { clear: none; } .description-list + * { clear: both; } dl.description-list dl dt { width: 8ex; } dl.description-list dd dd { margin-left: 18ex; } dl.description-list dl dd { margin-left: 12ex; } @media screen and (max-width: 480px) { dl.description-list dt, dl.description-list.narrow dt { float: none; margin-left: 0; text-align: left; width: 25ex; } dl.description-list dd, dl.description-list.narrow dd, dl.description-list.wide dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } :is(.cols2, .cols3, .cols4, .cols5, .cols6) { display: flex; flex-wrap: wrap; justify-content: start; } .cols2 > li { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > li { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > li { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > li { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > li { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .ptx-content li { margin-top: 0.5em; } .ptx-content li .li--heading-title { font-size: 100%; font-weight: normal; font-style: italic; } .para > :is(ol, ul) { margin-top: 0.5em; margin-bottom: 0.5em; } ol > li { padding-left: 0.25em; } .fillin { display: inline-block; border: none; border-width: 1px; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; } .fillin.underline { border-bottom-style: solid; border-width: 1px; } .fillin.box { outline: 1px solid var(--body-text-color); height: 1.3em; } .fillin.shade { background-color: var(--fillin-background-color, #eee); height: 1.3em; } :root.dark-mode { --fillin-background-color: #444; } .heading:is(h1, h2, h3, h4, h5, h6) { margin: 0; font-size: unset; } .heading { line-height: 1.1; font-family: var(--font-headings); font-weight: 700; margin-top: 0; margin-bottom: 0; } section > .heading { font-size: 1.75em; color: var(--body-title-color); line-height: 1.25em; margin-top: 2.5em; margin-bottom: 0.5em; } section > .heading + * { margin-top: 0.5em; } .ptx-content > section > .heading { margin-top: 0.5em; } section section > .heading { font-size: 1.5em; margin-top: 2em; } section section section > .heading { font-size: 1.4em; margin-top: 2em; } article > .heading { font-size: 1.25em; margin-top: 1.5em; } article > .heading + * { margin-top: 0.5em; } .paragraphs > .heading { font-size: 1.125em; } :is(section, article) > .heading + :is(section, article) > .heading { margin-top: 0.5em; } @media screen and (max-width: 480px) { section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } section section > .heading { font-size: 1.3em; line-height: 1.15em; } section section section > .heading { font-size: 1.15em; line-height: 1em; } } .heading.hide-type > .type { display: none; } a { color: var(--link-text-color); text-decoration: none; } a:hover, a:focus { text-decoration: none; } a[href^="mailto:"] { white-space: pre; } .ptx-content a.internal { color: var(--link-text-color); font-weight: bold; } .ptx-content a.external { color: var(--link-alt-text-color); font-weight: bold; } .ptx-content a.internal:hover, .ptx-content a.internal:hover *, .ptx-content a.internal:focus, .ptx-content a.internal:focus * { color: var(--link-active-text-color); background-color: var(--link-active-background); font-weight: bold; } .ptx-content a.external:hover, .ptx-content a.external:hover *, .ptx-content a.external:focus, .ptx-content a.external:focus * { color: var(--link-alt-active-text-color); background-color: var(--link-alt-active-background); font-weight: bold; } .ptx-content table { border-spacing: 0; border-collapse: collapse; } .ptx-content td { padding: 2px 5px; font-size: 90%; } .ptx-content td img { max-width: 200px; margin-right: 30px; } .ptx-content th { padding: 2px 5px; } .ptx-content th .lines { white-space: nowrap; } .ptx-content th.l { text-align: left; } .ptx-content th.c { text-align: center; } .ptx-content th.r { text-align: right; } .ptx-content th.j { text-align: justify; } .ptx-content th.t { vertical-align: top; } .ptx-content th.b { vertical-align: bottom; } .ptx-content th.m { vertical-align: middle; } .ptx-content th.l0 { border-left: none; } .ptx-content th.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content th.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content th.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content th.r0 { border-right: none; } .ptx-content th.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content th.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content th.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content th.t0 { border-top: none; } .ptx-content th.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content th.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content th.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content th.b0 { border-bottom: none; } .ptx-content th.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content th.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content th.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content td .lines { white-space: nowrap; } .ptx-content td.l { text-align: left; } .ptx-content td.c { text-align: center; } .ptx-content td.r { text-align: right; } .ptx-content td.j { text-align: justify; } .ptx-content td.t { vertical-align: top; } .ptx-content td.b { vertical-align: bottom; } .ptx-content td.m { vertical-align: middle; } .ptx-content td.l0 { border-left: none; } .ptx-content td.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content td.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content td.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content td.r0 { border-right: none; } .ptx-content td.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content td.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content td.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content td.t0 { border-top: none; } .ptx-content td.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content td.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content td.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content td.b0 { border-bottom: none; } .ptx-content td.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content td.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content td.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content th.r0.l0, .ptx-content td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content tr.header-vertical th { writing-mode: vertical-rl; transform: rotate(180deg); padding-top: 5px; } .ptx-content .center table { text-align: center; margin-left: auto; margin-right: auto; } .tabular-box { margin-top: 0.5em; overflow-x: auto; } .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } table.notation-list tr th { text-align: left; margin-left: 1em; } table.notation-list tr td { text-align: left; vertical-align: top; } .frontmatter > .heading { display: block; text-align: center; } .frontmatter > .heading .title, .frontmatter .book > .heading .title { font-size: 1.3em; } .frontmatter > .heading .subtitle, .frontmatter .book > .heading .subtitle { display: block; font-weight: normal; color: var(--byline-color); font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .frontmatter > .para:first-of-type { margin-top: 4em; } .frontmatter > .author, .frontmatter > .credit { margin-top: 2em; text-align: center; } .frontmatter .author:first-of-type { margin-top: 4em; } .frontmatter > .author .author-name { font-size: 120%; } .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .frontmatter .credit .title { font-size: 1em; } .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .frontmatter .author-info { font-size: 90%; } .frontmatter .summary-links { margin-top: 4em; } .frontmatter .abstract { margin: 4em 2em; } .frontmatter .keywords, .frontmatter .support { margin-top: 2em; } .frontmatter .abstract > .title, .frontmatter .keywords > .title, .frontmatter .support > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .frontmatter .abstract > .title::after, .frontmatter .keywords > .title::after, .frontmatter .support > .title::after { content: ".\2009\2009\2009"; } .frontmatter .abstract > .title + .para, .frontmatter .keywords > .title + .para, .frontmatter .support > .title + .para { display: inline; } .frontmatter .colophon .copyright { margin-top: 2.5em; } .frontmatter .colophon .license { margin-top: 2.5em; } .ptx-content .summary-links { font-family: var(--font-headings); display: block; margin-top: 1em; } .ptx-content .summary-links a { color: var(--summary-link-text-color); background: var(--summary-link-background); font-size: 1.5em; line-height: 1.25em; padding: 10px 20px; padding-right: 60px; border-radius: 3px; position: relative; display: block; font-weight: unset; } .ptx-content .summary-links a .title { font-style: normal; } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a::after { right: 0.83333em; content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid var(--summary-link-text-color); } .ptx-content .summary-links a:hover { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover * { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover .title { font-weight: normal; } .ptx-content .summary-links a:hover::after { border-left: 0.4em solid var(--summary-link-hover-text-color); } .ptx-content .summary-links ul { list-style-type: none; padding: 0; margin-top: 0; } .ptx-content .summary-links li { margin-top: 5px; } @media screen and (width <= 480px) { .ptx-content .summary-links a { font-size: 100%; line-height: 1.25em; } } .ptx-footnote { display: inline-block; position: relative; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: smaller; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote[open] .ptx-footnote__number sup { display: none; } .ptx-footnote__number { display: inline-block; cursor: pointer; min-width: 1em; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowl-background); border-radius: 0px; padding: 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowl-border-color); color: var(--body-text-color); font-weight: normal; font-size: var(1rem); } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: var(--activated-content-bg); } .indexitem { margin-top: 4px; } .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .indexknowl { margin-left: 0.11em; } em + .indexknowl { margin-left: -0.25em; } .indexknowl a { margin-left: 2em; } .indexitem .see, .subindexitem .see, .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .indexitem .seealso, .subindexitem .seealso, .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .indexitem .see em, .subindexitem .see em, .subsubindexitem .see em, .indexitem .seealso em, .subindexitem .seealso em, .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .indexitem .see + .see, .subindexitem .see + .see, .subsubindexitem .see + .see, .indexitem .seealso + .seealso, .subindexitem .seealso + .seealso, .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .indexitem .indexknowl { font-size: 90%; } .indexitem [data-knowl], .subindexitem [data-knowl], .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .indexknowl [data-knowl]:hover, .indexknowl .active[data-knowl] { margin-left: 2em; } .subindexitem .indexknowl { font-size: 95%; } .subsubindexitem .indexknowl { font-size: 95%; } .indexletter { margin-top: 1.5em; } .image-box, .audio-box, .video-box, .asymptote-box { position: relative; } .image-box .asymptote-box iframe.asymptote, iframe.asymptote, .video-box .video, .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .image-box img, img.contained { width: 100%; } .asymptote-fullsize-link { text-align: center; font-size: 0.9em; } .ptx-content img, .ptx-content svg { background: var(--ptx-image-bg); } .mermaid > svg { background: none; } .image-description summary { list-style: none; cursor: pointer; } .image-archive { margin: 0.75em auto 0; font-family: var(--font-monospace); justify-content: center; display: flex; gap: 0.5em; } .image-box > img:not(.mag_popup) { cursor: zoom-in; } img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; } .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .audio { width: 100%; } .video-poster { cursor: pointer; } figure { clear: both; position: relative; margin-left: 0; margin-right: 0; } figcaption { margin-left: auto; margin-right: auto; margin-top: 0.5em; } figcaption code.code-inline { white-space: pre; } figcaption .codenumber, figcaption .type { font-weight: 700; } figcaption .codenumber::after, figcaption .type:last-of-type::after { content: "\2002"; } figcaption .para:first-of-type { display: inline; } figure.table-like { margin-left: 30px; margin-right: 30px; } figure.table-like .list { margin-right: 0; } @media (max-width <= 943px) { .figure-like { overflow-x: auto; } } .poem { display: table; margin: 0 auto; width: auto; max-width: 90%; } .poem > .heading { display: block; text-align: center; } section article.poem > .heading::after { content: ""; } .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .poem .author { font-style: italic; margin-top: 0.75em; } .poem .author.left { text-align: left; } .poem .author.center { text-align: center; } .poem .author.right { text-align: right; } .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .poem .stanza + .stanza { margin-top: 1em; } .poem .heading + .stanza { margin-top: 0.2em; } .poem .heading + .line { margin-top: 0.2em; } .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .poem .line.center { text-align: center; } .poem .line.right { text-align: right; } .poem .tab { margin-left: 2em; } .code-box { overflow-x: auto; } .code-display { overflow-x: auto; font-family: var(--font-monospace); margin: 0.5em 0; } .console, .program { border: 1px solid var(--page-border-color); padding: 5px 15px; overflow-x: auto; margin: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-inline { font-family: var(--font-monospace); white-space: pre; color: var(--body-text-color); background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); border-radius: 0.2em; display: inline-block; overflow-x: auto; max-width: 100%; vertical-align: middle; line-height: normal; padding: 0.0625em 0.15em; } .prompt.unselectable { user-select: none; } .code-block { border-left: 1px solid #aaa; padding: 0 15px 5px; overflow-x: auto; background: var(--code-background); margin-top: 0; margin-bottom: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-block::before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } @media print { .code-copy { display: none; } } pre[class*=language-] { margin: 0; overflow: auto; border: 1px solid #e1e1e1; } :not(pre) > code[class*=language-] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } code[class*=language-], pre[class*=language-] { color: black; background: #fdfdfd; text-shadow: none; font-family: var(--font-monospace); text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.2; tab-size: 4; hyphens: none; } code[class*=language-].code-inline, pre[class*=language-].code-inline { line-height: normal; padding: 0.0625em 0.15em; } code[class*=language-]::selection, code[class*=language-] ::selection, pre[class*=language-]::selection, pre[class*=language-] ::selection { background: #b3d4fc; } code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #2a9716; } code[class*=language-] .token.punctuation, pre[class*=language-] .token.punctuation { color: #000; } code[class*=language-] .token.namespace, pre[class*=language-] .token.namespace { opacity: 0.9; } code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: rgb(41, 120, 15); } code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #a11; } code[class*=language-] .token:is(.operator, .entity, .url), pre[class*=language-] .token:is(.operator, .entity, .url) { color: #000; background: none; } code[class*=language-] .token:is(.atrule, .attr-value, .keyword), pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #0679B7; } code[class*=language-] .token.function, code[class*=language-] .token.class-name, pre[class*=language-] .token.function, pre[class*=language-] .token.class-name { color: #30a; } code[class*=language-] .token.important, code[class*=language-] .token.variable, pre[class*=language-] .token.important, pre[class*=language-] .token.variable { color: rgb(0, 0, 0); } code[class*=language-] .token.important, code[class*=language-] .token.bold, pre[class*=language-] .token.important, pre[class*=language-] .token.bold { font-weight: bold; } code[class*=language-] .token.italic, pre[class*=language-] .token.italic { font-style: italic; } code[class*=language-] .token.entity, pre[class*=language-] .token.entity { cursor: help; } code[class*=language-].line-numbers, pre[class*=language-].line-numbers { position: relative; padding-left: 3.8em; counter-reset: linenumber; overflow: auto; } code[class*=language-].line-numbers > code, pre[class*=language-].line-numbers > code { position: relative; white-space: inherit; } code[class*=language-].line-numbers .line-numbers-rows, pre[class*=language-].line-numbers .line-numbers-rows { position: absolute; pointer-events: none; top: 0; font-size: 100%; left: -3.8em; width: 3em; letter-spacing: -1px; border-right: 1px solid #999; user-select: none; } code[class*=language-].line-numbers .line-numbers-rows > span, pre[class*=language-].line-numbers .line-numbers-rows > span { display: block; counter-increment: linenumber; } code[class*=language-].line-numbers .line-numbers-rows > span::before, pre[class*=language-].line-numbers .line-numbers-rows > span::before { content: counter(linenumber); color: #999; display: block; padding-right: 0.8em; text-align: right; } code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { position: absolute; margin-top: 4px; left: 0; right: 0; padding: inherit 0; font-size: inherit; background: hsla(24, 20%, 50%, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } :root.dark-mode { } :root.dark-mode pre[class*=language-] { border: 1px solid #3d3d3d; } :root.dark-mode code[class*=language-], :root.dark-mode pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } :root.dark-mode code[class*=language-]::selection, :root.dark-mode code[class*=language-] ::selection, :root.dark-mode pre[class*=language-]::selection, :root.dark-mode pre[class*=language-] ::selection { background: hsl(200, 4%, 16%); } :root.dark-mode code[class*=language-] .token, :root.dark-mode pre[class*=language-] .token { position: relative; z-index: 1; } :root.dark-mode code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), :root.dark-mode pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #68a950; } :root.dark-mode code[class*=language-] .token.punctuation, :root.dark-mode pre[class*=language-] .token.punctuation { color: white; opacity: 1; } :root.dark-mode code[class*=language-] .token.namespace, :root.dark-mode pre[class*=language-] .token.namespace { opacity: 0.9; } :root.dark-mode code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), :root.dark-mode pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: #abc792; } :root.dark-mode code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), :root.dark-mode pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #ca9147; } :root.dark-mode code[class*=language-] .token:is(.operator, .entity, .url), :root.dark-mode pre[class*=language-] .token:is(.operator, .entity, .url) { color: white; } :root.dark-mode code[class*=language-] .token:is(.atrule, .attr-value, .keyword), :root.dark-mode pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #2d94fb; } :root.dark-mode code[class*=language-] .token.function, :root.dark-mode code[class*=language-] .token.class-name, :root.dark-mode pre[class*=language-] .token.function, :root.dark-mode pre[class*=language-] .token.class-name { color: #e3e1c2; } :root.dark-mode code[class*=language-] .token.important, :root.dark-mode code[class*=language-] .token.bold, :root.dark-mode pre[class*=language-] .token.important, :root.dark-mode pre[class*=language-] .token.bold { font-weight: bold; } :root.dark-mode code[class*=language-] .token.italic, :root.dark-mode pre[class*=language-] .token.italic { font-style: italic; } :root.dark-mode code[class*=language-] .token.entity, :root.dark-mode pre[class*=language-] .token.entity { cursor: help; } :root.dark-mode .line-highlight { background: hsla(0, 0%, 33%, 0.1); border-bottom: 1px dashed hsl(0, 0%, 33%); border-top: 1px dashed hsl(0, 0%, 33%); z-index: 0; } @media print { code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { color-adjust: exact; } } .displaymath { overflow-x: auto; overflow-y: hidden; } .displaymath mjx-container[jax=CHTML][display=true] { margin: 0 0 0 0; padding-top: 0.3em; } .process-math mjx-container svg { background: none; } [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .knowl mjx-mtext > mjx-utext, mjx-mtext > mjx-utext { width: revert !important; } mjx-msup mjx-utext, mjx-msub mjx-utext { display: inline; } em.alert { font-weight: bold; } .bib { margin-top: 0.25em; } .bib .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .bib .bibitem + .bibentry { display: inline-block; width: 90%; margin-top: 0; } .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .contributor { margin-top: 1.5ex; } .contributor:first-child { margin-top: 0em; } .contributor + .para { margin-top: 3ex; } .contributor .contributor-name { font-variant: small-caps; } .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } iframe { margin: 0; border: none; } .kbdkey { background: #f1f1f1; color: #333; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .unit, .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .unit sub, .unit sup, .quantity sub, .quantity sup { word-spacing: normal; } .terminology { font-style: italic; font-weight: bold; } .times-sign { font-size: larger; vertical-align: -0.15ex; } .emphasis { font-style: italic; } .emphasis .emphasis { font-weight: bold; } .definition-like .emphasis { font-weight: 700; } article.theorem-like .emphasis { font-weight: 700; } .para { line-height: 1.35; } .hidden { display: none !important; } .taxon { font-style: italic; } .quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .booktitle { font-style: oblique; } .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; } .ptx-page, .ptx-main, .ptx-main .ptx-content { all: unset !important; width: 100%; border: none; padding: 0; margin: 0; } .ptx-sagecell, .tabular, .table-like, .figure-like, .exercise-like { break-inside: avoid; } .heading { break-after: avoid; } .code-inline { border: unset; background: unset; } @page { margin: 0.75in 0.75in 0.75in 0.75in; } } .heading .print-links { float: right; position: relative; z-index: 100; vertical-align: bottom; } .heading .print-links .print-link { font-family: var(--font-body); padding: 0.1em 0.2em; } .heading .print-links .material-symbols-outlined { margin-top: 5pt; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .pretext .searchwrapper .cse .gsc-control-cse input, .searchwrapper .gsc-control-cse { padding: 5px; } .searchbox .searchwidget { height: 100%; } .searchbox .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; padding: 1em; left: max(10vw, (100vw - 800px) / 2); width: 80vw; max-width: 800px; border: 2px solid var(--body-text-color); background: var(--knowl-background, #eaf0f6); z-index: 5000; display: flex; flex-direction: column; } .searchbox .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; height: 35px; } .searchbox .ptxsearch { flex: 1 1; } .searchbox .closesearchresults { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .searchbox .closesearchresults:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .searchbox .closesearchresults:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .searchbox .closesearchresults.disabled { opacity: 0.4; cursor: not-allowed; } .searchbox .closesearchresults.hidden { display: none; } .searchbox .closesearchresults.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .searchbox .detailed_result { margin-bottom: 10px; } .searchbox .searchresults a:hover { text-decoration: underline; background: var(--link-active-background); } .searchbox .searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; background: var(--content-background, white); border: 1px solid var(--page-border-color, #ccc); } .searchbox .searchresults:empty { display: none; } .searchbox .search-result-bullet { list-style-type: none; } .searchbox .search-result-score { display: none; } .searchbox .no_result { font-size: 90%; font-weight: 200; } .searchbox .low_result { font-weight: 200; } .searchbox .medium_result { font-weight: 500; } .searchbox .high_result { font-weight: 700; } .searchbox .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .searchbox .search-results-unshown-count { margin-top: 0.6em; } .searchbox .search-result-clip-highlight { background: var(--searchresultshighlight); } .searchbox .searchresultsbackground { position: fixed; top: 0; background: var(--searchresultsbackground, white); width: 100vw; height: 100%; left: 0; z-index: 4999; } @media screen and (max-width: 800px) { .searchbox .searchresultsplaceholder { bottom: 10vh; } } :root { --searchresultsbackground: #fff8; --searchresultshighlight: rgba(255, 255, 0, 50%); } :root.dark-mode { --searchresultsbackground: #0008; --searchresultshighlight: rgba(255, 255, 0, 15%); } .ptx-content .ptx-runestone-container .runestone { margin: unset; border-radius: 0; border-width: 1px; } .multiplechoice_section label > .para { display: inline; } .ptx-content .ptx-runestone-container .ac_question { max-width: var(--base-content-width); margin: 0 auto 10px; } .runestone .runestone_caption { display: none; } .ptx-content .ptx-runestone-container .rsdraggable { font-size: 100%; } .ptx-content .bottom { position: unset; } .ptx-runestone-container .runestone code, .ptx-runestone-container .runestone pre { font-size: 0.93rem; line-height: 1.2; font-family: var(--font-monospace); } .ptx-runestone-container code[class*=language-], .ptx-runestone-container pre[class*=language-] { color: black; background: #fdfdfd; } .runestone.datafile .datafile_caption { background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); display: block; width: fit-content; margin: 0 auto; } .runestone.datafile img { margin: 0 auto; display: block; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); } .runestone.datafile pre, .runestone.datafile textarea { margin: 0 auto; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); background-color: var(--page-color); } .runestone.datafile + .program { margin-top: 0; } ul[data-component=timedAssessment] { margin: 0; padding: 0; } :root.dark-mode .ptx-runestone-container code[class*=language-], :root.dark-mode .ptx-runestone-container pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } @layer spacing { .runestone :is(.exercise-statement, .exercise-content) > *:not(:first-child) { margin-top: 1em; } .ptx-runestone-container + .solutions { margin-top: 0.5em; } } .interactive-iframe-container { max-width: 100%; overflow: auto; } .interactive-iframe-container > iframe { margin-left: auto; margin-right: auto; display: block; } .interactive__instructions { max-width: var(--base-content-width); } .standalone-page .interactive-iframe-container { margin-left: auto; margin-right: auto; } .standalone-page .interactive__instructions { margin: 5px auto 20px; } .interactive-iframe-container__opener { display: block; margin-right: 5px; margin-top: 11px; margin-bottom: 5px; font-size: 0.8rem; } .interactive-iframe-container__opener .icon { font-size: 18px; } .interactive-iframe-container__opener:has(+ figcaption, + .instructions) { float: left; z-index: 1; position: relative; } .interactive-iframe-container__opener + .instructions + figcaption { clear: left; } .interactive-iframe-container__opener + .instructions { margin-top: 0.5em; } .clipboardable { position: relative; display: flow-root; } .clipboardable .code-copy { position: absolute; right: 0; top: 0; opacity: 0.25; border-width: 0; background: none; cursor: pointer; z-index: 1; white-space-collapse: collapse; padding: 1px; scale: 0.85; } .clipboardable .code-copy:hover { opacity: 0.7; } .clipboardable .code-copy .checkmark { display: none; } .clipboardable .code-copy.copied { opacity: 1; color: mediumseagreen; cursor: not-allowed; pointer-events: none; } .clipboardable .code-copy.copied .copyicon { display: none; } .clipboardable .code-copy.copied .checkmark { display: inline; } .clipboardable:has(.code-display) { margin: 0.25em 0; } .clipboardable:has(.code-display) .code-display { margin: 0; padding: 0.25em 0; } .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } label.feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } .exercise-wrapper > *:not(:first-child) { margin-top: 1.5em; } .ptx-content .problem-buttons { display: flex; } .ptx-content .webwork-button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-content .webwork-button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content .webwork-button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-content .webwork-button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-content .webwork-button.hidden { display: none; } .ptx-content .webwork-button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .problem-buttons.hidden-content, .problem-contents.hidden-content { display: none; } .sagecell_sessionOutput pre { font-family: var(--font-monospace); } .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .sage-interact.sagecell { margin: 0; } .sagecell_evalButton { font-family: var(--font-body); font-size: 16px; padding: 0 0.65em; } .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .sagecell_evalButton:focus, .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .sagecell .sagecell_editor { margin-bottom: 8px; } .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .sageanswer .output { display: inline-block; vertical-align: top; } .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } section, article, li, blockquote, figcaption, dt, .exercisegroup, .discussion-like, .solution-like, .para { position: relative; } .autopermalink { position: absolute; display: inline-block; top: 0.5ex; left: -2em; font-size: 85%; opacity: var(--permalink-opacity, 0); transition: opacity 0.2s; margin-top: 0 !important; user-select: none; } li > .autopermalink { left: -3.5em; } .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } .appendix > .autopermalink, .chapter > .autopermalink, .index > .autopermalink, .section > .autopermalink, .subsection > .autopermalink, .references > .autopermalink, .exercises > .autopermalink { top: 1.5ex; } .assemblage-like > .para > .autopermalink, .example-like > .para > .autopermalink, .example-like > .exercise-like > .autopermalink, .project-like > .para > .autopermalink, .project-like > .exercise-like > .autopermalink, .project-like > .exercise-like > .introduction > .para > .autopermalink, .project-like > .exercise-like > .conclusion > .para > .autopermalink, .remark-like > .para > .autopermalink { left: -2.9em; } .axiom-like > .para:first-of-type > .autopermalink, .example-like > .para:first-of-type > .autopermalink, .exercise-like > .para:first-of-type > .autopermalink, .solution-like > .para:first-of-type > .autopermalink, .assemblage-like > .para:first-of-type > .autopermalink, .definition-like > .para:first-of-type > .autopermalink, .remark-like > .para:first-of-type > .autopermalink, .project-like > .para:first-of-type > .autopermalink, .openproblem-like > .para:first-of-type > .autopermalink, .computation-like > .para:first-of-type > .autopermalink, .theorem-like > .para:first-of-type > .autopermalink, .proof > .para:first-of-type > .autopermalink, .case > .para:first-of-type > .autopermalink, li > .para:first-of-type > .autopermalink, dd > .para:first-of-type > .autopermalink { display: none; } .axiom-like > .introduction > .para:first-of-type > .autopermalink, .example-like > .introduction > .para:first-of-type > .autopermalink, .exercise-like > .introduction > .para:first-of-type > .autopermalink, .solution-like > .introduction > .para:first-of-type > .autopermalink, .assemblage-like > .introduction > .para:first-of-type > .autopermalink, .definition-like > .introduction > .para:first-of-type > .autopermalink, .remark-like > .introduction > .para:first-of-type > .autopermalink, .project-like > .introduction > .para:first-of-type > .autopermalink, .openproblem-like > .introduction > .para:first-of-type > .autopermalink, .computation-like > .introduction > .para:first-of-type > .autopermalink, .theorem-like > .introduction > .para:first-of-type > .autopermalink, .proof > .introduction > .para:first-of-type > .autopermalink, .case > .introduction > .para:first-of-type > .autopermalink, li > .introduction > .para:first-of-type > .autopermalink, dd > .introduction > .para:first-of-type > .autopermalink { display: none; } .ptx-content:has(.autopermalink:hover) .autopermalink { opacity: 0.2; } .ptx-content:has(.autopermalink:hover) .autopermalink:hover { opacity: 1; } .autopermalink:has(a:focus-visible) { opacity: 1; } .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: var(--content-background); border: 3px solid var(--page-border-color); z-index: 2001; } :target { scroll-margin-top: 45px; animation: target-fade 10s 1; } @keyframes target-fade { 0% { background-color: var(--activated-content-bg); } 100% { background-color: inherit; opacity: 1; } } :is(.chapter, .section, .subsection, .subsubsection) > .tabular-box, :is(.chapter, .section, .subsection, .subsubsection) > .table > .tabular-box { overflow-x: auto; } @container ptx-main (width > 640px) { :is(.chapter, .section, .subsection, .subsubsection) > .tabular-box, :is(.chapter, .section, .subsection, .subsubsection) > .table > .tabular-box { --max-width: calc(min((100cqw - 2 * 20px), 10000px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); margin-left: calc(-0.5 * (100cqw - 640px)); } } figure.table-like { margin-left: 0px; margin-right: 0px; } :root { --base-content-width: 600px; --content-padding: 120px; } body { margin: 0; min-height: 100vh; display: flex; flex-direction: column; align-items: stretch; } body.pretext { color: var(--body-text-color); font-family: var(--font-body); } .ptx-page { position: relative; display: flex; flex-grow: 1; width: 100%; } .ptx-main { flex-grow: 1; position: relative; max-width: 100%; container-name: ptx-main; container-type: inline-size; } .ptx-main .ptx-content { max-width: 840px; padding: 24px 120px 60px; margin-left: auto; margin-right: auto; } .worksheet .ptx-main .ptx-content { max-width: 960px; } .ptx-page { max-width: 1480px; margin-left: auto; margin-right: auto; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; background: var(--page-color, white); } .ptx-content .print-preview-header { display: none; } body.pretext > a.assistive { padding: 6px; position: absolute; top: -40px; left: 0px; color: white; border-right: 1px solid white; border-bottom: 1px solid white; border-bottom-right-radius: 8px; background: #BF1722; z-index: 10000; } body.pretext > a.assistive:focus { top: 0px; outline: 0; transition: top 0.1s ease-in, background 0.5s linear; } .ptx-content-footer { display: flex; justify-content: space-around; max-width: 840px; padding-top: 2em; padding-bottom: 2em; padding-left: 120px; padding-right: 120px; margin-left: auto; margin-right: auto; } .ptx-content-footer .button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-content-footer .button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content-footer .button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-content-footer .button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-content-footer .button.hidden { display: none; } .ptx-content-footer .button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content-footer .button .icon { margin: 0 -7px; } body.standalone-page .ptx-page { max-width: 1600px; } .ptx-masthead { position: relative; background: var(--banner-background); width: 100%; display: flex; justify-content: center; } .ptx-masthead .ptx-banner { border-top: 1px solid transparent; overflow: hidden; padding: 10px 10px; border-bottom: none; display: flex; width: 100%; align-items: center; max-width: 840px; } .ptx-masthead a { color: var(--doc-title-color, #2a5ea4); } .ptx-masthead a:active { color: var(--link-active-text-color); } .ptx-masthead .title-container { font-family: var(--font-headings); font-size: 2em; padding-left: 9.68px; overflow: hidden; flex: 1; } .ptx-masthead .title-container .heading { font-weight: 700; font-size: 100%; line-height: 1.25em; } .ptx-masthead .title-container .title:has(+ .subtitle)::after { content: ":"; } .ptx-masthead .title-container .subtitle { font-weight: normal; } .ptx-masthead .logo-link { height: 5em; display: flex; } .ptx-masthead .logo-link img { max-height: 100%; } .ptx-masthead .logo-link img[src$=".svg"] { height: 100%; } .ptx-masthead .byline { color: var(--byline-color); font-weight: normal; margin: 0; font-size: 62.5%; min-height: inherit; } @media screen and (max-width: 800px) { .ptx-masthead { border-bottom: 1px solid var(--page-border-color); } .ptx-masthead .ptx-banner { padding: 10px 28px; display: flex; justify-content: center; } .ptx-masthead .logo-link::before { font-size: 1rem; margin-top: 0; } .ptx-masthead .title-container { width: fit-content; flex: unset; } .ptx-masthead .title-container .heading { line-height: 1em; } .ptx-masthead .title-container .heading .subtitle { display: block; font-size: 80%; line-height: 1em; } .ptx-masthead .byline { font-size: 50%; } } @media screen and (width <= 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; font-size: 1em; } .ptx-masthead .logo-link { display: none; } .ptx-masthead .byline { display: none; } } .ptx-navbar { position: sticky; top: 0; height: 36px; width: 100%; background: var(--navbar-background); border: 0; border-top: 1px solid var(--page-border-color); border-bottom: 1px solid var(--page-border-color); margin: 0; z-index: 500; overflow: visible; display: flex; } .ptx-navbar .ptx-navbar-contents { position: relative; display: flex; flex: 1; justify-content: center; align-items: center; max-width: 840px; margin: 0 auto; } .ptx-navbar .button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-navbar .button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-navbar .button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-navbar .button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-navbar .button.hidden { display: none; } .ptx-navbar .button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-navbar .button { height: 100%; border-width: 0; } .ptx-navbar .toc-toggle { width: 240px; gap: 0.4em; margin-left: 0; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls, .nav-other-controls) { display: flex; } .ptx-navbar .treebuttons { flex: 1 1 210px; justify-content: end; } .ptx-navbar .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .ptx-navbar .pretext .navbar .dropdown { height: 34px; } .ptx-navbar .embed-popup { padding: 10px; background-color: var(--navbar-background); position: absolute; margin-top: 36px; border: 1px solid var(--page-border-color); border-radius: 3px; box-shadow: 0 0 5px var(--primary-color-gray-80); color: var(--button-text-color); } .ptx-navbar .embed-popup .embed-code-container { width: "100%"; padding: 5px; } .ptx-navbar .embed-popup .embed-code-container .embed-code-textbox { width: 100%; padding: 10px; height: 5em; } .ptx-navbar .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .ptx-navbar .treebuttons .icon { margin: 0 -7px; } .ptx-navbar :is(.index-button) .icon { display: none; } .ptx-navbar :is(.runestone-profile, .activecode-toggle, .searchbutton, .calculator-toggle, .light-dark-button, .embed-button) .name { display: none; } .ptx-navbar .index-button { min-width: 70px; } .runestone-profile { position: relative; } .runestone-profile .dropdown-content { display: none; position: absolute; background-color: var(--dropdown-background); min-width: 160px; z-index: 100; border: 1px solid var(--dropdown-border-color); right: 0; top: 35px; text-align: start; padding: 0; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: var(--dropdown-text-color); padding: 2px 8px; } .runestone-profile .dropdown-content a:is(:hover, :focus-visible) { background-color: var(--dropdown-hover-background); color: var(--dropdown-hover-text-color); } .runestone-profile .dropdown-content hr { color: var(--dropdown-border-color); margin: 4px 0; } .runestone-profile:is(:hover, :focus-visible, :focus-within) { overflow: visible; } .runestone-profile:is(:hover, :focus-visible, :focus-within) .dropdown-content { display: block; } @media screen and (max-width: 800px) { .ptx-navbar .button { border-left-width: 1px; border-right-width: 1px; border-color: var(--page-border-color); } .ptx-navbar > *:not(:first-child) { margin-left: -1px; } .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; z-index: 1100; background: var(--button-border-color); max-width: 100vw; } .ptx-navbar .ptx-navbar-contents { max-width: 100vw; } .ptx-navbar .nav-runestone-controls { flex: 0; } .ptx-navbar .toc-toggle { flex: 2 1 100px; } .ptx-navbar .treebuttons { flex: 3 1 150px; } .ptx-navbar .treebuttons > * { flex: 1 1; min-width: 35px; } .ptx-navbar .index-button { display: none; } .ptx-navbar .embed-popup { margin-top: unset; bottom: 36px; } .ptx-navbar .dropdown-content { top: unset; bottom: 36px; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button, .embed-button) .name { display: none; } } .ptx-sidebar { align-self: flex-start; } .ptx-sidebar.visible { display: block; } .ptx-sidebar.hidden { display: none; height: 0; } .ptx-toc { --codenumber-pad-left: 0.3rem; --codenumber-pad-right: 0.5rem; --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); background: var(--toc-background); margin: 0; font-size: 0.9rem; } .ptx-toc:is(.depth1, .parts.depth2) { --codenumber-pad-right: 0.5rem; } .ptx-toc .toc-item-list { margin: 0; padding: 0; list-style: none; background: var(--tocitem-background); } .ptx-toc .toc-item-list .active { list-style: none; } .ptx-toc .toc-item { background-color: var(--tocitem-background); color: var(--toc-text-color); border-color: var(--toc-border-color); } .ptx-toc .toc-item a { color: inherit; } .ptx-toc .toc-item.active:not(:has(.toc-item.active)) { color: var(--tocitem-active-text-color) !important; background-color: var(--tocitem-active-background) !important; border-color: var(--tocitem-active-border-color) !important; } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--tocitem-highlight-text-color); background-color: var(--tocitem-highlight-background); border-color: var(--tocitem-highlight-border-color); } .ptx-toc .toc-title-box { display: flex; } .ptx-toc .toc-title-box > .internal { position: relative; display: flex; flex-grow: 1; padding: 0.2em; font-weight: 500; } .ptx-toc .toc-item-list .toc-item-list .toc-title-box > .internal { font-weight: normal; } .ptx-toc .codenumber { min-width: var(--toc-indent-first); padding-left: var(--codenumber-pad-left); padding-right: var(--codenumber-pad-right); display: inline-block; text-align: left; flex-grow: 0; } .ptx-toc .toc-item { color: var(--toclevel1-text-color); background-color: var(--toclevel1-background); } .ptx-toc .toc-item .toc-item { color: var(--toclevel2-text-color); background-color: var(--toclevel2-background); } .ptx-toc .toc-item .toc-item .toc-item { color: var(--toclevel3-text-color); background-color: var(--toclevel3-background); } .book .ptx-toc .toc-chapter .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .codenumber { font-size: 80%; padding-top: 0.16em; min-width: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber { min-width: var(--toc-indent-third); visibility: hidden; } .ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber { visibility: visible; } .ptx-toc .toc-item .toc-title-box .title { margin-left: var(--toc-indent-first); } .book .ptx-toc .toc-chapter .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .title { margin-left: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { margin-left: var(--toc-indent-third); } .ptx-toc .toc-item > .toc-title-box .codenumber + .title { margin-left: 0 !important; } .ptx-toc .toc-chapter .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { font-size: 90%; } .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title { font-style: italic; } .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth1 ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-backgrounde); color: var(--tocitem-active-text-color); } .ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-background); color: var(--tocitem-active-text-color); } .ptx-toc.focused { } .ptx-toc.focused ul.structural:not(.contains-active) > .toc-item { display: none; } .ptx-toc.focused ul.structural:not(.contains-active) > .toc-item.visible { display: block; } .ptx-toc.focused ul.structural .toc-item.active > ul.structural > .toc-item { display: block; } .ptx-toc.focused ul.structural .toc-item.active > ul.structural > .toc-item.hidden { display: none; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 1.25em; line-height: 18px; font-variation-settings: "wght" 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--tocitem-highlight-background); color: var(--tocitem-highlight-text-color); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--tocitem-highlight-text-color); } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon:before { content: "add"; } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before { content: "remove"; } .ptx-sidebar { flex: 0 0 240px; position: sticky; top: 36px; overflow-y: hidden; } .ptx-toc { position: sticky; top: 36px; overflow-y: auto; overflow-x: hidden; height: calc(100vh - 36px); margin-top: -1px; } .ptx-toc > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 3px solid var(--toc-border-color); } @media screen and (max-width: 944px) { .ptx-sidebar { display: none; position: sticky; top: 36px; background: var(--content-background); min-height: 30vh; border-right: 2px solid var(--toc-border-color); border-bottom: 2px solid var(--toc-border-color); width: 240px; } } @media screen and (max-width: 800px) { .ptx-sidebar { position: fixed; z-index: 1000; top: unset; height: auto; max-height: 80vh; max-width: 80vw; bottom: 36px; border-right: 2px solid var(--toc-border-color); border-top: 2px solid var(--toc-border-color); } .ptx-toc { border-top: 2px solid var(--toc-border-color); border-bottom: 0; max-height: 80vh; } } .ptx-toc { scrollbar-color: var(--content-background) var(--content-background); } .ptx-toc:hover { scrollbar-color: var(--page-border-color) var(--content-background); } .ptx-page-footer { background: var(--footer-background); padding-top: 0; border-top: 2px solid var(--page-border-color); border-bottom: 2px solid var(--page-border-color); display: flex; flex-direction: row; justify-content: center; width: 100%; gap: 90px; position: relative; } .ptx-page-footer > a { margin: 1em 0; color: var(--body-text-color); } .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } .ptx-page-footer .feedback-link { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-page-footer .feedback-link:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-page-footer .feedback-link:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-page-footer .feedback-link.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-page-footer .feedback-link.hidden { display: none; } .ptx-page-footer .feedback-link.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } @media screen and (max-width: 800px) { .ptx-page-footer { gap: 20px; justify-content: center; margin-bottom: 34px; } .ptx-page-footer > a > .logo:first-child { height: 2em; } } @container ptx-main (width > 640px) { .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { --max-width: calc(min((100cqw - 2 * 20px), 10000px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); margin-left: calc(-0.5 * (100cqw - 640px)); } } .ptx-runestone-container .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; min-width: 100%; margin-left: auto; } @container ptx-main (width > 640px) { :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { --max-width: calc(min((100cqw - 2 * 20px), 10000px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); margin-left: calc(-0.5 * (100cqw - 640px)); } } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; margin-left: auto; } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content) .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; margin-left: 0; } .runestone.ac_section > div > div > *:not(.ac_code_div):not(.ac_output):not(.codelens):not(.ac_actions) { max-width: 600px; margin-left: auto; margin-right: auto; } .runestone .exercise-statement { max-width: 600px; margin-left: auto; margin-right: auto; } .hparsons_section .hp_question, .hparsons_section .hp_feedback { max-width: 600px; margin-left: auto; margin-right: auto; } .runestone.parsons_section > .parsons { width: 100%; padding-right: 0; } .runestone.parsons_section > .parsons .sortable-code-container { display: flex; flex-flow: wrap; justify-content: center; gap: 15px; margin: 10px auto; } .runestone.parsons_section > .parsons .sortable-code { margin: 0; } .runestone.parsons_section > .parsons .runestone_caption_text { max-width: unset; } .runestone.parsons_section > .parsons > div > *:not(.sortable-code-container) { max-width: 600px; margin-left: auto; margin-right: auto; } @media (width < 850px) { .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100cqw; margin-left: calc(-0.5 * (100cqw - 100%)); } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100cqw; margin-left: calc(-0.5 * (100cqw - 100%)); } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content) .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; margin-left: 0px; } } .ptx-main { margin-right: 320px; } .ptx-sidebar.hidden + .ptx-main { margin-left: 320px; } .ptx-main { box-shadow: 5px 10px 40px -10px var(--primary-color-gray-80); } @media (prefers-color-scheme: dark) { .ptx-main { box-shadow: 5px 10px 40px -10px black; } } .ptx-sidebar { margin-right: 80px; } .ptx-navbar { border: none; } .ptx-navbar .toc-toggle { transform: translateX(-320px); position: absolute; left: 0; justify-content: left; } .ptx-toc { border: none; position: sticky; top: 36px; } .toc-item.visible { font-size: 0.95em; padding-left: 8px; } .ptx-page { margin-top: 36px; margin-bottom: 36px; } @media screen and (width <= 1480px) { .ptx-page { margin-left: 0; max-width: 100%; } .ptx-main { margin-right: calc(100% - 840px - 320px); max-width: 840px; } .ptx-sidebar.hidden + .ptx-main { margin-right: auto; margin-left: auto; } .ptx-navbar .ptx-navbar-contents { margin-left: 320px; } } @media screen and (width <= 1240px) { .ptx-main { box-shadow: unset; margin-right: auto; } .ptx-main .ptx-content { padding-left: 20px; padding-right: 20px; max-width: 640px; } .ptx-sidebar { margin-right: 0; } .ptx-navbar .ptx-navbar-contents { margin-left: 240px; } .ptx-navbar .toc-toggle { transform: translateX(-240px); justify-content: center; } .ptx-page { margin-top: unset; margin-bottom: unset; } .ptx-toc { padding-top: 36px; } } @media screen and (width <= 880px) { .ptx-sidebar { display: none; } } @media screen and (max-width: 800px) { .ptx-navbar .ptx-navbar-contents { margin-left: 0; } .ptx-navbar .toc-toggle { transform: none; position: relative; justify-content: center; } .ptx-content-footer { padding-left: 20px; padding-right: 20px; } } .toc-item:is(:hover, :focus) { color: var(--tocitem-highlight-text-color); background-color: var(--tocitem-highlight-background); border-color: var(--tocitem-highlight-border-color); } .standalone-page { margin: 0; padding: 0; } .standalone-page .ptx-page { margin-top: 0; margin-bottom: 0; } .standalone-page .ptx-main { margin-right: auto; margin-left: auto; box-shadow: none; max-width: 100%; } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon { font-size: 30px; } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon:before { content: "chevron_left"; } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before { content: "chevron_left"; } .hide-type .codenumber:not(:empty)::after { content: ". "; } .ptx-masthead { display: none; } .button.disabled { display: none; } .aside-like > .knowl__link { color: var(--aside-like-link-color); border-bottom-color: var(--aside-like-link-color); } .aside-like > .knowl__content { margin-left: 30px; margin-right: 30px; border: 2px solid var(--aside-like-border-color); background-color: var(--aside-like-body-background); } @media screen and (min-width: 1450px) { details.aside-like { position: relative; margin-left: -365px; width: 200px; right: -365px; float: right; clear: right; } .multicolumn details.aside-like { position: relative; margin-left: inherit; width: auto; right: 0; float: none; clear: none; } details.aside-like > .knowl__content { margin-left: 0; margin-right: 0; background-color: var(--aside-like-body-background); z-index: 100; } } .cols2 > .exercise-like { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > .exercise-like { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > .exercise-like { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > .exercise-like { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > .exercise-like { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .exercise-like > .heading { font-size: inherit; } .exercisegroup .exercise-like { margin-top: 1em; } .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .exercisegroup > .heading + .introduction { display: inline; } .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .exercisegroup .exercisegroup-exercises { margin-top: 1em; padding-left: 40px; } .exercisegroup .conclusion { margin-left: 40px; } .exercisegroup .conclusion .heading { font-size: inherit; } .exercise-like > .exercise-like.task { margin-left: 20px; } .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .exercise-wrapper form button:active { background-color: #f0f0f0; } .exercise-wrapper form button + button { margin-left: 0.8em; } .exercise-wrapper, .exercise-wrapper form, .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .knowl .exercise-wrapper, .knowl .exercise-wrapper form, .knowl .exercise-wrapper form > div:first-child { width: 100%; } .exercise-wrapper > .para:first-child, .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .cols2 .heading + .exercise-wrapper { width: auto; } section.solutions > .heading + .heading { margin-top: 0.5em; } section.solutions > h3.heading, section.solutions section > h3.heading { font-size: 1.6em; } section.solutions > h4.heading, section.solutions section > h4.heading { font-size: 1.45em; } section.solutions > h5.heading, section.solutions section > h5.heading { font-size: 1.35em; } section.solutions > h6.heading, section.solutions section > h6.heading { font-size: 1.25em; } .sbsgroup > *:not(:first-child) { margin-top: 1.5em; } .sbsrow { display: grid; grid-template-rows: auto auto; } .sbspanel { grid-row: 1; } .sbspanel > .table > figcaption { text-align: center; } .sbspanel .tabular { overflow-x: auto; margin-left: auto; margin-right: auto; } .sbspanel--top { align-self: start; } .sbspanel--middle { align-self: center; } .sbspanel--bottom { align-self: end; } .sbspanel:has(.figure-like, .table-like), .sbspanel > :is(.figure-like, .table-like) { display: contents; } .sbspanel > :is(.figure-like, .table-like) > *:first-child { grid-row: 1; align-items: start; align-self: start; } .sbspanel--top > :is(.figure-like, .table-like) > *:first-child { align-items: start; align-self: start; } .sbspanel--middle > :is(.figure-like, .table-like) > *:first-child { align-items: center; align-self: center; } .sbspanel--bottom > :is(.figure-like, .table-like) > *:first-child { align-items: end; align-self: end; } .sbspanel > :is(.figure-like, .table-like) > *:nth-child(2) { margin-top: 0.5em; grid-row: 2; width: 100%; } .sbspanel:nth-of-type(2) * { grid-column: 2; } .sbspanel:nth-of-type(3) * { grid-column: 3; } .sbspanel:nth-of-type(4) * { grid-column: 4; } .sbspanel:nth-of-type(5) * { grid-column: 5; } .sbspanel:nth-of-type(6) * { grid-column: 6; } .sbspanel:nth-of-type(7) * { grid-column: 7; } .sbspanel:nth-of-type(8) * { grid-column: 8; } .sbspanel:nth-of-type(9) * { grid-column: 9; } .sbspanel:nth-of-type(10) * { grid-column: 10; } .discussion-like > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .discussion-like > .heading:first-child:after { content: "\2009"; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } .discussion-like > .heading ::after { content: "\2009"; } .discussion-like > .heading + .para { display: inline; } .discussion-like > .heading .space, .discussion-like > .heading .codenumber, .discussion-like > .heading .period { display: none; } .discussion-like > .heading .type::after { content: ". "; } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowl-link-color); border-bottom: 1px dotted var(--knowl-link-color); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--knowl-background); border-bottom-color: transparent; } .source-view__content { margin: 0.2em 0; } .knowl__content { margin: 0.75em 0; border: 3px solid var(--knowl-border-color); border-radius: 8px; padding: 12px; background-color: var(--knowl-background); } .knowl__content .incontext { display: block; font-size: 85%; text-align: right; } .knowl__content .knowl__content { background-color: var(--knowl-nested-1-background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-2-background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-3-background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-4-background); } .knowl__content > figure { margin-left: 0; margin-right: 0; } .assemblage-like:not(.knowl__content, .born-hidden-knowl), .goal-like:not(.knowl__content, .born-hidden-knowl) { padding: 10px; padding-left: 15px; border-left: 4px solid var(--block-border-color); background-color: var(--goal-like-body-background); } .assemblage-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child, .goal-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-top: 0; } .theorem-like .heading, .definition-like .heading { display: block; font-size: 1.1em; } .theorem-like .para, .definition-like .para { font-style: italic; } .example-like > .heading, .project-like > .heading, .remark-like > .heading, .openproblem-like > .heading, .computation-like > .heading, .commentary > .heading { display: block; font-size: 1.1em; } .proof { padding-bottom: 1.5em; padding-left: 1em; padding-right: 1em; } .proof::after { content: "\25a1"; position: absolute; right: 0; bottom: 1.5em; } .proof .heading { font-size: unset; font-weight: bold; font-style: italic; } .solution-like .heading { display: inline; font-style: italic; font-size: unset; } .tasks .knowl__content { border: none; } .tasks .knowl__content .theorem-like, .tasks .knowl__content .definition-like, .tasks .knowl__content .example-like, .tasks .knowl__content .project-like, .tasks .knowl__content .remark-like, .tasks .knowl__content .openproblem-like, .tasks .knowl__content .computation-like, .tasks .knowl__content .project-like, .tasks .knowl__content .commentary { padding-left: 0; margin-left: 0; border-left: none; } .tasks .knowl__content .theorem-like::after, .tasks .knowl__content .definition-like::after, .tasks .knowl__content .example-like::after, .tasks .knowl__content .project-like::after, .tasks .knowl__content .remark-like::after, .tasks .knowl__content .openproblem-like::after, .tasks .knowl__content .computation-like::after, .tasks .knowl__content .project-like::after, .tasks .knowl__content .commentary::after { border-bottom: none; display: none; } section.solutions:not(:is(:first-child)):not(.knowl__content, .born-hidden-knowl) { padding: 10px; padding-left: 15px; border-left: 2px solid var(--solution-border-color); background-color: var(--content-background); } section.solutions:not(:is(:first-child)):not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-top: 0; } .paragraphs > .heading:first-child, article > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .paragraphs > .heading:first-child:after, article > .heading:first-child:after { content: "\2009"; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction), article > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child, article > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child, article > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } :root { --font-body: Open Sans, Helvetica Neue, Helvetica, Arial, sans-serif; } :root { --font-headings: PT Serif, Times New Roman, Times, serif; } :root { --font-monospace: Inconsolata, Consolas, Monaco, monospace; } :root { --font-print: PT Serif, Times New Roman, Times, serif; } :root { color-scheme: light; } :root:not(.dark-mode) { --page-color: white; --content-background: white; --page-border-color: #ccc; --doc-title-color: var(--primary-color); --byline-color: #333; --banner-background: #f8f8f8; --navbar-background: var(--primary-color); --footer-background: var(--banner-background); --toc-border-color: #666; --toc-background: var(--content-background); --tocitem-background: var(--toc-background); --toc-text-color: var(--primary-color-black-30); --tocitem-highlight-background: #3a3a3a; --tocitem-highlight-text-color: #fff; --tocitem-highlight-border-color: #3a3a3a; --tocitem-active-background: var(--primary-color-white-15); --tocitem-active-text-color: white; --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--content-background); --toclevel1-text-color: var(--toc-text-color); --toclevel2-background: var(--content-background); --toclevel2-text-color: var(--toc-text-color); --toclevel3-background: var(--content-background); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #000; --body-title-color: var(--primary-color-black-20); --ptx-image-bg: transparent; --activated-content-bg: rgba(241, 185, 255, 0.3); --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color); --link-background: transparent; --link-active-text-color: var(--primary-color); --link-active-background: var(--primary-color-white-96); --link-alt-text-color: var(--link-text-color); --link-alt-background: transparent; --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--primary-color-white-96); --knowl-link-color: var(--link-text-color); --knowl-background: #f8f8f8; --knowl-border-color: var(--primary-color-gray-80); --knowl-nested-1-background: #f5f5ff; --knowl-nested-2-background: #fffff5; --knowl-nested-3-background: #f5ffff; --knowl-nested-4-background: #fff5f5; --block-body-background: var(--content-background); --block-border-color: var(--knowl-border-color); --block-head-color: var(--body-text-color); --aside-like-link-color: var(--link-text-color); --button-background: var(--primary-color); --button-text-color: var(--primary-color-white-90); --button-border-color: #3a3a3a; --button-hover-background: #3a3a3a; --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: #fdfdfd; --code-inline-background: #ededed; --assemblage-like-body-background: var(--block-body-background); --assemblage-like-border-color: var(--block-border-color); --definition-like-body-background: var(--block-body-background); --definition-like-border-color: var(--block-border-color); --theorem-like-body-background: var(--block-body-background); --theorem-like-border-color: var(--block-border-color); --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: var(--block-body-background); --remark-like-border-color: var(--block-border-color); --computation-like-body-background: var(--block-body-background); --computation-like-border-color: var(--block-border-color); --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--block-body-background); --aside-like-border-color: var(--block-border-color); --proof-like-body-background: var(--block-body-background); --proof-like-border-color: var(--block-border-color); --example-like-body-background: var(--block-body-background); --example-like-border-color: var(--block-border-color); --project-like-body-background: var(--block-body-background); --project-like-border-color: var(--block-border-color); --goal-like-body-background: var(--block-body-background); --goal-like-border-color: var(--block-border-color); --solution-like-body-background: var(--block-body-background); --solution-like-border-color: var(--block-border-color); --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); --primary-color: hsl(270, 40%, 15%); --toc-border: var(--primary-color-gray-10); } :root.dark-mode { color-scheme: dark; --page-color: var(--background-color); --content-background: var(--page-color); --page-border-color: var(--background-color-white-25); --doc-title-color: var(--primary-color); --byline-color: var(--background-color-white-50); --banner-background: hsl(270, 10%, 5%); --navbar-background: var(--background-color-gray-15); --footer-background: var(--background-color-black-10); --toc-border-color: #555; --toc-background: var(--content-background); --tocitem-background: var(--toc-background); --toc-text-color: var(--body-text-color); --tocitem-highlight-background: var(--primary-color-gray-5); --tocitem-highlight-text-color: var(--background-color-black-50); --tocitem-highlight-border-color: var(--toc-border-color); --tocitem-active-background: var(--primary-color-gray-5); --tocitem-active-text-color: var(--background-color-black-50); --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--content-background); --toclevel1-text-color: var(--primary-color-white-40); --toclevel2-background: var(--content-background); --toclevel2-text-color: var(--toclevel1-text-color); --toclevel3-background: var(--content-background); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #f2f2f2; --body-title-color: var(--primary-color-white-20); --ptx-image-bg: white; --activated-content-bg: rgba(255, 237, 185, 0.2); --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color-white-10); --link-background: transparent; --link-active-text-color: var(--primary-color-white-40); --link-active-background: var(--background-color-gray-30); --link-alt-text-color: var(--link-text-color); --link-alt-background: transparent; --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--link-active-text-color); --knowl-link-color: var(--doc-title-color); --knowl-background: var(--background-color-black-10); --knowl-border-color: var(--background-color-white-20); --knowl-nested-1-background: var(--background-color-gray-10); --knowl-nested-2-background: var(--background-color-black-10); --knowl-nested-3-background: var(--background-color-gray-10); --knowl-nested-4-background: var(--background-color-black-10); --block-body-background: var(--content-background); --block-border-color: var(--knowl-border-color); --block-head-color: var(--body-text-color); --aside-like-link-color: var(--link-text-color); --button-background: var(--background-color-gray-15); --button-text-color: var(--body-text-color); --button-border-color: var(--background-color-white-25); --button-hover-background: var(--primary-color-black-50); --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: var(--background-color-gray-20); --code-inline-background: var(--background-color-gray-20); --assemblage-like-body-background: var(--block-body-background); --assemblage-like-border-color: var(--block-border-color); --definition-like-body-background: var(--block-body-background); --definition-like-border-color: var(--block-border-color); --theorem-like-body-background: var(--block-body-background); --theorem-like-border-color: var(--block-border-color); --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: var(--block-body-background); --remark-like-border-color: var(--block-border-color); --computation-like-body-background: var(--block-body-background); --computation-like-border-color: var(--block-border-color); --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--block-body-background); --aside-like-border-color: var(--block-border-color); --proof-like-body-background: var(--block-body-background); --proof-like-border-color: var(--block-border-color); --example-like-body-background: var(--block-body-background); --example-like-border-color: var(--block-border-color); --project-like-body-background: var(--block-body-background); --project-like-border-color: var(--block-border-color); --goal-like-body-background: var(--block-body-background); --goal-like-border-color: var(--block-border-color); --solution-like-body-background: var(--block-body-background); --solution-like-border-color: var(--block-border-color); --primary-color: hsl(270, 50%, 50%); --background-color: hsl(270, 10%, 5%); --background-color-white-1: color-mix(in oklab, var(--background-color), white 1%); --background-color-white-2: color-mix(in oklab, var(--background-color), white 2%); --background-color-white-3: color-mix(in oklab, var(--background-color), white 3%); --background-color-white-4: color-mix(in oklab, var(--background-color), white 4%); --background-color-white-5: color-mix(in oklab, var(--background-color), white 5%); --background-color-white-10: color-mix(in oklab, var(--background-color), white 10%); --background-color-white-15: color-mix(in oklab, var(--background-color), white 15%); --background-color-white-20: color-mix(in oklab, var(--background-color), white 20%); --background-color-white-25: color-mix(in oklab, var(--background-color), white 25%); --background-color-white-30: color-mix(in oklab, var(--background-color), white 30%); --background-color-white-35: color-mix(in oklab, var(--background-color), white 35%); --background-color-white-40: color-mix(in oklab, var(--background-color), white 40%); --background-color-white-50: color-mix(in oklab, var(--background-color), white 50%); --background-color-white-60: color-mix(in oklab, var(--background-color), white 60%); --background-color-white-65: color-mix(in oklab, var(--background-color), white 65%); --background-color-white-70: color-mix(in oklab, var(--background-color), white 70%); --background-color-white-75: color-mix(in oklab, var(--background-color), white 75%); --background-color-white-80: color-mix(in oklab, var(--background-color), white 80%); --background-color-white-85: color-mix(in oklab, var(--background-color), white 85%); --background-color-white-90: color-mix(in oklab, var(--background-color), white 90%); --background-color-white-95: color-mix(in oklab, var(--background-color), white 95%); --background-color-white-96: color-mix(in oklab, var(--background-color), white 96%); --background-color-white-97: color-mix(in oklab, var(--background-color), white 97%); --background-color-white-98: color-mix(in oklab, var(--background-color), white 98%); --background-color-white-99: color-mix(in oklab, var(--background-color), white 99%); --background-color-black-1: color-mix(in oklab, var(--background-color), black 1%); --background-color-black-2: color-mix(in oklab, var(--background-color), black 2%); --background-color-black-3: color-mix(in oklab, var(--background-color), black 3%); --background-color-black-4: color-mix(in oklab, var(--background-color), black 4%); --background-color-black-5: color-mix(in oklab, var(--background-color), black 5%); --background-color-black-10: color-mix(in oklab, var(--background-color), black 10%); --background-color-black-15: color-mix(in oklab, var(--background-color), black 15%); --background-color-black-20: color-mix(in oklab, var(--background-color), black 20%); --background-color-black-25: color-mix(in oklab, var(--background-color), black 25%); --background-color-black-30: color-mix(in oklab, var(--background-color), black 30%); --background-color-black-35: color-mix(in oklab, var(--background-color), black 35%); --background-color-black-40: color-mix(in oklab, var(--background-color), black 40%); --background-color-black-50: color-mix(in oklab, var(--background-color), black 50%); --background-color-black-60: color-mix(in oklab, var(--background-color), black 60%); --background-color-black-65: color-mix(in oklab, var(--background-color), black 65%); --background-color-black-70: color-mix(in oklab, var(--background-color), black 70%); --background-color-black-75: color-mix(in oklab, var(--background-color), black 75%); --background-color-black-80: color-mix(in oklab, var(--background-color), black 80%); --background-color-black-85: color-mix(in oklab, var(--background-color), black 85%); --background-color-black-90: color-mix(in oklab, var(--background-color), black 90%); --background-color-black-95: color-mix(in oklab, var(--background-color), black 95%); --background-color-black-96: color-mix(in oklab, var(--background-color), black 96%); --background-color-black-97: color-mix(in oklab, var(--background-color), black 97%); --background-color-black-98: color-mix(in oklab, var(--background-color), black 98%); --background-color-black-99: color-mix(in oklab, var(--background-color), black 99%); --background-color-gray-1: color-mix(in oklab, var(--background-color), gray 1%); --background-color-gray-2: color-mix(in oklab, var(--background-color), gray 2%); --background-color-gray-3: color-mix(in oklab, var(--background-color), gray 3%); --background-color-gray-4: color-mix(in oklab, var(--background-color), gray 4%); --background-color-gray-5: color-mix(in oklab, var(--background-color), gray 5%); --background-color-gray-10: color-mix(in oklab, var(--background-color), gray 10%); --background-color-gray-15: color-mix(in oklab, var(--background-color), gray 15%); --background-color-gray-20: color-mix(in oklab, var(--background-color), gray 20%); --background-color-gray-25: color-mix(in oklab, var(--background-color), gray 25%); --background-color-gray-30: color-mix(in oklab, var(--background-color), gray 30%); --background-color-gray-35: color-mix(in oklab, var(--background-color), gray 35%); --background-color-gray-40: color-mix(in oklab, var(--background-color), gray 40%); --background-color-gray-50: color-mix(in oklab, var(--background-color), gray 50%); --background-color-gray-60: color-mix(in oklab, var(--background-color), gray 60%); --background-color-gray-65: color-mix(in oklab, var(--background-color), gray 65%); --background-color-gray-70: color-mix(in oklab, var(--background-color), gray 70%); --background-color-gray-75: color-mix(in oklab, var(--background-color), gray 75%); --background-color-gray-80: color-mix(in oklab, var(--background-color), gray 80%); --background-color-gray-85: color-mix(in oklab, var(--background-color), gray 85%); --background-color-gray-90: color-mix(in oklab, var(--background-color), gray 90%); --background-color-gray-95: color-mix(in oklab, var(--background-color), gray 95%); --background-color-gray-96: color-mix(in oklab, var(--background-color), gray 96%); --background-color-gray-97: color-mix(in oklab, var(--background-color), gray 97%); --background-color-gray-98: color-mix(in oklab, var(--background-color), gray 98%); --background-color-gray-99: color-mix(in oklab, var(--background-color), gray 99%); --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); } /*! Theme: boulder */ /*# sourceMappingURL=theme-boulder.css.map */ ================================================ FILE: css/dist/theme-crc-legacy.css ================================================ @charset "UTF-8"; /* ../../css/targets/html/legacy/crc/theme-crc.scss */ * { box-sizing: border-box; } body.pretext { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } body.pretext[data-font=OS] { font-family: "Open Sans", sans-serif; } body.pretext[data-font=RS] { font-family: "Roboto Serif", serif; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; } body.pretext { background: #fff; } a { color: inherit; text-decoration: none; } a:hover, a:focus { text-decoration: none; } body.pretext > a.assistive { padding: 6px; position: absolute; top: -40px; left: 0px; color: white; border-right: 1px solid white; border-bottom: 1px solid white; border-bottom-right-radius: 8px; background: transparent; z-index: 10000; } body.pretext > a.assistive:focus { top: 0px; background: #BF1722; outline: 0; transition: top 0.1s ease-in, background 0.5s linear; } nav .ptx-navbar { border-top: none; border-right: none; border-left: none; min-height: unset; } .ptx-navbar .activecode-toggle { padding: 3px 5px; } .pretext #brand-navbar, .pretext .brand-navbar { left: 0; position: fixed; right: 0; z-index: 1030; height: 50px; border-width: 0 0 1px; top: 0; margin-bottom: 0; } .pretext #brand-navbar > .container::before, .pretext .brand-navbar > .container::before, .pretext #brand-navbar > .container::after, .pretext .brand-navbar > .container::after { display: none; } .pretext #brand-navbar + .ptx-masthead, .pretext .brand-navbar + .ptx-masthead { margin-top: 50px; } .pretext #brand-navbar .navbar-collapse.collapse, .pretext .brand-navbar .navbar-collapse.collapse { overflow: hidden !important; } .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: 50px; } @media screen and (max-width: 800px) { .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: auto; } } .ptx-content section, .ptx-content article, .ptx-content figure, .ptx-content figcaption, .ptx-content .exercisegroup, .ptx-content .discussion-like, .ptx-content .para { position: relative; } .ptx-content .para > p:first-child, .ptx-content .para > .para:first-child { display: inline; } .ptx-content pre { margin: 0; padding: 0; border: none; } .ptx-content pre { border-radius: 0; } .ptx-content textarea { padding: 0; } .ptx-content h1, .ptx-content h2, .ptx-content h3, .ptx-content h4, .ptx-content h5, .ptx-content h6 { margin: 0; font-size: unset; } .pretext h1, .pretext h2, .pretext h3, .pretext h4, .pretext h5, .pretext h6 { margin: 0; font-size: unset; } .ptx-content .heading { line-height: 1.1; } .ptx-content .para { margin-top: 1.25em; margin-bottom: 0; line-height: 1.35; } .ptx-content .para.continuation { margin-top: 0; } .ptx-content pre + .para.continuation, .ptx-content pre + form, .ptx-content div + form { margin-top: 1em; } .ptx-content ul + .para.continuation, .ptx-content ol + .para.continuation, .ptx-content dl + .para.continuation { margin-top: 0.75em; } .ptx-content .aside-like > .para:first-child, .ptx-content td > .para:first-child, .ptx-content .solution-like > .para:first-child { margin-top: 0; } .ptx-content .assemblage-like > .para:first-of-type { margin-top: 0; } .ptx-content .assemblage-like > .heading + .para { margin-top: 0.25em; } .ptx-content .assemblage-like + .para { margin-top: 1.75em; } .ptx-content .para.intertext { margin-top: -0.25em; text-indent: 0; } .ptx-content .para + table { margin-top: 1em; } .ptx-content table tr td .para + .para { margin-top: 1em; } .ptx-content table + .para { margin-top: 1.5em; } .ptx-content .para + figure.figure-like > table { margin-top: 1em; } .ptx-content .exercise-like .para + ol { margin-top: 0.5em; } .ptx-content .para + pre.prettyprint, .ptx-content .para + pre.plainprint { margin-top: 1.25em; } .ptx-content .para + .code-box { margin-top: 1.25em; } .ptx-content .code-box > .console { margin-left: 1.5em; } .ptx-content .exercisegroup { padding-top: 1.25em; margin-bottom: 1em; } .ptx-content section .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .ptx-content section .exercisegroup > .heading + .introduction { display: inline; } .ptx-content section .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .ptx-content .exercisegroup article.exercise-like li > .para:first-child { margin-top: 0; } .ptx-content .exercisegroup article.exercise-like .heading { margin: 0; } .ptx-content article.exercise-like .task > .heading + .heading { font-weight: 600; } .ptx-content article.exercise-like .task > .heading + .heading + .para, .ptx-content article.exercise-like .task > .heading + .heading + div { display: block; margin-top: 0; } .ptx-content .exercisegroup .conclusion .heading { margin-top: 0.5em; } .ptx-content .exercisegroup article + article { margin-top: 1em; } .ptx-content .exercisegroup > article, .ptx-content .exercisegroup-exercises > article { margin-left: 2em; } .ptx-content .exercisegroup .cols2 > article { margin-left: 1.25em; } .ptx-content .exercisegroup > .introduction, .ptx-content .exercisegroup > .conclusion { margin-left: 0; } .ptx-content .exercisegroup > .introduction { margin-top: 1.25em; margin-top: 0; } .ptx-content .exercisegroup > .introduction > .para:first-child::before { content: "\25a0\2009"; color: #06a; position: relative; top: -1px; right: 1px; } .ptx-content .exercisegroup > .heading + .introduction > .para:first-child::before { content: "\2003"; } .ptx-content .exercisegroup > .introduction > .para:first-child { margin-top: 0; } .ptx-content section > article, .ptx-content section > section.paragraphs, .ptx-content .paragraphs > article { margin-top: 1.25em; } .ptx-content section article + article, .ptx-content section .introduction + article, .ptx-content section .para + article, .ptx-content section .posterior + article { margin-top: 1.75em; } .ptx-content section article > .introduction + article { margin-top: 1em; } .ptx-content section article > .discussion-like { margin-top: 1em; } .ptx-content section article > .discussion-like .para { margin-top: 1em; } .ptx-content article + .posterior { margin-top: 0.5em; } .ptx-content section .para + .tabular-box { margin-top: 0.75em; } .ptx-content section .tabular-box + .tabular-box { margin-top: 1em; } .ptx-content section .proof { margin-top: 0.75em; } .ptx-content section > pre, .ptx-content .para + pre { margin-top: 1.25em; } .ptx-content ol .para + .para, .ptx-content ul .para + .para { margin-top: 1em; } .ptx-content .introduction + .sidebyside, .ptx-content .para + .sidebyside, .ptx-content ol + .sidebyside, .ptx-content ul + .sidebyside { margin-top: 1em; } .ptx-content section .heading, .ptx-content article .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; } .ptx-content article .exercise-stage { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; font-size: 100%; margin-top: 0.4em; } .ptx-content article > .heading + .para { margin-top: 0; } .ptx-content section .heading + .para, .ptx-content section .title + .para, .ptx-content section .heading + .introduction > .para:first-child, .ptx-content section .blob > .para:first-child { margin-top: 0.25em; } .ptx-content section .heading + article { margin-top: 1em; } .ptx-content section .heading + .sidebyside { margin-top: 1em; } .ptx-content a > .heading { display: inline; } .ptx-content section > .heading { font-size: 1.75em; line-height: 1.25em; margin-top: 1em; margin-bottom: 0.35em; } .ptx-content section section > .heading { font-size: 1.5em; line-height: 1.25em; margin-bottom: 0; } .ptx-content .paragraphs > .heading { font-size: 1.125em; line-height: 1.125em; display: inline; } .ptx-content .paragraphs .heading + .para { display: inline; } .ptx-content .para.logical > .para:first-child { display: inline; } .ptx-content .runestone label > .para { display: inline; } .ptx-content .paragraphs .para .title { font-family: "PT Serif", "Times New Roman", Times, serif; font-size: 1.125em; font-weight: 700; } .ptx-content .paragraphs > .heading { margin-top: 0; } .ptx-content .paragraphs + .paragraphs { margin-top: 3em; } .ptx-content article .paragraphs > .heading { font-size: 1.05em; } .ptx-content section section section > .heading { font-size: 1.4em; line-height: 1.15em; margin-top: 0.75em; } @media screen and (max-width: 480px) { .ptx-content section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } .ptx-content section section > .heading { font-size: 1.3em; line-height: 1.15em; } .ptx-content section section section > .heading { font-size: 1.15em; line-height: 1em; } } .ptx-content .abstract { margin: 4em 2em; } .ptx-content .abstract > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .ptx-content .abstract > .title::after { content: ".\2009\2009\2009"; } .ptx-content .abstract > .title + .para { display: inline; } .ptx-content article > .heading, .ptx-content article > a .heading { font-size: 1.125em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like > .heading { font-size: 1em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like.discussion > .heading .codenumber, .ptx-content .discussion-like.discussion > .heading .space, .ptx-content .discussion-like.discussion > .heading .period { display: none; } .ptx-content .discussion-like.discussion > .heading .type::after { content: ". "; } .ptx-content .discussion-like.status > .heading { display: none; } .ptx-content .discussion-like.status > .heading + .para, .ptx-content .discussion-like.status > .para { font-style: italic; display: block; padding-left: 1em; } .ptx-content article > .heading::after, .ptx-content .discussion-like > .heading::after, .ptx-content .paragraphs > .heading::after, .ptx-content article > a > .heading::after { content: "\2009"; } .ptx-content .posterior .heading { font-weight: normal; font-size: 1.125em; line-height: 1.125em; margin-top: 0; } .ptx-content article > .heading + .para, .ptx-content .discussion-like > .heading + .para, .ptx-content article > .heading + .introduction, .ptx-content article > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article > .heading + ol, .ptx-content article > .heading + ul { padding-left: 1.5em; } .ptx-content article.theorem-like .para, .ptx-content article.theorem-like li { font-style: italic; } .ptx-content article.theorem-like .emphasis { font-weight: 700; } .ptx-content ol, .ptx-content ul { margin-bottom: 0; } .ptx-content li { margin-bottom: 0; } .ptx-content li .title { font-size: 100%; font-weight: normal; font-style: italic; } .ptx-content article.theorem-like li .title { font-weight: 600; font-style: normal; font-size: 96%; } .ptx-content figure { margin-bottom: 0; } .ptx-content .heading { margin-top: 0; margin-bottom: 0; } .ptx-content .conclusion { margin-top: 1em; } .ptx-content .conclusion > .para:first-child { margin-top: 0.5em; } .ptx-content ol, .ptx-content ul { margin-top: 0.75em; } .ptx-content .exercise-like > ol:first-child, .ptx-content .exercise-like > ul:first-child { margin-top: 0; } .ptx-content .heading + ol, .ptx-content .heading + ul { margin-top: 0.45em; } .ptx-content li > .heading + ol, .ptx-content li > .heading + ul { margin-top: 0.25em; } .ptx-content li > .heading + ol > li:nth-child(1), .ptx-content li > .heading + ul > li:nth-child(1) { margin-top: 0; } .ptx-content li > .heading + ol.cols2 > li:nth-child(2), .ptx-content li > .heading + ul.cols2 > li:nth-child(2) { margin-top: 0; } .ptx-content li { margin-top: 0.5em; } .ptx-content li > .para:first-child { margin-top: 0; } .ptx-content article .para:first-child { margin-top: 0; } .ptx-content ol ol, .ptx-content ol ul, .ptx-content ul ol, .ptx-content ul ul { margin-top: 0.5em; } .ptx-content .frontmatter > .heading { display: block; text-align: center; } .ptx-content .frontmatter > .heading .title, .ptx-content .book > .heading .title { font-size: 1.3em; } .ptx-content .frontmatter > .heading .subtitle, .ptx-content .book > .heading .subtitle { display: block; font-weight: normal; color: #666666; font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .ptx-content .frontmatter .author:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .para:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .author, .ptx-content .frontmatter > .credit { margin-top: 2em; text-align: center; } .ptx-content .frontmatter > .author .author-name { font-size: 120%; } .ptx-content .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .ptx-content .frontmatter .credit .title { font-size: 1em; } .ptx-content .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .ptx-content .frontmatter .author-info { font-size: 90%; } .ptx-content a[href^="mailto:"] { white-space: pre; } .ptx-content .colophon .credit { margin-top: 1em; } button { font: inherit; } .print-button { position: relative; right: 2px; top: 66px; background-color: LightGreen; z-index: 1; margin-top: -4em; float: right; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; border: none; } .pretext .ptx-page main.ptx-main { margin-left: 0; left: auto; border: none; box-shadow: none; padding: 0; } .pretext .ptx-page .ptx-main .ptx-content { margin-top: 0; } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section { margin-top: 1em; } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section .heading { margin-top: 0; } .pretext a[href]::after { content: ""; } .print-button { display: none; } } @media print { body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { width: 820px; max-width: 820px; font-size: 12.5px; } body.standalone.worksheet { margin: 0; } body.standalone .ptx-content section.worksheet { border: none; } body.standalone.worksheet .ptx-masthead, body.standalone.worksheet .ptx-page-footer { display: none; } body.standalone.worksheet.has-sidebar-left.mathbook-loaded .ptx-page .ptx-main { margin: 0; } body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { margin: 0; } body.standalone.worksheet .ptx-content section.onepage { max-height: 100%; max-width: 100%; overflow: hidden; page-break-after: always; border: none; page-break-inside: avoid; } body.standalone.worksheet .ptx-content .onepage.lastpage { margin-bottom: -2em; page-break-after: auto; } body.standalone.worksheet.a4 .ptx-content .onepage { } body.standalone.worksheet .ptx-content .onepage div.workspace, body.standalone.worksheet .ptx-content .onepage div.workspace.squashed.tight { border: none; padding: 0; background: none !important; } body.standalone.worksheet a { color: black; } body.standalone.worksheet .ptx-page .ptx-main { padding: 0; } body.standalone.worksheet.mathbook-loaded .ptx-page .ptx-main .ptx-content.ptx-content section.onepage { padding-bottom: 20px; } @page { margin: 0; } } .hidden { display: none; } .ptx-navbar .preferences_menu_holder .active > li { color: #ddd; } .ptx-navbar .preferences_menu_holder > ol > li:focus { background: #eef; border: 2px solid #909; padding: 2px 24px 2px 8px; } .ptx-navbar .preferences_menu_holder > ol > li > ol > li:focus { background: #eef; border: 2px solid #909; padding: 4px 4px 2px 4px; } .ptx-navbar .preferences_menu_holder .active .selected { background: #eef; color: #111; } .ptx-navbar .button.user-preferences-button { overflow: visible; display: none; } .preferences_menu_holder { z-index: 30; background: #fee; color: #222; position: absolute; left: -11em; top: 4em; } .preferences_menu_holder ol { list-style-type: none; padding: 0; margin: 0; } .preferences_menu_holder > ol { width: 12.5em; } .preferences_menu_holder > ol > li { padding: 4px 26px 4px 10px; } .preferences_menu_holder ol li ol { z-index: 40; position: absolute; left: 13em; top: -2em; background: #fee; } .preferences_menu_holder ol li ol li { padding: 6px 6px 4px 6px; display: flex; align-items: center; } .preferences_menu_holder ol.fonts:not(.hidden) { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; } .preferences_menu_holder ol.fonts li:nth-child(8n+1), .preferences_menu_holder ol.fonts li:nth-child(8n+2), .preferences_menu_holder ol.fonts li:nth-child(8n+3), .preferences_menu_holder ol.fonts li:nth-child(8n+4) { background-color: #eff; } .preferences_menu_holder ol.fonts li:nth-child(4n+2) { width: 4em; justify-content: center; text-align: center; align-items: center; } .preferences_menu_holder ol.fonts li:nth-child(4n+1) { padding-left: 14px; } .preferences_menu_holder .wrap_to_submenu { float: right; line-height: 0.95em; margin-right: -7px; } .preferences_menu_holder .to_submenu { position: absolute; } .preferences_menu_holder .avatars li { font-size: 200%; text-align: center; } .preferences_menu_holder .fontfamily .name { margin-right: 2em; } .preferences_menu_holder .fontfamily .sample { margin-left: auto; } .preferences_menu_holder .fonts .byunits { font-size: 80%; margin-bottom: -0.3em; } #choose_topic { background: #eef; } .ffcheck, .atmospherecheck, .avatarcheck, .rulercheck, .motioncheck { width: 1em; margin-left: 0.2em; margin-right: 0.7em; font-size: 11pt; } .preferences_menu_holder .moveQ { padding-top: 0.5em; border-top: 0.3em solid #eef; } .preferences_menu_holder .moveQ, .preferences_menu_holder .moveQ ~ li { background: #efe; } [data-ruler=greybar] .onelineX:hover { padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: #f3f3f3; } [data-atmosphere*=dark][data-ruler=greybar] .onelineX:hover { color: #333; } [data-ruler=lightbox] .onelineX { background-color: #e3e3e3; } [data-ruler=lightbox] .onelineX:hover { padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: inherit; } [data-ruler=sunrise] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler=sunrise] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunrise] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] .onelineX:hover { background-color: inherit; border-bottom: 2px solid black; margin-bottom: -2px; position: relative; z-index: 10; } xxxxxx[data-ruler=sunriseunderline] .onelineX:hover + .onelineX { margin-top: -2px; } [data-ruler=sunriseunderline] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=underline] .onelineX:hover { background-color: inherit; border-bottom: 1px solid black; margin-bottom: -1px; } [data-ruler=lunderline] .onelineX:hover { background-color: inherit; border-bottom: 1px solid black; border-left: 1px solid black; padding-left: 4px; margin-left: -5px; margin-bottom: -1px; } [data-atmosphere*=dark][data-ruler*=underline] .onelineX:hover { border-bottom: 1.5px solid #ddd; margin-bottom: -1.5px; } [data-atmosphere*=dark][data-ruler=lunderline] .onelineX:hover { border-left: 1.5px solid #ddd; padding-left: 3.5px; margin-left: -5px; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } .ptx-footnote { display: inline-block; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number { visibility: hidden; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: 0.6rem; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote__number { display: inline; cursor: pointer; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowlbackground); border-radius: 6px; padding: 0px 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowlborder); } .ptx-content section .para.credit + .para.credit { margin-top: 0.25em; } .ptx-content section .para.credit > .title { font-weight: 700; margin-right: 0.5em; } .ptx-content section .para.copyright { margin-top: 2.5em; } .ptx-content section .para.license { margin-top: 2.5em; } .ptx-content section > .heading + .heading, .ptx-content section section > .heading + .heading { margin-top: 0.5em; } .ptx-content section.solutions > h3.heading, .ptx-content section.solutions section > h3.heading { font-size: 1.6em; } .ptx-content section.solutions > h4.heading, .ptx-content section.solutions section > h4.heading { font-size: 1.45em; } .ptx-content section.solutions > h5.heading, .ptx-content section.solutions section > h5.heading { font-size: 1.35em; } .ptx-content section.solutions > h6.heading, .ptx-content section.solutions section > h6.heading { font-size: 1.25em; } .ptx-content .bibitem + .bibentry { display: inline-block; width: 90%; } .ptx-content .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .ptx-content figcaption { font-weight: normal; } .ptx-content figcaption { margin-top: 0.6em; margin-left: auto; margin-right: auto; } .ptx-content figure.table-like figcaption:first-child { font-style: oblique; margin-top: 0; } .ptx-content figure.table-like figcaption:first-child .type, .ptx-content figure.table-like figcaption:first-child .codenumber { font-style: normal; } .ptx-content section figcaption .codenumber, .ptx-content section figcaption .type { font-weight: 700; font-size: inherit; } .ptx-content figcaption .codenumber:after { content: "\2002"; } .ptx-content figcaption .type:last-of-type::after { content: "\2002"; } .ptx-content figcaption code.code-inline { white-space: pre; } .ptx-content figure.figure > figcaption { margin-top: 1em; } .ptx-content figure.listing > figcaption + * { margin-top: 0.5em; } .ptx-content figcaption + .named-list-content { margin-top: 0.6em; } .ptx-content figcaption + .named-list-content > .introduction > .para:first-child { margin-top: 0; } .ptx-content figcaption + table, .ptx-content figcaption + .tabular-box { margin-top: 0.5em; } .ptx-content .definition-like .para > .emphasis { font-weight: 700; } .ptx-content em.alert { font-weight: bold; } .unprocessed { padding: 8px; background-color: rgb(255, 230, 230); } .unprocessed .unprocessed { margin: 8px; background-color: rgb(255, 200, 255); } .unprocessed .unprocessed .unprocessed { margin: 8px; background-color: rgb(205, 205, 255); } .ptx-content section.introduction + section { margin-top: 2em; } .ptx-content { margin: 0; } .ptx-content .runestone.parsons_section { display: inline-block; max-width: unset; } .ptx-content .runestone.ac_section { width: 60em; max-width: unset; } .ptx-content .runestone.ac_section .ac_section { max-width: unset; } .ptx-content .runestone.ac_section > div { max-width: unset; } .ptx-content .runestone > .parsons { width: 60em; max-width: unset; } .ptx-content .runestone .parsons { margin: 0; } .ptx-content .runestone.parsons_section > .parsons { width: max-content; padding-right: 1em; } .ptx-content .runestone .parsons .sortable-code-container { text-align: unset; } .ptx-content .runestone .parsons .parsons-text, .ptx-content .runestone .parsons .parsons-controls { margin-left: 0; margin-right: 0; } .ptx-content .runestone .parsons .sortable-code + .sortable-code { margin-right: 0; } .ptx-content .runestone .parsons .runestone_caption_text { max-width: 660px; } .runestonebustmenu { position: absolute; right: 0; top: 0; } .runestonebustmenu .dropdown-content { position: absolute; right: 2em; left: unset; top: 1em; } @media screen and (max-width: 800px) { nav .dropdown .dropdown-content { top: unset; bottom: 36px; } .activecode-toggle { display: none; } } .pretext .navbar .dropdown { height: 35px; } .ptx-content section section + section { margin-top: 3em; } .ptx-content .sidebyside > .para, .ptx-content .sidebyside > figure, .ptx-content .sidebyside > img, .ptx-content .sidebyside > table, .ptx-content .sidebyside > tabular, .ptx-content .sidebyside > section, .ptx-content .sidebyside > .paragraphs { display: inline-block; margin: 0; } .ptx-content .sidebyside .sbspanel > table { overflow-x: auto; margin-left: auto; margin-right: auto; } .ptx-content .sidebyside figcaption { padding-left: 1em; padding-right: 0; padding-bottom: 0; margin: 0.75em 0 0 0; } .ptx-content figcaption { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .sidebyside > .para { width: 32%; vertical-align: top; } .ptx-content .sidebyside > .para.left, .ptx-content .sidebyside > .para.middle, .ptx-content .sidebyside > .para.right { vertical-align: middle; } .ptx-content .sidebyside > .para + img { vertical-align: middle; } .ptx-content .sidebyside .sbsrow .sbsheader { margin-top: 0; } .ptx-content .sbsgroup { width: 100%; } .ptx-content .sidebyside { width: 100%; } .ptx-content .sbsrow { display: flex; justify-content: space-between; } .ptx-content .sbsheader { text-align: center; justify-content: center; font-size: 1em; } .ptx-content .sbspanel:empty { height: 10em; background-color: rgb(221, 221, 255); } .ptx-content .sbspanel { display: flex; flex-direction: column; justify-content: flex-start; } .ptx-content .sbspanel.top { justify-content: flex-start; } .ptx-content .sbspanel.middle { justify-content: center; } .ptx-content .sbspanel.bottom { justify-content: flex-end; } .ptx-content .sbspanel > .para:first-child { margin-top: 0; } .ptx-content .fixed-width { align-items: center; } .ptx-content .sbscaption { justify-content: center; } .ptx-content table { border-spacing: 0; } .ptx-content table { border-collapse: collapse; } .ptx-content .image-box + table, .ptx-content .image-box + .sidebyside > .sbsrow:first-child > .sbspanel > table:first-child { margin-top: 1.5em; } .ptx-content table tr td, .ptx-content table tr th { padding-top: 2px; padding-bottom: 2px; padding-left: 5px; padding-right: 5px; } .ptx-content table tr td { font-size: 90%; } .ptx-content table tr td.l { text-align: left; } .ptx-content table tr td.c { text-align: center; } .ptx-content table tr td.r { text-align: right; } .ptx-content table tr td.j { text-align: justify; } .ptx-content table tr td.lines { white-space: nowrap; } .ptx-content table tr td.t { vertical-align: top; } .ptx-content table tr td.b { vertical-align: bottom; } .ptx-content table tr td.m { vertical-align: middle; } .ptx-content table tr td.vv { border-left: 2px solid #000; border-right: 2px solid #000; } .ptx-content table tr td.vcv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.vcvv { border-left: 2px solid #000; border-right: 4px solid #000; text-align: center; } .ptx-content table tr td.vlv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vrv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.rv { border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.vr { border-left: 2px solid #000; text-align: right; } .ptx-content table tr td.lv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vl { border-left: 2px solid #000; text-align: left; } .ptx-content table tr td.cv { border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.Xv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vc { border-left: 2px solid #000; text-align: center; } .ptx-content table tr td.hline { padding: 0; } .ptx-content table tr td.hlinethick { padding-left: 0px; padding-right: 0px; } .ptx-content table tr td.hline hr { margin-top: 0; margin-bottom: 0; margin-left: -1px; margin-right: -1px; border: 1px solid rgb(0, 0, 0); } .ptx-content table tr td.hlinethick hr { margin-top: 0; margin-bottom: 0; margin-left: -1px; margin-right: -1px; border: 2px solid rgb(0, 0, 0); } .center table { text-align: center; margin-left: auto; margin-right: auto; } .ptx-content table tr th.b1, .ptx-content table tr td.b1 { border-bottom: 1px solid #000; } .ptx-content table tr th.b2, .ptx-content table tr td.b2 { border-bottom: 2px solid #000; } .ptx-content table tr th.b3, .ptx-content table tr td.b3 { border-bottom: 3px solid #000; } .ptx-content table tr th.b0, .ptx-content table tr td.b0 { border-bottom: none; } .ptx-content table tr th.t1, .ptx-content table tr td.t1 { border-top: 1px solid #000; } .ptx-content table tr th.t2, .ptx-content table tr td.t2 { border-top: 2px solid #000; } .ptx-content table tr th.t3, .ptx-content table tr td.t3 { border-top: 3px solid #000; } .ptx-content table tr th.t0, .ptx-content table tr td.t0 { border-top: none; } .ptx-content table tr th.r1, .ptx-content table tr td.r1 { border-right: 1px solid #000; } .ptx-content table tr th.r2, .ptx-content table tr td.r2 { border-right: 2px solid #000; } .ptx-content table tr th.r3, .ptx-content table tr td.r3 { border-right: 3px solid #000; } .ptx-content table tr th.r0, .ptx-content table tr td.r0 { border-right: none; } .ptx-content table tr th.l1, .ptx-content table tr td.l1 { border-left: 1px solid #000; } .ptx-content table tr th.l2, .ptx-content table tr td.l2 { border-left: 2px solid #000; } .ptx-content table tr th.l3, .ptx-content table tr td.l3 { border-left: 3px solid #000; } .ptx-content table tr th.l0, .ptx-content table tr td.l0 { border-left: none; } .ptx-content table tr td img { max-width: 200px; margin-right: 30px; } .ptx-content table.notation-list tr th { text-align: left; } .ptx-content table.notation-list tr td { text-align: left; vertical-align: top; } .ptx-content table.notation-list tr th { margin-left: 2em; } .ptx-content table.notation-list tr td { margin-left: 1em; } .ptx-content tr th.r0.l0, .ptx-content tr td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content table tr td span.decimal { float: left; text-align: right; } .ptx-content table tr.header-vertical th { writing-mode: vertical-rl; padding-left: 2em; } .ptx-content table + article { margin-top: 1em; } .ptx-content .hidden-knowl-wrapper .hiddenproof, .ptx-content .blob > article.hiddenproof, .ptx-content section > article.hiddenproof { margin-top: 0.3em; } .ptx-content .hidden-knowl-wrapper article { display: inline; } .apretext-content figure.figure-like { overflow: auto; } .ptx-content figure.figure-like { margin-left: 0; margin-right: 0; } .ptx-content figure.table-like { margin-left: 30px; margin-right: 30px; } .ptx-content figure.table-like.list { margin-right: 0; } .ptx-content a > tt { font-size: 110%; } .ptx-content section .videolink a:link { background-size: 0; } .ptx-content .playvideo { cursor: pointer; } .ptx-content .videobig { padding-right: 0.3em; padding-left: 0.3em; font-size: 85%; background-color: rgba(255, 255, 100, 0.9); display: inline-block; position: relative; top: 100px; cursor: zoom-in; } .ptx-content .videobig.nofigure { } .ptx-content .knowl .videobig { display: none; } .ptx-content .videosmall { padding-right: 0.3em; padding-left: 0.3em; font-size: 80%; background-color: rgba(255, 255, 100, 0.9); display: inline-block; position: absolute; left: -250px; z-index: 1001; cursor: zoom-out; } .ptx-content .exercise-like ol li table { margin-bottom: 0.5em; } .ptx-content .exercise-like > ol li + li { margin-top: 0.5em; } .ptx-content .solution > ol li + li { margin-top: 0.5em; } .ptx-content section.worksheet > .heading > .codenumber { display: inline-block; vertical-align: top; } .ptx-content section.worksheet > .heading > .title { display: inline-block; max-width: 70%; } .ptx-content .heading .print-links { display: inline-block; float: right; vertical-align: top; width: 19%; text-align: right; } .standalone .ptx-content .heading .print-links { display: none; } .standalone.worksheet .previous-button, .standalone.worksheet .up-button, .standalone.worksheet .next-button { display: none; } .standalone.worksheet .ptx-navbar .toc-toggle { display: none; } .standalone.worksheet .ptx-content [data-knowl]:hover, .standalone.worksheet .ptx-content [data-knowl]:active, .standalone.worksheet .ptx-content [data-knowl].active { background: none; color: black; } .standalone.worksheet .ptx-content [data-knowl]::after { border: none; } .standalone.worksheet .ptx-content .knowl-content { padding: 0; } .standalone.worksheet .ptx-content article > .knowl-output.original { margin: 0; } .ptx-content .appendix .heading > .type { display: inline; } .ptx-content .heading.hide-type > .type { display: none; } .ptx-content .heading .print-links > a { font-family: "Open Sans"; font-size: 0.6em; font-weight: bold; padding: 0.1em 0.2em; background: #ffa; border: 2px solid green; } .ptx-content .heading .print-links > a.us { background: #eef; color: #9b1c2c; border-color: #041E42; } .ptx-content .heading .print-links > a + a { margin-left: 0.25em; } .ptx-content .autopermalink { position: absolute; display: inline-block; top: 3px; left: -1.9em; font-size: 85%; color: #a00; opacity: 0.05; margin-top: 0.1em; } .ptx-content li > .para > .autopermalink { left: -3.4em; top: 0; } .ptx-content .autopermalink a { color: #a00; } .ptx-content .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } :target { scroll-margin-top: 45px; } .ptx-content .para > .autopermalink { margin-top: 0.2em; } .ptx-content .exercises > .autopermalink, .ptx-content .introduction > .autopermalink, .ptx-content .glossary > .autopermalink { margin-top: 0.3em; } .ptx-content .appendix > .autopermalink, .ptx-content .chapter > .autopermalink, .ptx-content .index > .autopermalink, .ptx-content .section > .autopermalink { margin-top: 0.3em; } .ptx-content .subsection > .autopermalink, .ptx-content .references > .autopermalink, .ptx-content .exercises > .autopermalink { margin-top: 0.3em; } .ptx-content .figure-like > .autopermalink { margin-top: 1.4em; } .ptx-content .subsubsection > .autopermalink { margin-top: 0; } .ptx-content .exercisegroup > .autopermalink { margin-top: 1.4em; } .ptx-content .autopermalink:hover { opacity: 1; background: #eeddff; } .ptx-content .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: #fff; border: 3px solid blue; z-index: 2001; } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: #eeaaff; } .ptx-content .indexitem { margin-top: 2px; } .ptx-content .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .ptx-content .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .ptx-content .indexknowl { margin-left: 0.11em; } .ptx-content em + .indexknowl { margin-left: -0.25em; } .ptx-content .indexknowl a { margin-left: 2em; } .ptx-content .indexitem .see, .ptx-content .subindexitem .see, .ptx-content .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .seealso, .ptx-content .subindexitem .seealso, .ptx-content .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .see em, .ptx-content .subindexitem .see em, .ptx-content .subsubindexitem .see em, .ptx-content .indexitem .seealso em, .ptx-content .subindexitem .seealso em, .ptx-content .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .ptx-content .indexitem .see + .see, .ptx-content .subindexitem .see + .see, .ptx-content .subsubindexitem .see + .see, .ptx-content .indexitem .seealso + .seealso, .ptx-content .subindexitem .seealso + .seealso, .ptx-content .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .ptx-content .indexitem .indexknowl { font-size: 90%; } .ptx-content .indexitem [data-knowl], .ptx-content .subindexitem [data-knowl], .ptx-content .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .ptx-content .indexknowl [data-knowl]:hover, .ptx-content .indexknowl .active[data-knowl] { margin-left: 2em; } .ptx-content .subindexitem .indexknowl { font-size: 95%; } .ptx-content .subsubindexitem .indexknowl { font-size: 95%; } .ptx-content .indexletter { margin-top: 1.5em; } .ptx-content .hidden-knowl-wrapper .heading { display: inline; } .ptx-content .heading + .hidden-knowl-wrapper { display: inline; } .ptx-content .cols2 .knowl-output, .ptx-content .cols3 .knowl-output, .ptx-content .cols4 .knowl-output, .ptx-content .cols5 .knowl-output, .ptx-content .cols5 .knowl-output { width: 100%; } .ptx-content .cols2 + *, .ptx-content .cols3 + *, .ptx-content .cols4 + *, .ptx-content .cols5 + *, .ptx-content .cols6 + * { clear: both; } .ptx-content .cols2::after, .ptx-content .cols3::after, .ptx-content .cols4::after, .ptx-content .cols5::after, .ptx-content .cols6::after { content: ""; display: block; clear: both; } .ptx-content section > ol:last-child, .ptx-content section > ul:last-child { margin-bottom: 1.5em; } .ptx-content section > ol:last-child > li:last-child, .ptx-content section > ul:last-child > li:last-child { padding-bottom: 0em; } .ptx-content .cols2 > li:nth-child(2n+1), .ptx-content .cols3 > li:nth-child(3n+1), .ptx-content .cols4 > li:nth-child(4n+1), .ptx-content .cols5 > li:nth-child(5n+1), .ptx-content .cols6 > li:nth-child(6n+1) { clear: left; } .ptx-content .exercise-like ol.cols2 li { margin-top: 0.5em; } .ptx-content .cols2 > li, .ptx-content .cols3 > li, .ptx-content .cols4 > li, .ptx-content .cols5 > li, .ptx-content .cols6 > li { float: left; } .ptx-content .incontext { display: block; font-size: 85%; text-align: right; } .ptx-content .terminology { font-style: italic; font-weight: bold; } .ptx-content .emphasis { font-style: italic; } .ptx-content .emphasis .emphasis { font-weight: bold; } :target { animation: target-fade 15s 1; } @-webkit-keyframes target-fade { 0% { background-color: rgba(120, 0, 120, 0.3); } 100% { background-color: inherit; opacity: 1; } } @-moz-keyframes target-fade { 0% { background-color: rgba(120, 0, 120, 0.3); } 100% { background-color: inherit; opacity: 1; } } .ptx-content .autoterm [knowl], .ptx-content .autoterm [knowl]:after { font-weight: inherit; color: inherit; padding: 0; margin-bottom: inherit; border-bottom: inherit; border-bottom-color: inherit; } .ptx-content .autoterm [knowl]:hover { background: #ffddff; border-top: 2px dotted purple; border-bottom: 1px dotted red; border-top-left-radius: 0; border-top-right-radius: 0; } .ptx-content ol li.custom-list-style-type { list-style-type: none; } .ptx-content ol li.custom-list-style-type:before { content: attr(label) "\a0\a0"; } .ptx-content ol.no-marker, .ptx-content ul.no-marker, .ptx-content li.no-marker { list-style-type: none; } .ptx-content ol.decimal { list-style-type: decimal; } .ptx-content ol.lower-alpha { list-style-type: lower-alpha; } .ptx-content ol.upper-alpha { list-style-type: upper-alpha; } .ptx-content ol.lower-roman { list-style-type: lower-roman; } .ptx-content ol.upper-roman { list-style-type: upper-roman; } .ptx-content ul.disc { list-style-type: disc; } .ptx-content ul.square { list-style-type: square; } .ptx-content ul.circle { list-style-type: circle; } .ptx-content ol.no-marker, .ptx-content ul.no-marker { list-style-type: none; } .ptx-content section, .ptx-content article, .ptx-content figure { clear: both; } .ptx-content dl { margin-top: 1em; margin-left: 0; margin-bottom: 0; overflow: hidden; } .ptx-content dl dd { margin-top: 0; } .ptx-content dl dd::after { content: ""; display: block; clear: both; } .ptx-content dl.glossary dt { margin-top: 1.25em; } .ptx-content dl.description-list dt, .ptx-content dl.description-list dd { margin-top: 1em; } .ptx-content dl.description-list.narrow dt { margin-top: 0; } .ptx-content dl.glosary dt:first-of-type, .ptx-content dl.description-list dt:first-of-type, .ptx-content dl.glosary dd:first-of-type, .ptx-content dl.description-list dd:first-of-type { margin-top: 0; } .ptx-content dl dd .para { margin-top: 1em; } .ptx-content dl dt > .para:first-child, .ptx-content dl dd > .para:first-child { margin-top: 0; } .ptx-content dl > dt { font-weight: bold; max-width: 55ex; } .ptx-content dl.description-list dt { float: left; clear: left; text-align: right; width: 18ex; } .ptx-content dl.description-list.narrow dt, .ptx-content dl.glossary dt { text-align: left; } .ptx-content dl.glossary dd { margin-left: 5ex; } .ptx-content dl.description-list dd { margin-left: 22ex; } .ptx-content dl.description-list.narrow dd { margin-left: 12ex; } .ptx-content dl.description-list dt:first-of-type { clear: none; } .ptx-content dl.description-list.narrow dd::after { content: ""; display: block; height: 1em; clear: left; } .ptx-content dl.description-list.narrow dd:last-child::after { height: 0; } .ptx-content dl.description-list dt { float: left; clear: both; margin-right: 1ex; } .ptx-content dl.description-list.narrow dt { width: unset; max-width: 55ex; text-align: left; } .ptx-content dl.description-list.narrow dd { margin-left: 0; margin-top: 0; width: 31em; max-width: calc(100% - 12ex); float: right; clear: right; } .ptx-content dl.description-list + * { clear: both; } @media screen and (max-width: 480px) { .ptx-content dl.description-list dt { float: none; margin-left: 0; text-align: left; } .ptx-content dl.description-list dd, .ptx-content dl.description-list.narrow dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } .ptx-content dl.description-list dl dt { width: 8ex; } .ptx-content dl.description-list dd dd { margin-left: 18ex; } .ptx-content dl.description-list dl dd { margin-left: 12ex; } .ptx-content [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .ptx-content .knowl mjx-mtext > mjx-utext, .ptx-content mjx-mtext > mjx-utext { width: revert !important; } .ptx-content mjx-msup mjx-utext, .ptx-content mjx-msub mjx-utext { display: inline; } a.mjx-svg-href { fill: inherit; stroke: inherit; } .displaymath + .para { margin-top: 0; } @media screen and (max-width: 943px) { .ptx-content .displaymath { position: relative; overflow-x: auto; } .ptx-content .mjx-chtml.MJXc-display { overflow-x: auto; overflow-y: hidden; } .ptx-content .figure-like { overflow-x: auto; } .ptx-content #MathJax_ZoomFrame { position: static; background: white; } .ptx-content #MathJax_Zoom { background-color: inherit; border: 0; padding: 0; position: absolute; overflow-x: auto; overflow-y: visible; left: 10% !important; max-height: none !important; } } .ptx-content dd .displaymath:last-child .MJXc-display { margin-bottom: 0; } .floatnav { margin-top: 8px; margin-left: 50px; } .floatnav a { padding-left: 3px; margin-right: -1px; color: inherit; } .ptx-content a .heading .mjx-chtml { z-index: 1; background: #fff; } .ptx-content .hidden-knowl-wrapper [data-knowl]::after, .ptx-content .hidden-knowl-wrapper [data-knowl]:hover::after, .ptx-content .hidden-knowl-wrapper .active[data-knowl]::after { right: 7px; } .floatnav a:hover { background: #eeaaff; } .ptx-content .unselectable { user-select: none; } .ptx-content .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .ptx-content .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } .ptx-content .fillin { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.underline { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.box { display: inline-block; border: none; margin-left: 0.1em; margin-right: 0.1em; margin-bottom: -0.25em; outline: 1px solid black; height: 1.3em; } .ptx-content .fillin.shade { display: inline-block; border: none; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; background-color: #eee; height: 1.3em; } .ptx-content .hiddenproof > a > .heading { font-style: italic; font-weight: normal; } .ptx-content .MJXc-display, .ptx-content .knowl-output .knowl-output .knowl-output .knowl-output .MJXc-display, .ptx-content pre.prettyprint, .ptx-content pre.plainprint, .ptx-content pre.console, .ptx-content .code-box { background-image: linear-gradient( to right, white, white), linear-gradient( to right, white, white), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 255, 255, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 255, 255, 0)); background-position: left center, right center, left center, right center; background-repeat: no-repeat; background-color: inherit; background-size: 20px 100%, 20px 100%, 10px 100%, 10px 100%; background-attachment: local, local, scroll, scroll; } .ptx-content .runestone .code-box { background-image: none; } .ptx-content .knowl-output .MJXc-display { background-image: linear-gradient( to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient( to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient( to right, rgba(0, 0, 0, 0.25), var(--knowlbackground)), linear-gradient( to left, rgba(0, 0, 0, 0.25), var(--knowlbackground)); } .ptx-content .knowl-output.original .MJXc-display { background: inherit; } .ptx-content .assemblage-like .MJXc-display { background-image: linear-gradient( to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient( to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient( to right, rgba(0, 0, 0, 0.25), var(--assemblagebackground)), linear-gradient( to left, rgba(0, 0, 0, 0.25), var(--assemblagebackground)); } .ptx-content .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient( to right, #fffff5, #fffff5), linear-gradient( to right, #fffff5, #fffff5), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 255, 243, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 255, 243, 0)); } .ptx-content .knowl-output .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient( to right, #fff5fe, #fff5fe), linear-gradient( to right, #fff5fe, #fff5fe), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 243, 254, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 243, 254, 0)); } .ptx-content .knowl-output .knowl-content > *:last-child:not(.incontext) { margin-bottom: 0.5em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like, .ptx-content .knowl-output .knowl .knowl-content > .solution-like:not(.incontext) { margin-bottom: 0.15em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.hint { border-left: 1px solid #0f0; padding-left: 0.35em; background: #efe; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.answer { border-left: 2px solid #00f; padding-left: 0.35em; background: #eef; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.solution { border-left: 3px solid #c0c; padding-left: 0.5em; background: #fef; } .ptx-content .knowl-content > article:first-child, .ptx-content .knowl-content > .solution-like:first-child { padding-top: 0.25em; } .ptx-content .exercisegroup > .conclusion { margin-left: 1.5em; } .ptx-content .exercise-like .introduction { display: inline; } .ptx-content .exercise-like .introduction .heading { display: inline; } .ptx-content .exercise-like .introduction .para:first-child { display: inline; } .ptx-content .exercise-like .introduction::after { content: ""; display: block; } .ptx-content .exercise-like .conclusion::before { content: ""; display: block; margin-top: 0.25em; } .ptx-content .exercisegroup .exercisegroup-exercises.cols2, .ptx-content .exercisegroup .exercisegroup-exercises.cols3, .ptx-content .exercisegroup .exercisegroup-exercises.cols4, .ptx-content .exercisegroup .exercisegroup-exercises.cols5, .ptx-content .exercisegroup .exercisegroup-exercises.cols6 { width: 100%; display: inline-flex; flex-direction: row; flex-wrap: wrap; justify-content: flex-start; align-items: flex-start; align-content: flex-start; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 { display: inline; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 .knowl-output { display: block; } .ptx-content .exercisegroup .cols1 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(33.33% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(25% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(20% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(16.66% - 2em); } .ptx-content .mathword { white-space: nowrap; } .ptx-content .unit, .ptx-content .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .ptx-content .unit sub, .ptx-content .unit sup, .ptx-content .quantity sub, .ptx-content .quantity sup { word-spacing: normal; } .ptx-content .code-inline, .ptx-content .code-block, .ptx-content .console, .ptx-content .program, .ptx-content .program code { font-family: "Inconsolata", monospace; } .ptx-content .code-block, .ptx-content .console, .ptx-content .program { overflow-x: auto; } .ptx-content .code-inline { font-size: 1em; white-space: pre; color: inherit; background: #eeeeee; border: 1px solid #dddddd; padding: 0.0625em 0.25em; margin-left: 0.2em; margin-right: 0.2em; border-radius: 0.2em; } .ptx-content .code-inline:first-child { margin-left: 0; } .ptx-content .title .code-inline { padding-left: 0; padding-right: 0; margin-left: 0; margin-right: 0; } .ptx-content a .code-inline { background: #f6f6f6; } .ptx-content .kbdkey { background: #f1f1f1; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .ptx-content .kbdkey { color: #333; } .ptx-content .sagecell_sessionOutput pre { font-family: "Inconsolata", monospace; } .ptx-content .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .ptx-content .sage-interact.sagecell { margin: 0; } .ptx-content .sagecell_evalButton { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px; padding: 0 0.65em; } .ptx-content .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .ptx-content .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .ptx-content .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .ptx-content .sagecell_evalButton:focus, .ptx-content .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .ptx-content .sagecell .sagecell_editor { margin-bottom: 8px; } .ptx-content .booktitle { font-style: oblique; } .ptx-content .objectives > .heading, .ptx-content .outcomes > .heading { font-size: 1.25em; } .ptx-content a .heading { white-space: normal; } .ptx-content .solutions > a, .ptx-content .solutions > a:hover, .ptx-content .solutions > a.active, .ptx-content .instructions > a, .ptx-content .instructions > a:hover, .ptx-content .instructions > a.active { display: inline-block; margin-right: 1.5em; } .ptx-content .solutions > a::before, .ptx-content .instructions > a::before { content: "\25ba"; font-size: 70%; color: #06a; position: relative; top: -2px; right: 3px; } .ptx-content .solutions > a.active::before, .ptx-content .instructions > a.active::before { content: "\25bc"; animation-name: solutiontriangle; animation-duration: 3s; animation-iteration-count: 1; } .ptx-content .solutions > a[data-knowl]::after, .ptx-content .instructions > a[data-knowl]::after { left: 12px; } @keyframes solutiontriangle { from { content: "\25ba"; } to { content: "\25bc"; } } .ptx-content section.solutions { font-size: 90%; padding-left: 1em; border-left: 1em solid #eeeeee; } .ptx-content.ptx-content > section.solutions:first-child { padding-left: 0; border-left: none; } .ptx-content article.example-like > .solution-like, .ptx-content article.exercise-like > .solution-like { margin-top: 1em; padding-left: 0.7em; } .ptx-content article.example-like > .solution-like > .heading, .ptx-content article.exercise-like > .solution-like > .heading { font-size: 100%; font-weight: 700; margin-right: 0.25em; display: inline; } .ptx-content article.example-like > .solution-like > .heading + .para, .ptx-content article.exercise-like > .solution-like > .heading + .para { display: inline; } .ptx-content article > figure:first-child { margin-top: 0; } .ptx-content figure + figure, .ptx-content figure + .sidebyside, .ptx-content .sidebyside + .sidebyside, .ptx-content article + figure, .ptx-content .sidebyside + figure { padding-top: 1em; } .ptx-content img { display: inline-block; margin-left: auto; margin-right: auto; } .ptx-content img.cs { display: block; margin-top: 20px; margin-bottom: 20px; margin-left: auto; margin-right: auto; } .ptx-content img:not(.cs) { max-width: 650px; } .ptx-content .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } .ptx-content figure img { display: block; margin-left: auto; margin-right: auto; } .ptx-content figure img + img { margin-top: 30px; } .ptx-content div.center img { display: block; margin-left: auto; margin-right: auto; } .ptx-content div.center + div.center > img { margin-top: 60px; } .ptx-content div.center > img + img { margin-top: 60px; } .ptx-content figure table { margin-left: auto; margin-right: auto; } .ptx-content .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .ptx-content figure.wrap img { width: 250px; } .ptx-content figure.wrap { float: right; margin-right: 0; margin-left: 30px; } .ptx-content figure img.wrap { float: right; margin: 0; } .ptx-content figure figcaption.wrap { margin: 10px; font-size: 100%; text-align: center; } .ptx-content figure, .ptx-content .image-box { margin-top: 0.5em; } .ptx-content figure.listing { margin-top: 1em; } .ptx-content figure .image-box { margin-top: 0; } .ptx-content .sidebyside figure { margin-top: 0; } .ptx-content .image-box img, .ptx-content img.contained, .ptx-content .sbspanel img { width: 100%; height: auto; } .ptx-content .image-box > img:not(.draw_on_me):not(.mag_popup) { cursor: zoom-in; } .ptx-content img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; max-width: 600px; } .ptx-content .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .ptx-content .image-box, .ptx-content .audio-box, .ptx-content .video-box, .ptx-content .asymptote-box { position: relative; } .ptx-content .image-box .asymptote-box iframe.asymptote, .ptx-content iframe.asymptote, .ptx-content .video-box .video, .ptx-content .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .ptx-content section > .audio-box, .ptx-content section > .video-box, .ptx-content section > .image-box { margin-top: 0.75em; } .ptx-content .audio { width: 100%; } .caption .heading { font-weight: bold; } .caption .counter { font-weight: bold; } .ptx-content div.quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .minipage + .minipage { display: inline-block; } .ptx-content code.inline { background: none; border: none; } .ptx-content pre.program, .ptx-content pre.program code, .ptx-content pre.code-block, .ptx-content pre.code-block code { line-height: 1.1; } .ptx-content section > .code-box, .ptx-content .para + .code-box, .ptx-content section > .code-block, .ptx-content .para + .code-block { margin-top: 1em; } .ptx-content pre.program, .ptx-content pre.code-block { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.program:before, .ptx-content pre.code-block:before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } .ptx-content pre[data-line].program, .ptx-content pre[data-line].code-block { padding-left: 2.5em; } .ptx-content pre[data-line].program:before, .ptx-content pre[data-line].code-block:before { margin-left: -5em; } .ptx-content pre.program.line-numbers, .ptx-content pre.code-block.line-numbers { padding-left: 3.5em; overflow: visible; } .ptx-content pre.program.line-numbers:before, .ptx-content pre.code-block.line-numbers:before { margin-left: -7em; } .ptx-content pre[data-line].line-numbers code { padding-top: 0em; } .ptx-content pre[data-line].line-numbers .line-highlight { margin-top: 0em; } .ptx-content pre[data-line]:not(.line-numbers) .line-highlight { margin-top: 0.6em; } .ptx-content pre.prettyprint, .ptx-content pre.plainprint { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.prettyprint:before, .ptx-content pre.plainprint:before { content: ""; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 2.5em; } .ptx-content .objectives { margin-bottom: 1.25em; } .ptx-content ol > li { padding-left: 0.25em; } .ptx-content ol.cols2 > li, .ptx-content ul.cols2 > li { width: calc(49% - 1.75em); min-width: 190px; } .ptx-content ol.cols3 > li, .ptx-content ul.cols3 > li { width: calc(33% - 1.25em); min-width: 160px; } .ptx-content ol.cols4 > li, .ptx-content ul.cols4 > li { width: calc(24.5% - 1.25em); min-width: 100px; } .ptx-content ol.cols5 > li, .ptx-content ul.cols5 > li { width: calc(19.5% - 0.75em); min-width: 90px; } .ptx-content ol.cols6 > li, .ptx-content ul.cols6 > li { width: calc(16.3% - 0.5em); min-width: 80px; } .ptx-content ul.cols2 > li:nth-child(odd), .ptx-content ol.cols2 > li:nth-child(odd) { margin-right: 2em; } .ptx-content .cols2 ol, .ptx-content .cols3 ol, .ptx-content .cols4 ol, .ptx-content .cols5 ol, .ptx-content .cols6 ol { padding-left: 0.7em; } .ptx-content .exercisegroup-exercises > article.exercise-like { margin-top: 1em; } .ptx-content .cols2 > li:last-child:nth-child(odd) { float: none !important; padding-top: 0.5em; } .ptx-content .solution ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .solution ol li > .para:first-child, .ptx-content .solution ol li > .displaymath:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .solution ol li > .displaymath:first-child .MJXc-display { margin-top: 0; } .ptx-content .exercise-like ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .exercise-like > .cols2 > li { width: calc(49% - 2.5em); } .ptx-content .exercise-like > .cols3 > li { width: calc(33% - 2.5em); } .ptx-content .exercise-like > .cols4 > li { width: calc(24.5% - 2.5em); } .ptx-content .exercise-like > .cols5 > li { width: calc(19.5% - 2.5em); } .ptx-content .exercise-like > .cols6 > li { width: calc(16.3% - 2.5em); } .ptx-content .knowl .exercise-like > .cols2 > li { width: calc(49% - 2em); } .ptx-content .knowl .exercise-like > .cols3 > li { width: calc(33% - 2em); } .ptx-content .knowl .exercise-like > .cols4 > li { width: calc(24.5% - 2em); } .ptx-content .knowl .exercise-like > .cols5 > li { width: calc(19.5% - 2em); } .ptx-content .knowl .exercise-like > .cols6 > li { width: calc(16.3% - 2em); } .ptx-content .exercise-like ol li > .para:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .contributor .contributor-name { font-variant: small-caps; } .ptx-content .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .ptx-content .contributor { margin-top: 3ex; } .ptx-content .contributor + .contributor { margin-top: 1.5ex; } .ptx-content .contributor + .para { margin-top: 3ex; } .ptx-content .frontmatter .contributors, .ptx-content .book .contributors { text-align: center; font-style: normal; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .searchwrapper .gsc-control-cse { padding: 0; border: none; width: 25ex; } .pretext .searchwrapper .cse .gsc-search-button input.gsc-search-button-v2, .searchwrapper input.gsc-search-button-v2 { padding: 2px 2px; } .pretext .searchwrapper form.gsc-search-box { margin: 0; } .pretext .searchwrapper table.gsc-search-box { margin: 0; } .pretext .searchwrapper .gsc-search-box-tools .gsc-search-box .gsc-input { padding: 0; } .pretext .searchwrapper .gsib_a { padding: 0 0 0 5px; } .pretext .searchwrapper .gsc-input-box { height: 3ex; } .pretext .searchwrapper form.gsc-search-box { font-size: 12px; } .ptx-content div.CodeMirror span.CodeMirror-matchingbracket { color: #090; } .ptx-content .image-archive { margin-left: auto; margin-right: auto; margin-bottom: 0; margin-top: 0.75em; padding-bottom: 0.25em; text-align: center; } .ptx-content .image-archive > a { display: inline-block; padding-left: 0.5em; padding-right: 0.5em; font-family: monospace; } .ptx-content iframe { margin: 0; border: none; box-sizing: border-box; } .ptx-content .times-sign { font-size: larger; vertical-align: -0.15ex; } .ptx-content article.notranslate { margin-top: 0; } .ptx-content article.exercise-like > .exercise-like { margin-left: 40px; } .ptx-content article.exercise-like > .exercise-like.task { margin-left: 20px; } .ptx-content article.exercise-like > .exercise-like > .para { margin-top: 1.25em; } .ptx-content article.example-like > .heading + .introduction { display: inline; } .ptx-content article.example-like > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article.example-like > .exercise-like > .para { margin-top: 1.25em; } .ptx-content .taxon { font-style: italic; } .ptx-content .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .ptx-content .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .ptx-content .sageanswer .output { display: inline-block; vertical-align: top; } .ptx-content .CodeMirror-code pre.CodeMirror-line { padding-bottom: 5px; padding-left: 6px; } .ptx-content .hidden-content, .pretext .hidden-content { display: none; } .ptx-content hr.ptx-pagebreak { width: 30em; text-align: center; margin-left: auto; margin-right: auto; margin-bottom: 2em; margin-top: 0; height: 4em; border: 0; border-bottom: 1px dashed #ccc; } .ptx-content hr.ptx-pagebreak:after { content: "page"; display: inline-block; position: relative; top: 4em; font-size: 80%; padding: 0 0.25em; background: white; } .ptx-content .example-like > .exercise-like > .para:first-of-type { display: inline; } .ptx-content .example-like > .exercise-like > .aside-like { margin-top: -3em; } .ptx-content .example-like > .exercise-like > .aside-like.front { margin-top: 0; } .ptx-content meta { display: none; } .ptx-content .summary-links a { color: #671d12; background: #f0f0f0; text-decoration: none; cursor: pointer; } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: white; background: #671d12; } .ptx-content .summary-links a .codenumber { color: #303030; margin-right: 0.41667em; } .ptx-content .summary-links a:hover .codenumber, .ptx-content .summary-links a:focus .codenumber { color: #f0f0f0; } .ptx-content .summary-links { margin-top: 4em; } .ptx-content section + .summary-links { margin-top: 2em; } .ptx-content .summary-links ul { list-style-type: none; } .ptx-content .summary-links li { margin-top: 0; } .ptx-content section .summary-links li .title { font-style: normal; } .ptx-content .summary-links a { position: relative; display: block; font-size: 1.5em; line-height: 1.25em; padding: 0.41667em 0.83333em; margin-top: 0.20833em; border-radius: 3px; padding-right: 2.06667em; } .ptx-content .summary-links a:after { right: 0.83333em; } .ptx-content .summary-links a:after { content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid #c9c9c9; } .ptx-content .summary-links a, .ptx-content .summary-links a:link, .ptx-content .summary-links a:visited { cursor: pointer; } .ptx-content .summary-links a:hover:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a { font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-content .summary-links a { font-size: 1em; line-height: 1.25em; } } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a:active { position: relative; color: white; background: #932919; text-decoration: none; box-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px 5px inset; } .ptx-content .summary-links a:active:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a:focus { outline: thin dotted #333; outline-offset: -2px; } body.standalone.worksheet .ptx-content .onepage > .heading { margin-top: 0; font-size: 1.3em; } body.standalone.worksheet .ptx-content .onepage > .introduction { margin-top: 0.4em; } body.standalone.worksheet .ptx-content .onepage > .introduction > .heading { font-size: 1.1em; } body.standalone.worksheet .ptx-content .onepage .solutions, body.standalone.worksheet .ptx-content .onepage .instructions { display: none; } body.standalone .ptx-content .worksheet { padding: 40px 0 45px 0; border: 2px solid grey; margin: 0; } body.standalone .ptx-content .onepage { padding: 40px 45px 45px 55px; border-bottom: 2px solid grey; margin: 0; } body.standalone .ptx-content .onepage + .onepage { border-top: 2px solid grey; } body.standalone .ptx-content .onepage.firstpage { padding-top: 0; } body.standalone .ptx-content .onepage.lastpage { padding-bottom: 0; border-bottom: none; } body.standalone .ptx-content .worksheet > *:last-child { padding-bottom: 0 !important; } .ptx-content .onepage + .onepage { margin-top: 2.5em; padding-top: 1.5em; border-top: 1px dashed #aaa; } .ptx-content .onepage + .onepage::before { content: "pagebreak"; text-align: center; margin-left: 40%; padding-left: 1em; padding-right: 1em; position: absolute; top: -0.8em; font-size: 80%; font-style: italic; background: white; } body.standalone .ptx-content .onepage + .onepage { margin-top: 10px; } body.standalone .ptx-content .onepage + .onepage::before { content: none; } body.standalone .ptx-content .onepage article { padding-left: 0; border: none; } body.standalone .ptx-content .onepage article::after { all: unset; } .ptx-content .onepage > .para:first-child, .ptx-content .onepage > article:first-child { margin-top: 0; } .ptx-content section + .onepage.firstpage, .ptx-content article + .onepage.firstpage, .ptx-content .para + .onepage.firstpage { margin-top: 1.25em; } body.worksheet .ptx-content .onepage .sbspanel + .sbspanel > .exercise::before { content: ""; position: absolute; top: 0; bottom: 0; right: 0; left: 0; padding-left: 1.25em; border-left: 1px solid grey; margin-left: -1.25em; z-index: -100; } body.standalone.worksheet .ptx-content section article.task { margin-left: 0; } body.standalone.worksheet .ptx-content section article.task > .heading { font-weight: normal; } body.standalone .autopermalink { display: none; } body.standalone.worksheet .ptx-content .onepage .workspace { border: 2px dotted grey; background: #f3fff3; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed { border: 2px dotted grey; background: #ffe; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed.tight { border: 15px solid; border-image: repeating-linear-gradient( -35deg, #f33, #f33 10px, #000 10px, #000 20px) 20; background: yellow; } body.has-sidebar-left.mathbook-loaded.standalone.worksheet .ptx-page .ptx-main { margin-left: 0; } body.standalone.worksheet .ptx-content .goal-like { border: none; padding: 0; } body.standalone.worksheet .ptx-content .goal-like > .heading { margin-top: -0.5em; padding: 0; margin: 0; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading { display: inline; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading, body.standalone.worksheet .ptx-content section.worksheet > .objectives, body.standalone.worksheet .ptx-content section.worksheet > .introduction, body.standalone.worksheet .ptx-content section.worksheet > .conclusion { margin-left: 55px; margin-right: 40px; } body.standalone.worksheet .ptx-content section.worksheet > .heading + .para { display: inline; } .ui-dialog.ui-widget.ui-widget-content.ui-corner-all.ui-draggable.ui-resizable { left: 0 !important; top: 0 !important; } .ptx-content a.url, .ptx-content a.external { color: #22a; } .ptx-content a.url:hover, .ptx-content a.external:hover { background: #ffd; } .ptx-content .poem { margin-top: 1.5em; } .ptx-content .poem { display: table; margin-top: 1.5em; margin-left: auto; margin-right: auto; margin-bottom: 0; width: auto; max-width: 90%; } .ptx-content .poem > .heading { display: block; text-align: center; } .ptx-content section article.poem > .heading::after { content: ""; } .ptx-content .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .ptx-content .poem .author { font-style: italic; margin-top: 0.75em; } .ptx-content .poem .author.left { text-align: left; } .ptx-content .poem .author.center { text-align: center; } .ptx-content .poem .author.right { text-align: right; } .ptx-content .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .ptx-content .poem .stanza + .stanza { margin-top: 1em; } .ptx-content .poem .heading + .stanza { margin-top: 0.2em; } .ptx-content .poem .heading + .line { margin-top: 0.2em; } .ptx-content .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .ptx-content .poem .line.center { text-align: center; } .ptx-content .poem .line.right { text-align: right; } .ptx-content .poem .tab { margin-left: 2em; } .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } .toolBPanel { overflow: hidden !important; } .toolBPanel:hover { overflow: auto !important; } #aboelkins-ACS .ptx-main .ptx-content > section:first-of-type > section:first-of-type > .project-like:first-of-type li { font-size: 300%; } .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } .ptx-content .marginresource { position: relative; height: 0; left: 40em; top: 1em; } .ptx-content .marginresource a { color: blue; } .ptx-content .marginresource a[knowl] { border-bottom: 1px dotted blue; } .ptx-content .marginresource .icon { font-size: 200%; margin-right: 1em; display: inline-block; } .ptx-content .marginresource .resource_description { display: inline-block; } .ptx-content .marginresource .resource_links { display: block; margin-left: 2em; } .collectedworks .knowl-output { border: 12px solid #D6E3FF; background: none repeat scroll 0% 0% #FAFCFF; border-radius: 4px; margin-bottom: 1.25em; } .collectedworks .subjectwork { max-width: 750px; } .collectedworks .bib { margin-bottom: 1em; } .collectedworks .bibitem + .bibentry { display: inline; } .collectedworks .bibitem { display: inline; font-weight: bold; margin-right: 1em; } .collectedworks .work .title a { text-decoration: none; color: #009; } .iconlegend { position: absolute; margin-top: 0.5em; top: 0; left: 920px; line-height: 1; } .iconlegend .icon_name { font-size: 90%; margin-right: 1em; } .icongroup + .icongroup { margin-left: 1em; } label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } .feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .ptx-content .webwork-button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; background-color: #ffffff; } .ptx-content .webwork-button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .webwork-button:active { cursor: pointer; background-color: #a0a0a0; border: 1px solid #999; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } .ptx-content .exercise-wrapper form button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; color: black; background-color: #ffffff; } .ptx-content .webwork-button.activate { width: 22px; height: 22px; background-image: url(https://raw.githubusercontent.com/openwebwork/webwork2/main/htdocs/images/favicon.ico); background-size: contain; position: absolute; right: -35px; } article.project-like > .heading + div.ptx-runestone-container > div.runestone, article.exercise-like > .heading + div.ptx-runestone-container > div.runestone { margin-top: 0.5em; } .ptx-content .bottom { position: unset; } .ptx-content .rsdraggable { font-size: 100%; } .ptx-content .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .exercise-wrapper form button:active { background-color: #f0f0f0; } .ptx-content .exercise-wrapper form button + button { margin-left: 0.8em; } .ptx-content .exercise-wrapper, .ptx-content .exercise-wrapper form, .ptx-content .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .ptx-content .knowl .exercise-wrapper, .ptx-content .knowl .exercise-wrapper form, .ptx-content .knowl .exercise-wrapper form > div:first-child { width: 100%; } .ptx-content .exercise-wrapper > .para:first-child, .ptx-content .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .ptx-content .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .ptx-content .cols2 .heading + .exercise-wrapper { width: auto; } @media screen and (max-width: 600px) { .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(33.3% - 2em); } .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } @media screen and (max-width: 850px) and (min-width: 786px) { .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(33.3% - 2em); } .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } .APEXlogo { white-space: nowrap; } .APEXlogo .A { margin-right: -0.07em; } .APEXlogo .P { margin-right: -0.33em; position: relative; top: -0.3em; } .APEXlogo .E { position: relative; top: 0.33em; } .runestone-profile .dropdown-content { position: absolute; display: none; right: 0; top: 35px; text-align: left; border: 1px solid; border-color: #600; border-color: var(--tocborder); } .runestone-profile.dropdown:hover { background-color: #ddd; overflow: visible; } .runestone-profile.dropdown:hover .dropdown-content { display: block; } .runestone-profile .dropdown-content { background-color: white; z-index: 1800; min-width: 100px; padding: 5px; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: #662211; padding: 2px 8px; } .runestone-profile.dropdown .dropdown-content a:hover { background-color: #671d12; color: #ffffff; text-decoration: none; background-color: var(--chaptertoc); } .runestone-profile.dropdown .dropdown-content hr { margin-bottom: 4px; margin-top: 4px; border-color: #600; border-color: var(--sectiontoctext); } .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox { } .ptxsearch { height: 35px; flex: 1 1; } .searchbutton .name { display: none; } .searchwidget { text-align: right; } .searchwidget input { } .helpbox { display: none; } .detailed_result { margin-bottom: 10px; } .all_results a:link { text-decoration: none; font-size: large; } .all_results a:hover { background-color: lightgray; } .searchresults a:hover { background-color: #eee; } .searchresults a { text-decoration: none; color: #222; } .searchresults a:hover { text-decoration: underline; color: #33f; } .searchresults ul li { list-style-type: none; } ol.searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; } ol.searchresults > li { list-style-type: none; } .search-result-score { display: none; } .high_result { font-weight: 700; } .medium_result { font-weight: 500; } .low_result { font-weight: 200; } .no_result { font-weight: 200; color: #444; } .detailed_result .no_result { font-size: 90%; } .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; left: 152px; width: 600px; padding: 1em; border: 0.2em solid #009; background: aliceblue; z-index: 5000; display: flex; flex-direction: column; } .search-results-heading { border-bottom: 1px solid rgba(0, 0, 125, 0.5); } .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; } .closesearchresults { display: flex; justify-content: space-between; align-items: center; border: 1px solid black; } .closesearchresults:hover { color: #c00; background-color: #fee; border-color: #f00; } .closesearchresults + h2 { margin-top: -1em; } .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .search-result-bullet { margin-top: 0.3em; } .search-result-clip { font-size: 80%; font-style: italic; color: #444; padding-left: 15px; } .search-results-unshown-count { margin-top: 0.6em; } .search-result-clip-highlight { background: rgba(255, 255, 0, 0.5); } @media screen and (max-width: 800px) { .searchresultsplaceholder { width: 80vw; left: 10vw; bottom: 10vh; } } .pretext .ptx-page > .ptx-main { margin-left: unset; } .ptx-masthead .logo-link img { width: unset; height: unset; max-height: unset; } .ptx-masthead .logo-link { font-size: unset; text-align: unset; line-height: unset; } .pretext .ptx-masthead { position: unset; background: unset; min-height: unset; border: unset; position: unset; z-index: unset; } .ptx-content-footer .previous-button .name { margin-left: unset; padding-right: unset; } .pretext .ptx-content-footer .name { position: relative; bottom: 0; } .pretext .ptx-content-footer .button.previous-button, .pretext .ptx-content-footer .button.next-button { font-size: 0.8em; margin-top: 1.5em; padding: 0.4em; } .pretext .ptx-content-footer .top-button .icon, .pretext .ptx-content-footer .top-button .name { display: unset; } .pretext .ptx-content-footer .previous-button .icon { margin-left: unset; margin-right: unset; } .pretext .ptx-content-footer .button { text-align: unset; padding: 0; display: flex; align-items: center; justify-content: center; height: 35px; min-width: 85px; } body.pretext { max-width: 904px; margin: 0 auto 0 auto; padding: 0; box-sizing: border-box; } .pretext .ptx-masthead { border: 2px solid #ddd; border-bottom: none; border-top-left-radius: 5px; border-top-right-radius: 5px; } .pretext .ptx-masthead { position: relative; background: #fafafa; min-height: inherit; box-shadow: none; } .pretext .ptx-masthead { max-width: 904px; border-right: 1px solid #bababa; } @media only screen and (min-width: 600px) { .ptx-masthead { z-index: 100; } } .ptx-masthead .searchbox { bottom: 2px; margin-right: -19px; } .ptx-page { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 1em; min-height: 100vh; display: grid; grid-template-columns: auto 1fr auto; grid-template-rows: auto; grid-template-areas: "toc main-content" "toc content-footer"; } .ptx-content { min-height: 50vh; } .ptx-sidebar { position: sticky; top: 34px; background-color: #f1f1f1; box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); width: 240px; max-height: 100vh; height: 100vh; grid-area: toc; grid-column-start: 1; grid-column-end: 2; grid-row-start: 1; grid-row-end: 3; border: 2px solid var(--bluegreen); border-radius: 5px; z-index: 1; } .ptx-page > .ptx-main { grid-area: main-content; grid-column-start: 2; grid-column-end: 3; grid-row-start: 1; grid-row-end: 2; justify-self: start; max-width: 664px; width: 97vw; transition: 0s; padding: 0; margin: 0; z-index: 0; } @media only screen and (min-width: 500px) { .ptx-page > .ptx-main { margin: 0; max-width: 664px; width: min(100vw, 664px); justify-self: center; } } .ptx-page > .ptx-main > .ptx-content { margin-left: 2em; } .pretext .ptx-page .ptx-content-footer { display: grid; max-width: 100%; grid-template-columns: 1fr 1fr 1fr; grid-template-areas: "content-footer-prev content-footer-top content-footer-next"; margin-left: 32px; margin-top: 30px; } .ptx-content-footer .previous-button { grid-area: content-footer-prev; justify-self: start; align-self: center; margin: 20px; padding: 5px; display: inline-block; height: 32px; color: var(--bodytitle); font-family: inherit; text-align: center; font-size: 0.8em; font-weight: 700; letter-spacing: 0.1rem; text-transform: uppercase; text-decoration: none; white-space: nowrap; background-color: #eee; border-radius: 4px; border: 1px solid #888; cursor: pointer; box-sizing: border-box; } .ptx-content-footer .previous-button:hover { background-color: #fafafa; color: #888; } .ptx-content-footer .previous-button .name { margin-left: 2px; padding-right: 5px; } .ptx-content-footer .previous-button .icon { padding-left: 5px; } .ptx-content-footer .top-button { grid-area: content-footer-top; justify-self: center; align-self: center; margin: 20px; padding: 5px; display: inline-block; height: 32px; color: var(--bodytitle); font-family: inherit; text-align: center; font-size: 0.8em; font-weight: 700; letter-spacing: 0.1rem; text-transform: uppercase; text-decoration: none; white-space: nowrap; background-color: #eee; border-radius: 4px; border: 1px solid #888; cursor: pointer; box-sizing: border-box; } .ptx-content-footer .top-button:hover { background-color: #fafafa; color: #888; } .ptx-content-footer .top-button .name { margin-left: 2px; padding-right: 5px; } .ptx-content-footer .top-button .icon { padding-left: 5px; } .ptx-content-footer .next-button { grid-area: content-footer-next; justify-self: end; align-self: center; margin: 20px; padding: 5px; display: inline-block; height: 32px; color: var(--bodytitle); font-family: inherit; text-align: center; font-size: 0.8em; font-weight: 700; letter-spacing: 0.1rem; text-transform: uppercase; text-decoration: none; white-space: nowrap; background-color: #eee; border-radius: 4px; border: 1px solid #888; cursor: pointer; box-sizing: border-box; } .ptx-content-footer .next-button:hover { background-color: #fafafa; color: #888; } .ptx-content-footer .next-button .name { margin-right: 2px; padding-left: 5px; } .ptx-content-footer .next-button .icon { padding-right: 5px; } .pretext .ptx-sidebar.visible { display: block; } @media only screen and (max-width: 800px) { .pretext .ptx-sidebar { display: none; } .pretext .ptx-navbar { position: fixed; top: auto; bottom: 0; z-index: 1100; } .pretext .ptx-sidebar { display: none; position: fixed; top: 10px; z-index: 1000; background: white; } } .pretext .ptx-page-footer .feedback-link { cursor: pointer; text-align: center; color: #333333; background-color: #ededed; border: 1px solid #bababa; margin: 1.5em 0 0 0; padding: 0 1em 0 1em; height: 2em; display: flex; align-items: center; } .pretext .ptx-page-footer { background: #f4f4f4; margin-top: 2em; padding-top: 0; max-width: 900px; border-top: 2px solid var(--sectiontoctext); border-bottom: 2px solid var(--sectiontoctext); display: flex; flex-direction: row; justify-content: space-around; position: relative; } .pretext .ptx-page-footer > a { margin: 1em 0; } .pretext .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } .ptx-masthead .title-container > .heading { line-height: unset; } .ptx-masthead .byline { margin: unset; font-size: unset; line-height: unset; font-family: unset; } .ptx-masthead .ptx-banner { border-top: 1px solid transparent; border-bottom: none; overflow: hidden; padding-top: 0.625em; padding-bottom: 1.125em; } .ptx-content .summary-links a { display: block; padding: 0.6em; text-decoration: none; font-family: "Open Sans", sans-serif; font-size: 1em; font-weight: 600; border-radius: 5px; } .ptx-content .summary-links a .codenumber { color: var(--bluegreen); } .ptx-content .summary-links a .title { font-weight: 600; } .ptx-content .summary-links a:hover { color: #fff; background: var(--bluegreen); } .ptx-content .summary-links ul, .ptx-content .summary-links ul li { display: grid; list-style-type: none; min-width: 300px; padding-inline-start: 0px; font-family: "Open Sans", sans-serif; justify-items: stretch; margin: 2px auto 3px auto; } .ptx-content .summary-links > ul { } @media screen and (min-width: 600px) { .ptx-content .summary-links ul, .ptx-content .summary-links ul li { width: 60vw; max-width: 500px; } } @media screen and (min-width: 700px) { .ptx-content .summary-links ul, .ptx-content .summary-links ul li { width: 55vw; max-width: 500px; } } @media screen and (min-width: 800px) { .ptx-content .summary-links ul, .ptx-content .summary-links ul li { width: 49vw; max-width: 500px; } } .ptx-masthead .title-container { font-size: 1em; padding-left: 9.68px; overflow: hidden; } @media screen and (max-width: 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; } } .ptx-masthead .title-container > .heading { margin: 0; font-size: 2em; } .ptx-masthead .title-container > .heading.hide-type .type { display: none; } .ptx-masthead .title-container > .heading.hide-codenumber .codenumber { display: none; } .ptx-masthead .title-container > .heading.hide-title .title { display: none; } .ptx-masthead .title-container > .heading .subtitle { font-weight: normal; } @media screen and (max-width: 800px) { .ptx-masthead .title-container > .heading .subtitle { display: block; color: #595959; } .ptx-masthead .title-container > .heading .subtitle:before { content: normal; } } .ptx-masthead .byline { color: #333333; font-size: 1.2em; font-weight: normal; margin: 0; min-height: inherit; } @media screen and (max-width: 480px) { .ptx-masthead .byline { margin-top: 0; font-size: 1em; line-height: 1.25em; } } .ptx-masthead .byline a { color: #333333; } .ptx-masthead .byline a:active { color: #3572a0; } .ptx-masthead .ptx-banner .title-container .heading { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } .ptx-masthead .ptx-banner { max-width: 904px; display: grid; grid-gap: 1em; grid-template-columns: 50px 1fr; grid-template-areas: "ptx-logobox ptx-title-byline-box"; background-color: #fff; padding: 0px 20px 0px 20px; } .title-container .title { color: var(--bodytitle); } .title-container .subtitle { color: var(--bodysubtitle); } .title-container { margin-top: 0px; } .title-container .title { font-size: 0.6em; font-weight: 600; } .title-container .subtitle { font-weight: normal; font-size: 0.5em; } @media (min-width: 400px) { .title-container { margin-top: 0px; } .title-container .title { font-size: 0.7em; font-weight: 600; } .title-container .subtitle { font-weight: normal; font-size: 0.6em; } } @media (min-width: 550px) { .title-container { margin-top: 3px; } .title-container .title { font-size: 0.9em; font-weight: 600; } .title-container .subtitle { font-weight: normal; font-size: 0.7em; } } @media (min-width: 801px) { .title-container { margin-top: 5px; } .title-container .title { font-size: 1em; font-weight: 600; } .title-container .subtitle { font-weight: normal; font-size: 0.8em; } } .logo-link { grid-area: ptx-logobox; color: #000; padding: 15px 0px 0px 0px; justify-self: stretch; } .ptx-masthead .logo-link img { width: 50px; } .title-container { grid-area: ptx-title-byline-box; color: #000; padding: 0px 0px 0px 0px; justify-self: stretch; } .searchbox { grid-area: ptx-searchbox; } .ptx-navbar .treebuttons .next-button, .ptx-navbar .treebuttons .up-button, .ptx-navbar .treebuttons .previous-button { float: unset; } .ptx-navbar .previous-button, .ptx-navbar .up-button, .ptx-navbar .next-button, .ptx-navbar .index-button, .ptx-navbar .calculator-toggle, .ptx-navbar .toc-toggle { width: unset; } .ptx-navbar .calculator-toggle { margin-left: unset; margin-right: unset; } .ptx-navbar .index-button .name { padding-top: unset; } .ptx-navbar-contents { display: flex; flex: 1; max-width: 100%; } .ptx-navbar .nav-other-controls { margin-left: 1em; } .ptx-navbar .treebuttons { display: flex; justify-content: right; } .ptx-navbar .button { padding: 0 10px 0 10px; } .ptx-navbar .treebuttons .button { display: flex; justify-content: center; align-items: center; } .ptx-navbar .treebuttons .previous-button { padding-left: 0px; } .ptx-navbar .treebuttons .next-button { padding-right: 0px; } .ptx-navbar .nav-runestone-controls { display: flex; } nav.ptx-navbar { display: grid; grid-column-gap: 0em; grid-template-columns: auto auto auto 1fr 1fr auto; grid-template-areas: "MH-toc-area MH-extras-area1 ptx-searchbox MH-extras-area2 MH-page-navigation-area MH-preferences-area"; background-color: #fff; align-items: start; border: 2px solid #ddd; border-top: none; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; z-index: 20; position: sticky; top: 0; align-items: end; min-height: unset; margin-bottom: 0; } nav.ptx-navbar::before, nav.ptx-navbar::after { content: none; } .toc-toggle { display: inline-block; height: 32px; color: #333; font-family: inherit; text-align: center; font-size: 0.8em; font-weight: 600; line-height: 32px; letter-spacing: 0.1rem; text-transform: uppercase; text-decoration: none; white-space: nowrap; background-color: #eee; border-radius: 4px; border: 1px solid #888; cursor: pointer; box-sizing: border-box; margin-right: 2em; } .toc-toggle:hover { background-color: #fafafa; color: black; } .toc-toggle { grid-area: MH-toc-area; justify-self: start; } .index-button { grid-area: MH-extras-area1; justify-self: right; } .calculator-toggle { grid-area: MH-extras-area2; justify-self: left; } .user-preferences-button { justify-self: left; } .treebuttons { grid-area: MH-page-navigation-area; justify-self: end; display: flex; width: 100%; } .nav-runestone-controls { grid-area: MH-preferences-area; justify-self: end; display: flex; padding-left: 4em; } .ptx-navbar .button { display: inline-block; height: 32px; color: var(--bodytitle); font-family: inherit; text-align: center; font-size: 0.8em; font-weight: 600; line-height: 32px; letter-spacing: 0.1rem; text-transform: uppercase; text-decoration: none; white-space: nowrap; background-color: #eee; border-radius: 4px; border: 1px solid #888; cursor: pointer; box-sizing: border-box; } .ptx-navbar .searchbutton { display: flex; align-items: center; justify-content: center; } .searchresultsplaceholder { left: calc(50vw - 300px); } @media only screen and (max-width: 800px) { .pretext .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; padding: 0; background: #ededed; grid-template-columns: auto auto auto auto 1fr auto; align-items: end; } .ptx-navbar .toc-toggle { padding: 0 40px; } .ptx-navbar .nav-runestone-controls { padding-left: 0; } .ptx-navbar .treebuttons { justify-content: center; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button) .name { display: none; } .pretext .ptx-navbar :is(.calculator-toggle, .index-button) .icon { display: inline-block; } .searchresultsplaceholder { left: 10vw; } } .ptx-navbar .button:hover { background-color: #fafafa; color: #888; } .ptx-navbar .button:focus { outline: thin dotted #333; outline-offset: -2px; } .ptx-navbar .button:active { background-color: #e0e0e0; } .ptx-navbar .button.disabled { opacity: 0.4; color: #333333; background: #ededed; cursor: default; box-shadow: none; } .ptx-navbar .toc-toggle .icon { font-size: 1.5em; position: relative; bottom: -0.1em; padding-left: 0; padding-right: 0.4em; } .ptx-navbar .toc-toggle .name { font-size: 1em; } .ptx-navbar .index-button .name { } .ptx-navbar .index-button .icon { display: none; } .ptx-navbar .calculator-toggle .name { } .ptx-navbar .calculator-toggle .icon { display: none; } .ptx-navbar .runestone-profile .name { display: none; } .ptx-navbar .activecode-toggle .name { display: none; } .pretext .ptx-navbar .dropdown { height: 32px; } .ptx-navbar .up-button { text-align: center; } .ptx-navbar .name { display: inline-block; } .ptx-navbar .searchbutton .name { display: none; position: relative; bottom: 0; } .ptx-navbar .icon { display: inline-block; font-size: 1.5em; } .ptx-navbar .previous-button .icon { margin-left: 0.3em; margin-right: 0.2em; } .ptx-navbar .up-button .icon { margin-left: 0; margin-right: 0.2em; } .ptx-navbar .next-button .icon { margin-left: 0.2em; margin-right: 0.3em; } .ptx-navbar .user-preferences-button { padding: 0 0.8em 0 0.8em; margin-left: 2em; border: 1px solid #bababa; width: 6em; } @media screen and (max-width: 800px) { .ptx-navbar .toc-toggle .name, .ptx-navbar .previous-button .name, .ptx-navbar .up-button .name, .ptx-navbar .up-button .disabled .name, .ptx-navbar .next-button .name { display: none; } .ptx-navbar .toc-toggle { margin: 0; } .ptx-navbar .calculator-toggle .icon { padding-top: 5px; } } .ptx-toc > ul.structural > li:not(:first-child) { margin-top: 0; } .ptx-toc ul.structural li a { border-bottom: 0; } .ptx-toc ul.structural li li a { border-bottom: none; } .ptx-toc ul.structural .toc-title-box { border-top: solid #999 1px; } .ptx-toc ul.structural li ul.structural li:last-child { margin-bottom: 0; } .ptx-toc { width: 240px; margin: 0; font-size: 14.72px; overflow-y: auto; overflow-x: hidden; background: #fff; } .ptx-toc ul { margin: 0px; padding: 0px; } .ptx-toc ul a, .ptx-toc ul .part a, .ptx-toc ul .frontmatter a { font-weight: 700; font-size: 0.9em; } .ptx-toc ul ul li a { font-weight: 400; grid-template-columns: 1.5em 1fr; } .ptx-toc .toc-chapter .toc-item-list .toc-item .codenumber { font-size: 80%; padding-top: 0.16em; } .ptx-toc .toc-section .toc-item-list .toc-item a > .codenumber { display: none; } .ptx-toc .toc-section .toc-item-list .toc-item a:hover > .codenumber { display: inline-block; } .ptx-toc ul ul a > .title { margin-left: 0; } .ptx-toc ul ul a > .title:empty::after { content: "empty heading!"; font-weight: bold; } .ptx-toc ul ul ul a > .title { margin-left: 0.5em; font-size: 90%; } .ptx-toc ul ul ul ul a > .title { margin-left: 2em; font-size: 90%; font-style: italic; } .ptx-toc ul li a { text-decoration: none; } .ptx-toc > ul > li a { font-weight: bold; font-family: "PT Serif", "Times New Roman", Times, serif; padding-left: 0.2em; } .ptx-toc ul li a:active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-toc a { padding: 0.25em 0.5em 0.25em 0.5em; text-decoration: none; font-weight: 500; font-size: 0.9em; margin: 0px; } .ptx-toc ul, .ptx-toc ul li { list-style-type: none; margin: 0px; padding-inline-start: 0px; } .ptx-toc ul li a { display: grid; grid-gap: 3px; grid-template-columns: 1.25em 10fr; grid-template-areas: "toc-codenumber toc-content"; } .ptx-toc { position: sticky; top: 0; width: unset; height: 100vh; } .ptx-toc::after { content: url("data:image/svg+xml; utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='338 3000 8772 6866'%3E%3Cg style='stroke-width:.025in; stroke:black; fill:none'%3E%3Cpolyline points='472,3590 472,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,9448 A 4660 4660 0 0 1 8598 9259 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4488,9685 A 4228 4228 0 0 0 472 9732 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,3590 A 4241 4241 0 0 1 8598 3496 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,3496 A 4241 4241 0 0 1 4724 3590 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,9259 A 4507 4507 0 0 1 4724 9448 '%3E%3C/path%3E%3Cpolyline points='5385,4299 4062,8125 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8598,3496 8598,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='850,3496 850,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='4960,9685 4488,9685 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='3070,4582 1889,6141 3070,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='6418,4582 7600,6141 6418,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8976,3590 8976,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4960,9685 A 4228 4228 0 0 1 8976 9732 '%3E%3C/path%3E%3C/g%3E%3C/svg%3E"); display: block; height: 13em; padding: 2em 1em; background: #fff; } .ptx-toc > ul:first-child > li:last-child { border-bottom: 4px solid #669; } .ptx-toc a > .codenumber { font-family: "PT Serif", "Times New Roman", Times, serif; grid-area: toc-codenumber; } .ptx-toc a > .title { grid-area: toc-content; } .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.focused ul.structural:not(.contains-active) > li { display: none; } .ptx-toc.focused ul.structural li.active > ul > li { display: block; } .ptx-toc.focused ul.structural:not(.contains-active) > li.visible { display: block; } .ptx-toc.focused ul.structural li.active > ul > li.hidden { display: none; } .ptx-toc.focused > ul.structural > li:not(:first-child) { margin-top: 0em; } .ptx-toc.focused ul.structural li ul.structural a:hover { border: 0; } .toc-title-box { display: flex; } .ptx-toc ul.structural li .toc-title-box a { flex: 1 1; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 30px; line-height: 18px; font-variation-settings: "wght" 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--highlighttoc); color: var(--highlighttoctext); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--highlighttoctext); } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); } :root { --parttoc: var(--chaptertoc); --parttoctext: var(--chaptertoctext); --parttocactive: var(--documenttitle); --parttoctextactive: var(--chaptertoctextactive); } @supports (background: color-mix(in srgb, red 50%, blue)) { :root { --parttoc: color-mix(in srgb, var(--chaptertoc), black 15%); } } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowlLinkColor); border-bottom: 1px dotted var(--knowlLinkColor); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--linkbackground); border-bottom-color: transparent; } .knowl__content { margin: 0.2em; border: 6px solid var(--knowlborder); border-radius: 0.4em; padding: 0.8em; background-color: var(--knowlbackground); } .source-view__content { margin: 0.2em 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like, .proof)::after { content: "" !important; border-bottom: none; margin: 0; padding: 0; width: 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like) { padding-left: 0; border-left: none; } .ptx-content .knowl__content > article:is(.proof) { padding-right: 0; border-right: none; } .knowl__content .knowl__content { background-color: var(--knowlNested1Background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested2Background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested3Background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested4Background); } .ptx-content .knowl__content > figure { margin-left: 0; margin-right: 0; } .ptx-content .proof { border-right: 1px solid #666; padding-right: 0.625em; margin-right: -0.725em; } .ptx-content .proof:after { content: ""; border-bottom: 1px solid #666; display: block; margin-left: auto; margin-right: -0.625em; width: 1.5em; padding-bottom: 0.25em; } .ptx-content.epub .proof { margin-right: 1px; } .ptx-content .proof .proof { margin-right: -0.2em; border-right: 1.5px solid #ddd; } .ptx-content .proof .proof:after { border-bottom: 1.5px solid #ddd; width: 1em; } .ptx-content article.theorem-like, .ptx-content article.definition-like, .ptx-content article.example-like, .ptx-content article.project-like, .ptx-content article.remark-like, .ptx-content article.openproblem-like, .ptx-content article.openproblems-like, .ptx-content article.computation-like { padding-left: 0.4em; border-left: 1px solid #569; } .ptx-content.epub article.theorem-like, .ptx-content.epub article.definition-like, .ptx-content.epub article.example-like, .ptx-content.epub article.project-like, .ptx-content.epub article.remark-like, .ptx-content article.openproblem-like, .ptx-content article.openproblems-like, .ptx-content.epub article.computation-like { margin-left: 1px; } .ptx-content article.theorem-like::after, .ptx-content article.definition-like::after, .ptx-content article.example-like::after, .ptx-content article.project-like::after, .ptx-content article.remark-like::after, .ptx-content article.openproblem-like::after, .ptx-content article.openproblems-like::after, .ptx-content article.computation-like::after { content: ""; border-bottom: 1px solid #569; display: block; margin-right: auto; margin-left: -0.5em; padding-top: 0.25em; width: 1.5em; } .ptx-content article.project-like { border-left: 1px dotted #569; } .ptx-content article.project-like::after { border-bottom: 1px dotted #569; } .ptx-content article.commentary { padding-left: 0.6em; border-left: 3px solid #c33; } .ptx-content article.commentary::after { content: ""; border-bottom: 3px solid #c33; display: block; margin-right: auto; margin-left: -0.6em; padding-top: 0.25em; width: 1.5em; } .ptx-content .assemblage-like { border: solid 2px #1100AA; border-radius: 12px; padding: 10px; background-color: #f4f4fe; } .ptx-content .assemblage-like .heading { margin-top: 0; } .ptx-content .assemblage-like + .sidebyside { margin-top: 1.25em; } .ptx-content section article.assemblage-like .heading + .para { display: block; } .ptx-content .goal-like { border: solid 3px #999999; padding: 0.7em; margin-bottom: 1em; } .ptx-content .goal-like > .heading { margin-top: -1.5em; background-color: white; display: table; padding: 5px 1em; margin-left: 5px; font-style: italic; font-size: 120%; } .ptx-content .goal-like > .heading .codenumber { display: none; } .ptx-content .goal-like > .heading::after { display: none; } .ptx-content .aside-like { position: absolute; margin-left: 45%; overflow-x: hidden; max-width: 495px; max-height: 7em; overflow-y: hidden; border: none; padding: 4px 10px 0 10px; color: #888; z-index: 100; } .ptx-content .example-like .aside-like { margin-top: 0; position: absolute; } .ptx-content .aside-like { font-size: 90%; } .ptx-content .aside-like { margin-bottom: 5px; background-color: #f5faff; box-shadow: 0 0 1em 0.2em #fff inset; } .ptx-content .aside-like .para { overflow-x: auto; } .ptx-content .aside-like:first-child { margin-top: -2.25em; } .ptx-content .aside-like:after { content: ""; position: absolute; z-index: 1; top: 0em; bottom: 0; left: 0; pointer-events: none; background-image: linear-gradient( to bottom, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 1) 90%); width: 550px; height: 8em; } .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { position: relative; z-index: 0; padding: 8px 15px 10px 15px; padding: 2px 10px; margin: 5px 0px 5px 10px; border: 2px solid #dcebfa; max-height: none; max-width: 550px; color: inherit; font-size: 100%; box-shadow: none; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .example-like .aside-like.front { margin-top: 1.25em; } .ptx-content .aside-like.front + p { margin-top: 1.25em !important; padding-top: 0; } .ptx-content .aside-like .aside-like { background-color: #fafff5; border: 1px dotted #aaa; } .ptx-content article.aside-like > p:first-child { margin-top: 0; } .ptx-content .aside-like > .heading { font-size: 95%; } .ptx-content .aside-like + * { margin-top: 3em; margin-right: 3em; } @media screen and (min-width: 943px) { .ptx-content .aside-like + * { margin-right: 0; } } @media screen and (min-width: 1100px) { .ptx-content .aside-like, .ptx-content .aside-like.front, .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { position: absolute; margin-top: -2em; margin-left: 660px; max-width: 200px; width: 200px; color: inherit; } .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { max-height: none; max-width: 223px; border: 2px solid #dcebfa; } .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { margin-left: 654px; } .ptx-content .aside-like + * { margin-top: 1.25em; margin-right: 0; } .ptx-content .aside-like + .solutions, .ptx-content .aside-like + .instructions { margin-top: 0; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .aside-like:nth-of-type(3n+1) { margin-left: 660px; } .ptx-content .aside-like:nth-of-type(3n) { margin-left: 680px; } .ptx-content .aside-like:nth-of-type(3n+2) { margin-left: 640px; } } .ptx-content .aside-like:hover:after, .ptx-content .aside-like:focus:after { top: 3em; height: auto; background-image: none; } .ptx-content .aside-like:hover, .ptx-content .aside-like:focus { color: inherit; padding: 2px 8px 0 8px; border: 2px solid #dcebfa; height: auto; max-height: none; } .ptx-content .aside-like.front:hover, .ptx-content .aside-like.front:focus { padding: 4px 10px; } .ptx-content section dl dd .aside-like { margin-top: 0 !important; margin-left: 100px !important; } .ptx-content section dl dd .aside-like.front { margin-left: -300px !important; } @media screen and (max-width: 1099px) { .ptx-content .aside-like { position: relative; float: right; z-index: 0; overflow-x: hidden; margin-left: 1em; margin-top: 1em; max-width: 195px; max-height: 4em; margin-right: -8em; } .ptx-content li > .aside-like:last-child { position: absolute; } } .searchbox .searchresultsplaceholder { background: #eaf0f6; } :root[data-legacy-colorscheme=blue_green] { --documenttitle: #2a5ea4; --bodytitle: #2b5f82; --bodysubtitle: #a62e1c; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #28803f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } :root[data-legacy-colorscheme=blue_grey] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #525252; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=blue_red] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #932c1c; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=blue_red_dark] { --bodyfontcolor: #eee; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abf; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #316; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #932c1c; --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: #666; --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); body.pretext { background: #222; } .pretext .ptx-page > .ptx-main { background: #444; color: var(--bodyfontcolor); } .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .ptx-navbar { background: #333; } .ptx-navbar .button { background-color: #635; color: #fff; } .ptx-navbar .button:hover { background-color: #fafafa; color: #000; } .ptx-navbar .calculator-toggle { background-color: #336; } .ptx-navbar .calculator-toggle:hover { background-color: #fce; } .pretext .ptx-masthead { background: #555; } .pretext .ptx-masthead .title-container > .pretext .heading, .pretext .ptx-masthead .title-container > .heading a, .pretext .ptx-masthead .logo-link:empty:hover::before, .pretext .ptx-masthead .byline, .pretext .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext .ptx-content .code-inline { color: var(--documenttitledark); } .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext .ptx-content [data-knowl], .pretext .ptx-content [data-knowl]:hover, .pretext .ptx-content [data-knowl]:active, .pretext .ptx-content [data-knowl].active { color: var(--documenttitlelight); } .pretext .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } } :root[data-legacy-colorscheme=bluegreen_grey] { --bluegreen: hsl(192, 98%, 23%); --documenttitle: var(--bluegreen); --bodytitle: var(--bluegreen); --bodysubtitle: var(--bluegreen); --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #ddd; --chaptertoctext: var(--bluegreen); --chaptertocactive: hsl(192, 98%, 19%); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: var(--bluegreen); --sectiontocactive: hsl(192, 98%, 19%); --sectiontoctextactive: white; --tocborder: var(--bluegreen); --highlighttoc: var(--bluegreen); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } :root[data-legacy-colorscheme=brown_gold] { --documenttitle: #472200; --bodytitle: #8e4a0c; --bodysubtitle: #864E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #eaaf0f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #140a00 --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=darkmartiansands] { --documenttitle: #880000; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #b58039; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #550000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=default] { --documenttitle: #932919; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --parttoc: #234b6a; --parttoctext: white; --parttocactive: var(--documenttitle); --parttoctextactive: white; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblagebackground: #F0EAF6; --assemblageborder: #CAAEE0; --assemblagedarkborder: #472664; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=focused_gray_aqua] { --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #1d686e; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #343b48; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --toc-text-dark: #343b48; --toc-text-light: white; --tocborder: var(--toc-text-dark); --active-toc-item: #e5ca34; --parttoc: var(--toc-text-dark); --parttoctext: var(--toc-text-light); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #1d686e; --chaptertoctext: var(--toc-text-light); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fffffd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: var(--active-toc-item); --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } :root[data-legacy-colorscheme=focused_light] { --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --toc-text-dark: #333; --tocborder: var(--toc-text-dark); --active-toc-item: #dbebf1; --parttoc: #e8e8e8; --parttoctext: var(--toc-text-dark); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #f2f2f2; --chaptertoctext: var(--toc-text-dark); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fdfdfd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: #c2e5f2; --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } :root[data-legacy-colorscheme=green_blue] { --documenttitle: #248038; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #2650a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #195827; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=green_plum] { --documenttitle: #28803f; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #822060; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20602f; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=maroon_grey] { --documenttitle: #660000; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6d8899; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #330000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=martiansands] { --documenttitle: #944921; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #d19e69; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #6a3418; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=orange_navy] { --documenttitle: #d64000; --bodytitle: #00408a; --bodysubtitle: #9e2f00; --bodytitlehighlight: #ffcdbd; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #00326b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #00326b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #006deb; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=pastel_blue_orange] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffffff; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } :root[data-legacy-colorscheme=red_blue] { --documenttitle: #932919; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_amethyst] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6f080b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #008099; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_emerald] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d9ffe9; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #16a67d; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_turquoise] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #008099; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } body.pretext { color: var(--bodyfontcolor); } .ptx-masthead .title-container > .heading, .ptx-masthead .title-container > .heading a, .ptx-masthead .logo-link:empty:hover::before, .ptx-masthead .byline a { color: var(--documenttitle, #2a5ea4); } .ptx-masthead .title-container > .heading a:active, .ptx-masthead .logo-link:empty:active::before, .ptx-masthead .byline a:active { color: var(--bodytitle, #932c1c); } .ptx-toc .toc-item { color: var(--sectiontoctext, #404040); background-color: var(--sectiontoc); border-color: var(--tocborder, #afc2e5); } .ptx-toc .toc-item.active { color: var(--sectiontoctextactive); background-color: var(--sectiontocactive); border-color: var(--highlighttocborder); } .ptx-toc:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc > .toc-item-list > .toc-item { color: var(--chaptertoctext); background-color: var(--chaptertoc); } .ptx-toc > .toc-item-list > .toc-item.active { color: var(--chaptertoctextactive); background-color: var(--chaptertocactive); border-color: var(--highlighttocborder); } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--highlighttoctext, #321a0c); background-color: var(--highlighttoc); border-color: var(--highlighttocborder, #ec704b); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter) { background-color: var(--parttoc); color: var(--parttoctext); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter).active { background-color: var(--parttocactive); color: var(--parttoctextactive); } .ptx-toc.focused .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused .toc-chapter.active { background-color: var(--chaptertocactive); color: var(--chaptertoctextactive); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item { background-color: var(--sectiontoc); color: var(--sectiontoctext); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item.active { background-color: var(--sectiontocactive); color: var(--sectiontoctextactive); } .ptx-content .summary-links a { color: var(--sectiontoctext); } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: var(--highlighttoctext); background: var(--highlighttoc); } .ptx-content .para > a.internal { color: var(--bodysubtitle); } .ptx-content .para > a.external { color: var(--bodysubtitle); } .ptx-content .para > a.internal:hover, .ptx-content .para > a.internal:hover *, .ptx-content .para > a.internal:focus, .ptx-content .para > a.internal:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .para > a.external:hover, .ptx-content .para > a.external:hover *, .ptx-content .para > a.external:focus, .ptx-content .para > a.external:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .playvideo { background-color: var(--videoplay); } .ptx-content .goal-like { border-color: var(--goalborder); } .ptx-content .assemblage-like { border-color: var(--assemblageborder); background-color: var(--assemblagebackground); } .ptx-content .knowl-output { border-color: var(--knowlborder); background-color: var(--knowlbackground); } .pretext[data-atmosphere=pastel], .pretext[data-atmosphere=pastel] .ptx-main { background: #dbf5ff; background: #efe; } .pretext[data-atmosphere=pastel] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoc: #dcdcf9; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffeeee; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoc: #fadfa3; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } .pretext[data-atmosphere=pastel] .ptx-toc { scrollbar-color: var(--documenttitlelight) #efe; } .pretext[data-atmosphere=pastel] .ptx-navbar { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere=pastel] .ptx-masthead { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere=pastel] .ptx-sidebar { background: #ffd; } .pretext[data-atmosphere=darktwilight] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abd; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(9, 72%, 30%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 40%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 33%); --navbarbackground: hsl(0, 0%, 33%); --footerbackground: hsl(0, 0%, 30%); --mainbackground: hsl(0, 0%, 27%); --buttonbackground: hsl(225, 80%, 25%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 23%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 20%); } .pretext[data-atmosphere=dark] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(5, 86%, 24%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 27%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 20%); --navbarbackground: hsl(0, 0%, 20%); --footerbackground: hsl(0, 0%, 22%); --mainbackground: hsl(0, 0%, 17%); --buttonbackground: hsl(232, 90%, 19%); --codebackground: hsl(120, 100%, 15%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 19%); } .pretext[data-atmosphere=darkmidnight] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad9; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(0, 100%, 17%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 13%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 16%); --navbarbackground: hsl(0, 0%, 16%); --footerbackground: hsl(0, 0%, 13%); --mainbackground: hsl(0, 0%, 7%); --buttonbackground: hsl(240, 100%, 13%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 17%); } .pretext[data-atmosphere*=dark] { background: var(--mainbackground); } .pretext[data-atmosphere*=dark] .ptx-page > .ptx-main { background: var(--mainbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .pretext[data-atmosphere*=dark] .ptx-navbar { background: var(--navbarbackground); } .pretext[data-atmosphere*=dark] .ptx-page-footer .feedback-link, .pretext[data-atmosphere*=dark] .ptx-content-footer .button, .pretext[data-atmosphere*=dark] .ptx-navbar .button { background-color: var(--buttonbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-page-footer .feedback-link:hover, .pretext[data-atmosphere*=dark] .ptx-content-footer .button:hover, .pretext[data-atmosphere*=dark] .ptx-navbar .button:hover, .pretext[data-atmosphere*=dark] .ptx-content-footer .button:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-navbar .calculator-toggle { background-color: var(--buttonbackground); } .pretext[data-atmosphere*=dark] .ptx-navbar .calculator-toggle:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-masthead { background: var(--bannerbackground); } .pretext[data-atmosphere*=dark] .ptx-page-footer { background: var(--footerbackground); border-top-color: #447; border-bottom-color: #447; } .pretext[data-atmosphere*=dark] .ptx-page-footer .logo { background: #779; border-radius: 0.4em; } .pretext[data-atmosphere*=dark] .ptx-masthead .title-container > .pretext .heading, .pretext[data-atmosphere*=dark] .ptx-masthead .title-container > .heading a, .pretext[data-atmosphere*=dark] .ptx-masthead .logo-link:empty:hover::before, .pretext[data-atmosphere*=dark] .ptx-masthead .byline, .pretext[data-atmosphere*=dark] .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext[data-atmosphere*=dark] .ptx-toc { scrollbar-color: var(--documenttitlelight) var(--footerbackground); } .pretext[data-atmosphere*=dark] .ptx-content .code-inline { background: var(--codebackground); } .pretext[data-atmosphere*=dark] .ptx-content .kbdkey { background: var(--keybackground); } .pretext[data-atmosphere*=dark] .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext[data-atmosphere*=dark] .ptx-content a.url, .pretext[data-atmosphere*=dark] .ptx-content a.internal, .pretext[data-atmosphere*=dark] .ptx-content a.external { background-color: var(--linkbackground); color: var(--bodyfontcolor, #ddc); } .pretext[data-atmosphere*=dark] .ptx-content [data-knowl] { background-color: var(--linkbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-content [data-knowl]:hover, .pretext[data-atmosphere*=dark] .ptx-content [data-knowl]:active, .pretext[data-atmosphere*=dark] .ptx-content [data-knowl].active { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } :root { --knowlLinkColor: var(--documenttitle); --linkColor: var(--bodysubtitle); --linkBackground: var(--bodysubtitlehighlight); --knowlNested1Background: #f5f5ff; --knowlNested2Background: #fffff5; --knowlNested3Background: #f5ffff; --knowlNested4Background: #fff5f5; } /*! Theme: crc-legacy */ /*# sourceMappingURL=theme-crc-legacy.css.map */ ================================================ FILE: css/dist/theme-default-legacy.css ================================================ @charset "UTF-8"; /* ../../css/targets/html/legacy/default/theme-default.scss */ * { box-sizing: border-box; } body.pretext { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } body.pretext[data-font=OS] { font-family: "Open Sans", sans-serif; } body.pretext[data-font=RS] { font-family: "Roboto Serif", serif; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; } body.pretext { background: #fff; } a { color: inherit; text-decoration: none; } a:hover, a:focus { text-decoration: none; } body.pretext > a.assistive { padding: 6px; position: absolute; top: -40px; left: 0px; color: white; border-right: 1px solid white; border-bottom: 1px solid white; border-bottom-right-radius: 8px; background: transparent; z-index: 10000; } body.pretext > a.assistive:focus { top: 0px; background: #BF1722; outline: 0; transition: top 0.1s ease-in, background 0.5s linear; } nav .ptx-navbar { border-top: none; border-right: none; border-left: none; min-height: unset; } .ptx-navbar .activecode-toggle { padding: 3px 5px; } .pretext #brand-navbar, .pretext .brand-navbar { left: 0; position: fixed; right: 0; z-index: 1030; height: 50px; border-width: 0 0 1px; top: 0; margin-bottom: 0; } .pretext #brand-navbar > .container::before, .pretext .brand-navbar > .container::before, .pretext #brand-navbar > .container::after, .pretext .brand-navbar > .container::after { display: none; } .pretext #brand-navbar + .ptx-masthead, .pretext .brand-navbar + .ptx-masthead { margin-top: 50px; } .pretext #brand-navbar .navbar-collapse.collapse, .pretext .brand-navbar .navbar-collapse.collapse { overflow: hidden !important; } .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: 50px; } @media screen and (max-width: 800px) { .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: auto; } } .ptx-content section, .ptx-content article, .ptx-content figure, .ptx-content figcaption, .ptx-content .exercisegroup, .ptx-content .discussion-like, .ptx-content .para { position: relative; } .ptx-content .para > p:first-child, .ptx-content .para > .para:first-child { display: inline; } .ptx-content pre { margin: 0; padding: 0; border: none; } .ptx-content pre { border-radius: 0; } .ptx-content textarea { padding: 0; } .ptx-content h1, .ptx-content h2, .ptx-content h3, .ptx-content h4, .ptx-content h5, .ptx-content h6 { margin: 0; font-size: unset; } .pretext h1, .pretext h2, .pretext h3, .pretext h4, .pretext h5, .pretext h6 { margin: 0; font-size: unset; } .ptx-content .heading { line-height: 1.1; } .ptx-content .para { margin-top: 1.25em; margin-bottom: 0; line-height: 1.35; } .ptx-content .para.continuation { margin-top: 0; } .ptx-content pre + .para.continuation, .ptx-content pre + form, .ptx-content div + form { margin-top: 1em; } .ptx-content ul + .para.continuation, .ptx-content ol + .para.continuation, .ptx-content dl + .para.continuation { margin-top: 0.75em; } .ptx-content .aside-like > .para:first-child, .ptx-content td > .para:first-child, .ptx-content .solution-like > .para:first-child { margin-top: 0; } .ptx-content .assemblage-like > .para:first-of-type { margin-top: 0; } .ptx-content .assemblage-like > .heading + .para { margin-top: 0.25em; } .ptx-content .assemblage-like + .para { margin-top: 1.75em; } .ptx-content .para.intertext { margin-top: -0.25em; text-indent: 0; } .ptx-content .para + table { margin-top: 1em; } .ptx-content table tr td .para + .para { margin-top: 1em; } .ptx-content table + .para { margin-top: 1.5em; } .ptx-content .para + figure.figure-like > table { margin-top: 1em; } .ptx-content .exercise-like .para + ol { margin-top: 0.5em; } .ptx-content .para + pre.prettyprint, .ptx-content .para + pre.plainprint { margin-top: 1.25em; } .ptx-content .para + .code-box { margin-top: 1.25em; } .ptx-content .code-box > .console { margin-left: 1.5em; } .ptx-content .exercisegroup { padding-top: 1.25em; margin-bottom: 1em; } .ptx-content section .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .ptx-content section .exercisegroup > .heading + .introduction { display: inline; } .ptx-content section .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .ptx-content .exercisegroup article.exercise-like li > .para:first-child { margin-top: 0; } .ptx-content .exercisegroup article.exercise-like .heading { margin: 0; } .ptx-content article.exercise-like .task > .heading + .heading { font-weight: 600; } .ptx-content article.exercise-like .task > .heading + .heading + .para, .ptx-content article.exercise-like .task > .heading + .heading + div { display: block; margin-top: 0; } .ptx-content .exercisegroup .conclusion .heading { margin-top: 0.5em; } .ptx-content .exercisegroup article + article { margin-top: 1em; } .ptx-content .exercisegroup > article, .ptx-content .exercisegroup-exercises > article { margin-left: 2em; } .ptx-content .exercisegroup .cols2 > article { margin-left: 1.25em; } .ptx-content .exercisegroup > .introduction, .ptx-content .exercisegroup > .conclusion { margin-left: 0; } .ptx-content .exercisegroup > .introduction { margin-top: 1.25em; margin-top: 0; } .ptx-content .exercisegroup > .introduction > .para:first-child::before { content: "\25a0\2009"; color: #06a; position: relative; top: -1px; right: 1px; } .ptx-content .exercisegroup > .heading + .introduction > .para:first-child::before { content: "\2003"; } .ptx-content .exercisegroup > .introduction > .para:first-child { margin-top: 0; } .ptx-content section > article, .ptx-content section > section.paragraphs, .ptx-content .paragraphs > article { margin-top: 1.25em; } .ptx-content section article + article, .ptx-content section .introduction + article, .ptx-content section .para + article, .ptx-content section .posterior + article { margin-top: 1.75em; } .ptx-content section article > .introduction + article { margin-top: 1em; } .ptx-content section article > .discussion-like { margin-top: 1em; } .ptx-content section article > .discussion-like .para { margin-top: 1em; } .ptx-content article + .posterior { margin-top: 0.5em; } .ptx-content section .para + .tabular-box { margin-top: 0.75em; } .ptx-content section .tabular-box + .tabular-box { margin-top: 1em; } .ptx-content section .proof { margin-top: 0.75em; } .ptx-content section > pre, .ptx-content .para + pre { margin-top: 1.25em; } .ptx-content ol .para + .para, .ptx-content ul .para + .para { margin-top: 1em; } .ptx-content .introduction + .sidebyside, .ptx-content .para + .sidebyside, .ptx-content ol + .sidebyside, .ptx-content ul + .sidebyside { margin-top: 1em; } .ptx-content section .heading, .ptx-content article .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; } .ptx-content article .exercise-stage { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; font-size: 100%; margin-top: 0.4em; } .ptx-content article > .heading + .para { margin-top: 0; } .ptx-content section .heading + .para, .ptx-content section .title + .para, .ptx-content section .heading + .introduction > .para:first-child, .ptx-content section .blob > .para:first-child { margin-top: 0.25em; } .ptx-content section .heading + article { margin-top: 1em; } .ptx-content section .heading + .sidebyside { margin-top: 1em; } .ptx-content a > .heading { display: inline; } .ptx-content section > .heading { font-size: 1.75em; line-height: 1.25em; margin-top: 1em; margin-bottom: 0.35em; } .ptx-content section section > .heading { font-size: 1.5em; line-height: 1.25em; margin-bottom: 0; } .ptx-content .paragraphs > .heading { font-size: 1.125em; line-height: 1.125em; display: inline; } .ptx-content .paragraphs .heading + .para { display: inline; } .ptx-content .para.logical > .para:first-child { display: inline; } .ptx-content .runestone label > .para { display: inline; } .ptx-content .paragraphs .para .title { font-family: "PT Serif", "Times New Roman", Times, serif; font-size: 1.125em; font-weight: 700; } .ptx-content .paragraphs > .heading { margin-top: 0; } .ptx-content .paragraphs + .paragraphs { margin-top: 3em; } .ptx-content article .paragraphs > .heading { font-size: 1.05em; } .ptx-content section section section > .heading { font-size: 1.4em; line-height: 1.15em; margin-top: 0.75em; } @media screen and (max-width: 480px) { .ptx-content section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } .ptx-content section section > .heading { font-size: 1.3em; line-height: 1.15em; } .ptx-content section section section > .heading { font-size: 1.15em; line-height: 1em; } } .ptx-content .abstract { margin: 4em 2em; } .ptx-content .abstract > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .ptx-content .abstract > .title::after { content: ".\2009\2009\2009"; } .ptx-content .abstract > .title + .para { display: inline; } .ptx-content article > .heading, .ptx-content article > a .heading { font-size: 1.125em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like > .heading { font-size: 1em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like.discussion > .heading .codenumber, .ptx-content .discussion-like.discussion > .heading .space, .ptx-content .discussion-like.discussion > .heading .period { display: none; } .ptx-content .discussion-like.discussion > .heading .type::after { content: ". "; } .ptx-content .discussion-like.status > .heading { display: none; } .ptx-content .discussion-like.status > .heading + .para, .ptx-content .discussion-like.status > .para { font-style: italic; display: block; padding-left: 1em; } .ptx-content article > .heading::after, .ptx-content .discussion-like > .heading::after, .ptx-content .paragraphs > .heading::after, .ptx-content article > a > .heading::after { content: "\2009"; } .ptx-content .posterior .heading { font-weight: normal; font-size: 1.125em; line-height: 1.125em; margin-top: 0; } .ptx-content article > .heading + .para, .ptx-content .discussion-like > .heading + .para, .ptx-content article > .heading + .introduction, .ptx-content article > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article > .heading + ol, .ptx-content article > .heading + ul { padding-left: 1.5em; } .ptx-content article.theorem-like .para, .ptx-content article.theorem-like li { font-style: italic; } .ptx-content article.theorem-like .emphasis { font-weight: 700; } .ptx-content ol, .ptx-content ul { margin-bottom: 0; } .ptx-content li { margin-bottom: 0; } .ptx-content li .title { font-size: 100%; font-weight: normal; font-style: italic; } .ptx-content article.theorem-like li .title { font-weight: 600; font-style: normal; font-size: 96%; } .ptx-content figure { margin-bottom: 0; } .ptx-content .heading { margin-top: 0; margin-bottom: 0; } .ptx-content .conclusion { margin-top: 1em; } .ptx-content .conclusion > .para:first-child { margin-top: 0.5em; } .ptx-content ol, .ptx-content ul { margin-top: 0.75em; } .ptx-content .exercise-like > ol:first-child, .ptx-content .exercise-like > ul:first-child { margin-top: 0; } .ptx-content .heading + ol, .ptx-content .heading + ul { margin-top: 0.45em; } .ptx-content li > .heading + ol, .ptx-content li > .heading + ul { margin-top: 0.25em; } .ptx-content li > .heading + ol > li:nth-child(1), .ptx-content li > .heading + ul > li:nth-child(1) { margin-top: 0; } .ptx-content li > .heading + ol.cols2 > li:nth-child(2), .ptx-content li > .heading + ul.cols2 > li:nth-child(2) { margin-top: 0; } .ptx-content li { margin-top: 0.5em; } .ptx-content li > .para:first-child { margin-top: 0; } .ptx-content article .para:first-child { margin-top: 0; } .ptx-content ol ol, .ptx-content ol ul, .ptx-content ul ol, .ptx-content ul ul { margin-top: 0.5em; } .ptx-content .frontmatter > .heading { display: block; text-align: center; } .ptx-content .frontmatter > .heading .title, .ptx-content .book > .heading .title { font-size: 1.3em; } .ptx-content .frontmatter > .heading .subtitle, .ptx-content .book > .heading .subtitle { display: block; font-weight: normal; color: #666666; font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .ptx-content .frontmatter .author:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .para:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .author, .ptx-content .frontmatter > .credit { margin-top: 2em; text-align: center; } .ptx-content .frontmatter > .author .author-name { font-size: 120%; } .ptx-content .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .ptx-content .frontmatter .credit .title { font-size: 1em; } .ptx-content .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .ptx-content .frontmatter .author-info { font-size: 90%; } .ptx-content a[href^="mailto:"] { white-space: pre; } .ptx-content .colophon .credit { margin-top: 1em; } button { font: inherit; } .print-button { position: relative; right: 2px; top: 66px; background-color: LightGreen; z-index: 1; margin-top: -4em; float: right; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; border: none; } .pretext .ptx-page main.ptx-main { margin-left: 0; left: auto; border: none; box-shadow: none; padding: 0; } .pretext .ptx-page .ptx-main .ptx-content { margin-top: 0; } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section { margin-top: 1em; } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section .heading { margin-top: 0; } .pretext a[href]::after { content: ""; } .print-button { display: none; } } @media print { body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { width: 820px; max-width: 820px; font-size: 12.5px; } body.standalone.worksheet { margin: 0; } body.standalone .ptx-content section.worksheet { border: none; } body.standalone.worksheet .ptx-masthead, body.standalone.worksheet .ptx-page-footer { display: none; } body.standalone.worksheet.has-sidebar-left.mathbook-loaded .ptx-page .ptx-main { margin: 0; } body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { margin: 0; } body.standalone.worksheet .ptx-content section.onepage { max-height: 100%; max-width: 100%; overflow: hidden; page-break-after: always; border: none; page-break-inside: avoid; } body.standalone.worksheet .ptx-content .onepage.lastpage { margin-bottom: -2em; page-break-after: auto; } body.standalone.worksheet.a4 .ptx-content .onepage { } body.standalone.worksheet .ptx-content .onepage div.workspace, body.standalone.worksheet .ptx-content .onepage div.workspace.squashed.tight { border: none; padding: 0; background: none !important; } body.standalone.worksheet a { color: black; } body.standalone.worksheet .ptx-page .ptx-main { padding: 0; } body.standalone.worksheet.mathbook-loaded .ptx-page .ptx-main .ptx-content.ptx-content section.onepage { padding-bottom: 20px; } @page { margin: 0; } } .hidden { display: none; } .ptx-navbar .preferences_menu_holder .active > li { color: #ddd; } .ptx-navbar .preferences_menu_holder > ol > li:focus { background: #eef; border: 2px solid #909; padding: 2px 24px 2px 8px; } .ptx-navbar .preferences_menu_holder > ol > li > ol > li:focus { background: #eef; border: 2px solid #909; padding: 4px 4px 2px 4px; } .ptx-navbar .preferences_menu_holder .active .selected { background: #eef; color: #111; } .ptx-navbar .button.user-preferences-button { overflow: visible; display: none; } .preferences_menu_holder { z-index: 30; background: #fee; color: #222; position: absolute; left: -11em; top: 4em; } .preferences_menu_holder ol { list-style-type: none; padding: 0; margin: 0; } .preferences_menu_holder > ol { width: 12.5em; } .preferences_menu_holder > ol > li { padding: 4px 26px 4px 10px; } .preferences_menu_holder ol li ol { z-index: 40; position: absolute; left: 13em; top: -2em; background: #fee; } .preferences_menu_holder ol li ol li { padding: 6px 6px 4px 6px; display: flex; align-items: center; } .preferences_menu_holder ol.fonts:not(.hidden) { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; } .preferences_menu_holder ol.fonts li:nth-child(8n+1), .preferences_menu_holder ol.fonts li:nth-child(8n+2), .preferences_menu_holder ol.fonts li:nth-child(8n+3), .preferences_menu_holder ol.fonts li:nth-child(8n+4) { background-color: #eff; } .preferences_menu_holder ol.fonts li:nth-child(4n+2) { width: 4em; justify-content: center; text-align: center; align-items: center; } .preferences_menu_holder ol.fonts li:nth-child(4n+1) { padding-left: 14px; } .preferences_menu_holder .wrap_to_submenu { float: right; line-height: 0.95em; margin-right: -7px; } .preferences_menu_holder .to_submenu { position: absolute; } .preferences_menu_holder .avatars li { font-size: 200%; text-align: center; } .preferences_menu_holder .fontfamily .name { margin-right: 2em; } .preferences_menu_holder .fontfamily .sample { margin-left: auto; } .preferences_menu_holder .fonts .byunits { font-size: 80%; margin-bottom: -0.3em; } #choose_topic { background: #eef; } .ffcheck, .atmospherecheck, .avatarcheck, .rulercheck, .motioncheck { width: 1em; margin-left: 0.2em; margin-right: 0.7em; font-size: 11pt; } .preferences_menu_holder .moveQ { padding-top: 0.5em; border-top: 0.3em solid #eef; } .preferences_menu_holder .moveQ, .preferences_menu_holder .moveQ ~ li { background: #efe; } [data-ruler=greybar] .onelineX:hover { padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: #f3f3f3; } [data-atmosphere*=dark][data-ruler=greybar] .onelineX:hover { color: #333; } [data-ruler=lightbox] .onelineX { background-color: #e3e3e3; } [data-ruler=lightbox] .onelineX:hover { padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: inherit; } [data-ruler=sunrise] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler=sunrise] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunrise] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] .onelineX:hover { background-color: inherit; border-bottom: 2px solid black; margin-bottom: -2px; position: relative; z-index: 10; } xxxxxx[data-ruler=sunriseunderline] .onelineX:hover + .onelineX { margin-top: -2px; } [data-ruler=sunriseunderline] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=underline] .onelineX:hover { background-color: inherit; border-bottom: 1px solid black; margin-bottom: -1px; } [data-ruler=lunderline] .onelineX:hover { background-color: inherit; border-bottom: 1px solid black; border-left: 1px solid black; padding-left: 4px; margin-left: -5px; margin-bottom: -1px; } [data-atmosphere*=dark][data-ruler*=underline] .onelineX:hover { border-bottom: 1.5px solid #ddd; margin-bottom: -1.5px; } [data-atmosphere*=dark][data-ruler=lunderline] .onelineX:hover { border-left: 1.5px solid #ddd; padding-left: 3.5px; margin-left: -5px; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } .ptx-footnote { display: inline-block; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number { visibility: hidden; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: 0.6rem; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote__number { display: inline; cursor: pointer; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowlbackground); border-radius: 6px; padding: 0px 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowlborder); } .ptx-content section .para.credit + .para.credit { margin-top: 0.25em; } .ptx-content section .para.credit > .title { font-weight: 700; margin-right: 0.5em; } .ptx-content section .para.copyright { margin-top: 2.5em; } .ptx-content section .para.license { margin-top: 2.5em; } .ptx-content section > .heading + .heading, .ptx-content section section > .heading + .heading { margin-top: 0.5em; } .ptx-content section.solutions > h3.heading, .ptx-content section.solutions section > h3.heading { font-size: 1.6em; } .ptx-content section.solutions > h4.heading, .ptx-content section.solutions section > h4.heading { font-size: 1.45em; } .ptx-content section.solutions > h5.heading, .ptx-content section.solutions section > h5.heading { font-size: 1.35em; } .ptx-content section.solutions > h6.heading, .ptx-content section.solutions section > h6.heading { font-size: 1.25em; } .ptx-content .bibitem + .bibentry { display: inline-block; width: 90%; } .ptx-content .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .ptx-content figcaption { font-weight: normal; } .ptx-content figcaption { margin-top: 0.6em; margin-left: auto; margin-right: auto; } .ptx-content figure.table-like figcaption:first-child { font-style: oblique; margin-top: 0; } .ptx-content figure.table-like figcaption:first-child .type, .ptx-content figure.table-like figcaption:first-child .codenumber { font-style: normal; } .ptx-content section figcaption .codenumber, .ptx-content section figcaption .type { font-weight: 700; font-size: inherit; } .ptx-content figcaption .codenumber:after { content: "\2002"; } .ptx-content figcaption .type:last-of-type::after { content: "\2002"; } .ptx-content figcaption code.code-inline { white-space: pre; } .ptx-content figure.figure > figcaption { margin-top: 1em; } .ptx-content figure.listing > figcaption + * { margin-top: 0.5em; } .ptx-content figcaption + .named-list-content { margin-top: 0.6em; } .ptx-content figcaption + .named-list-content > .introduction > .para:first-child { margin-top: 0; } .ptx-content figcaption + table, .ptx-content figcaption + .tabular-box { margin-top: 0.5em; } .ptx-content .definition-like .para > .emphasis { font-weight: 700; } .ptx-content em.alert { font-weight: bold; } .unprocessed { padding: 8px; background-color: rgb(255, 230, 230); } .unprocessed .unprocessed { margin: 8px; background-color: rgb(255, 200, 255); } .unprocessed .unprocessed .unprocessed { margin: 8px; background-color: rgb(205, 205, 255); } .ptx-content section.introduction + section { margin-top: 2em; } .ptx-content { margin: 0; } .ptx-content .runestone.parsons_section { display: inline-block; max-width: unset; } .ptx-content .runestone.ac_section { width: 60em; max-width: unset; } .ptx-content .runestone.ac_section .ac_section { max-width: unset; } .ptx-content .runestone.ac_section > div { max-width: unset; } .ptx-content .runestone > .parsons { width: 60em; max-width: unset; } .ptx-content .runestone .parsons { margin: 0; } .ptx-content .runestone.parsons_section > .parsons { width: max-content; padding-right: 1em; } .ptx-content .runestone .parsons .sortable-code-container { text-align: unset; } .ptx-content .runestone .parsons .parsons-text, .ptx-content .runestone .parsons .parsons-controls { margin-left: 0; margin-right: 0; } .ptx-content .runestone .parsons .sortable-code + .sortable-code { margin-right: 0; } .ptx-content .runestone .parsons .runestone_caption_text { max-width: 660px; } .runestonebustmenu { position: absolute; right: 0; top: 0; } .runestonebustmenu .dropdown-content { position: absolute; right: 2em; left: unset; top: 1em; } @media screen and (max-width: 800px) { nav .dropdown .dropdown-content { top: unset; bottom: 36px; } .activecode-toggle { display: none; } } .pretext .navbar .dropdown { height: 35px; } .ptx-content section section + section { margin-top: 3em; } .ptx-content .sidebyside > .para, .ptx-content .sidebyside > figure, .ptx-content .sidebyside > img, .ptx-content .sidebyside > table, .ptx-content .sidebyside > tabular, .ptx-content .sidebyside > section, .ptx-content .sidebyside > .paragraphs { display: inline-block; margin: 0; } .ptx-content .sidebyside .sbspanel > table { overflow-x: auto; margin-left: auto; margin-right: auto; } .ptx-content .sidebyside figcaption { padding-left: 1em; padding-right: 0; padding-bottom: 0; margin: 0.75em 0 0 0; } .ptx-content figcaption { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .sidebyside > .para { width: 32%; vertical-align: top; } .ptx-content .sidebyside > .para.left, .ptx-content .sidebyside > .para.middle, .ptx-content .sidebyside > .para.right { vertical-align: middle; } .ptx-content .sidebyside > .para + img { vertical-align: middle; } .ptx-content .sidebyside .sbsrow .sbsheader { margin-top: 0; } .ptx-content .sbsgroup { width: 100%; } .ptx-content .sidebyside { width: 100%; } .ptx-content .sbsrow { display: flex; justify-content: space-between; } .ptx-content .sbsheader { text-align: center; justify-content: center; font-size: 1em; } .ptx-content .sbspanel:empty { height: 10em; background-color: rgb(221, 221, 255); } .ptx-content .sbspanel { display: flex; flex-direction: column; justify-content: flex-start; } .ptx-content .sbspanel.top { justify-content: flex-start; } .ptx-content .sbspanel.middle { justify-content: center; } .ptx-content .sbspanel.bottom { justify-content: flex-end; } .ptx-content .sbspanel > .para:first-child { margin-top: 0; } .ptx-content .fixed-width { align-items: center; } .ptx-content .sbscaption { justify-content: center; } .ptx-content table { border-spacing: 0; } .ptx-content table { border-collapse: collapse; } .ptx-content .image-box + table, .ptx-content .image-box + .sidebyside > .sbsrow:first-child > .sbspanel > table:first-child { margin-top: 1.5em; } .ptx-content table tr td, .ptx-content table tr th { padding-top: 2px; padding-bottom: 2px; padding-left: 5px; padding-right: 5px; } .ptx-content table tr td { font-size: 90%; } .ptx-content table tr td.l { text-align: left; } .ptx-content table tr td.c { text-align: center; } .ptx-content table tr td.r { text-align: right; } .ptx-content table tr td.j { text-align: justify; } .ptx-content table tr td.lines { white-space: nowrap; } .ptx-content table tr td.t { vertical-align: top; } .ptx-content table tr td.b { vertical-align: bottom; } .ptx-content table tr td.m { vertical-align: middle; } .ptx-content table tr td.vv { border-left: 2px solid #000; border-right: 2px solid #000; } .ptx-content table tr td.vcv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.vcvv { border-left: 2px solid #000; border-right: 4px solid #000; text-align: center; } .ptx-content table tr td.vlv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vrv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.rv { border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.vr { border-left: 2px solid #000; text-align: right; } .ptx-content table tr td.lv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vl { border-left: 2px solid #000; text-align: left; } .ptx-content table tr td.cv { border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.Xv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vc { border-left: 2px solid #000; text-align: center; } .ptx-content table tr td.hline { padding: 0; } .ptx-content table tr td.hlinethick { padding-left: 0px; padding-right: 0px; } .ptx-content table tr td.hline hr { margin-top: 0; margin-bottom: 0; margin-left: -1px; margin-right: -1px; border: 1px solid rgb(0, 0, 0); } .ptx-content table tr td.hlinethick hr { margin-top: 0; margin-bottom: 0; margin-left: -1px; margin-right: -1px; border: 2px solid rgb(0, 0, 0); } .center table { text-align: center; margin-left: auto; margin-right: auto; } .ptx-content table tr th.b1, .ptx-content table tr td.b1 { border-bottom: 1px solid #000; } .ptx-content table tr th.b2, .ptx-content table tr td.b2 { border-bottom: 2px solid #000; } .ptx-content table tr th.b3, .ptx-content table tr td.b3 { border-bottom: 3px solid #000; } .ptx-content table tr th.b0, .ptx-content table tr td.b0 { border-bottom: none; } .ptx-content table tr th.t1, .ptx-content table tr td.t1 { border-top: 1px solid #000; } .ptx-content table tr th.t2, .ptx-content table tr td.t2 { border-top: 2px solid #000; } .ptx-content table tr th.t3, .ptx-content table tr td.t3 { border-top: 3px solid #000; } .ptx-content table tr th.t0, .ptx-content table tr td.t0 { border-top: none; } .ptx-content table tr th.r1, .ptx-content table tr td.r1 { border-right: 1px solid #000; } .ptx-content table tr th.r2, .ptx-content table tr td.r2 { border-right: 2px solid #000; } .ptx-content table tr th.r3, .ptx-content table tr td.r3 { border-right: 3px solid #000; } .ptx-content table tr th.r0, .ptx-content table tr td.r0 { border-right: none; } .ptx-content table tr th.l1, .ptx-content table tr td.l1 { border-left: 1px solid #000; } .ptx-content table tr th.l2, .ptx-content table tr td.l2 { border-left: 2px solid #000; } .ptx-content table tr th.l3, .ptx-content table tr td.l3 { border-left: 3px solid #000; } .ptx-content table tr th.l0, .ptx-content table tr td.l0 { border-left: none; } .ptx-content table tr td img { max-width: 200px; margin-right: 30px; } .ptx-content table.notation-list tr th { text-align: left; } .ptx-content table.notation-list tr td { text-align: left; vertical-align: top; } .ptx-content table.notation-list tr th { margin-left: 2em; } .ptx-content table.notation-list tr td { margin-left: 1em; } .ptx-content tr th.r0.l0, .ptx-content tr td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content table tr td span.decimal { float: left; text-align: right; } .ptx-content table tr.header-vertical th { writing-mode: vertical-rl; padding-left: 2em; } .ptx-content table + article { margin-top: 1em; } .ptx-content .hidden-knowl-wrapper .hiddenproof, .ptx-content .blob > article.hiddenproof, .ptx-content section > article.hiddenproof { margin-top: 0.3em; } .ptx-content .hidden-knowl-wrapper article { display: inline; } .apretext-content figure.figure-like { overflow: auto; } .ptx-content figure.figure-like { margin-left: 0; margin-right: 0; } .ptx-content figure.table-like { margin-left: 30px; margin-right: 30px; } .ptx-content figure.table-like.list { margin-right: 0; } .ptx-content a > tt { font-size: 110%; } .ptx-content section .videolink a:link { background-size: 0; } .ptx-content .playvideo { cursor: pointer; } .ptx-content .videobig { padding-right: 0.3em; padding-left: 0.3em; font-size: 85%; background-color: rgba(255, 255, 100, 0.9); display: inline-block; position: relative; top: 100px; cursor: zoom-in; } .ptx-content .videobig.nofigure { } .ptx-content .knowl .videobig { display: none; } .ptx-content .videosmall { padding-right: 0.3em; padding-left: 0.3em; font-size: 80%; background-color: rgba(255, 255, 100, 0.9); display: inline-block; position: absolute; left: -250px; z-index: 1001; cursor: zoom-out; } .ptx-content .exercise-like ol li table { margin-bottom: 0.5em; } .ptx-content .exercise-like > ol li + li { margin-top: 0.5em; } .ptx-content .solution > ol li + li { margin-top: 0.5em; } .ptx-content section.worksheet > .heading > .codenumber { display: inline-block; vertical-align: top; } .ptx-content section.worksheet > .heading > .title { display: inline-block; max-width: 70%; } .ptx-content .heading .print-links { display: inline-block; float: right; vertical-align: top; width: 19%; text-align: right; } .standalone .ptx-content .heading .print-links { display: none; } .standalone.worksheet .previous-button, .standalone.worksheet .up-button, .standalone.worksheet .next-button { display: none; } .standalone.worksheet .ptx-navbar .toc-toggle { display: none; } .standalone.worksheet .ptx-content [data-knowl]:hover, .standalone.worksheet .ptx-content [data-knowl]:active, .standalone.worksheet .ptx-content [data-knowl].active { background: none; color: black; } .standalone.worksheet .ptx-content [data-knowl]::after { border: none; } .standalone.worksheet .ptx-content .knowl-content { padding: 0; } .standalone.worksheet .ptx-content article > .knowl-output.original { margin: 0; } .ptx-content .appendix .heading > .type { display: inline; } .ptx-content .heading.hide-type > .type { display: none; } .ptx-content .heading .print-links > a { font-family: "Open Sans"; font-size: 0.6em; font-weight: bold; padding: 0.1em 0.2em; background: #ffa; border: 2px solid green; } .ptx-content .heading .print-links > a.us { background: #eef; color: #9b1c2c; border-color: #041E42; } .ptx-content .heading .print-links > a + a { margin-left: 0.25em; } .ptx-content .autopermalink { position: absolute; display: inline-block; top: 3px; left: -1.9em; font-size: 85%; color: #a00; opacity: 0.05; margin-top: 0.1em; } .ptx-content li > .para > .autopermalink { left: -3.4em; top: 0; } .ptx-content .autopermalink a { color: #a00; } .ptx-content .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } :target { scroll-margin-top: 45px; } .ptx-content .para > .autopermalink { margin-top: 0.2em; } .ptx-content .exercises > .autopermalink, .ptx-content .introduction > .autopermalink, .ptx-content .glossary > .autopermalink { margin-top: 0.3em; } .ptx-content .appendix > .autopermalink, .ptx-content .chapter > .autopermalink, .ptx-content .index > .autopermalink, .ptx-content .section > .autopermalink { margin-top: 0.3em; } .ptx-content .subsection > .autopermalink, .ptx-content .references > .autopermalink, .ptx-content .exercises > .autopermalink { margin-top: 0.3em; } .ptx-content .figure-like > .autopermalink { margin-top: 1.4em; } .ptx-content .subsubsection > .autopermalink { margin-top: 0; } .ptx-content .exercisegroup > .autopermalink { margin-top: 1.4em; } .ptx-content .autopermalink:hover { opacity: 1; background: #eeddff; } .ptx-content .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: #fff; border: 3px solid blue; z-index: 2001; } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: #eeaaff; } .ptx-content .indexitem { margin-top: 2px; } .ptx-content .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .ptx-content .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .ptx-content .indexknowl { margin-left: 0.11em; } .ptx-content em + .indexknowl { margin-left: -0.25em; } .ptx-content .indexknowl a { margin-left: 2em; } .ptx-content .indexitem .see, .ptx-content .subindexitem .see, .ptx-content .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .seealso, .ptx-content .subindexitem .seealso, .ptx-content .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .see em, .ptx-content .subindexitem .see em, .ptx-content .subsubindexitem .see em, .ptx-content .indexitem .seealso em, .ptx-content .subindexitem .seealso em, .ptx-content .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .ptx-content .indexitem .see + .see, .ptx-content .subindexitem .see + .see, .ptx-content .subsubindexitem .see + .see, .ptx-content .indexitem .seealso + .seealso, .ptx-content .subindexitem .seealso + .seealso, .ptx-content .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .ptx-content .indexitem .indexknowl { font-size: 90%; } .ptx-content .indexitem [data-knowl], .ptx-content .subindexitem [data-knowl], .ptx-content .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .ptx-content .indexknowl [data-knowl]:hover, .ptx-content .indexknowl .active[data-knowl] { margin-left: 2em; } .ptx-content .subindexitem .indexknowl { font-size: 95%; } .ptx-content .subsubindexitem .indexknowl { font-size: 95%; } .ptx-content .indexletter { margin-top: 1.5em; } .ptx-content .hidden-knowl-wrapper .heading { display: inline; } .ptx-content .heading + .hidden-knowl-wrapper { display: inline; } .ptx-content .cols2 .knowl-output, .ptx-content .cols3 .knowl-output, .ptx-content .cols4 .knowl-output, .ptx-content .cols5 .knowl-output, .ptx-content .cols5 .knowl-output { width: 100%; } .ptx-content .cols2 + *, .ptx-content .cols3 + *, .ptx-content .cols4 + *, .ptx-content .cols5 + *, .ptx-content .cols6 + * { clear: both; } .ptx-content .cols2::after, .ptx-content .cols3::after, .ptx-content .cols4::after, .ptx-content .cols5::after, .ptx-content .cols6::after { content: ""; display: block; clear: both; } .ptx-content section > ol:last-child, .ptx-content section > ul:last-child { margin-bottom: 1.5em; } .ptx-content section > ol:last-child > li:last-child, .ptx-content section > ul:last-child > li:last-child { padding-bottom: 0em; } .ptx-content .cols2 > li:nth-child(2n+1), .ptx-content .cols3 > li:nth-child(3n+1), .ptx-content .cols4 > li:nth-child(4n+1), .ptx-content .cols5 > li:nth-child(5n+1), .ptx-content .cols6 > li:nth-child(6n+1) { clear: left; } .ptx-content .exercise-like ol.cols2 li { margin-top: 0.5em; } .ptx-content .cols2 > li, .ptx-content .cols3 > li, .ptx-content .cols4 > li, .ptx-content .cols5 > li, .ptx-content .cols6 > li { float: left; } .ptx-content .incontext { display: block; font-size: 85%; text-align: right; } .ptx-content .terminology { font-style: italic; font-weight: bold; } .ptx-content .emphasis { font-style: italic; } .ptx-content .emphasis .emphasis { font-weight: bold; } :target { animation: target-fade 15s 1; } @-webkit-keyframes target-fade { 0% { background-color: rgba(120, 0, 120, 0.3); } 100% { background-color: inherit; opacity: 1; } } @-moz-keyframes target-fade { 0% { background-color: rgba(120, 0, 120, 0.3); } 100% { background-color: inherit; opacity: 1; } } .ptx-content .autoterm [knowl], .ptx-content .autoterm [knowl]:after { font-weight: inherit; color: inherit; padding: 0; margin-bottom: inherit; border-bottom: inherit; border-bottom-color: inherit; } .ptx-content .autoterm [knowl]:hover { background: #ffddff; border-top: 2px dotted purple; border-bottom: 1px dotted red; border-top-left-radius: 0; border-top-right-radius: 0; } .ptx-content ol li.custom-list-style-type { list-style-type: none; } .ptx-content ol li.custom-list-style-type:before { content: attr(label) "\a0\a0"; } .ptx-content ol.no-marker, .ptx-content ul.no-marker, .ptx-content li.no-marker { list-style-type: none; } .ptx-content ol.decimal { list-style-type: decimal; } .ptx-content ol.lower-alpha { list-style-type: lower-alpha; } .ptx-content ol.upper-alpha { list-style-type: upper-alpha; } .ptx-content ol.lower-roman { list-style-type: lower-roman; } .ptx-content ol.upper-roman { list-style-type: upper-roman; } .ptx-content ul.disc { list-style-type: disc; } .ptx-content ul.square { list-style-type: square; } .ptx-content ul.circle { list-style-type: circle; } .ptx-content ol.no-marker, .ptx-content ul.no-marker { list-style-type: none; } .ptx-content section, .ptx-content article, .ptx-content figure { clear: both; } .ptx-content dl { margin-top: 1em; margin-left: 0; margin-bottom: 0; overflow: hidden; } .ptx-content dl dd { margin-top: 0; } .ptx-content dl dd::after { content: ""; display: block; clear: both; } .ptx-content dl.glossary dt { margin-top: 1.25em; } .ptx-content dl.description-list dt, .ptx-content dl.description-list dd { margin-top: 1em; } .ptx-content dl.description-list.narrow dt { margin-top: 0; } .ptx-content dl.glosary dt:first-of-type, .ptx-content dl.description-list dt:first-of-type, .ptx-content dl.glosary dd:first-of-type, .ptx-content dl.description-list dd:first-of-type { margin-top: 0; } .ptx-content dl dd .para { margin-top: 1em; } .ptx-content dl dt > .para:first-child, .ptx-content dl dd > .para:first-child { margin-top: 0; } .ptx-content dl > dt { font-weight: bold; max-width: 55ex; } .ptx-content dl.description-list dt { float: left; clear: left; text-align: right; width: 18ex; } .ptx-content dl.description-list.narrow dt, .ptx-content dl.glossary dt { text-align: left; } .ptx-content dl.glossary dd { margin-left: 5ex; } .ptx-content dl.description-list dd { margin-left: 22ex; } .ptx-content dl.description-list.narrow dd { margin-left: 12ex; } .ptx-content dl.description-list dt:first-of-type { clear: none; } .ptx-content dl.description-list.narrow dd::after { content: ""; display: block; height: 1em; clear: left; } .ptx-content dl.description-list.narrow dd:last-child::after { height: 0; } .ptx-content dl.description-list dt { float: left; clear: both; margin-right: 1ex; } .ptx-content dl.description-list.narrow dt { width: unset; max-width: 55ex; text-align: left; } .ptx-content dl.description-list.narrow dd { margin-left: 0; margin-top: 0; width: 31em; max-width: calc(100% - 12ex); float: right; clear: right; } .ptx-content dl.description-list + * { clear: both; } @media screen and (max-width: 480px) { .ptx-content dl.description-list dt { float: none; margin-left: 0; text-align: left; } .ptx-content dl.description-list dd, .ptx-content dl.description-list.narrow dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } .ptx-content dl.description-list dl dt { width: 8ex; } .ptx-content dl.description-list dd dd { margin-left: 18ex; } .ptx-content dl.description-list dl dd { margin-left: 12ex; } .ptx-content [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .ptx-content .knowl mjx-mtext > mjx-utext, .ptx-content mjx-mtext > mjx-utext { width: revert !important; } .ptx-content mjx-msup mjx-utext, .ptx-content mjx-msub mjx-utext { display: inline; } a.mjx-svg-href { fill: inherit; stroke: inherit; } .displaymath + .para { margin-top: 0; } @media screen and (max-width: 943px) { .ptx-content .displaymath { position: relative; overflow-x: auto; } .ptx-content .mjx-chtml.MJXc-display { overflow-x: auto; overflow-y: hidden; } .ptx-content .figure-like { overflow-x: auto; } .ptx-content #MathJax_ZoomFrame { position: static; background: white; } .ptx-content #MathJax_Zoom { background-color: inherit; border: 0; padding: 0; position: absolute; overflow-x: auto; overflow-y: visible; left: 10% !important; max-height: none !important; } } .ptx-content dd .displaymath:last-child .MJXc-display { margin-bottom: 0; } .floatnav { margin-top: 8px; margin-left: 50px; } .floatnav a { padding-left: 3px; margin-right: -1px; color: inherit; } .ptx-content a .heading .mjx-chtml { z-index: 1; background: #fff; } .ptx-content .hidden-knowl-wrapper [data-knowl]::after, .ptx-content .hidden-knowl-wrapper [data-knowl]:hover::after, .ptx-content .hidden-knowl-wrapper .active[data-knowl]::after { right: 7px; } .floatnav a:hover { background: #eeaaff; } .ptx-content .unselectable { user-select: none; } .ptx-content .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .ptx-content .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } .ptx-content .fillin { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.underline { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.box { display: inline-block; border: none; margin-left: 0.1em; margin-right: 0.1em; margin-bottom: -0.25em; outline: 1px solid black; height: 1.3em; } .ptx-content .fillin.shade { display: inline-block; border: none; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; background-color: #eee; height: 1.3em; } .ptx-content .hiddenproof > a > .heading { font-style: italic; font-weight: normal; } .ptx-content .MJXc-display, .ptx-content .knowl-output .knowl-output .knowl-output .knowl-output .MJXc-display, .ptx-content pre.prettyprint, .ptx-content pre.plainprint, .ptx-content pre.console, .ptx-content .code-box { background-image: linear-gradient( to right, white, white), linear-gradient( to right, white, white), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 255, 255, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 255, 255, 0)); background-position: left center, right center, left center, right center; background-repeat: no-repeat; background-color: inherit; background-size: 20px 100%, 20px 100%, 10px 100%, 10px 100%; background-attachment: local, local, scroll, scroll; } .ptx-content .runestone .code-box { background-image: none; } .ptx-content .knowl-output .MJXc-display { background-image: linear-gradient( to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient( to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient( to right, rgba(0, 0, 0, 0.25), var(--knowlbackground)), linear-gradient( to left, rgba(0, 0, 0, 0.25), var(--knowlbackground)); } .ptx-content .knowl-output.original .MJXc-display { background: inherit; } .ptx-content .assemblage-like .MJXc-display { background-image: linear-gradient( to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient( to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient( to right, rgba(0, 0, 0, 0.25), var(--assemblagebackground)), linear-gradient( to left, rgba(0, 0, 0, 0.25), var(--assemblagebackground)); } .ptx-content .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient( to right, #fffff5, #fffff5), linear-gradient( to right, #fffff5, #fffff5), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 255, 243, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 255, 243, 0)); } .ptx-content .knowl-output .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient( to right, #fff5fe, #fff5fe), linear-gradient( to right, #fff5fe, #fff5fe), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 243, 254, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 243, 254, 0)); } .ptx-content .knowl-output .knowl-content > *:last-child:not(.incontext) { margin-bottom: 0.5em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like, .ptx-content .knowl-output .knowl .knowl-content > .solution-like:not(.incontext) { margin-bottom: 0.15em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.hint { border-left: 1px solid #0f0; padding-left: 0.35em; background: #efe; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.answer { border-left: 2px solid #00f; padding-left: 0.35em; background: #eef; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.solution { border-left: 3px solid #c0c; padding-left: 0.5em; background: #fef; } .ptx-content .knowl-content > article:first-child, .ptx-content .knowl-content > .solution-like:first-child { padding-top: 0.25em; } .ptx-content .exercisegroup > .conclusion { margin-left: 1.5em; } .ptx-content .exercise-like .introduction { display: inline; } .ptx-content .exercise-like .introduction .heading { display: inline; } .ptx-content .exercise-like .introduction .para:first-child { display: inline; } .ptx-content .exercise-like .introduction::after { content: ""; display: block; } .ptx-content .exercise-like .conclusion::before { content: ""; display: block; margin-top: 0.25em; } .ptx-content .exercisegroup .exercisegroup-exercises.cols2, .ptx-content .exercisegroup .exercisegroup-exercises.cols3, .ptx-content .exercisegroup .exercisegroup-exercises.cols4, .ptx-content .exercisegroup .exercisegroup-exercises.cols5, .ptx-content .exercisegroup .exercisegroup-exercises.cols6 { width: 100%; display: inline-flex; flex-direction: row; flex-wrap: wrap; justify-content: flex-start; align-items: flex-start; align-content: flex-start; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 { display: inline; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 .knowl-output { display: block; } .ptx-content .exercisegroup .cols1 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(33.33% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(25% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(20% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(16.66% - 2em); } .ptx-content .mathword { white-space: nowrap; } .ptx-content .unit, .ptx-content .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .ptx-content .unit sub, .ptx-content .unit sup, .ptx-content .quantity sub, .ptx-content .quantity sup { word-spacing: normal; } .ptx-content .code-inline, .ptx-content .code-block, .ptx-content .console, .ptx-content .program, .ptx-content .program code { font-family: "Inconsolata", monospace; } .ptx-content .code-block, .ptx-content .console, .ptx-content .program { overflow-x: auto; } .ptx-content .code-inline { font-size: 1em; white-space: pre; color: inherit; background: #eeeeee; border: 1px solid #dddddd; padding: 0.0625em 0.25em; margin-left: 0.2em; margin-right: 0.2em; border-radius: 0.2em; } .ptx-content .code-inline:first-child { margin-left: 0; } .ptx-content .title .code-inline { padding-left: 0; padding-right: 0; margin-left: 0; margin-right: 0; } .ptx-content a .code-inline { background: #f6f6f6; } .ptx-content .kbdkey { background: #f1f1f1; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .ptx-content .kbdkey { color: #333; } .ptx-content .sagecell_sessionOutput pre { font-family: "Inconsolata", monospace; } .ptx-content .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .ptx-content .sage-interact.sagecell { margin: 0; } .ptx-content .sagecell_evalButton { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px; padding: 0 0.65em; } .ptx-content .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .ptx-content .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .ptx-content .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .ptx-content .sagecell_evalButton:focus, .ptx-content .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .ptx-content .sagecell .sagecell_editor { margin-bottom: 8px; } .ptx-content .booktitle { font-style: oblique; } .ptx-content .objectives > .heading, .ptx-content .outcomes > .heading { font-size: 1.25em; } .ptx-content a .heading { white-space: normal; } .ptx-content .solutions > a, .ptx-content .solutions > a:hover, .ptx-content .solutions > a.active, .ptx-content .instructions > a, .ptx-content .instructions > a:hover, .ptx-content .instructions > a.active { display: inline-block; margin-right: 1.5em; } .ptx-content .solutions > a::before, .ptx-content .instructions > a::before { content: "\25ba"; font-size: 70%; color: #06a; position: relative; top: -2px; right: 3px; } .ptx-content .solutions > a.active::before, .ptx-content .instructions > a.active::before { content: "\25bc"; animation-name: solutiontriangle; animation-duration: 3s; animation-iteration-count: 1; } .ptx-content .solutions > a[data-knowl]::after, .ptx-content .instructions > a[data-knowl]::after { left: 12px; } @keyframes solutiontriangle { from { content: "\25ba"; } to { content: "\25bc"; } } .ptx-content section.solutions { font-size: 90%; padding-left: 1em; border-left: 1em solid #eeeeee; } .ptx-content.ptx-content > section.solutions:first-child { padding-left: 0; border-left: none; } .ptx-content article.example-like > .solution-like, .ptx-content article.exercise-like > .solution-like { margin-top: 1em; padding-left: 0.7em; } .ptx-content article.example-like > .solution-like > .heading, .ptx-content article.exercise-like > .solution-like > .heading { font-size: 100%; font-weight: 700; margin-right: 0.25em; display: inline; } .ptx-content article.example-like > .solution-like > .heading + .para, .ptx-content article.exercise-like > .solution-like > .heading + .para { display: inline; } .ptx-content article > figure:first-child { margin-top: 0; } .ptx-content figure + figure, .ptx-content figure + .sidebyside, .ptx-content .sidebyside + .sidebyside, .ptx-content article + figure, .ptx-content .sidebyside + figure { padding-top: 1em; } .ptx-content img { display: inline-block; margin-left: auto; margin-right: auto; } .ptx-content img.cs { display: block; margin-top: 20px; margin-bottom: 20px; margin-left: auto; margin-right: auto; } .ptx-content img:not(.cs) { max-width: 650px; } .ptx-content .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } .ptx-content figure img { display: block; margin-left: auto; margin-right: auto; } .ptx-content figure img + img { margin-top: 30px; } .ptx-content div.center img { display: block; margin-left: auto; margin-right: auto; } .ptx-content div.center + div.center > img { margin-top: 60px; } .ptx-content div.center > img + img { margin-top: 60px; } .ptx-content figure table { margin-left: auto; margin-right: auto; } .ptx-content .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .ptx-content figure.wrap img { width: 250px; } .ptx-content figure.wrap { float: right; margin-right: 0; margin-left: 30px; } .ptx-content figure img.wrap { float: right; margin: 0; } .ptx-content figure figcaption.wrap { margin: 10px; font-size: 100%; text-align: center; } .ptx-content figure, .ptx-content .image-box { margin-top: 0.5em; } .ptx-content figure.listing { margin-top: 1em; } .ptx-content figure .image-box { margin-top: 0; } .ptx-content .sidebyside figure { margin-top: 0; } .ptx-content .image-box img, .ptx-content img.contained, .ptx-content .sbspanel img { width: 100%; height: auto; } .ptx-content .image-box > img:not(.draw_on_me):not(.mag_popup) { cursor: zoom-in; } .ptx-content img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; max-width: 600px; } .ptx-content .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .ptx-content .image-box, .ptx-content .audio-box, .ptx-content .video-box, .ptx-content .asymptote-box { position: relative; } .ptx-content .image-box .asymptote-box iframe.asymptote, .ptx-content iframe.asymptote, .ptx-content .video-box .video, .ptx-content .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .ptx-content section > .audio-box, .ptx-content section > .video-box, .ptx-content section > .image-box { margin-top: 0.75em; } .ptx-content .audio { width: 100%; } .caption .heading { font-weight: bold; } .caption .counter { font-weight: bold; } .ptx-content div.quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .minipage + .minipage { display: inline-block; } .ptx-content code.inline { background: none; border: none; } .ptx-content pre.program, .ptx-content pre.program code, .ptx-content pre.code-block, .ptx-content pre.code-block code { line-height: 1.1; } .ptx-content section > .code-box, .ptx-content .para + .code-box, .ptx-content section > .code-block, .ptx-content .para + .code-block { margin-top: 1em; } .ptx-content pre.program, .ptx-content pre.code-block { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.program:before, .ptx-content pre.code-block:before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } .ptx-content pre[data-line].program, .ptx-content pre[data-line].code-block { padding-left: 2.5em; } .ptx-content pre[data-line].program:before, .ptx-content pre[data-line].code-block:before { margin-left: -5em; } .ptx-content pre.program.line-numbers, .ptx-content pre.code-block.line-numbers { padding-left: 3.5em; overflow: visible; } .ptx-content pre.program.line-numbers:before, .ptx-content pre.code-block.line-numbers:before { margin-left: -7em; } .ptx-content pre[data-line].line-numbers code { padding-top: 0em; } .ptx-content pre[data-line].line-numbers .line-highlight { margin-top: 0em; } .ptx-content pre[data-line]:not(.line-numbers) .line-highlight { margin-top: 0.6em; } .ptx-content pre.prettyprint, .ptx-content pre.plainprint { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.prettyprint:before, .ptx-content pre.plainprint:before { content: ""; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 2.5em; } .ptx-content .objectives { margin-bottom: 1.25em; } .ptx-content ol > li { padding-left: 0.25em; } .ptx-content ol.cols2 > li, .ptx-content ul.cols2 > li { width: calc(49% - 1.75em); min-width: 190px; } .ptx-content ol.cols3 > li, .ptx-content ul.cols3 > li { width: calc(33% - 1.25em); min-width: 160px; } .ptx-content ol.cols4 > li, .ptx-content ul.cols4 > li { width: calc(24.5% - 1.25em); min-width: 100px; } .ptx-content ol.cols5 > li, .ptx-content ul.cols5 > li { width: calc(19.5% - 0.75em); min-width: 90px; } .ptx-content ol.cols6 > li, .ptx-content ul.cols6 > li { width: calc(16.3% - 0.5em); min-width: 80px; } .ptx-content ul.cols2 > li:nth-child(odd), .ptx-content ol.cols2 > li:nth-child(odd) { margin-right: 2em; } .ptx-content .cols2 ol, .ptx-content .cols3 ol, .ptx-content .cols4 ol, .ptx-content .cols5 ol, .ptx-content .cols6 ol { padding-left: 0.7em; } .ptx-content .exercisegroup-exercises > article.exercise-like { margin-top: 1em; } .ptx-content .cols2 > li:last-child:nth-child(odd) { float: none !important; padding-top: 0.5em; } .ptx-content .solution ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .solution ol li > .para:first-child, .ptx-content .solution ol li > .displaymath:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .solution ol li > .displaymath:first-child .MJXc-display { margin-top: 0; } .ptx-content .exercise-like ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .exercise-like > .cols2 > li { width: calc(49% - 2.5em); } .ptx-content .exercise-like > .cols3 > li { width: calc(33% - 2.5em); } .ptx-content .exercise-like > .cols4 > li { width: calc(24.5% - 2.5em); } .ptx-content .exercise-like > .cols5 > li { width: calc(19.5% - 2.5em); } .ptx-content .exercise-like > .cols6 > li { width: calc(16.3% - 2.5em); } .ptx-content .knowl .exercise-like > .cols2 > li { width: calc(49% - 2em); } .ptx-content .knowl .exercise-like > .cols3 > li { width: calc(33% - 2em); } .ptx-content .knowl .exercise-like > .cols4 > li { width: calc(24.5% - 2em); } .ptx-content .knowl .exercise-like > .cols5 > li { width: calc(19.5% - 2em); } .ptx-content .knowl .exercise-like > .cols6 > li { width: calc(16.3% - 2em); } .ptx-content .exercise-like ol li > .para:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .contributor .contributor-name { font-variant: small-caps; } .ptx-content .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .ptx-content .contributor { margin-top: 3ex; } .ptx-content .contributor + .contributor { margin-top: 1.5ex; } .ptx-content .contributor + .para { margin-top: 3ex; } .ptx-content .frontmatter .contributors, .ptx-content .book .contributors { text-align: center; font-style: normal; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .searchwrapper .gsc-control-cse { padding: 0; border: none; width: 25ex; } .pretext .searchwrapper .cse .gsc-search-button input.gsc-search-button-v2, .searchwrapper input.gsc-search-button-v2 { padding: 2px 2px; } .pretext .searchwrapper form.gsc-search-box { margin: 0; } .pretext .searchwrapper table.gsc-search-box { margin: 0; } .pretext .searchwrapper .gsc-search-box-tools .gsc-search-box .gsc-input { padding: 0; } .pretext .searchwrapper .gsib_a { padding: 0 0 0 5px; } .pretext .searchwrapper .gsc-input-box { height: 3ex; } .pretext .searchwrapper form.gsc-search-box { font-size: 12px; } .ptx-content div.CodeMirror span.CodeMirror-matchingbracket { color: #090; } .ptx-content .image-archive { margin-left: auto; margin-right: auto; margin-bottom: 0; margin-top: 0.75em; padding-bottom: 0.25em; text-align: center; } .ptx-content .image-archive > a { display: inline-block; padding-left: 0.5em; padding-right: 0.5em; font-family: monospace; } .ptx-content iframe { margin: 0; border: none; box-sizing: border-box; } .ptx-content .times-sign { font-size: larger; vertical-align: -0.15ex; } .ptx-content article.notranslate { margin-top: 0; } .ptx-content article.exercise-like > .exercise-like { margin-left: 40px; } .ptx-content article.exercise-like > .exercise-like.task { margin-left: 20px; } .ptx-content article.exercise-like > .exercise-like > .para { margin-top: 1.25em; } .ptx-content article.example-like > .heading + .introduction { display: inline; } .ptx-content article.example-like > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article.example-like > .exercise-like > .para { margin-top: 1.25em; } .ptx-content .taxon { font-style: italic; } .ptx-content .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .ptx-content .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .ptx-content .sageanswer .output { display: inline-block; vertical-align: top; } .ptx-content .CodeMirror-code pre.CodeMirror-line { padding-bottom: 5px; padding-left: 6px; } .ptx-content .hidden-content, .pretext .hidden-content { display: none; } .ptx-content hr.ptx-pagebreak { width: 30em; text-align: center; margin-left: auto; margin-right: auto; margin-bottom: 2em; margin-top: 0; height: 4em; border: 0; border-bottom: 1px dashed #ccc; } .ptx-content hr.ptx-pagebreak:after { content: "page"; display: inline-block; position: relative; top: 4em; font-size: 80%; padding: 0 0.25em; background: white; } .ptx-content .example-like > .exercise-like > .para:first-of-type { display: inline; } .ptx-content .example-like > .exercise-like > .aside-like { margin-top: -3em; } .ptx-content .example-like > .exercise-like > .aside-like.front { margin-top: 0; } .ptx-content meta { display: none; } .ptx-content .summary-links a { color: #671d12; background: #f0f0f0; text-decoration: none; cursor: pointer; } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: white; background: #671d12; } .ptx-content .summary-links a .codenumber { color: #303030; margin-right: 0.41667em; } .ptx-content .summary-links a:hover .codenumber, .ptx-content .summary-links a:focus .codenumber { color: #f0f0f0; } .ptx-content .summary-links { margin-top: 4em; } .ptx-content section + .summary-links { margin-top: 2em; } .ptx-content .summary-links ul { list-style-type: none; } .ptx-content .summary-links li { margin-top: 0; } .ptx-content section .summary-links li .title { font-style: normal; } .ptx-content .summary-links a { position: relative; display: block; font-size: 1.5em; line-height: 1.25em; padding: 0.41667em 0.83333em; margin-top: 0.20833em; border-radius: 3px; padding-right: 2.06667em; } .ptx-content .summary-links a:after { right: 0.83333em; } .ptx-content .summary-links a:after { content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid #c9c9c9; } .ptx-content .summary-links a, .ptx-content .summary-links a:link, .ptx-content .summary-links a:visited { cursor: pointer; } .ptx-content .summary-links a:hover:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a { font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-content .summary-links a { font-size: 1em; line-height: 1.25em; } } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a:active { position: relative; color: white; background: #932919; text-decoration: none; box-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px 5px inset; } .ptx-content .summary-links a:active:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a:focus { outline: thin dotted #333; outline-offset: -2px; } body.standalone.worksheet .ptx-content .onepage > .heading { margin-top: 0; font-size: 1.3em; } body.standalone.worksheet .ptx-content .onepage > .introduction { margin-top: 0.4em; } body.standalone.worksheet .ptx-content .onepage > .introduction > .heading { font-size: 1.1em; } body.standalone.worksheet .ptx-content .onepage .solutions, body.standalone.worksheet .ptx-content .onepage .instructions { display: none; } body.standalone .ptx-content .worksheet { padding: 40px 0 45px 0; border: 2px solid grey; margin: 0; } body.standalone .ptx-content .onepage { padding: 40px 45px 45px 55px; border-bottom: 2px solid grey; margin: 0; } body.standalone .ptx-content .onepage + .onepage { border-top: 2px solid grey; } body.standalone .ptx-content .onepage.firstpage { padding-top: 0; } body.standalone .ptx-content .onepage.lastpage { padding-bottom: 0; border-bottom: none; } body.standalone .ptx-content .worksheet > *:last-child { padding-bottom: 0 !important; } .ptx-content .onepage + .onepage { margin-top: 2.5em; padding-top: 1.5em; border-top: 1px dashed #aaa; } .ptx-content .onepage + .onepage::before { content: "pagebreak"; text-align: center; margin-left: 40%; padding-left: 1em; padding-right: 1em; position: absolute; top: -0.8em; font-size: 80%; font-style: italic; background: white; } body.standalone .ptx-content .onepage + .onepage { margin-top: 10px; } body.standalone .ptx-content .onepage + .onepage::before { content: none; } body.standalone .ptx-content .onepage article { padding-left: 0; border: none; } body.standalone .ptx-content .onepage article::after { all: unset; } .ptx-content .onepage > .para:first-child, .ptx-content .onepage > article:first-child { margin-top: 0; } .ptx-content section + .onepage.firstpage, .ptx-content article + .onepage.firstpage, .ptx-content .para + .onepage.firstpage { margin-top: 1.25em; } body.worksheet .ptx-content .onepage .sbspanel + .sbspanel > .exercise::before { content: ""; position: absolute; top: 0; bottom: 0; right: 0; left: 0; padding-left: 1.25em; border-left: 1px solid grey; margin-left: -1.25em; z-index: -100; } body.standalone.worksheet .ptx-content section article.task { margin-left: 0; } body.standalone.worksheet .ptx-content section article.task > .heading { font-weight: normal; } body.standalone .autopermalink { display: none; } body.standalone.worksheet .ptx-content .onepage .workspace { border: 2px dotted grey; background: #f3fff3; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed { border: 2px dotted grey; background: #ffe; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed.tight { border: 15px solid; border-image: repeating-linear-gradient( -35deg, #f33, #f33 10px, #000 10px, #000 20px) 20; background: yellow; } body.has-sidebar-left.mathbook-loaded.standalone.worksheet .ptx-page .ptx-main { margin-left: 0; } body.standalone.worksheet .ptx-content .goal-like { border: none; padding: 0; } body.standalone.worksheet .ptx-content .goal-like > .heading { margin-top: -0.5em; padding: 0; margin: 0; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading { display: inline; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading, body.standalone.worksheet .ptx-content section.worksheet > .objectives, body.standalone.worksheet .ptx-content section.worksheet > .introduction, body.standalone.worksheet .ptx-content section.worksheet > .conclusion { margin-left: 55px; margin-right: 40px; } body.standalone.worksheet .ptx-content section.worksheet > .heading + .para { display: inline; } .ui-dialog.ui-widget.ui-widget-content.ui-corner-all.ui-draggable.ui-resizable { left: 0 !important; top: 0 !important; } .ptx-content a.url, .ptx-content a.external { color: #22a; } .ptx-content a.url:hover, .ptx-content a.external:hover { background: #ffd; } .ptx-content .poem { margin-top: 1.5em; } .ptx-content .poem { display: table; margin-top: 1.5em; margin-left: auto; margin-right: auto; margin-bottom: 0; width: auto; max-width: 90%; } .ptx-content .poem > .heading { display: block; text-align: center; } .ptx-content section article.poem > .heading::after { content: ""; } .ptx-content .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .ptx-content .poem .author { font-style: italic; margin-top: 0.75em; } .ptx-content .poem .author.left { text-align: left; } .ptx-content .poem .author.center { text-align: center; } .ptx-content .poem .author.right { text-align: right; } .ptx-content .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .ptx-content .poem .stanza + .stanza { margin-top: 1em; } .ptx-content .poem .heading + .stanza { margin-top: 0.2em; } .ptx-content .poem .heading + .line { margin-top: 0.2em; } .ptx-content .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .ptx-content .poem .line.center { text-align: center; } .ptx-content .poem .line.right { text-align: right; } .ptx-content .poem .tab { margin-left: 2em; } .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } .toolBPanel { overflow: hidden !important; } .toolBPanel:hover { overflow: auto !important; } #aboelkins-ACS .ptx-main .ptx-content > section:first-of-type > section:first-of-type > .project-like:first-of-type li { font-size: 300%; } .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } .ptx-content .marginresource { position: relative; height: 0; left: 40em; top: 1em; } .ptx-content .marginresource a { color: blue; } .ptx-content .marginresource a[knowl] { border-bottom: 1px dotted blue; } .ptx-content .marginresource .icon { font-size: 200%; margin-right: 1em; display: inline-block; } .ptx-content .marginresource .resource_description { display: inline-block; } .ptx-content .marginresource .resource_links { display: block; margin-left: 2em; } .collectedworks .knowl-output { border: 12px solid #D6E3FF; background: none repeat scroll 0% 0% #FAFCFF; border-radius: 4px; margin-bottom: 1.25em; } .collectedworks .subjectwork { max-width: 750px; } .collectedworks .bib { margin-bottom: 1em; } .collectedworks .bibitem + .bibentry { display: inline; } .collectedworks .bibitem { display: inline; font-weight: bold; margin-right: 1em; } .collectedworks .work .title a { text-decoration: none; color: #009; } .iconlegend { position: absolute; margin-top: 0.5em; top: 0; left: 920px; line-height: 1; } .iconlegend .icon_name { font-size: 90%; margin-right: 1em; } .icongroup + .icongroup { margin-left: 1em; } label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } .feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .ptx-content .webwork-button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; background-color: #ffffff; } .ptx-content .webwork-button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .webwork-button:active { cursor: pointer; background-color: #a0a0a0; border: 1px solid #999; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } .ptx-content .exercise-wrapper form button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; color: black; background-color: #ffffff; } .ptx-content .webwork-button.activate { width: 22px; height: 22px; background-image: url(https://raw.githubusercontent.com/openwebwork/webwork2/main/htdocs/images/favicon.ico); background-size: contain; position: absolute; right: -35px; } article.project-like > .heading + div.ptx-runestone-container > div.runestone, article.exercise-like > .heading + div.ptx-runestone-container > div.runestone { margin-top: 0.5em; } .ptx-content .bottom { position: unset; } .ptx-content .rsdraggable { font-size: 100%; } .ptx-content .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .exercise-wrapper form button:active { background-color: #f0f0f0; } .ptx-content .exercise-wrapper form button + button { margin-left: 0.8em; } .ptx-content .exercise-wrapper, .ptx-content .exercise-wrapper form, .ptx-content .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .ptx-content .knowl .exercise-wrapper, .ptx-content .knowl .exercise-wrapper form, .ptx-content .knowl .exercise-wrapper form > div:first-child { width: 100%; } .ptx-content .exercise-wrapper > .para:first-child, .ptx-content .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .ptx-content .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .ptx-content .cols2 .heading + .exercise-wrapper { width: auto; } @media screen and (max-width: 600px) { .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(33.3% - 2em); } .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } @media screen and (max-width: 850px) and (min-width: 786px) { .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(33.3% - 2em); } .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } .APEXlogo { white-space: nowrap; } .APEXlogo .A { margin-right: -0.07em; } .APEXlogo .P { margin-right: -0.33em; position: relative; top: -0.3em; } .APEXlogo .E { position: relative; top: 0.33em; } .runestone-profile .dropdown-content { position: absolute; display: none; right: 0; top: 35px; text-align: left; border: 1px solid; border-color: #600; border-color: var(--tocborder); } .runestone-profile.dropdown:hover { background-color: #ddd; overflow: visible; } .runestone-profile.dropdown:hover .dropdown-content { display: block; } .runestone-profile .dropdown-content { background-color: white; z-index: 1800; min-width: 100px; padding: 5px; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: #662211; padding: 2px 8px; } .runestone-profile.dropdown .dropdown-content a:hover { background-color: #671d12; color: #ffffff; text-decoration: none; background-color: var(--chaptertoc); } .runestone-profile.dropdown .dropdown-content hr { margin-bottom: 4px; margin-top: 4px; border-color: #600; border-color: var(--sectiontoctext); } .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox { } .ptxsearch { height: 35px; flex: 1 1; } .searchbutton .name { display: none; } .searchwidget { text-align: right; } .searchwidget input { } .helpbox { display: none; } .detailed_result { margin-bottom: 10px; } .all_results a:link { text-decoration: none; font-size: large; } .all_results a:hover { background-color: lightgray; } .searchresults a:hover { background-color: #eee; } .searchresults a { text-decoration: none; color: #222; } .searchresults a:hover { text-decoration: underline; color: #33f; } .searchresults ul li { list-style-type: none; } ol.searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; } ol.searchresults > li { list-style-type: none; } .search-result-score { display: none; } .high_result { font-weight: 700; } .medium_result { font-weight: 500; } .low_result { font-weight: 200; } .no_result { font-weight: 200; color: #444; } .detailed_result .no_result { font-size: 90%; } .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; left: 152px; width: 600px; padding: 1em; border: 0.2em solid #009; background: aliceblue; z-index: 5000; display: flex; flex-direction: column; } .search-results-heading { border-bottom: 1px solid rgba(0, 0, 125, 0.5); } .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; } .closesearchresults { display: flex; justify-content: space-between; align-items: center; border: 1px solid black; } .closesearchresults:hover { color: #c00; background-color: #fee; border-color: #f00; } .closesearchresults + h2 { margin-top: -1em; } .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .search-result-bullet { margin-top: 0.3em; } .search-result-clip { font-size: 80%; font-style: italic; color: #444; padding-left: 15px; } .search-results-unshown-count { margin-top: 0.6em; } .search-result-clip-highlight { background: rgba(255, 255, 0, 0.5); } @media screen and (max-width: 800px) { .searchresultsplaceholder { width: 80vw; left: 10vw; bottom: 10vh; } } .pretext .ptx-masthead { position: relative; background: #fafafa; min-height: inherit; border: none; position: relative; } .pretext .ptx-navbar { position: sticky; top: 0; max-width: 904px; height: 36px; } .pretext .ptx-page { position: relative; min-height: 100vh; } .ptx-content { min-height: 60vh; } .pretext .ptx-sidebar { position: sticky; top: 36px; left: 0; float: left; width: 240px; } .pretext .ptx-toc { position: sticky; top: 50px; box-sizing: border-box; overflow-y: scroll; height: calc(100vh - 60px); } .pretext .ptx-page > .ptx-main { display: block; position: relative; overflow-y: hidden; margin: 0 0 0 240px; padding: 1px 0 0 0; background: white; border-left: 1px solid #ccc; } .pretext .ptx-page .ptx-sidebar.hidden + .ptx-main { margin-left: 0; } .pretext .ptx-page > .ptx-main.notoc { margin-left: 0; transition-property: margin-left; transition-duration: 0.3s; } @media screen and (max-width: 800px) { .pretext .ptx-page > .ptx-main { margin-left: 0; left: auto; } .pretext .ptx-page-footer { margin-bottom: 38px; } } .pretext .ptx-page > .ptx-main .ptx-content { max-width: 600px; margin: 32px; } @media screen and (max-width: 663px) { .pretext .ptx-page > .ptx-main .ptx-content { margin: 28px; } } .ptx-content.serif .para .para, .ptx-content[data-font=RS] .para .para { font-size: 100%; } .ptx-content[data-font=RS] .code-inline { background: #f6f6f6; border: 1px solid #eee; padding: 0.01em 0.15em 0.03em 0.15em; margin-left: 0.15em; margin-right: 0.15em; border-radius: 0; } .pretext .ptx-content-footer { margin-top: 2em; display: flex; justify-content: space-around; max-width: 600px; margin-left: 32px; } .pretext .ptx-content-footer .button { min-width: 80px; height: 35px; color: #333333; background-color: #ededed; border: 1px solid #bababa; padding: 0 10px; display: flex; gap: 10px; align-items: center; justify-content: center; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .pretext .ptx-content-footer .button .icon { margin: 0 -7px; } .pretext .ptx-content-footer .button:hover, .pretext .ptx-content-footer .button:active, .pretext .ptx-content-footer .button:focus { background-color: #fafafa; } .pretext .ptx-sidebar.visible { display: block; } .pretext .ptx-page-footer .feedback-link { cursor: pointer; text-align: center; color: #333333; background-color: #ededed; border: 1px solid #bababa; margin: 1.5em 0 0 0; padding: 0 1em 0 1em; height: 2em; display: flex; align-items: center; } .pretext .ptx-page-footer { background: #f4f4f4; margin-top: 2em; padding-top: 0; max-width: 900px; border-top: 2px solid var(--sectiontoctext); border-bottom: 2px solid var(--sectiontoctext); display: flex; flex-direction: row; justify-content: space-around; position: relative; } .pretext .ptx-page-footer > a { margin: 1em 0; } .pretext .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } @media screen and (max-width: 800px) { .pretext .ptx-navbar { position: fixed; top: auto; bottom: 0; z-index: 1100; } .pretext .ptx-sidebar { display: none; position: fixed; top: 10px; z-index: 1000; background: white; } .pretext .ptx-content-footer { display: none; } .pretext .ptx-toc { height: calc(100vh - 50px); } } .ptx-masthead .ptx-banner { border-bottom: 1px solid #d4d4d4; border-top: 1px solid transparent; overflow: hidden; padding-top: 0.625em; padding-bottom: 1.125em; border-bottom: none; } .ptx-masthead { max-width: 904px; border-right: 1px solid #bababa; } .ptx-masthead .title-container { font-size: 1em; padding-left: 9.68px; overflow: hidden; } @media screen and (max-width: 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; margin-top: 0.625em; } } .ptx-masthead .title-container > .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; margin: 0; font-size: 2em; line-height: 1.25em; color: #932919; } @media screen and (max-width: 480px) { .ptx-masthead .title-container > .heading { font-size: 1.5em; line-height: 1.25em; margin: 0; margin-bottom: 0.41667em; } } .ptx-masthead .title-container > .heading a { color: #932919; background: none; text-decoration: none; } .ptx-masthead .title-container > .heading .subtitle { font-weight: normal; } @media screen and (max-width: 800px) { .ptx-masthead .title-container > .heading .subtitle { display: block; font-size: 1.16667em; line-height: 1.42857em; color: #595959; } .ptx-masthead .title-container > .heading .subtitle:before { content: normal; } } .ptx-masthead .logo-link { position: relative; float: left; font-size: 50px; margin-top: 0.1em; margin-left: 9.68px; text-align: center; line-height: 1; } .ptx-masthead .logo-link img { width: auto; height: auto; max-height: 1em; } .ptx-masthead .logo-link:empty:before { font-family: "Open Sans"; font-size: 1em; content: "\2211"; line-height: 1; width: 1em; display: inline-block; vertical-align: top; text-align: center; color: #ccc; } .ptx-masthead .logo-link:empty:hover:before { color: #932919; } .ptx-masthead .logo-link:empty:active:before { color: #3572a0; } .ptx-masthead .logo-link { background: transparent; border: none; text-decoration: none; } @media screen and (max-width: 480px) { .ptx-masthead .logo-link { display: block; float: none; margin: 0; font-size: 50px; } } .ptx-masthead .byline { color: #333333; font-weight: normal; margin: 0; font-size: 1.3125em; line-height: 1.42857em; min-height: inherit; font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-masthead .byline { margin-top: 0; font-size: 1em; line-height: 1.25em; } } .ptx-masthead .byline a { color: #333333; } .ptx-masthead .byline a:hover, .ptx-masthead .byline a:focus { color: #932919; } .ptx-masthead .byline a:active { color: #3572a0; } nav.ptx-navbar { background: #ededed; border: 0; border-top: 1px solid #bababa; border-bottom: 1px solid #bababa; margin: 0; z-index: 100; font-family: "Open Sans"; overflow: visible; display: flex; } .ptx-navbar-contents { display: flex; flex: 1; max-width: 100%; } .ptx-navbar .button { font-size: 1em; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: #333333; background-color: #ededed; border: 0; border-right: 1px solid #bababa; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .ptx-navbar .button:focus { outline: thin dotted #333; outline-offset: -2px; } .ptx-navbar .button:active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-navbar .button:hover { background-color: #fafafa; } .ptx-navbar .button:active { background-color: #e0e0e0; } .ptx-navbar .button.disabled { opacity: 0.4; color: #333333; background: #ededed; box-shadow: none; } .ptx-navbar .toc-toggle { width: 240px; gap: 0.4em; } .ptx-navbar .button .icon { font-size: 1.5em; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls) { display: flex; } .ptx-navbar .treebuttons { flex: 1 1 210px; justify-content: end; } .ptx-navbar .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .pretext .navbar .dropdown { height: 34px; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls) > *:first-child { border-left: 1px solid #bababa; } .ptx-navbar .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .ptx-navbar .treebuttons .icon { margin: 0 -7px; } .ptx-navbar :is(.index-button, .calculator-toggle) .icon { display: none; } .ptx-navbar :is(.runestone-profile, .activecode-toggle, .searchbutton) .name { display: none; } .ptx-navbar .index-button { width: 70px; } .ptx-navbar .calculator-toggle { width: 60px; min-height: 32px; text-align: center; border-radius: 20px; margin-left: 5px; border: 2px solid #66f; line-height: 25px; margin-top: 1px; background-color: #eef; } .ptx-navbar .calculator-toggle.open { background: #fee; border: 2px solid #f66; } @media screen and (max-width: 800px) { .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; background: #ededed; box-shadow: rgba(0, 0, 0, 0.3) 0px -2px 5px; } .ptx-navbar .nav-runestone-controls { flex: 0; } .ptx-navbar .toc-toggle { flex: 2 1 100px; } .ptx-navbar .treebuttons { flex: 3 1 150px; } .ptx-navbar .treebuttons > * { flex: 1 1; min-width: 35px; } .ptx-navbar .index-button { display: none; } .ptx-navbar :is(.treebuttons) > *:first-child { border-left: 0; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button) .name { display: none; } .pretext .ptx-navbar :is(.calculator-toggle, .index-button) .icon { display: inline-block; } .ptx-navbar .nav-runestone-controls > *:first-child { border-left: 0; } .ptx-navbar .calculator-toggle { width: auto; height: 35px; border-radius: 0; margin-left: 0; border: 0; border-right: 1px solid #bababa; line-height: inherit; margin-top: 0; background-color: inherit; } } .ptx-toc { width: 240px; margin: 0; font-size: 14.72px; overflow-y: auto; overflow-x: hidden; } .ptx-toc::after { content: url("data:image/svg+xml; utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='338 3000 8772 6866'%3E%3Cg style='stroke-width:.025in; stroke:black; fill:none'%3E%3Cpolyline points='472,3590 472,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,9448 A 4660 4660 0 0 1 8598 9259 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4488,9685 A 4228 4228 0 0 0 472 9732 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,3590 A 4241 4241 0 0 1 8598 3496 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,3496 A 4241 4241 0 0 1 4724 3590 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,9259 A 4507 4507 0 0 1 4724 9448 '%3E%3C/path%3E%3Cpolyline points='5385,4299 4062,8125 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8598,3496 8598,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='850,3496 850,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='4960,9685 4488,9685 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='3070,4582 1889,6141 3070,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='6418,4582 7600,6141 6418,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8976,3590 8976,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4960,9685 A 4228 4228 0 0 1 8976 9732 '%3E%3C/path%3E%3C/g%3E%3C/svg%3E"); display: block; height: 13em; padding: 2em 1em; background: #fff; } .ptx-toc > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 8px solid #999; } .ptx-toc { --codenumber-pad-left: 0.3rem; --codenumber-pad-right: 0.5rem; --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); } .ptx-toc:is(.depth1, .parts.depth2) { --codenumber-pad-right: 0.5rem; } .ptx-toc .toc-item-list { margin: 0px; padding: 0px; list-style-type: none; } .ptx-toc .toc-item { border-top: 1px solid var(--tocborder, #d1d1d1); } .ptx-toc .toc-title-box { display: flex; } .ptx-toc .toc-title-box > .internal { position: relative; display: flex; flex-grow: 1; padding: 0.2em; font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: bold; } .ptx-toc .toc-item-list .toc-item-list .toc-title-box > .internal { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: normal; } .ptx-toc > .toc-item-list > .toc-item { border-top: 2px solid var(--tocborder, #d1d1d1); } .ptx-toc .toc-item.active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-toc .codenumber { min-width: var(--toc-indent-first); padding-left: var(--codenumber-pad-left); padding-right: var(--codenumber-pad-right); display: inline-block; text-align: left; flex-grow: 0; } .book .ptx-toc .toc-chapter .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .codenumber { font-size: 80%; padding-top: 0.16em; min-width: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber { min-width: var(--toc-indent-third); visibility: hidden; } .ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber { visibility: visible; } .ptx-toc .toc-title-box .title { flex-grow: 1; } .ptx-toc .toc-item .toc-title-box .title { margin-left: var(--toc-indent-first); } .book .ptx-toc .toc-chapter .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .title { margin-left: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { margin-left: var(--toc-indent-third); } .ptx-toc .toc-item > .toc-title-box .codenumber + .title { margin-left: 0 !important; } .ptx-toc ul.structural ul.structural .title:empty::after { content: "empty heading!"; font-weight: bold; } .ptx-toc .toc-chapter .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { font-size: 90%; } .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title { font-style: italic; } .ptx-toc ul.structural li a.has-chevron { padding-right: 2em; } .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth1 ul.structural .toc-item.contains-active { background-color: var(--chaptertocactive); color: var(--chaptertoctextactive); } .ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active { background-color: var(--parttocactive); color: var(--parttoctextactive); } .ptx-toc.focused ul.structural:not(.contains-active) > li { display: none; } .ptx-toc.focused ul.structural li.active > ul > li { display: block; } .ptx-toc.focused ul.structural:not(.contains-active) > li.visible { display: block; } .ptx-toc.focused ul.structural li.active > ul > li.hidden { display: none; } .ptx-toc.focused > ul.structural > li:not(:first-child) { margin-top: 0em; } .ptx-toc.focused ul.structural li ul.structural a:hover { border: 0; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 30px; line-height: 18px; font-variation-settings: "wght" 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--highlighttoc); color: var(--highlighttoctext); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--highlighttoctext); } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); } :root { --parttoc: var(--chaptertoc); --parttoctext: var(--chaptertoctext); --parttocactive: var(--documenttitle); --parttoctextactive: var(--chaptertoctextactive); } @supports (background: color-mix(in srgb, red 50%, blue)) { :root { --parttoc: color-mix(in srgb, var(--chaptertoc), black 15%); } } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowlLinkColor); border-bottom: 1px dotted var(--knowlLinkColor); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--linkbackground); border-bottom-color: transparent; } .knowl__content { margin: 0.2em; border: 6px solid var(--knowlborder); border-radius: 0.4em; padding: 0.8em; background-color: var(--knowlbackground); } .source-view__content { margin: 0.2em 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like, .proof)::after { content: "" !important; border-bottom: none; margin: 0; padding: 0; width: 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like) { padding-left: 0; border-left: none; } .ptx-content .knowl__content > article:is(.proof) { padding-right: 0; border-right: none; } .knowl__content .knowl__content { background-color: var(--knowlNested1Background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested2Background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested3Background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested4Background); } .ptx-content .knowl__content > figure { margin-left: 0; margin-right: 0; } .ptx-content .proof { border-right: 1px solid #666; padding-right: 0.625em; margin-right: -0.725em; } .ptx-content .proof:after { content: ""; border-bottom: 1px solid #666; display: block; margin-left: auto; margin-right: -0.625em; width: 1.5em; padding-bottom: 0.25em; } .ptx-content.epub .proof { margin-right: 1px; } .ptx-content .proof .proof { margin-right: -0.2em; border-right: 1.5px solid #ddd; } .ptx-content .proof .proof:after { border-bottom: 1.5px solid #ddd; width: 1em; } .ptx-content article.theorem-like, .ptx-content article.definition-like, .ptx-content article.example-like, .ptx-content article.project-like, .ptx-content article.remark-like, .ptx-content article.openproblem-like, .ptx-content article.openproblems-like, .ptx-content article.computation-like { padding-left: 0.4em; border-left: 1px solid #569; } .ptx-content.epub article.theorem-like, .ptx-content.epub article.definition-like, .ptx-content.epub article.example-like, .ptx-content.epub article.project-like, .ptx-content.epub article.remark-like, .ptx-content article.openproblem-like, .ptx-content article.openproblems-like, .ptx-content.epub article.computation-like { margin-left: 1px; } .ptx-content article.theorem-like::after, .ptx-content article.definition-like::after, .ptx-content article.example-like::after, .ptx-content article.project-like::after, .ptx-content article.remark-like::after, .ptx-content article.openproblem-like::after, .ptx-content article.openproblems-like::after, .ptx-content article.computation-like::after { content: ""; border-bottom: 1px solid #569; display: block; margin-right: auto; margin-left: -0.5em; padding-top: 0.25em; width: 1.5em; } .ptx-content article.project-like { border-left: 1px dotted #569; } .ptx-content article.project-like::after { border-bottom: 1px dotted #569; } .ptx-content article.commentary { padding-left: 0.6em; border-left: 3px solid #c33; } .ptx-content article.commentary::after { content: ""; border-bottom: 3px solid #c33; display: block; margin-right: auto; margin-left: -0.6em; padding-top: 0.25em; width: 1.5em; } .ptx-content .assemblage-like { border: solid 2px #1100AA; border-radius: 12px; padding: 10px; background-color: #f4f4fe; } .ptx-content .assemblage-like .heading { margin-top: 0; } .ptx-content .assemblage-like + .sidebyside { margin-top: 1.25em; } .ptx-content section article.assemblage-like .heading + .para { display: block; } .ptx-content .goal-like { border: solid 3px #999999; padding: 0.7em; margin-bottom: 1em; } .ptx-content .goal-like > .heading { margin-top: -1.5em; background-color: white; display: table; padding: 5px 1em; margin-left: 5px; font-style: italic; font-size: 120%; } .ptx-content .goal-like > .heading .codenumber { display: none; } .ptx-content .goal-like > .heading::after { display: none; } .ptx-content .aside-like { position: absolute; margin-left: 45%; overflow-x: hidden; max-width: 495px; max-height: 7em; overflow-y: hidden; border: none; padding: 4px 10px 0 10px; color: #888; z-index: 100; } .ptx-content .example-like .aside-like { margin-top: 0; position: absolute; } .ptx-content .aside-like { font-size: 90%; } .ptx-content .aside-like { margin-bottom: 5px; background-color: #f5faff; box-shadow: 0 0 1em 0.2em #fff inset; } .ptx-content .aside-like .para { overflow-x: auto; } .ptx-content .aside-like:first-child { margin-top: -2.25em; } .ptx-content .aside-like:after { content: ""; position: absolute; z-index: 1; top: 0em; bottom: 0; left: 0; pointer-events: none; background-image: linear-gradient( to bottom, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 1) 90%); width: 550px; height: 8em; } .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { position: relative; z-index: 0; padding: 8px 15px 10px 15px; padding: 2px 10px; margin: 5px 0px 5px 10px; border: 2px solid #dcebfa; max-height: none; max-width: 550px; color: inherit; font-size: 100%; box-shadow: none; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .example-like .aside-like.front { margin-top: 1.25em; } .ptx-content .aside-like.front + p { margin-top: 1.25em !important; padding-top: 0; } .ptx-content .aside-like .aside-like { background-color: #fafff5; border: 1px dotted #aaa; } .ptx-content article.aside-like > p:first-child { margin-top: 0; } .ptx-content .aside-like > .heading { font-size: 95%; } .ptx-content .aside-like + * { margin-top: 3em; margin-right: 3em; } @media screen and (min-width: 943px) { .ptx-content .aside-like + * { margin-right: 0; } } @media screen and (min-width: 1100px) { .ptx-content .aside-like, .ptx-content .aside-like.front, .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { position: absolute; margin-top: -2em; margin-left: 660px; max-width: 200px; width: 200px; color: inherit; } .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { max-height: none; max-width: 223px; border: 2px solid #dcebfa; } .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { margin-left: 654px; } .ptx-content .aside-like + * { margin-top: 1.25em; margin-right: 0; } .ptx-content .aside-like + .solutions, .ptx-content .aside-like + .instructions { margin-top: 0; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .aside-like:nth-of-type(3n+1) { margin-left: 660px; } .ptx-content .aside-like:nth-of-type(3n) { margin-left: 680px; } .ptx-content .aside-like:nth-of-type(3n+2) { margin-left: 640px; } } .ptx-content .aside-like:hover:after, .ptx-content .aside-like:focus:after { top: 3em; height: auto; background-image: none; } .ptx-content .aside-like:hover, .ptx-content .aside-like:focus { color: inherit; padding: 2px 8px 0 8px; border: 2px solid #dcebfa; height: auto; max-height: none; } .ptx-content .aside-like.front:hover, .ptx-content .aside-like.front:focus { padding: 4px 10px; } .ptx-content section dl dd .aside-like { margin-top: 0 !important; margin-left: 100px !important; } .ptx-content section dl dd .aside-like.front { margin-left: -300px !important; } @media screen and (max-width: 1099px) { .ptx-content .aside-like { position: relative; float: right; z-index: 0; overflow-x: hidden; margin-left: 1em; margin-top: 1em; max-width: 195px; max-height: 4em; margin-right: -8em; } .ptx-content li > .aside-like:last-child { position: absolute; } } .searchbox .searchresultsplaceholder { background: #eaf0f6; } :root[data-legacy-colorscheme=blue_green] { --documenttitle: #2a5ea4; --bodytitle: #2b5f82; --bodysubtitle: #a62e1c; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #28803f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } :root[data-legacy-colorscheme=blue_grey] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #525252; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=blue_red] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #932c1c; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=blue_red_dark] { --bodyfontcolor: #eee; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abf; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #316; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #932c1c; --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: #666; --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); body.pretext { background: #222; } .pretext .ptx-page > .ptx-main { background: #444; color: var(--bodyfontcolor); } .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .ptx-navbar { background: #333; } .ptx-navbar .button { background-color: #635; color: #fff; } .ptx-navbar .button:hover { background-color: #fafafa; color: #000; } .ptx-navbar .calculator-toggle { background-color: #336; } .ptx-navbar .calculator-toggle:hover { background-color: #fce; } .pretext .ptx-masthead { background: #555; } .pretext .ptx-masthead .title-container > .pretext .heading, .pretext .ptx-masthead .title-container > .heading a, .pretext .ptx-masthead .logo-link:empty:hover::before, .pretext .ptx-masthead .byline, .pretext .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext .ptx-content .code-inline { color: var(--documenttitledark); } .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext .ptx-content [data-knowl], .pretext .ptx-content [data-knowl]:hover, .pretext .ptx-content [data-knowl]:active, .pretext .ptx-content [data-knowl].active { color: var(--documenttitlelight); } .pretext .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } } :root[data-legacy-colorscheme=bluegreen_grey] { --bluegreen: hsl(192, 98%, 23%); --documenttitle: var(--bluegreen); --bodytitle: var(--bluegreen); --bodysubtitle: var(--bluegreen); --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #ddd; --chaptertoctext: var(--bluegreen); --chaptertocactive: hsl(192, 98%, 19%); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: var(--bluegreen); --sectiontocactive: hsl(192, 98%, 19%); --sectiontoctextactive: white; --tocborder: var(--bluegreen); --highlighttoc: var(--bluegreen); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } :root[data-legacy-colorscheme=brown_gold] { --documenttitle: #472200; --bodytitle: #8e4a0c; --bodysubtitle: #864E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #eaaf0f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #140a00 --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=darkmartiansands] { --documenttitle: #880000; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #b58039; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #550000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=default] { --documenttitle: #932919; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --parttoc: #234b6a; --parttoctext: white; --parttocactive: var(--documenttitle); --parttoctextactive: white; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblagebackground: #F0EAF6; --assemblageborder: #CAAEE0; --assemblagedarkborder: #472664; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=focused_gray_aqua] { --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #1d686e; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #343b48; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --toc-text-dark: #343b48; --toc-text-light: white; --tocborder: var(--toc-text-dark); --active-toc-item: #e5ca34; --parttoc: var(--toc-text-dark); --parttoctext: var(--toc-text-light); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #1d686e; --chaptertoctext: var(--toc-text-light); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fffffd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: var(--active-toc-item); --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } :root[data-legacy-colorscheme=focused_light] { --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --toc-text-dark: #333; --tocborder: var(--toc-text-dark); --active-toc-item: #dbebf1; --parttoc: #e8e8e8; --parttoctext: var(--toc-text-dark); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #f2f2f2; --chaptertoctext: var(--toc-text-dark); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fdfdfd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: #c2e5f2; --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } :root[data-legacy-colorscheme=green_blue] { --documenttitle: #248038; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #2650a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #195827; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=green_plum] { --documenttitle: #28803f; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #822060; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20602f; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=maroon_grey] { --documenttitle: #660000; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6d8899; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #330000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=martiansands] { --documenttitle: #944921; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #d19e69; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #6a3418; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=orange_navy] { --documenttitle: #d64000; --bodytitle: #00408a; --bodysubtitle: #9e2f00; --bodytitlehighlight: #ffcdbd; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #00326b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #00326b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #006deb; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=pastel_blue_orange] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffffff; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } :root[data-legacy-colorscheme=red_blue] { --documenttitle: #932919; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_amethyst] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6f080b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #008099; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_emerald] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d9ffe9; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #16a67d; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_turquoise] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #008099; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } body.pretext { color: var(--bodyfontcolor); } .ptx-masthead .title-container > .heading, .ptx-masthead .title-container > .heading a, .ptx-masthead .logo-link:empty:hover::before, .ptx-masthead .byline a { color: var(--documenttitle, #2a5ea4); } .ptx-masthead .title-container > .heading a:active, .ptx-masthead .logo-link:empty:active::before, .ptx-masthead .byline a:active { color: var(--bodytitle, #932c1c); } .ptx-toc .toc-item { color: var(--sectiontoctext, #404040); background-color: var(--sectiontoc); border-color: var(--tocborder, #afc2e5); } .ptx-toc .toc-item.active { color: var(--sectiontoctextactive); background-color: var(--sectiontocactive); border-color: var(--highlighttocborder); } .ptx-toc:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc > .toc-item-list > .toc-item { color: var(--chaptertoctext); background-color: var(--chaptertoc); } .ptx-toc > .toc-item-list > .toc-item.active { color: var(--chaptertoctextactive); background-color: var(--chaptertocactive); border-color: var(--highlighttocborder); } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--highlighttoctext, #321a0c); background-color: var(--highlighttoc); border-color: var(--highlighttocborder, #ec704b); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter) { background-color: var(--parttoc); color: var(--parttoctext); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter).active { background-color: var(--parttocactive); color: var(--parttoctextactive); } .ptx-toc.focused .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused .toc-chapter.active { background-color: var(--chaptertocactive); color: var(--chaptertoctextactive); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item { background-color: var(--sectiontoc); color: var(--sectiontoctext); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item.active { background-color: var(--sectiontocactive); color: var(--sectiontoctextactive); } .ptx-content .summary-links a { color: var(--sectiontoctext); } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: var(--highlighttoctext); background: var(--highlighttoc); } .ptx-content .para > a.internal { color: var(--bodysubtitle); } .ptx-content .para > a.external { color: var(--bodysubtitle); } .ptx-content .para > a.internal:hover, .ptx-content .para > a.internal:hover *, .ptx-content .para > a.internal:focus, .ptx-content .para > a.internal:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .para > a.external:hover, .ptx-content .para > a.external:hover *, .ptx-content .para > a.external:focus, .ptx-content .para > a.external:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .playvideo { background-color: var(--videoplay); } .ptx-content .goal-like { border-color: var(--goalborder); } .ptx-content .assemblage-like { border-color: var(--assemblageborder); background-color: var(--assemblagebackground); } .ptx-content .knowl-output { border-color: var(--knowlborder); background-color: var(--knowlbackground); } .pretext[data-atmosphere=pastel], .pretext[data-atmosphere=pastel] .ptx-main { background: #dbf5ff; background: #efe; } .pretext[data-atmosphere=pastel] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoc: #dcdcf9; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffeeee; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoc: #fadfa3; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } .pretext[data-atmosphere=pastel] .ptx-toc { scrollbar-color: var(--documenttitlelight) #efe; } .pretext[data-atmosphere=pastel] .ptx-navbar { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere=pastel] .ptx-masthead { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere=pastel] .ptx-sidebar { background: #ffd; } .pretext[data-atmosphere=darktwilight] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abd; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(9, 72%, 30%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 40%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 33%); --navbarbackground: hsl(0, 0%, 33%); --footerbackground: hsl(0, 0%, 30%); --mainbackground: hsl(0, 0%, 27%); --buttonbackground: hsl(225, 80%, 25%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 23%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 20%); } .pretext[data-atmosphere=dark] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(5, 86%, 24%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 27%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 20%); --navbarbackground: hsl(0, 0%, 20%); --footerbackground: hsl(0, 0%, 22%); --mainbackground: hsl(0, 0%, 17%); --buttonbackground: hsl(232, 90%, 19%); --codebackground: hsl(120, 100%, 15%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 19%); } .pretext[data-atmosphere=darkmidnight] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad9; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(0, 100%, 17%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 13%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 16%); --navbarbackground: hsl(0, 0%, 16%); --footerbackground: hsl(0, 0%, 13%); --mainbackground: hsl(0, 0%, 7%); --buttonbackground: hsl(240, 100%, 13%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 17%); } .pretext[data-atmosphere*=dark] { background: var(--mainbackground); } .pretext[data-atmosphere*=dark] .ptx-page > .ptx-main { background: var(--mainbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .pretext[data-atmosphere*=dark] .ptx-navbar { background: var(--navbarbackground); } .pretext[data-atmosphere*=dark] .ptx-page-footer .feedback-link, .pretext[data-atmosphere*=dark] .ptx-content-footer .button, .pretext[data-atmosphere*=dark] .ptx-navbar .button { background-color: var(--buttonbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-page-footer .feedback-link:hover, .pretext[data-atmosphere*=dark] .ptx-content-footer .button:hover, .pretext[data-atmosphere*=dark] .ptx-navbar .button:hover, .pretext[data-atmosphere*=dark] .ptx-content-footer .button:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-navbar .calculator-toggle { background-color: var(--buttonbackground); } .pretext[data-atmosphere*=dark] .ptx-navbar .calculator-toggle:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-masthead { background: var(--bannerbackground); } .pretext[data-atmosphere*=dark] .ptx-page-footer { background: var(--footerbackground); border-top-color: #447; border-bottom-color: #447; } .pretext[data-atmosphere*=dark] .ptx-page-footer .logo { background: #779; border-radius: 0.4em; } .pretext[data-atmosphere*=dark] .ptx-masthead .title-container > .pretext .heading, .pretext[data-atmosphere*=dark] .ptx-masthead .title-container > .heading a, .pretext[data-atmosphere*=dark] .ptx-masthead .logo-link:empty:hover::before, .pretext[data-atmosphere*=dark] .ptx-masthead .byline, .pretext[data-atmosphere*=dark] .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext[data-atmosphere*=dark] .ptx-toc { scrollbar-color: var(--documenttitlelight) var(--footerbackground); } .pretext[data-atmosphere*=dark] .ptx-content .code-inline { background: var(--codebackground); } .pretext[data-atmosphere*=dark] .ptx-content .kbdkey { background: var(--keybackground); } .pretext[data-atmosphere*=dark] .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext[data-atmosphere*=dark] .ptx-content a.url, .pretext[data-atmosphere*=dark] .ptx-content a.internal, .pretext[data-atmosphere*=dark] .ptx-content a.external { background-color: var(--linkbackground); color: var(--bodyfontcolor, #ddc); } .pretext[data-atmosphere*=dark] .ptx-content [data-knowl] { background-color: var(--linkbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-content [data-knowl]:hover, .pretext[data-atmosphere*=dark] .ptx-content [data-knowl]:active, .pretext[data-atmosphere*=dark] .ptx-content [data-knowl].active { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } :root { --knowlLinkColor: var(--documenttitle); --linkColor: var(--bodysubtitle); --linkBackground: var(--bodysubtitlehighlight); --knowlNested1Background: #f5f5ff; --knowlNested2Background: #fffff5; --knowlNested3Background: #f5ffff; --knowlNested4Background: #fff5f5; } /*! Theme: default-legacy */ /*# sourceMappingURL=theme-default-legacy.css.map */ ================================================ FILE: css/dist/theme-default-modern.css ================================================ @charset "UTF-8"; @import "https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=swap"; @import "https://fonts.googleapis.com/css2?family=PT Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap"; @import "https://fonts.googleapis.com/css2?family=Inconsolata:ital,wght@0,400..700;1,400..700&display=swap"; /* ../../css/targets/html/default-modern/theme-default-modern.scss */ :root { --base-content-width: 600px; --content-padding: 48px; } body { margin: 0; min-height: 100vh; display: flex; flex-direction: column; align-items: stretch; } body.pretext { color: var(--body-text-color); font-family: var(--font-body); } .ptx-page { position: relative; display: flex; flex-grow: 1; width: 100%; } .ptx-main { flex-grow: 1; position: relative; max-width: 100%; container-name: ptx-main; container-type: inline-size; } .ptx-main .ptx-content { max-width: 696px; padding: 24px 48px 60px; } .worksheet .ptx-main .ptx-content { max-width: 960px; } .ptx-page { max-width: 1200px; margin-left: auto; margin-right: auto; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; background: var(--page-color, white); } .ptx-content .print-preview-header { display: none; } body.pretext > a.assistive { padding: 6px; position: absolute; top: -40px; left: 0px; color: white; border-right: 1px solid white; border-bottom: 1px solid white; border-bottom-right-radius: 8px; background: #BF1722; z-index: 10000; } body.pretext > a.assistive:focus { top: 0px; outline: 0; transition: top 0.1s ease-in, background 0.5s linear; } .ptx-content-footer { display: flex; justify-content: space-around; max-width: 696px; padding-top: 2em; padding-bottom: 2em; padding-left: 48px; padding-right: 48px; } .ptx-content-footer .button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-content-footer .button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content-footer .button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-content-footer .button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-content-footer .button.hidden { display: none; } .ptx-content-footer .button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content-footer .button .icon { margin: 0 -7px; } body.standalone-page .ptx-page { max-width: 1600px; } .ptx-masthead { position: relative; background: var(--banner-background); width: 100%; display: flex; justify-content: center; } .ptx-masthead .ptx-banner { border-top: 1px solid transparent; overflow: hidden; padding: 10px 10px; border-bottom: none; display: flex; width: 100%; align-items: center; max-width: 1200px; } .ptx-masthead a { color: var(--doc-title-color, #2a5ea4); } .ptx-masthead a:active { color: var(--link-active-text-color); } .ptx-masthead .title-container { font-family: var(--font-headings); font-size: 2em; padding-left: 9.68px; overflow: hidden; flex: 1; } .ptx-masthead .title-container .heading { font-weight: 700; font-size: 100%; line-height: 1.25em; } .ptx-masthead .title-container .title:has(+ .subtitle)::after { content: ":"; } .ptx-masthead .title-container .subtitle { font-weight: normal; } .ptx-masthead .logo-link { height: 5em; display: flex; } .ptx-masthead .logo-link img { max-height: 100%; } .ptx-masthead .logo-link img[src$=".svg"] { height: 100%; } .ptx-masthead .byline { color: var(--byline-color); font-weight: normal; margin: 0; font-size: 62.5%; min-height: inherit; } @media screen and (max-width: 800px) { .ptx-masthead { border-bottom: 1px solid var(--page-border-color); } .ptx-masthead .ptx-banner { padding: 10px 28px; display: flex; justify-content: center; } .ptx-masthead .logo-link::before { font-size: 1rem; margin-top: 0; } .ptx-masthead .title-container { width: fit-content; flex: unset; } .ptx-masthead .title-container .heading { line-height: 1em; } .ptx-masthead .title-container .heading .subtitle { display: block; font-size: 80%; line-height: 1em; } .ptx-masthead .byline { font-size: 50%; } } @media screen and (width <= 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; font-size: 1em; } .ptx-masthead .logo-link { display: none; } .ptx-masthead .byline { display: none; } } .ptx-navbar { position: sticky; top: 0; height: 36px; width: 100%; background: var(--navbar-background); border: 0; border-top: 1px solid var(--page-border-color); border-bottom: 1px solid var(--page-border-color); margin: 0; z-index: 500; overflow: visible; display: flex; } .ptx-navbar .ptx-navbar-contents { position: relative; display: flex; flex: 1; justify-content: center; align-items: center; max-width: 1200px; margin: 0 auto; } .ptx-navbar .button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-navbar .button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-navbar .button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-navbar .button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-navbar .button.hidden { display: none; } .ptx-navbar .button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-navbar .button { height: 100%; border-width: 0; } .ptx-navbar .toc-toggle { width: 240px; gap: 0.4em; margin-left: 0; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls, .nav-other-controls) { display: flex; } .ptx-navbar .treebuttons { flex: 1 1 210px; justify-content: end; } .ptx-navbar .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .ptx-navbar .pretext .navbar .dropdown { height: 34px; } .ptx-navbar .embed-popup { padding: 10px; background-color: var(--navbar-background); position: absolute; margin-top: 36px; border: 1px solid var(--page-border-color); border-radius: 3px; box-shadow: 0 0 5px var(--primary-color-gray-80); color: var(--button-text-color); } .ptx-navbar .embed-popup .embed-code-container { width: "100%"; padding: 5px; } .ptx-navbar .embed-popup .embed-code-container .embed-code-textbox { width: 100%; padding: 10px; height: 5em; } .ptx-navbar .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .ptx-navbar .treebuttons .icon { margin: 0 -7px; } .ptx-navbar :is(.index-button) .icon { display: none; } .ptx-navbar :is(.runestone-profile, .activecode-toggle, .searchbutton, .calculator-toggle, .light-dark-button, .embed-button) .name { display: none; } .ptx-navbar .index-button { min-width: 70px; } .runestone-profile { position: relative; } .runestone-profile .dropdown-content { display: none; position: absolute; background-color: var(--dropdown-background); min-width: 160px; z-index: 100; border: 1px solid var(--dropdown-border-color); right: 0; top: 35px; text-align: start; padding: 0; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: var(--dropdown-text-color); padding: 2px 8px; } .runestone-profile .dropdown-content a:is(:hover, :focus-visible) { background-color: var(--dropdown-hover-background); color: var(--dropdown-hover-text-color); } .runestone-profile .dropdown-content hr { color: var(--dropdown-border-color); margin: 4px 0; } .runestone-profile:is(:hover, :focus-visible, :focus-within) { overflow: visible; } .runestone-profile:is(:hover, :focus-visible, :focus-within) .dropdown-content { display: block; } @media screen and (max-width: 800px) { .ptx-navbar .button { border-left-width: 1px; border-right-width: 1px; border-color: var(--page-border-color); } .ptx-navbar > *:not(:first-child) { margin-left: -1px; } .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; z-index: 1100; background: var(--button-border-color); max-width: 100vw; } .ptx-navbar .ptx-navbar-contents { max-width: 100vw; } .ptx-navbar .nav-runestone-controls { flex: 0; } .ptx-navbar .toc-toggle { flex: 2 1 100px; } .ptx-navbar .treebuttons { flex: 3 1 150px; } .ptx-navbar .treebuttons > * { flex: 1 1; min-width: 35px; } .ptx-navbar .index-button { display: none; } .ptx-navbar .embed-popup { margin-top: unset; bottom: 36px; } .ptx-navbar .dropdown-content { top: unset; bottom: 36px; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button, .embed-button) .name { display: none; } } .ptx-sidebar { align-self: flex-start; } .ptx-sidebar.visible { display: block; } .ptx-sidebar.hidden { display: none; height: 0; } .ptx-toc { --codenumber-pad-left: 0.3rem; --codenumber-pad-right: 0.5rem; --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); background: var(--toc-background); margin: 0; font-size: 0.9rem; } .ptx-toc:is(.depth1, .parts.depth2) { --codenumber-pad-right: 0.5rem; } .ptx-toc .toc-item-list { margin: 0; padding: 0; list-style: none; background: var(--tocitem-background); } .ptx-toc .toc-item-list .active { list-style: none; } .ptx-toc .toc-item { background-color: var(--tocitem-background); color: var(--toc-text-color); border-color: var(--toc-border-color); } .ptx-toc .toc-item a { color: inherit; } .ptx-toc .toc-item.active:not(:has(.toc-item.active)) { color: var(--tocitem-active-text-color) !important; background-color: var(--tocitem-active-background) !important; border-color: var(--tocitem-active-border-color) !important; } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--tocitem-highlight-text-color); background-color: var(--tocitem-highlight-background); border-color: var(--tocitem-highlight-border-color); } .ptx-toc .toc-title-box { display: flex; } .ptx-toc .toc-title-box > .internal { position: relative; display: flex; flex-grow: 1; padding: 0.2em; font-weight: 500; } .ptx-toc .toc-item-list .toc-item-list .toc-title-box > .internal { font-weight: normal; } .ptx-toc .codenumber { min-width: var(--toc-indent-first); padding-left: var(--codenumber-pad-left); padding-right: var(--codenumber-pad-right); display: inline-block; text-align: left; flex-grow: 0; } .ptx-toc .toc-item { color: var(--toclevel1-text-color); background-color: var(--toclevel1-background); } .ptx-toc .toc-item .toc-item { color: var(--toclevel2-text-color); background-color: var(--toclevel2-background); } .ptx-toc .toc-item .toc-item .toc-item { color: var(--toclevel3-text-color); background-color: var(--toclevel3-background); } .book .ptx-toc .toc-chapter .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .codenumber { font-size: 80%; padding-top: 0.16em; min-width: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber { min-width: var(--toc-indent-third); visibility: hidden; } .ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber { visibility: visible; } .ptx-toc .toc-item .toc-title-box .title { margin-left: var(--toc-indent-first); } .book .ptx-toc .toc-chapter .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .title { margin-left: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { margin-left: var(--toc-indent-third); } .ptx-toc .toc-item > .toc-title-box .codenumber + .title { margin-left: 0 !important; } .ptx-toc .toc-chapter .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { font-size: 90%; } .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title { font-style: italic; } .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth1 ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-backgrounde); color: var(--tocitem-active-text-color); } .ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-background); color: var(--tocitem-active-text-color); } .ptx-toc.focused { } .ptx-toc.focused ul.structural:not(.contains-active) > .toc-item { display: none; } .ptx-toc.focused ul.structural:not(.contains-active) > .toc-item.visible { display: block; } .ptx-toc.focused ul.structural .toc-item.active > ul.structural > .toc-item { display: block; } .ptx-toc.focused ul.structural .toc-item.active > ul.structural > .toc-item.hidden { display: none; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 1.25em; line-height: 18px; font-variation-settings: "wght" 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--tocitem-highlight-background); color: var(--tocitem-highlight-text-color); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--tocitem-highlight-text-color); } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon:before { content: "add"; } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before { content: "remove"; } .ptx-sidebar { flex: 0 0 240px; position: sticky; top: 36px; overflow-y: hidden; } .ptx-toc { position: sticky; top: 36px; overflow-y: auto; overflow-x: hidden; height: calc(100vh - 36px); margin-top: -1px; } .ptx-toc > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 3px solid var(--toc-border-color); } @media screen and (max-width: 936px) { .ptx-sidebar { display: none; position: sticky; top: 36px; background: var(--content-background); min-height: 30vh; border-right: 2px solid var(--toc-border-color); border-bottom: 2px solid var(--toc-border-color); width: 240px; } } @media screen and (max-width: 800px) { .ptx-sidebar { position: fixed; z-index: 1000; top: unset; height: auto; max-height: 80vh; max-width: 80vw; bottom: 36px; border-right: 2px solid var(--toc-border-color); border-top: 2px solid var(--toc-border-color); } .ptx-toc { border-top: 2px solid var(--toc-border-color); border-bottom: 0; max-height: 80vh; } } .ptx-page-footer { background: var(--footer-background); padding-top: 0; border-top: 2px solid var(--page-border-color); border-bottom: 2px solid var(--page-border-color); display: flex; flex-direction: row; justify-content: center; width: 100%; gap: 90px; position: relative; } .ptx-page-footer > a { margin: 1em 0; color: var(--body-text-color); } .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } .ptx-page-footer .feedback-link { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-page-footer .feedback-link:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-page-footer .feedback-link:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-page-footer .feedback-link.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-page-footer .feedback-link.hidden { display: none; } .ptx-page-footer .feedback-link.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } @media screen and (max-width: 800px) { .ptx-page-footer { gap: 20px; justify-content: center; margin-bottom: 34px; } .ptx-page-footer > a > .logo:first-child { height: 2em; } } @container ptx-main (width < 696px) { .ptx-page > .ptx-main .ptx-content { padding-left: 28px; padding-right: 28px; max-width: calc(600px + 2 * 28px); } } .aside-like > .knowl__link { color: var(--aside-like-link-color); border-bottom-color: var(--aside-like-link-color); } .aside-like > .knowl__content { margin-left: 30px; margin-right: 30px; border: 2px solid var(--aside-like-border-color); background-color: var(--aside-like-body-background); } @media screen and (min-width: 1280px) { details.aside-like { position: relative; margin-left: -248px; width: 200px; right: -248px; float: right; clear: right; } .multicolumn details.aside-like { position: relative; margin-left: inherit; width: auto; right: 0; float: none; clear: none; } details.aside-like > .knowl__content { margin-left: 0; margin-right: 0; background-color: var(--aside-like-body-background); z-index: 100; } } .code-box { overflow-x: auto; } .code-display { overflow-x: auto; font-family: var(--font-monospace); margin: 0.5em 0; } .console, .program { border: 1px solid var(--page-border-color); padding: 5px 15px; overflow-x: auto; margin: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-inline { font-family: var(--font-monospace); white-space: pre; color: var(--body-text-color); background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); border-radius: 0.2em; display: inline-block; overflow-x: auto; max-width: 100%; vertical-align: middle; line-height: normal; padding: 0.0625em 0.15em; } .prompt.unselectable { user-select: none; } .code-block { border-left: 1px solid #aaa; padding: 0 15px 5px; overflow-x: auto; background: var(--code-background); margin-top: 0; margin-bottom: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-block::before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } @media print { .code-copy { display: none; } } :is(.cols2, .cols3, .cols4, .cols5, .cols6) { display: flex; flex-wrap: wrap; justify-content: start; } .cols2 > .exercise-like { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > .exercise-like { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > .exercise-like { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > .exercise-like { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > .exercise-like { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .exercise-like > .heading { font-size: inherit; } .exercisegroup .exercise-like { margin-top: 1em; } .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .exercisegroup > .heading + .introduction { display: inline; } .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .exercisegroup .exercisegroup-exercises { margin-top: 1em; padding-left: 40px; } .exercisegroup .conclusion { margin-left: 40px; } .exercisegroup .conclusion .heading { font-size: inherit; } .exercise-like > .exercise-like.task { margin-left: 20px; } .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .exercise-wrapper form button:active { background-color: #f0f0f0; } .exercise-wrapper form button + button { margin-left: 0.8em; } .exercise-wrapper, .exercise-wrapper form, .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .knowl .exercise-wrapper, .knowl .exercise-wrapper form, .knowl .exercise-wrapper form > div:first-child { width: 100%; } .exercise-wrapper > .para:first-child, .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .cols2 .heading + .exercise-wrapper { width: auto; } section.solutions > .heading + .heading { margin-top: 0.5em; } section.solutions > h3.heading, section.solutions section > h3.heading { font-size: 1.6em; } section.solutions > h4.heading, section.solutions section > h4.heading { font-size: 1.45em; } section.solutions > h5.heading, section.solutions section > h5.heading { font-size: 1.35em; } section.solutions > h6.heading, section.solutions section > h6.heading { font-size: 1.25em; } .sbsgroup > *:not(:first-child) { margin-top: 1.5em; } .sbsrow { display: grid; grid-template-rows: auto auto; } .sbspanel { grid-row: 1; } .sbspanel > .table > figcaption { text-align: center; } .sbspanel .tabular { overflow-x: auto; margin-left: auto; margin-right: auto; } .sbspanel--top { align-self: start; } .sbspanel--middle { align-self: center; } .sbspanel--bottom { align-self: end; } .sbspanel:has(.figure-like, .table-like), .sbspanel > :is(.figure-like, .table-like) { display: contents; } .sbspanel > :is(.figure-like, .table-like) > *:first-child { grid-row: 1; align-items: start; align-self: start; } .sbspanel--top > :is(.figure-like, .table-like) > *:first-child { align-items: start; align-self: start; } .sbspanel--middle > :is(.figure-like, .table-like) > *:first-child { align-items: center; align-self: center; } .sbspanel--bottom > :is(.figure-like, .table-like) > *:first-child { align-items: end; align-self: end; } .sbspanel > :is(.figure-like, .table-like) > *:nth-child(2) { margin-top: 0.5em; grid-row: 2; width: 100%; } .sbspanel:nth-of-type(2) * { grid-column: 2; } .sbspanel:nth-of-type(3) * { grid-column: 3; } .sbspanel:nth-of-type(4) * { grid-column: 4; } .sbspanel:nth-of-type(5) * { grid-column: 5; } .sbspanel:nth-of-type(6) * { grid-column: 6; } .sbspanel:nth-of-type(7) * { grid-column: 7; } .sbspanel:nth-of-type(8) * { grid-column: 8; } .sbspanel:nth-of-type(9) * { grid-column: 9; } .sbspanel:nth-of-type(10) * { grid-column: 10; } .discussion-like > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .discussion-like > .heading:first-child:after { content: "\2009"; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } .discussion-like > .heading ::after { content: "\2009"; } .discussion-like > .heading + .para { display: inline; } .discussion-like > .heading .space, .discussion-like > .heading .codenumber, .discussion-like > .heading .period { display: none; } .discussion-like > .heading .type::after { content: ". "; } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowl-link-color); border-bottom: 1px dotted var(--knowl-link-color); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--knowl-background); border-bottom-color: transparent; } .source-view__content { margin: 0.2em 0; } .knowl__content { margin: 0.75em 0; border: 3px solid var(--knowl-border-color); border-radius: 8px; padding: 12px; background-color: var(--knowl-background); } .knowl__content .incontext { display: block; font-size: 85%; text-align: right; } .knowl__content .knowl__content { background-color: var(--knowl-nested-1-background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-2-background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-3-background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-4-background); } .knowl__content > figure { margin-left: 0; margin-right: 0; } .assemblage-like:not(.knowl__content, .born-hidden-knowl) { border: 2px solid var(--assemblage-like-border-color); background-color: var(--assemblage-like-body-background); padding: 10px; border-radius: 8px; } .assemblage-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { display: block; color: var(--block-head-color); margin-bottom: 0.5em; } .assemblage-like:not(.knowl__content, .born-hidden-knowl) > *:first-child { margin-top: 0; } .goal-like:not(.knowl__content, .born-hidden-knowl) { border: 3px solid var(--goal-like-border-color); background-color: var(--goal-like-body-background); padding: 20px; padding-top: calc(20px + 0.25ex); margin-top: 2.5em !important; } .goal-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--content-background); display: block; color: var(--block-head-color); margin-bottom: 0.5em; padding: 5px 10px; margin-top: calc(-25px - 1.65ex); width: fit-content; border: 0; } .goal-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .knowl__content *:first-child .goal-like { margin-top: 1em; } .theorem-like:not(.knowl__content, .born-hidden-knowl), .definition-like:not(.knowl__content, .born-hidden-knowl), .example-like:not(.knowl__content, .born-hidden-knowl), .project-like:not(.knowl__content, .born-hidden-knowl), .remark-like:not(.knowl__content, .born-hidden-knowl), .openproblem-like:not(.knowl__content, .born-hidden-knowl), .computation-like:not(.knowl__content, .born-hidden-knowl) { padding-left: 10px; border-left: 2px solid var(--block-border-color); } .theorem-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child, .definition-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child, .example-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child, .project-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child, .remark-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child, .openproblem-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child, .computation-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { color: var(--block-head-color); } .theorem-like:not(.knowl__content, .born-hidden-knowl)::after, .definition-like:not(.knowl__content, .born-hidden-knowl)::after, .example-like:not(.knowl__content, .born-hidden-knowl)::after, .project-like:not(.knowl__content, .born-hidden-knowl)::after, .remark-like:not(.knowl__content, .born-hidden-knowl)::after, .openproblem-like:not(.knowl__content, .born-hidden-knowl)::after, .computation-like:not(.knowl__content, .born-hidden-knowl)::after { content: ""; border-bottom: 2px solid var(--block-border-color); display: block; margin-right: auto; margin-left: -10px; padding-top: 10px; width: 1.5em; } .knowl__content .theorem-like, .knowl__content .definition-like, .knowl__content .example-like, .knowl__content .project-like, .knowl__content .remark-like, .knowl__content .openproblem-like, .knowl__content .computation-like { padding-left: 0; border-left: 0; } .knowl__content .theorem-like::after, .knowl__content .definition-like::after, .knowl__content .example-like::after, .knowl__content .project-like::after, .knowl__content .remark-like::after, .knowl__content .openproblem-like::after, .knowl__content .computation-like::after { display: none; } .project-like:not(.knowl__content, .born-hidden-knowl):not(.knowl__content, .born-hidden-knowl) { padding-left: 10px; border-left: 2px dotted var(--block-border-color); } .project-like:not(.knowl__content, .born-hidden-knowl):not(.knowl__content, .born-hidden-knowl) > .heading:first-child { color: var(--block-head-color); } .project-like:not(.knowl__content, .born-hidden-knowl):not(.knowl__content, .born-hidden-knowl)::after { content: ""; border-bottom: 2px dotted var(--block-border-color); display: block; margin-right: auto; margin-left: -10px; padding-top: 10px; width: 1.5em; } .knowl__content .project-like:not(.knowl__content, .born-hidden-knowl) { padding-left: 0; border-left: 0; } .knowl__content .project-like:not(.knowl__content, .born-hidden-knowl)::after { display: none; } .proof:not(.knowl__content, .born-hidden-knowl) { padding-right: 10px; border-right: 1px solid var(--block-border-color); } .proof:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { color: var(--block-head-color); } .proof:not(.knowl__content, .born-hidden-knowl)::after { content: ""; border-bottom: 1px solid var(--block-border-color); display: block; margin-left: auto; margin-right: -10px; padding-top: 10px; width: 1.5em; } .knowl__content .proof { padding-right: 0; border-right: 0; } .knowl__content .proof::after { display: none; } .knowl__content .theorem-like, .knowl__content .definition-like, .knowl__content .example-like, .knowl__content .project-like, .knowl__content .remark-like, .knowl__content .openproblem-like, .knowl__content .computation-like, .knowl__content .project-like { padding-left: 0; margin-left: 0; border-left: none; } .knowl__content .theorem-like::after, .knowl__content .definition-like::after, .knowl__content .example-like::after, .knowl__content .project-like::after, .knowl__content .remark-like::after, .knowl__content .openproblem-like::after, .knowl__content .computation-like::after, .knowl__content .project-like::after { border-bottom: none; display: none; } section.solutions:not(:is(:first-child)):not(.knowl__content, .born-hidden-knowl) { padding: 10px; padding-left: 15px; border-left: 10px solid var(--page-border-color); background-color: var(--content-background); } section.solutions:not(:is(:first-child)):not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-top: 0; } .paragraphs > .heading:first-child, article > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .paragraphs > .heading:first-child:after, article > .heading:first-child:after { content: "\2009"; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction), article > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child, article > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child, article > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } * { box-sizing: border-box; } @layer spacing { :is(section, article, .knowl__content) > *:not(:first-child) { margin-top: 1.5em; } :is(section, article, .knowl__content) > .para + .para { margin-top: 1em; } .ptx-content :is(ul, td, li, dd, .blockquote, .sbspanel, .para.logical) > *:not(:first-child) { margin-top: 0.5em; } } ol.no-marker, ul.no-marker, li.no-marker { list-style-type: none; } ol.decimal { list-style-type: decimal; } ol.lower-alpha { list-style-type: lower-alpha; } ol.lower-alpha-level-1 > li::marker { content: "(" counter(list-item, lower-alpha) ") "; } ol.upper-alpha { list-style-type: upper-alpha; } ol.lower-roman { list-style-type: lower-roman; } ol.upper-roman { list-style-type: upper-roman; } ul.disc { list-style-type: disc; } ul.square { list-style-type: square; } ul.circle { list-style-type: circle; } dl:is(.description-list, .glossary) { margin: 0; } dl:is(.description-list, .glossary) dt { font-weight: bold; max-width: 55ex; } dl:is(.description-list, .glossary) dd::after { content: ""; display: block; clear: both; } .para > dl:is(.description-list) { margin-top: 0.5em; margin-bottom: 0.5em; } dl.glossary dt { margin-top: 1.25em; } dl.glossary dt:first-of-type { margin-top: 0; } dl.glossary dd { margin-left: 5ex; } dl.description-list dt, dl.description-list dd { margin-top: 1em; } dl.description-list dt:first-of-type, dl.description-list dd:first-of-type { margin-top: 0; } dl.description-list dt { float: left; clear: both; text-align: right; width: 18ex; margin-right: 1ex; } dl.description-list dd { margin-left: 22ex; } dl.description-list.narrow dt { width: 11ex; } dl.description-list.narrow dd { margin-left: 15ex; } dl.description-list.wide dt { width: 25ex; } dl.description-list.wide dd { margin-left: 29ex; } dl.description-list dt:first-of-type { clear: none; } .description-list + * { clear: both; } dl.description-list dl dt { width: 8ex; } dl.description-list dd dd { margin-left: 18ex; } dl.description-list dl dd { margin-left: 12ex; } @media screen and (max-width: 480px) { dl.description-list dt, dl.description-list.narrow dt { float: none; margin-left: 0; text-align: left; width: 25ex; } dl.description-list dd, dl.description-list.narrow dd, dl.description-list.wide dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } .cols2 > li { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > li { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > li { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > li { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > li { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .ptx-content li { margin-top: 0.5em; } .ptx-content li .li--heading-title { font-size: 100%; font-weight: normal; font-style: italic; } .para > :is(ol, ul) { margin-top: 0.5em; margin-bottom: 0.5em; } ol > li { padding-left: 0.25em; } .fillin { display: inline-block; border: none; border-width: 1px; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; } .fillin.underline { border-bottom-style: solid; border-width: 1px; } .fillin.box { outline: 1px solid var(--body-text-color); height: 1.3em; } .fillin.shade { background-color: var(--fillin-background-color, #eee); height: 1.3em; } :root.dark-mode { --fillin-background-color: #444; } .heading:is(h1, h2, h3, h4, h5, h6) { margin: 0; font-size: unset; } .heading { line-height: 1.1; font-family: var(--font-headings); font-weight: 700; margin-top: 0; margin-bottom: 0; } section > .heading { font-size: 1.75em; color: var(--body-title-color); line-height: 1.25em; margin-top: 2.5em; margin-bottom: 0.5em; } section > .heading + * { margin-top: 0.5em; } .ptx-content > section > .heading { margin-top: 0.5em; } section section > .heading { font-size: 1.5em; margin-top: 2em; } section section section > .heading { font-size: 1.4em; margin-top: 2em; } article > .heading { font-size: 1.25em; margin-top: 1.5em; } article > .heading + * { margin-top: 0.5em; } .paragraphs > .heading { font-size: 1.125em; } :is(section, article) > .heading + :is(section, article) > .heading { margin-top: 0.5em; } @media screen and (max-width: 480px) { section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } section section > .heading { font-size: 1.3em; line-height: 1.15em; } section section section > .heading { font-size: 1.15em; line-height: 1em; } } .heading.hide-type > .type { display: none; } a { color: var(--link-text-color); text-decoration: none; } a:hover, a:focus { text-decoration: none; } a[href^="mailto:"] { white-space: pre; } .ptx-content a.internal { color: var(--link-text-color); font-weight: bold; } .ptx-content a.external { color: var(--link-alt-text-color); font-weight: bold; } .ptx-content a.internal:hover, .ptx-content a.internal:hover *, .ptx-content a.internal:focus, .ptx-content a.internal:focus * { color: var(--link-active-text-color); background-color: var(--link-active-background); font-weight: bold; } .ptx-content a.external:hover, .ptx-content a.external:hover *, .ptx-content a.external:focus, .ptx-content a.external:focus * { color: var(--link-alt-active-text-color); background-color: var(--link-alt-active-background); font-weight: bold; } .ptx-content table { border-spacing: 0; border-collapse: collapse; } .ptx-content td { padding: 2px 5px; font-size: 90%; } .ptx-content td img { max-width: 200px; margin-right: 30px; } .ptx-content th { padding: 2px 5px; } .ptx-content th .lines { white-space: nowrap; } .ptx-content th.l { text-align: left; } .ptx-content th.c { text-align: center; } .ptx-content th.r { text-align: right; } .ptx-content th.j { text-align: justify; } .ptx-content th.t { vertical-align: top; } .ptx-content th.b { vertical-align: bottom; } .ptx-content th.m { vertical-align: middle; } .ptx-content th.l0 { border-left: none; } .ptx-content th.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content th.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content th.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content th.r0 { border-right: none; } .ptx-content th.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content th.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content th.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content th.t0 { border-top: none; } .ptx-content th.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content th.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content th.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content th.b0 { border-bottom: none; } .ptx-content th.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content th.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content th.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content td .lines { white-space: nowrap; } .ptx-content td.l { text-align: left; } .ptx-content td.c { text-align: center; } .ptx-content td.r { text-align: right; } .ptx-content td.j { text-align: justify; } .ptx-content td.t { vertical-align: top; } .ptx-content td.b { vertical-align: bottom; } .ptx-content td.m { vertical-align: middle; } .ptx-content td.l0 { border-left: none; } .ptx-content td.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content td.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content td.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content td.r0 { border-right: none; } .ptx-content td.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content td.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content td.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content td.t0 { border-top: none; } .ptx-content td.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content td.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content td.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content td.b0 { border-bottom: none; } .ptx-content td.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content td.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content td.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content th.r0.l0, .ptx-content td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content tr.header-vertical th { writing-mode: vertical-rl; transform: rotate(180deg); padding-top: 5px; } .ptx-content .center table { text-align: center; margin-left: auto; margin-right: auto; } .tabular-box { margin-top: 0.5em; overflow-x: auto; } .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } table.notation-list tr th { text-align: left; margin-left: 1em; } table.notation-list tr td { text-align: left; vertical-align: top; } .frontmatter > .heading { display: block; text-align: center; } .frontmatter > .heading .title, .frontmatter .book > .heading .title { font-size: 1.3em; } .frontmatter > .heading .subtitle, .frontmatter .book > .heading .subtitle { display: block; font-weight: normal; color: var(--byline-color); font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .frontmatter > .para:first-of-type { margin-top: 4em; } .frontmatter > .author, .frontmatter > .credit { margin-top: 2em; text-align: center; } .frontmatter .author:first-of-type { margin-top: 4em; } .frontmatter > .author .author-name { font-size: 120%; } .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .frontmatter .credit .title { font-size: 1em; } .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .frontmatter .author-info { font-size: 90%; } .frontmatter .summary-links { margin-top: 4em; } .frontmatter .abstract { margin: 4em 2em; } .frontmatter .keywords, .frontmatter .support { margin-top: 2em; } .frontmatter .abstract > .title, .frontmatter .keywords > .title, .frontmatter .support > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .frontmatter .abstract > .title::after, .frontmatter .keywords > .title::after, .frontmatter .support > .title::after { content: ".\2009\2009\2009"; } .frontmatter .abstract > .title + .para, .frontmatter .keywords > .title + .para, .frontmatter .support > .title + .para { display: inline; } .frontmatter .colophon .copyright { margin-top: 2.5em; } .frontmatter .colophon .license { margin-top: 2.5em; } .ptx-content .summary-links { font-family: var(--font-headings); display: block; margin-top: 1em; } .ptx-content .summary-links a { color: var(--summary-link-text-color); background: var(--summary-link-background); font-size: 1.5em; line-height: 1.25em; padding: 10px 20px; padding-right: 60px; border-radius: 3px; position: relative; display: block; font-weight: unset; } .ptx-content .summary-links a .title { font-style: normal; } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a::after { right: 0.83333em; content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid var(--summary-link-text-color); } .ptx-content .summary-links a:hover { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover * { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover .title { font-weight: normal; } .ptx-content .summary-links a:hover::after { border-left: 0.4em solid var(--summary-link-hover-text-color); } .ptx-content .summary-links ul { list-style-type: none; padding: 0; margin-top: 0; } .ptx-content .summary-links li { margin-top: 5px; } @media screen and (width <= 480px) { .ptx-content .summary-links a { font-size: 100%; line-height: 1.25em; } } .ptx-footnote { display: inline-block; position: relative; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: smaller; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote[open] .ptx-footnote__number sup { display: none; } .ptx-footnote__number { display: inline-block; cursor: pointer; min-width: 1em; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowl-background); border-radius: 0px; padding: 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowl-border-color); color: var(--body-text-color); font-weight: normal; font-size: var(1rem); } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: var(--activated-content-bg); } .indexitem { margin-top: 4px; } .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .indexknowl { margin-left: 0.11em; } em + .indexknowl { margin-left: -0.25em; } .indexknowl a { margin-left: 2em; } .indexitem .see, .subindexitem .see, .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .indexitem .seealso, .subindexitem .seealso, .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .indexitem .see em, .subindexitem .see em, .subsubindexitem .see em, .indexitem .seealso em, .subindexitem .seealso em, .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .indexitem .see + .see, .subindexitem .see + .see, .subsubindexitem .see + .see, .indexitem .seealso + .seealso, .subindexitem .seealso + .seealso, .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .indexitem .indexknowl { font-size: 90%; } .indexitem [data-knowl], .subindexitem [data-knowl], .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .indexknowl [data-knowl]:hover, .indexknowl .active[data-knowl] { margin-left: 2em; } .subindexitem .indexknowl { font-size: 95%; } .subsubindexitem .indexknowl { font-size: 95%; } .indexletter { margin-top: 1.5em; } .image-box, .audio-box, .video-box, .asymptote-box { position: relative; } .image-box .asymptote-box iframe.asymptote, iframe.asymptote, .video-box .video, .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .image-box img, img.contained { width: 100%; } .asymptote-fullsize-link { text-align: center; font-size: 0.9em; } .ptx-content img, .ptx-content svg { background: var(--ptx-image-bg); } .mermaid > svg { background: none; } .image-description summary { list-style: none; cursor: pointer; } .image-archive { margin: 0.75em auto 0; font-family: var(--font-monospace); justify-content: center; display: flex; gap: 0.5em; } .image-box > img:not(.mag_popup) { cursor: zoom-in; } img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; } .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .audio { width: 100%; } .video-poster { cursor: pointer; } figure { clear: both; position: relative; margin-left: 0; margin-right: 0; } figcaption { margin-left: auto; margin-right: auto; margin-top: 0.5em; } figcaption code.code-inline { white-space: pre; } figcaption .codenumber, figcaption .type { font-weight: 700; } figcaption .codenumber::after, figcaption .type:last-of-type::after { content: "\2002"; } figcaption .para:first-of-type { display: inline; } figure.table-like { margin-left: 30px; margin-right: 30px; } figure.table-like .list { margin-right: 0; } @media (max-width <= 943px) { .figure-like { overflow-x: auto; } } .poem { display: table; margin: 0 auto; width: auto; max-width: 90%; } .poem > .heading { display: block; text-align: center; } section article.poem > .heading::after { content: ""; } .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .poem .author { font-style: italic; margin-top: 0.75em; } .poem .author.left { text-align: left; } .poem .author.center { text-align: center; } .poem .author.right { text-align: right; } .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .poem .stanza + .stanza { margin-top: 1em; } .poem .heading + .stanza { margin-top: 0.2em; } .poem .heading + .line { margin-top: 0.2em; } .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .poem .line.center { text-align: center; } .poem .line.right { text-align: right; } .poem .tab { margin-left: 2em; } pre[class*=language-] { margin: 0; overflow: auto; border: 1px solid #e1e1e1; } :not(pre) > code[class*=language-] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } code[class*=language-], pre[class*=language-] { color: black; background: #fdfdfd; text-shadow: none; font-family: var(--font-monospace); text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.2; tab-size: 4; hyphens: none; } code[class*=language-].code-inline, pre[class*=language-].code-inline { line-height: normal; padding: 0.0625em 0.15em; } code[class*=language-]::selection, code[class*=language-] ::selection, pre[class*=language-]::selection, pre[class*=language-] ::selection { background: #b3d4fc; } code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #2a9716; } code[class*=language-] .token.punctuation, pre[class*=language-] .token.punctuation { color: #000; } code[class*=language-] .token.namespace, pre[class*=language-] .token.namespace { opacity: 0.9; } code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: rgb(41, 120, 15); } code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #a11; } code[class*=language-] .token:is(.operator, .entity, .url), pre[class*=language-] .token:is(.operator, .entity, .url) { color: #000; background: none; } code[class*=language-] .token:is(.atrule, .attr-value, .keyword), pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #0679B7; } code[class*=language-] .token.function, code[class*=language-] .token.class-name, pre[class*=language-] .token.function, pre[class*=language-] .token.class-name { color: #30a; } code[class*=language-] .token.important, code[class*=language-] .token.variable, pre[class*=language-] .token.important, pre[class*=language-] .token.variable { color: rgb(0, 0, 0); } code[class*=language-] .token.important, code[class*=language-] .token.bold, pre[class*=language-] .token.important, pre[class*=language-] .token.bold { font-weight: bold; } code[class*=language-] .token.italic, pre[class*=language-] .token.italic { font-style: italic; } code[class*=language-] .token.entity, pre[class*=language-] .token.entity { cursor: help; } code[class*=language-].line-numbers, pre[class*=language-].line-numbers { position: relative; padding-left: 3.8em; counter-reset: linenumber; overflow: auto; } code[class*=language-].line-numbers > code, pre[class*=language-].line-numbers > code { position: relative; white-space: inherit; } code[class*=language-].line-numbers .line-numbers-rows, pre[class*=language-].line-numbers .line-numbers-rows { position: absolute; pointer-events: none; top: 0; font-size: 100%; left: -3.8em; width: 3em; letter-spacing: -1px; border-right: 1px solid #999; user-select: none; } code[class*=language-].line-numbers .line-numbers-rows > span, pre[class*=language-].line-numbers .line-numbers-rows > span { display: block; counter-increment: linenumber; } code[class*=language-].line-numbers .line-numbers-rows > span::before, pre[class*=language-].line-numbers .line-numbers-rows > span::before { content: counter(linenumber); color: #999; display: block; padding-right: 0.8em; text-align: right; } code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { position: absolute; margin-top: 4px; left: 0; right: 0; padding: inherit 0; font-size: inherit; background: hsla(24, 20%, 50%, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } :root.dark-mode { } :root.dark-mode pre[class*=language-] { border: 1px solid #3d3d3d; } :root.dark-mode code[class*=language-], :root.dark-mode pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } :root.dark-mode code[class*=language-]::selection, :root.dark-mode code[class*=language-] ::selection, :root.dark-mode pre[class*=language-]::selection, :root.dark-mode pre[class*=language-] ::selection { background: hsl(200, 4%, 16%); } :root.dark-mode code[class*=language-] .token, :root.dark-mode pre[class*=language-] .token { position: relative; z-index: 1; } :root.dark-mode code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), :root.dark-mode pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #68a950; } :root.dark-mode code[class*=language-] .token.punctuation, :root.dark-mode pre[class*=language-] .token.punctuation { color: white; opacity: 1; } :root.dark-mode code[class*=language-] .token.namespace, :root.dark-mode pre[class*=language-] .token.namespace { opacity: 0.9; } :root.dark-mode code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), :root.dark-mode pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: #abc792; } :root.dark-mode code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), :root.dark-mode pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #ca9147; } :root.dark-mode code[class*=language-] .token:is(.operator, .entity, .url), :root.dark-mode pre[class*=language-] .token:is(.operator, .entity, .url) { color: white; } :root.dark-mode code[class*=language-] .token:is(.atrule, .attr-value, .keyword), :root.dark-mode pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #2d94fb; } :root.dark-mode code[class*=language-] .token.function, :root.dark-mode code[class*=language-] .token.class-name, :root.dark-mode pre[class*=language-] .token.function, :root.dark-mode pre[class*=language-] .token.class-name { color: #e3e1c2; } :root.dark-mode code[class*=language-] .token.important, :root.dark-mode code[class*=language-] .token.bold, :root.dark-mode pre[class*=language-] .token.important, :root.dark-mode pre[class*=language-] .token.bold { font-weight: bold; } :root.dark-mode code[class*=language-] .token.italic, :root.dark-mode pre[class*=language-] .token.italic { font-style: italic; } :root.dark-mode code[class*=language-] .token.entity, :root.dark-mode pre[class*=language-] .token.entity { cursor: help; } :root.dark-mode .line-highlight { background: hsla(0, 0%, 33%, 0.1); border-bottom: 1px dashed hsl(0, 0%, 33%); border-top: 1px dashed hsl(0, 0%, 33%); z-index: 0; } @media print { code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { color-adjust: exact; } } .displaymath { overflow-x: auto; overflow-y: hidden; } .displaymath mjx-container[jax=CHTML][display=true] { margin: 0 0 0 0; padding-top: 0.3em; } .process-math mjx-container svg { background: none; } [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .knowl mjx-mtext > mjx-utext, mjx-mtext > mjx-utext { width: revert !important; } mjx-msup mjx-utext, mjx-msub mjx-utext { display: inline; } em.alert { font-weight: bold; } .bib { margin-top: 0.25em; } .bib .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .bib .bibitem + .bibentry { display: inline-block; width: 90%; margin-top: 0; } .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .contributor { margin-top: 1.5ex; } .contributor:first-child { margin-top: 0em; } .contributor + .para { margin-top: 3ex; } .contributor .contributor-name { font-variant: small-caps; } .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } iframe { margin: 0; border: none; } .kbdkey { background: #f1f1f1; color: #333; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .unit, .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .unit sub, .unit sup, .quantity sub, .quantity sup { word-spacing: normal; } .terminology { font-style: italic; font-weight: bold; } .times-sign { font-size: larger; vertical-align: -0.15ex; } .emphasis { font-style: italic; } .emphasis .emphasis { font-weight: bold; } .definition-like .emphasis { font-weight: 700; } article.theorem-like .emphasis { font-weight: 700; } .para { line-height: 1.35; } .hidden { display: none !important; } .taxon { font-style: italic; } .quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .booktitle { font-style: oblique; } .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; } .ptx-page, .ptx-main, .ptx-main .ptx-content { all: unset !important; width: 100%; border: none; padding: 0; margin: 0; } .ptx-sagecell, .tabular, .table-like, .figure-like, .exercise-like { break-inside: avoid; } .heading { break-after: avoid; } .code-inline { border: unset; background: unset; } @page { margin: 0.75in 0.75in 0.75in 0.75in; } } .heading .print-links { float: right; position: relative; z-index: 100; vertical-align: bottom; } .heading .print-links .print-link { font-family: var(--font-body); padding: 0.1em 0.2em; } .heading .print-links .material-symbols-outlined { margin-top: 5pt; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .pretext .searchwrapper .cse .gsc-control-cse input, .searchwrapper .gsc-control-cse { padding: 5px; } .searchbox .searchwidget { height: 100%; } .searchbox .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; padding: 1em; left: max(10vw, (100vw - 800px) / 2); width: 80vw; max-width: 800px; border: 2px solid var(--body-text-color); background: var(--knowl-background, #eaf0f6); z-index: 5000; display: flex; flex-direction: column; } .searchbox .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; height: 35px; } .searchbox .ptxsearch { flex: 1 1; } .searchbox .closesearchresults { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .searchbox .closesearchresults:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .searchbox .closesearchresults:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .searchbox .closesearchresults.disabled { opacity: 0.4; cursor: not-allowed; } .searchbox .closesearchresults.hidden { display: none; } .searchbox .closesearchresults.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .searchbox .detailed_result { margin-bottom: 10px; } .searchbox .searchresults a:hover { text-decoration: underline; background: var(--link-active-background); } .searchbox .searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; background: var(--content-background, white); border: 1px solid var(--page-border-color, #ccc); } .searchbox .searchresults:empty { display: none; } .searchbox .search-result-bullet { list-style-type: none; } .searchbox .search-result-score { display: none; } .searchbox .no_result { font-size: 90%; font-weight: 200; } .searchbox .low_result { font-weight: 200; } .searchbox .medium_result { font-weight: 500; } .searchbox .high_result { font-weight: 700; } .searchbox .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .searchbox .search-results-unshown-count { margin-top: 0.6em; } .searchbox .search-result-clip-highlight { background: var(--searchresultshighlight); } .searchbox .searchresultsbackground { position: fixed; top: 0; background: var(--searchresultsbackground, white); width: 100vw; height: 100%; left: 0; z-index: 4999; } @media screen and (max-width: 800px) { .searchbox .searchresultsplaceholder { bottom: 10vh; } } :root { --searchresultsbackground: #fff8; --searchresultshighlight: rgba(255, 255, 0, 50%); } :root.dark-mode { --searchresultsbackground: #0008; --searchresultshighlight: rgba(255, 255, 0, 15%); } .ptx-content .ptx-runestone-container .runestone { margin: unset; border-radius: 0; border-width: 1px; } .multiplechoice_section label > .para { display: inline; } .ptx-content .ptx-runestone-container .ac_question { max-width: var(--base-content-width); margin: 0 auto 10px; } .runestone .runestone_caption { display: none; } .ptx-content .ptx-runestone-container .rsdraggable { font-size: 100%; } .ptx-content .bottom { position: unset; } .ptx-runestone-container .runestone code, .ptx-runestone-container .runestone pre { font-size: 0.93rem; line-height: 1.2; font-family: var(--font-monospace); } .ptx-runestone-container code[class*=language-], .ptx-runestone-container pre[class*=language-] { color: black; background: #fdfdfd; } .runestone.datafile .datafile_caption { background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); display: block; width: fit-content; margin: 0 auto; } .runestone.datafile img { margin: 0 auto; display: block; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); } .runestone.datafile pre, .runestone.datafile textarea { margin: 0 auto; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); background-color: var(--page-color); } .runestone.datafile + .program { margin-top: 0; } ul[data-component=timedAssessment] { margin: 0; padding: 0; } :root.dark-mode .ptx-runestone-container code[class*=language-], :root.dark-mode .ptx-runestone-container pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } @layer spacing { .runestone :is(.exercise-statement, .exercise-content) > *:not(:first-child) { margin-top: 1em; } .ptx-runestone-container + .solutions { margin-top: 0.5em; } } .interactive-iframe-container { max-width: 100%; overflow: auto; } .interactive-iframe-container > iframe { margin-left: auto; margin-right: auto; display: block; } .interactive__instructions { max-width: var(--base-content-width); } .standalone-page .interactive-iframe-container { margin-left: auto; margin-right: auto; } .standalone-page .interactive__instructions { margin: 5px auto 20px; } .interactive-iframe-container__opener { display: block; margin-right: 5px; margin-top: 11px; margin-bottom: 5px; font-size: 0.8rem; } .interactive-iframe-container__opener .icon { font-size: 18px; } .interactive-iframe-container__opener:has(+ figcaption, + .instructions) { float: left; z-index: 1; position: relative; } .interactive-iframe-container__opener + .instructions + figcaption { clear: left; } .interactive-iframe-container__opener + .instructions { margin-top: 0.5em; } .clipboardable { position: relative; display: flow-root; } .clipboardable .code-copy { position: absolute; right: 0; top: 0; opacity: 0.25; border-width: 0; background: none; cursor: pointer; z-index: 1; white-space-collapse: collapse; padding: 1px; scale: 0.85; } .clipboardable .code-copy:hover { opacity: 0.7; } .clipboardable .code-copy .checkmark { display: none; } .clipboardable .code-copy.copied { opacity: 1; color: mediumseagreen; cursor: not-allowed; pointer-events: none; } .clipboardable .code-copy.copied .copyicon { display: none; } .clipboardable .code-copy.copied .checkmark { display: inline; } .clipboardable:has(.code-display) { margin: 0.25em 0; } .clipboardable:has(.code-display) .code-display { margin: 0; padding: 0.25em 0; } .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } label.feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } .exercise-wrapper > *:not(:first-child) { margin-top: 1.5em; } .ptx-content .problem-buttons { display: flex; } .ptx-content .webwork-button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-content .webwork-button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content .webwork-button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-content .webwork-button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-content .webwork-button.hidden { display: none; } .ptx-content .webwork-button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .problem-buttons.hidden-content, .problem-contents.hidden-content { display: none; } .sagecell_sessionOutput pre { font-family: var(--font-monospace); } .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .sage-interact.sagecell { margin: 0; } .sagecell_evalButton { font-family: var(--font-body); font-size: 16px; padding: 0 0.65em; } .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .sagecell_evalButton:focus, .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .sagecell .sagecell_editor { margin-bottom: 8px; } .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .sageanswer .output { display: inline-block; vertical-align: top; } .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } section, article, li, blockquote, figcaption, dt, .exercisegroup, .discussion-like, .solution-like, .para { position: relative; } .autopermalink { position: absolute; display: inline-block; top: 0.5ex; left: -2em; font-size: 85%; opacity: var(--permalink-opacity, 0); transition: opacity 0.2s; margin-top: 0 !important; user-select: none; } li > .autopermalink { left: -3.5em; } .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } .appendix > .autopermalink, .chapter > .autopermalink, .index > .autopermalink, .section > .autopermalink, .subsection > .autopermalink, .references > .autopermalink, .exercises > .autopermalink { top: 1.5ex; } .assemblage-like > .para > .autopermalink, .example-like > .para > .autopermalink, .example-like > .exercise-like > .autopermalink, .project-like > .para > .autopermalink, .project-like > .exercise-like > .autopermalink, .project-like > .exercise-like > .introduction > .para > .autopermalink, .project-like > .exercise-like > .conclusion > .para > .autopermalink, .remark-like > .para > .autopermalink { left: -2.9em; } .axiom-like > .para:first-of-type > .autopermalink, .example-like > .para:first-of-type > .autopermalink, .exercise-like > .para:first-of-type > .autopermalink, .solution-like > .para:first-of-type > .autopermalink, .assemblage-like > .para:first-of-type > .autopermalink, .definition-like > .para:first-of-type > .autopermalink, .remark-like > .para:first-of-type > .autopermalink, .project-like > .para:first-of-type > .autopermalink, .openproblem-like > .para:first-of-type > .autopermalink, .computation-like > .para:first-of-type > .autopermalink, .theorem-like > .para:first-of-type > .autopermalink, .proof > .para:first-of-type > .autopermalink, .case > .para:first-of-type > .autopermalink, li > .para:first-of-type > .autopermalink, dd > .para:first-of-type > .autopermalink { display: none; } .axiom-like > .introduction > .para:first-of-type > .autopermalink, .example-like > .introduction > .para:first-of-type > .autopermalink, .exercise-like > .introduction > .para:first-of-type > .autopermalink, .solution-like > .introduction > .para:first-of-type > .autopermalink, .assemblage-like > .introduction > .para:first-of-type > .autopermalink, .definition-like > .introduction > .para:first-of-type > .autopermalink, .remark-like > .introduction > .para:first-of-type > .autopermalink, .project-like > .introduction > .para:first-of-type > .autopermalink, .openproblem-like > .introduction > .para:first-of-type > .autopermalink, .computation-like > .introduction > .para:first-of-type > .autopermalink, .theorem-like > .introduction > .para:first-of-type > .autopermalink, .proof > .introduction > .para:first-of-type > .autopermalink, .case > .introduction > .para:first-of-type > .autopermalink, li > .introduction > .para:first-of-type > .autopermalink, dd > .introduction > .para:first-of-type > .autopermalink { display: none; } .ptx-content:has(.autopermalink:hover) .autopermalink { opacity: 0.2; } .ptx-content:has(.autopermalink:hover) .autopermalink:hover { opacity: 1; } .autopermalink:has(a:focus-visible) { opacity: 1; } .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: var(--content-background); border: 3px solid var(--page-border-color); z-index: 2001; } :target { scroll-margin-top: 45px; animation: target-fade 10s 1; } @keyframes target-fade { 0% { background-color: var(--activated-content-bg); } 100% { background-color: inherit; opacity: 1; } } :root { --font-body: Open Sans, Helvetica Neue, Helvetica, Arial, sans-serif; } :root { --font-headings: PT Serif, Times New Roman, Times, serif; } :root { --font-monospace: Inconsolata, Consolas, Monaco, monospace; } :root { --font-print: PT Serif, Times New Roman, Times, serif; } .ptx-toc:is(.depth0, .depth1, .depth2) .toc-item .toc-item { background-color: var(--tocitem-background); color: var(--toc-text-color); } .ptx-toc:is(.depth0, .depth1, .depth2, .depth3) .toc-item .toc-item .toc-item { background-color: var(--tocitem-background); color: var(--toc-text-color); } .toc-item { border-top: 1px solid var(--toc-border-color); } .ptx-toc.focused .toc-title-box > a:hover { border-right: 1px solid var(--toc-border-color); } .ptx-toc.focused .toc-expander:is(:hover) { border-left: 1px solid var(--toc-border-color); } .ptx-toc > .toc-item-list > .toc-item { border-top: 2px solid var(--toc-border-color); } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon { font-size: 30px; } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon:before { content: "chevron_left"; } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before { content: "chevron_left"; } section > .heading { padding-bottom: 3px; border-bottom: 2px solid var(--primary-color-white-30); } section > h2.heading { border-bottom-width: 4px; } section > h3.heading { border-bottom-width: 3px; } :root.dark-mode section > .heading { border-bottom-color: var(--primary-color-black-30); } .displaymath { overflow-x: auto; } @container ptx-main (width > 696px) { .displaymath { --max-width: calc(min((100cqw - 2 * 48px), 900px)); min-width: 100%; clear: right; width: fit-content; max-width: var(--max-width); } } .code-display { overflow-x: auto; } @container ptx-main (width > 696px) { .code-display { --max-width: calc(min((100cqw - 2 * 48px), 900px)); min-width: 100%; clear: right; width: fit-content; max-width: var(--max-width); } } .ptx-runestone-container:has(.parsons_section, .ac_section, .codelens) { overflow-x: auto; } @container ptx-main (width > 696px) { .ptx-runestone-container:has(.parsons_section, .ac_section, .codelens) { --max-width: calc(min((100cqw - 2 * 48px), 900px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); } } .tabular-box { overflow-x: auto; } @container ptx-main (width > 696px) { .tabular-box { --max-width: calc(min((100cqw - 2 * 48px), 900px)); min-width: 100%; clear: right; width: fit-content; max-width: var(--max-width); } } :root { color-scheme: light; } :root:not(.dark-mode) { --page-color: white; --content-background: white; --page-border-color: #ccc; --doc-title-color: var(--primary-color); --byline-color: #333; --banner-background: #fafafa; --navbar-background: #ededed; --footer-background: var(--banner-background); --toc-border-color: var(--primary-color-white-30); --toc-background: var(--content-background); --tocitem-background: var(--toc-background); --toc-text-color: var(--body-text-color); --tocitem-highlight-background: var(--secondary-color-white-10); --tocitem-highlight-text-color: white; --tocitem-highlight-border-color: var(--toc-border-color); --tocitem-active-background: var(--secondary-color); --tocitem-active-text-color: white; --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--primary-color); --toclevel1-text-color: white; --toclevel2-background: var(--primary-color-white-10); --toclevel2-text-color: var(--toclevel1-text-color); --toclevel3-background: var(--content-background); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #000; --body-title-color: #000; --ptx-image-bg: transparent; --activated-content-bg: #fae6e3; --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color); --link-background: var(--primary-color-white-97); --link-active-text-color: var(--primary-color-black-20); --link-active-background: var(--link-background); --link-alt-text-color: var(--secondary-color-black-10); --link-alt-background: var(--secondary-color-white-97); --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--secondary-color-white-97); --knowl-link-color: var(--link-text-color); --knowl-background: var(--primary-color-white-97); --knowl-border-color: var(--primary-color-white-30); --knowl-nested-1-background: var(--secondary-color-white-97); --knowl-nested-2-background: var(--primary-color-white-97); --knowl-nested-3-background: var(--secondary-color-white-97); --knowl-nested-4-background: var(--primary-color-white-97); --block-body-background: var(--content-background); --block-border-color: var(--knowl-border-color); --block-head-color: var(--body-text-color); --aside-like-link-color: var(--link-text-color); --button-background: #ededed; --button-text-color: #333333; --button-border-color: #ccc; --button-hover-background: #c7c7c7; --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: #fdfdfd; --code-inline-background: #ededed; --assemblage-like-body-background: var(--knowl-background); --assemblage-like-border-color: var(--knowl-border-color); --definition-like-body-background: var(--block-body-background); --definition-like-border-color: var(--block-border-color); --theorem-like-body-background: var(--block-body-background); --theorem-like-border-color: var(--block-border-color); --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: var(--block-body-background); --remark-like-border-color: var(--block-border-color); --computation-like-body-background: var(--block-body-background); --computation-like-border-color: var(--block-border-color); --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--knowl-background); --aside-like-border-color: var(--knowl-border-color); --proof-like-body-background: var(--block-body-background); --proof-like-border-color: var(--block-border-color); --example-like-body-background: var(--block-body-background); --example-like-border-color: var(--block-border-color); --project-like-body-background: var(--block-body-background); --project-like-border-color: var(--block-border-color); --goal-like-body-background: var(--block-body-background); --goal-like-border-color: var(--secondary-color-white-20); --solution-like-body-background: var(--block-body-background); --solution-like-border-color: var(--block-border-color); --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); --secondary-color-white-1: color-mix(in oklab, var(--secondary-color), white 1%); --secondary-color-white-2: color-mix(in oklab, var(--secondary-color), white 2%); --secondary-color-white-3: color-mix(in oklab, var(--secondary-color), white 3%); --secondary-color-white-4: color-mix(in oklab, var(--secondary-color), white 4%); --secondary-color-white-5: color-mix(in oklab, var(--secondary-color), white 5%); --secondary-color-white-10: color-mix(in oklab, var(--secondary-color), white 10%); --secondary-color-white-15: color-mix(in oklab, var(--secondary-color), white 15%); --secondary-color-white-20: color-mix(in oklab, var(--secondary-color), white 20%); --secondary-color-white-25: color-mix(in oklab, var(--secondary-color), white 25%); --secondary-color-white-30: color-mix(in oklab, var(--secondary-color), white 30%); --secondary-color-white-35: color-mix(in oklab, var(--secondary-color), white 35%); --secondary-color-white-40: color-mix(in oklab, var(--secondary-color), white 40%); --secondary-color-white-50: color-mix(in oklab, var(--secondary-color), white 50%); --secondary-color-white-60: color-mix(in oklab, var(--secondary-color), white 60%); --secondary-color-white-65: color-mix(in oklab, var(--secondary-color), white 65%); --secondary-color-white-70: color-mix(in oklab, var(--secondary-color), white 70%); --secondary-color-white-75: color-mix(in oklab, var(--secondary-color), white 75%); --secondary-color-white-80: color-mix(in oklab, var(--secondary-color), white 80%); --secondary-color-white-85: color-mix(in oklab, var(--secondary-color), white 85%); --secondary-color-white-90: color-mix(in oklab, var(--secondary-color), white 90%); --secondary-color-white-95: color-mix(in oklab, var(--secondary-color), white 95%); --secondary-color-white-96: color-mix(in oklab, var(--secondary-color), white 96%); --secondary-color-white-97: color-mix(in oklab, var(--secondary-color), white 97%); --secondary-color-white-98: color-mix(in oklab, var(--secondary-color), white 98%); --secondary-color-white-99: color-mix(in oklab, var(--secondary-color), white 99%); --secondary-color-black-1: color-mix(in oklab, var(--secondary-color), black 1%); --secondary-color-black-2: color-mix(in oklab, var(--secondary-color), black 2%); --secondary-color-black-3: color-mix(in oklab, var(--secondary-color), black 3%); --secondary-color-black-4: color-mix(in oklab, var(--secondary-color), black 4%); --secondary-color-black-5: color-mix(in oklab, var(--secondary-color), black 5%); --secondary-color-black-10: color-mix(in oklab, var(--secondary-color), black 10%); --secondary-color-black-15: color-mix(in oklab, var(--secondary-color), black 15%); --secondary-color-black-20: color-mix(in oklab, var(--secondary-color), black 20%); --secondary-color-black-25: color-mix(in oklab, var(--secondary-color), black 25%); --secondary-color-black-30: color-mix(in oklab, var(--secondary-color), black 30%); --secondary-color-black-35: color-mix(in oklab, var(--secondary-color), black 35%); --secondary-color-black-40: color-mix(in oklab, var(--secondary-color), black 40%); --secondary-color-black-50: color-mix(in oklab, var(--secondary-color), black 50%); --secondary-color-black-60: color-mix(in oklab, var(--secondary-color), black 60%); --secondary-color-black-65: color-mix(in oklab, var(--secondary-color), black 65%); --secondary-color-black-70: color-mix(in oklab, var(--secondary-color), black 70%); --secondary-color-black-75: color-mix(in oklab, var(--secondary-color), black 75%); --secondary-color-black-80: color-mix(in oklab, var(--secondary-color), black 80%); --secondary-color-black-85: color-mix(in oklab, var(--secondary-color), black 85%); --secondary-color-black-90: color-mix(in oklab, var(--secondary-color), black 90%); --secondary-color-black-95: color-mix(in oklab, var(--secondary-color), black 95%); --secondary-color-black-96: color-mix(in oklab, var(--secondary-color), black 96%); --secondary-color-black-97: color-mix(in oklab, var(--secondary-color), black 97%); --secondary-color-black-98: color-mix(in oklab, var(--secondary-color), black 98%); --secondary-color-black-99: color-mix(in oklab, var(--secondary-color), black 99%); --secondary-color-gray-1: color-mix(in oklab, var(--secondary-color), gray 1%); --secondary-color-gray-2: color-mix(in oklab, var(--secondary-color), gray 2%); --secondary-color-gray-3: color-mix(in oklab, var(--secondary-color), gray 3%); --secondary-color-gray-4: color-mix(in oklab, var(--secondary-color), gray 4%); --secondary-color-gray-5: color-mix(in oklab, var(--secondary-color), gray 5%); --secondary-color-gray-10: color-mix(in oklab, var(--secondary-color), gray 10%); --secondary-color-gray-15: color-mix(in oklab, var(--secondary-color), gray 15%); --secondary-color-gray-20: color-mix(in oklab, var(--secondary-color), gray 20%); --secondary-color-gray-25: color-mix(in oklab, var(--secondary-color), gray 25%); --secondary-color-gray-30: color-mix(in oklab, var(--secondary-color), gray 30%); --secondary-color-gray-35: color-mix(in oklab, var(--secondary-color), gray 35%); --secondary-color-gray-40: color-mix(in oklab, var(--secondary-color), gray 40%); --secondary-color-gray-50: color-mix(in oklab, var(--secondary-color), gray 50%); --secondary-color-gray-60: color-mix(in oklab, var(--secondary-color), gray 60%); --secondary-color-gray-65: color-mix(in oklab, var(--secondary-color), gray 65%); --secondary-color-gray-70: color-mix(in oklab, var(--secondary-color), gray 70%); --secondary-color-gray-75: color-mix(in oklab, var(--secondary-color), gray 75%); --secondary-color-gray-80: color-mix(in oklab, var(--secondary-color), gray 80%); --secondary-color-gray-85: color-mix(in oklab, var(--secondary-color), gray 85%); --secondary-color-gray-90: color-mix(in oklab, var(--secondary-color), gray 90%); --secondary-color-gray-95: color-mix(in oklab, var(--secondary-color), gray 95%); --secondary-color-gray-96: color-mix(in oklab, var(--secondary-color), gray 96%); --secondary-color-gray-97: color-mix(in oklab, var(--secondary-color), gray 97%); --secondary-color-gray-98: color-mix(in oklab, var(--secondary-color), gray 98%); --secondary-color-gray-99: color-mix(in oklab, var(--secondary-color), gray 99%); --primary-color: #195684; --secondary-color: #932c1c; } :root.dark-mode { color-scheme: dark; --page-color: var(--background-color); --content-background: var(--page-color); --page-border-color: var(--background-color-white-25); --doc-title-color: var(--primary-color); --byline-color: var(--background-color-white-50); --banner-background: #23241f; --navbar-background: var(--background-color-gray-15); --footer-background: var(--background-color-black-10); --toc-border-color: #555; --toc-background: var(--content-background); --tocitem-background: var(--toc-background); --toc-text-color: var(--body-text-color); --tocitem-highlight-background: var(--primary-color-gray-5); --tocitem-highlight-text-color: var(--background-color-black-50); --tocitem-highlight-border-color: var(--toc-border-color); --tocitem-active-background: var(--primary-color-gray-5); --tocitem-active-text-color: var(--background-color-black-50); --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--background-color-gray-10); --toclevel1-text-color: var(--primary-color-white-40); --toclevel2-background: var(--toclevel1-background); --toclevel2-text-color: var(--toclevel1-text-color); --toclevel3-background: var(--content-background); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #f2f2f2; --body-title-color: var(--primary-color-white-20); --ptx-image-bg: white; --activated-content-bg: rgba(255, 237, 185, 0.2); --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color-white-10); --link-background: transparent; --link-active-text-color: var(--primary-color-white-40); --link-active-background: var(--background-color-gray-30); --link-alt-text-color: var(--link-text-color); --link-alt-background: transparent; --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--link-active-text-color); --knowl-link-color: var(--doc-title-color); --knowl-background: var(--background-color-black-10); --knowl-border-color: var(--background-color-white-20); --knowl-nested-1-background: var(--background-color-gray-10); --knowl-nested-2-background: var(--background-color-black-10); --knowl-nested-3-background: var(--background-color-gray-10); --knowl-nested-4-background: var(--background-color-black-10); --block-body-background: var(--content-background); --block-border-color: var(--knowl-border-color); --block-head-color: var(--body-text-color); --aside-like-link-color: var(--link-text-color); --button-background: var(--background-color-gray-15); --button-text-color: var(--body-text-color); --button-border-color: var(--background-color-white-25); --button-hover-background: var(--primary-color-black-50); --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: var(--background-color-gray-20); --code-inline-background: var(--background-color-gray-20); --assemblage-like-body-background: var(--block-body-background); --assemblage-like-border-color: var(--block-border-color); --definition-like-body-background: var(--block-body-background); --definition-like-border-color: var(--block-border-color); --theorem-like-body-background: var(--block-body-background); --theorem-like-border-color: var(--block-border-color); --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: var(--block-body-background); --remark-like-border-color: var(--block-border-color); --computation-like-body-background: var(--block-body-background); --computation-like-border-color: var(--block-border-color); --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--block-body-background); --aside-like-border-color: var(--block-border-color); --proof-like-body-background: var(--block-body-background); --proof-like-border-color: var(--block-border-color); --example-like-body-background: var(--block-body-background); --example-like-border-color: var(--block-border-color); --project-like-body-background: var(--block-body-background); --project-like-border-color: var(--block-border-color); --goal-like-body-background: var(--block-body-background); --goal-like-border-color: var(--block-border-color); --solution-like-body-background: var(--block-body-background); --solution-like-border-color: var(--block-border-color); --primary-color: #698aa8; --background-color: #23241f; --background-color-white-1: color-mix(in oklab, var(--background-color), white 1%); --background-color-white-2: color-mix(in oklab, var(--background-color), white 2%); --background-color-white-3: color-mix(in oklab, var(--background-color), white 3%); --background-color-white-4: color-mix(in oklab, var(--background-color), white 4%); --background-color-white-5: color-mix(in oklab, var(--background-color), white 5%); --background-color-white-10: color-mix(in oklab, var(--background-color), white 10%); --background-color-white-15: color-mix(in oklab, var(--background-color), white 15%); --background-color-white-20: color-mix(in oklab, var(--background-color), white 20%); --background-color-white-25: color-mix(in oklab, var(--background-color), white 25%); --background-color-white-30: color-mix(in oklab, var(--background-color), white 30%); --background-color-white-35: color-mix(in oklab, var(--background-color), white 35%); --background-color-white-40: color-mix(in oklab, var(--background-color), white 40%); --background-color-white-50: color-mix(in oklab, var(--background-color), white 50%); --background-color-white-60: color-mix(in oklab, var(--background-color), white 60%); --background-color-white-65: color-mix(in oklab, var(--background-color), white 65%); --background-color-white-70: color-mix(in oklab, var(--background-color), white 70%); --background-color-white-75: color-mix(in oklab, var(--background-color), white 75%); --background-color-white-80: color-mix(in oklab, var(--background-color), white 80%); --background-color-white-85: color-mix(in oklab, var(--background-color), white 85%); --background-color-white-90: color-mix(in oklab, var(--background-color), white 90%); --background-color-white-95: color-mix(in oklab, var(--background-color), white 95%); --background-color-white-96: color-mix(in oklab, var(--background-color), white 96%); --background-color-white-97: color-mix(in oklab, var(--background-color), white 97%); --background-color-white-98: color-mix(in oklab, var(--background-color), white 98%); --background-color-white-99: color-mix(in oklab, var(--background-color), white 99%); --background-color-black-1: color-mix(in oklab, var(--background-color), black 1%); --background-color-black-2: color-mix(in oklab, var(--background-color), black 2%); --background-color-black-3: color-mix(in oklab, var(--background-color), black 3%); --background-color-black-4: color-mix(in oklab, var(--background-color), black 4%); --background-color-black-5: color-mix(in oklab, var(--background-color), black 5%); --background-color-black-10: color-mix(in oklab, var(--background-color), black 10%); --background-color-black-15: color-mix(in oklab, var(--background-color), black 15%); --background-color-black-20: color-mix(in oklab, var(--background-color), black 20%); --background-color-black-25: color-mix(in oklab, var(--background-color), black 25%); --background-color-black-30: color-mix(in oklab, var(--background-color), black 30%); --background-color-black-35: color-mix(in oklab, var(--background-color), black 35%); --background-color-black-40: color-mix(in oklab, var(--background-color), black 40%); --background-color-black-50: color-mix(in oklab, var(--background-color), black 50%); --background-color-black-60: color-mix(in oklab, var(--background-color), black 60%); --background-color-black-65: color-mix(in oklab, var(--background-color), black 65%); --background-color-black-70: color-mix(in oklab, var(--background-color), black 70%); --background-color-black-75: color-mix(in oklab, var(--background-color), black 75%); --background-color-black-80: color-mix(in oklab, var(--background-color), black 80%); --background-color-black-85: color-mix(in oklab, var(--background-color), black 85%); --background-color-black-90: color-mix(in oklab, var(--background-color), black 90%); --background-color-black-95: color-mix(in oklab, var(--background-color), black 95%); --background-color-black-96: color-mix(in oklab, var(--background-color), black 96%); --background-color-black-97: color-mix(in oklab, var(--background-color), black 97%); --background-color-black-98: color-mix(in oklab, var(--background-color), black 98%); --background-color-black-99: color-mix(in oklab, var(--background-color), black 99%); --background-color-gray-1: color-mix(in oklab, var(--background-color), gray 1%); --background-color-gray-2: color-mix(in oklab, var(--background-color), gray 2%); --background-color-gray-3: color-mix(in oklab, var(--background-color), gray 3%); --background-color-gray-4: color-mix(in oklab, var(--background-color), gray 4%); --background-color-gray-5: color-mix(in oklab, var(--background-color), gray 5%); --background-color-gray-10: color-mix(in oklab, var(--background-color), gray 10%); --background-color-gray-15: color-mix(in oklab, var(--background-color), gray 15%); --background-color-gray-20: color-mix(in oklab, var(--background-color), gray 20%); --background-color-gray-25: color-mix(in oklab, var(--background-color), gray 25%); --background-color-gray-30: color-mix(in oklab, var(--background-color), gray 30%); --background-color-gray-35: color-mix(in oklab, var(--background-color), gray 35%); --background-color-gray-40: color-mix(in oklab, var(--background-color), gray 40%); --background-color-gray-50: color-mix(in oklab, var(--background-color), gray 50%); --background-color-gray-60: color-mix(in oklab, var(--background-color), gray 60%); --background-color-gray-65: color-mix(in oklab, var(--background-color), gray 65%); --background-color-gray-70: color-mix(in oklab, var(--background-color), gray 70%); --background-color-gray-75: color-mix(in oklab, var(--background-color), gray 75%); --background-color-gray-80: color-mix(in oklab, var(--background-color), gray 80%); --background-color-gray-85: color-mix(in oklab, var(--background-color), gray 85%); --background-color-gray-90: color-mix(in oklab, var(--background-color), gray 90%); --background-color-gray-95: color-mix(in oklab, var(--background-color), gray 95%); --background-color-gray-96: color-mix(in oklab, var(--background-color), gray 96%); --background-color-gray-97: color-mix(in oklab, var(--background-color), gray 97%); --background-color-gray-98: color-mix(in oklab, var(--background-color), gray 98%); --background-color-gray-99: color-mix(in oklab, var(--background-color), gray 99%); --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); } /*! Theme: default-modern */ /*# sourceMappingURL=theme-default-modern.css.map */ ================================================ FILE: css/dist/theme-denver.css ================================================ @charset "UTF-8"; @import "https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=swap"; @import "https://fonts.googleapis.com/css2?family=Noto Sans:ital,wght@0,400..700;1,400..700&display=swap"; @import "https://fonts.googleapis.com/css2?family=Inconsolata:ital,wght@0,400..700;1,400..700&display=swap"; /* ../../css/targets/html/denver/theme-denver.scss */ :root { --base-content-width: 600px; --content-padding: 120px; } body { margin: 0; min-height: 100vh; display: flex; flex-direction: column; align-items: stretch; } body.pretext { color: var(--body-text-color); font-family: var(--font-body); } .ptx-page { position: relative; display: flex; flex-grow: 1; width: 100%; } .ptx-main { flex-grow: 1; position: relative; max-width: 100%; container-name: ptx-main; container-type: inline-size; } .ptx-main .ptx-content { max-width: 840px; padding: 24px 120px 60px; margin-left: auto; margin-right: auto; } .worksheet .ptx-main .ptx-content { max-width: 960px; } .ptx-page { max-width: 1480px; margin-left: auto; margin-right: auto; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; background: var(--page-color, white); } .ptx-content .print-preview-header { display: none; } body.pretext > a.assistive { padding: 6px; position: absolute; top: -40px; left: 0px; color: white; border-right: 1px solid white; border-bottom: 1px solid white; border-bottom-right-radius: 8px; background: #BF1722; z-index: 10000; } body.pretext > a.assistive:focus { top: 0px; outline: 0; transition: top 0.1s ease-in, background 0.5s linear; } .ptx-content-footer { display: flex; justify-content: space-around; max-width: 840px; padding-top: 2em; padding-bottom: 2em; padding-left: 120px; padding-right: 120px; margin-left: auto; margin-right: auto; } .ptx-content-footer .button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-content-footer .button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content-footer .button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-content-footer .button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-content-footer .button.hidden { display: none; } .ptx-content-footer .button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content-footer .button .icon { margin: 0 -7px; } body.standalone-page .ptx-page { max-width: 1600px; } .ptx-masthead { position: relative; background: var(--banner-background); width: 100%; display: flex; justify-content: center; } .ptx-masthead .ptx-banner { border-top: 1px solid transparent; overflow: hidden; padding: 10px 10px; border-bottom: none; display: flex; width: 100%; align-items: center; max-width: 840px; } .ptx-masthead a { color: var(--doc-title-color, #2a5ea4); } .ptx-masthead a:active { color: var(--link-active-text-color); } .ptx-masthead .title-container { font-family: var(--font-headings); font-size: 2em; padding-left: 9.68px; overflow: hidden; flex: 1; } .ptx-masthead .title-container .heading { font-weight: 700; font-size: 100%; line-height: 1.25em; } .ptx-masthead .title-container .title:has(+ .subtitle)::after { content: ":"; } .ptx-masthead .title-container .subtitle { font-weight: normal; } .ptx-masthead .logo-link { height: 5em; display: flex; } .ptx-masthead .logo-link img { max-height: 100%; } .ptx-masthead .logo-link img[src$=".svg"] { height: 100%; } .ptx-masthead .byline { color: var(--byline-color); font-weight: normal; margin: 0; font-size: 62.5%; min-height: inherit; } @media screen and (max-width: 800px) { .ptx-masthead { border-bottom: 1px solid var(--page-border-color); } .ptx-masthead .ptx-banner { padding: 10px 28px; display: flex; justify-content: center; } .ptx-masthead .logo-link::before { font-size: 1rem; margin-top: 0; } .ptx-masthead .title-container { width: fit-content; flex: unset; } .ptx-masthead .title-container .heading { line-height: 1em; } .ptx-masthead .title-container .heading .subtitle { display: block; font-size: 80%; line-height: 1em; } .ptx-masthead .byline { font-size: 50%; } } @media screen and (width <= 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; font-size: 1em; } .ptx-masthead .logo-link { display: none; } .ptx-masthead .byline { display: none; } } .ptx-navbar { position: sticky; top: 0; height: 36px; width: 100%; background: var(--navbar-background); border: 0; border-top: 1px solid var(--page-border-color); border-bottom: 1px solid var(--page-border-color); margin: 0; z-index: 500; overflow: visible; display: flex; } .ptx-navbar .ptx-navbar-contents { position: relative; display: flex; flex: 1; justify-content: center; align-items: center; max-width: 840px; margin: 0 auto; } .ptx-navbar .button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-navbar .button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-navbar .button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-navbar .button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-navbar .button.hidden { display: none; } .ptx-navbar .button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-navbar .button { height: 100%; border-width: 0; } .ptx-navbar .toc-toggle { width: 240px; gap: 0.4em; margin-left: 0; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls, .nav-other-controls) { display: flex; } .ptx-navbar .treebuttons { flex: 1 1 210px; justify-content: end; } .ptx-navbar .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .ptx-navbar .pretext .navbar .dropdown { height: 34px; } .ptx-navbar .embed-popup { padding: 10px; background-color: var(--navbar-background); position: absolute; margin-top: 36px; border: 1px solid var(--page-border-color); border-radius: 3px; box-shadow: 0 0 5px var(--primary-color-gray-80); color: var(--button-text-color); } .ptx-navbar .embed-popup .embed-code-container { width: "100%"; padding: 5px; } .ptx-navbar .embed-popup .embed-code-container .embed-code-textbox { width: 100%; padding: 10px; height: 5em; } .ptx-navbar .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .ptx-navbar .treebuttons .icon { margin: 0 -7px; } .ptx-navbar :is(.index-button) .icon { display: none; } .ptx-navbar :is(.runestone-profile, .activecode-toggle, .searchbutton, .calculator-toggle, .light-dark-button, .embed-button) .name { display: none; } .ptx-navbar .index-button { min-width: 70px; } .runestone-profile { position: relative; } .runestone-profile .dropdown-content { display: none; position: absolute; background-color: var(--dropdown-background); min-width: 160px; z-index: 100; border: 1px solid var(--dropdown-border-color); right: 0; top: 35px; text-align: start; padding: 0; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: var(--dropdown-text-color); padding: 2px 8px; } .runestone-profile .dropdown-content a:is(:hover, :focus-visible) { background-color: var(--dropdown-hover-background); color: var(--dropdown-hover-text-color); } .runestone-profile .dropdown-content hr { color: var(--dropdown-border-color); margin: 4px 0; } .runestone-profile:is(:hover, :focus-visible, :focus-within) { overflow: visible; } .runestone-profile:is(:hover, :focus-visible, :focus-within) .dropdown-content { display: block; } @media screen and (max-width: 800px) { .ptx-navbar .button { border-left-width: 1px; border-right-width: 1px; border-color: var(--page-border-color); } .ptx-navbar > *:not(:first-child) { margin-left: -1px; } .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; z-index: 1100; background: var(--button-border-color); max-width: 100vw; } .ptx-navbar .ptx-navbar-contents { max-width: 100vw; } .ptx-navbar .nav-runestone-controls { flex: 0; } .ptx-navbar .toc-toggle { flex: 2 1 100px; } .ptx-navbar .treebuttons { flex: 3 1 150px; } .ptx-navbar .treebuttons > * { flex: 1 1; min-width: 35px; } .ptx-navbar .index-button { display: none; } .ptx-navbar .embed-popup { margin-top: unset; bottom: 36px; } .ptx-navbar .dropdown-content { top: unset; bottom: 36px; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button, .embed-button) .name { display: none; } } .ptx-sidebar { align-self: flex-start; } .ptx-sidebar.visible { display: block; } .ptx-sidebar.hidden { display: none; height: 0; } .ptx-toc { --codenumber-pad-left: 0.3rem; --codenumber-pad-right: 0.5rem; --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); background: var(--toc-background); margin: 0; font-size: 0.9rem; } .ptx-toc:is(.depth1, .parts.depth2) { --codenumber-pad-right: 0.5rem; } .ptx-toc .toc-item-list { margin: 0; padding: 0; list-style: none; background: var(--tocitem-background); } .ptx-toc .toc-item-list .active { list-style: none; } .ptx-toc .toc-item { background-color: var(--tocitem-background); color: var(--toc-text-color); border-color: var(--toc-border-color); } .ptx-toc .toc-item a { color: inherit; } .ptx-toc .toc-item.active:not(:has(.toc-item.active)) { color: var(--tocitem-active-text-color) !important; background-color: var(--tocitem-active-background) !important; border-color: var(--tocitem-active-border-color) !important; } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--tocitem-highlight-text-color); background-color: var(--tocitem-highlight-background); border-color: var(--tocitem-highlight-border-color); } .ptx-toc .toc-title-box { display: flex; } .ptx-toc .toc-title-box > .internal { position: relative; display: flex; flex-grow: 1; padding: 0.2em; font-weight: 500; } .ptx-toc .toc-item-list .toc-item-list .toc-title-box > .internal { font-weight: normal; } .ptx-toc .codenumber { min-width: var(--toc-indent-first); padding-left: var(--codenumber-pad-left); padding-right: var(--codenumber-pad-right); display: inline-block; text-align: left; flex-grow: 0; } .ptx-toc .toc-item { color: var(--toclevel1-text-color); background-color: var(--toclevel1-background); } .ptx-toc .toc-item .toc-item { color: var(--toclevel2-text-color); background-color: var(--toclevel2-background); } .ptx-toc .toc-item .toc-item .toc-item { color: var(--toclevel3-text-color); background-color: var(--toclevel3-background); } .book .ptx-toc .toc-chapter .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .codenumber { font-size: 80%; padding-top: 0.16em; min-width: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber { min-width: var(--toc-indent-third); visibility: hidden; } .ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber { visibility: visible; } .ptx-toc .toc-item .toc-title-box .title { margin-left: var(--toc-indent-first); } .book .ptx-toc .toc-chapter .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .title { margin-left: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { margin-left: var(--toc-indent-third); } .ptx-toc .toc-item > .toc-title-box .codenumber + .title { margin-left: 0 !important; } .ptx-toc .toc-chapter .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { font-size: 90%; } .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title { font-style: italic; } .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth1 ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-backgrounde); color: var(--tocitem-active-text-color); } .ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-background); color: var(--tocitem-active-text-color); } .ptx-toc.focused { } .ptx-toc.focused ul.structural:not(.contains-active) > .toc-item { display: none; } .ptx-toc.focused ul.structural:not(.contains-active) > .toc-item.visible { display: block; } .ptx-toc.focused ul.structural .toc-item.active > ul.structural > .toc-item { display: block; } .ptx-toc.focused ul.structural .toc-item.active > ul.structural > .toc-item.hidden { display: none; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 1.25em; line-height: 18px; font-variation-settings: "wght" 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--tocitem-highlight-background); color: var(--tocitem-highlight-text-color); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--tocitem-highlight-text-color); } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon:before { content: "add"; } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before { content: "remove"; } .ptx-sidebar { flex: 0 0 240px; position: sticky; top: 36px; overflow-y: hidden; } .ptx-toc { position: sticky; top: 36px; overflow-y: auto; overflow-x: hidden; height: calc(100vh - 36px); margin-top: -1px; } .ptx-toc > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 3px solid var(--toc-border-color); } @media screen and (max-width: 944px) { .ptx-sidebar { display: none; position: sticky; top: 36px; background: var(--content-background); min-height: 30vh; border-right: 2px solid var(--toc-border-color); border-bottom: 2px solid var(--toc-border-color); width: 240px; } } @media screen and (max-width: 800px) { .ptx-sidebar { position: fixed; z-index: 1000; top: unset; height: auto; max-height: 80vh; max-width: 80vw; bottom: 36px; border-right: 2px solid var(--toc-border-color); border-top: 2px solid var(--toc-border-color); } .ptx-toc { border-top: 2px solid var(--toc-border-color); border-bottom: 0; max-height: 80vh; } } .ptx-toc { scrollbar-color: var(--content-background) var(--content-background); } .ptx-toc:hover { scrollbar-color: var(--page-border-color) var(--content-background); } .ptx-page-footer { background: var(--footer-background); padding-top: 0; border-top: 2px solid var(--page-border-color); border-bottom: 2px solid var(--page-border-color); display: flex; flex-direction: row; justify-content: center; width: 100%; gap: 90px; position: relative; } .ptx-page-footer > a { margin: 1em 0; color: var(--body-text-color); } .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } .ptx-page-footer .feedback-link { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-page-footer .feedback-link:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-page-footer .feedback-link:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-page-footer .feedback-link.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-page-footer .feedback-link.hidden { display: none; } .ptx-page-footer .feedback-link.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } @media screen and (max-width: 800px) { .ptx-page-footer { gap: 20px; justify-content: center; margin-bottom: 34px; } .ptx-page-footer > a > .logo:first-child { height: 2em; } } @container ptx-main (width > 640px) { .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { --max-width: calc(min((100cqw - 2 * 20px), 10000px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); margin-left: calc(-0.5 * (100cqw - 640px)); } } .ptx-runestone-container .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; min-width: 100%; margin-left: auto; } @container ptx-main (width > 640px) { :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { --max-width: calc(min((100cqw - 2 * 20px), 10000px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); margin-left: calc(-0.5 * (100cqw - 640px)); } } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; margin-left: auto; } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content) .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; margin-left: 0; } .runestone.ac_section > div > div > *:not(.ac_code_div):not(.ac_output):not(.codelens):not(.ac_actions) { max-width: 600px; margin-left: auto; margin-right: auto; } .runestone .exercise-statement { max-width: 600px; margin-left: auto; margin-right: auto; } .hparsons_section .hp_question, .hparsons_section .hp_feedback { max-width: 600px; margin-left: auto; margin-right: auto; } .runestone.parsons_section > .parsons { width: 100%; padding-right: 0; } .runestone.parsons_section > .parsons .sortable-code-container { display: flex; flex-flow: wrap; justify-content: center; gap: 15px; margin: 10px auto; } .runestone.parsons_section > .parsons .sortable-code { margin: 0; } .runestone.parsons_section > .parsons .runestone_caption_text { max-width: unset; } .runestone.parsons_section > .parsons > div > *:not(.sortable-code-container) { max-width: 600px; margin-left: auto; margin-right: auto; } @media (width < 850px) { .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100cqw; margin-left: calc(-0.5 * (100cqw - 100%)); } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100cqw; margin-left: calc(-0.5 * (100cqw - 100%)); } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content) .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; margin-left: 0px; } } .ptx-main { margin-right: 320px; } .ptx-sidebar.hidden + .ptx-main { margin-left: 320px; } .ptx-main { box-shadow: 5px 10px 40px -10px var(--primary-color-gray-80); } @media (prefers-color-scheme: dark) { .ptx-main { box-shadow: 5px 10px 40px -10px black; } } .ptx-sidebar { margin-right: 80px; } .ptx-navbar { border: none; } .ptx-navbar .toc-toggle { transform: translateX(-320px); position: absolute; left: 0; justify-content: left; } .ptx-toc { border: none; position: sticky; top: 36px; } .toc-item.visible { font-size: 0.95em; padding-left: 8px; } .ptx-page { margin-top: 36px; margin-bottom: 36px; } @media screen and (width <= 1480px) { .ptx-page { margin-left: 0; max-width: 100%; } .ptx-main { margin-right: calc(100% - 840px - 320px); max-width: 840px; } .ptx-sidebar.hidden + .ptx-main { margin-right: auto; margin-left: auto; } .ptx-navbar .ptx-navbar-contents { margin-left: 320px; } } @media screen and (width <= 1240px) { .ptx-main { box-shadow: unset; margin-right: auto; } .ptx-main .ptx-content { padding-left: 20px; padding-right: 20px; max-width: 640px; } .ptx-sidebar { margin-right: 0; } .ptx-navbar .ptx-navbar-contents { margin-left: 240px; } .ptx-navbar .toc-toggle { transform: translateX(-240px); justify-content: center; } .ptx-page { margin-top: unset; margin-bottom: unset; } .ptx-toc { padding-top: 36px; } } @media screen and (width <= 880px) { .ptx-sidebar { display: none; } } @media screen and (max-width: 800px) { .ptx-navbar .ptx-navbar-contents { margin-left: 0; } .ptx-navbar .toc-toggle { transform: none; position: relative; justify-content: center; } .ptx-content-footer { padding-left: 20px; padding-right: 20px; } } .toc-item:is(:hover, :focus) { color: var(--tocitem-highlight-text-color); background-color: var(--tocitem-highlight-background); border-color: var(--tocitem-highlight-border-color); } .standalone-page { margin: 0; padding: 0; } .standalone-page .ptx-page { margin-top: 0; margin-bottom: 0; } .standalone-page .ptx-main { margin-right: auto; margin-left: auto; box-shadow: none; max-width: 100%; } .aside-like > .knowl__link { color: var(--aside-like-link-color); border-bottom-color: var(--aside-like-link-color); } .aside-like > .knowl__content { margin-left: 30px; margin-right: 30px; border: 2px solid var(--aside-like-border-color); background-color: var(--aside-like-body-background); } @media screen and (min-width: 1450px) { details.aside-like { position: relative; margin-left: -365px; width: 200px; right: -365px; float: right; clear: right; } .multicolumn details.aside-like { position: relative; margin-left: inherit; width: auto; right: 0; float: none; clear: none; } details.aside-like > .knowl__content { margin-left: 0; margin-right: 0; background-color: var(--aside-like-body-background); z-index: 100; } } .code-box { overflow-x: auto; } .code-display { overflow-x: auto; font-family: var(--font-monospace); margin: 0.5em 0; } .console, .program { border: 1px solid var(--page-border-color); padding: 5px 15px; overflow-x: auto; margin: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-inline { font-family: var(--font-monospace); white-space: pre; color: var(--body-text-color); background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); border-radius: 0.2em; display: inline-block; overflow-x: auto; max-width: 100%; vertical-align: middle; line-height: normal; padding: 0.0625em 0.15em; } .prompt.unselectable { user-select: none; } .code-block { border-left: 1px solid #aaa; padding: 0 15px 5px; overflow-x: auto; background: var(--code-background); margin-top: 0; margin-bottom: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-block::before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } @media print { .code-copy { display: none; } } :is(.cols2, .cols3, .cols4, .cols5, .cols6) { display: flex; flex-wrap: wrap; justify-content: start; } .cols2 > .exercise-like { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > .exercise-like { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > .exercise-like { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > .exercise-like { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > .exercise-like { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .exercise-like > .heading { font-size: inherit; } .exercisegroup .exercise-like { margin-top: 1em; } .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .exercisegroup > .heading + .introduction { display: inline; } .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .exercisegroup .exercisegroup-exercises { margin-top: 1em; padding-left: 40px; } .exercisegroup .conclusion { margin-left: 40px; } .exercisegroup .conclusion .heading { font-size: inherit; } .exercise-like > .exercise-like.task { margin-left: 20px; } .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .exercise-wrapper form button:active { background-color: #f0f0f0; } .exercise-wrapper form button + button { margin-left: 0.8em; } .exercise-wrapper, .exercise-wrapper form, .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .knowl .exercise-wrapper, .knowl .exercise-wrapper form, .knowl .exercise-wrapper form > div:first-child { width: 100%; } .exercise-wrapper > .para:first-child, .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .cols2 .heading + .exercise-wrapper { width: auto; } section.solutions > .heading + .heading { margin-top: 0.5em; } section.solutions > h3.heading, section.solutions section > h3.heading { font-size: 1.6em; } section.solutions > h4.heading, section.solutions section > h4.heading { font-size: 1.45em; } section.solutions > h5.heading, section.solutions section > h5.heading { font-size: 1.35em; } section.solutions > h6.heading, section.solutions section > h6.heading { font-size: 1.25em; } .sbsgroup > *:not(:first-child) { margin-top: 1.5em; } .sbsrow { display: grid; grid-template-rows: auto auto; } .sbspanel { grid-row: 1; } .sbspanel > .table > figcaption { text-align: center; } .sbspanel .tabular { overflow-x: auto; margin-left: auto; margin-right: auto; } .sbspanel--top { align-self: start; } .sbspanel--middle { align-self: center; } .sbspanel--bottom { align-self: end; } .sbspanel:has(.figure-like, .table-like), .sbspanel > :is(.figure-like, .table-like) { display: contents; } .sbspanel > :is(.figure-like, .table-like) > *:first-child { grid-row: 1; align-items: start; align-self: start; } .sbspanel--top > :is(.figure-like, .table-like) > *:first-child { align-items: start; align-self: start; } .sbspanel--middle > :is(.figure-like, .table-like) > *:first-child { align-items: center; align-self: center; } .sbspanel--bottom > :is(.figure-like, .table-like) > *:first-child { align-items: end; align-self: end; } .sbspanel > :is(.figure-like, .table-like) > *:nth-child(2) { margin-top: 0.5em; grid-row: 2; width: 100%; } .sbspanel:nth-of-type(2) * { grid-column: 2; } .sbspanel:nth-of-type(3) * { grid-column: 3; } .sbspanel:nth-of-type(4) * { grid-column: 4; } .sbspanel:nth-of-type(5) * { grid-column: 5; } .sbspanel:nth-of-type(6) * { grid-column: 6; } .sbspanel:nth-of-type(7) * { grid-column: 7; } .sbspanel:nth-of-type(8) * { grid-column: 8; } .sbspanel:nth-of-type(9) * { grid-column: 9; } .sbspanel:nth-of-type(10) * { grid-column: 10; } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowl-link-color); border-bottom: 1px dotted var(--knowl-link-color); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--knowl-background); border-bottom-color: transparent; } .source-view__content { margin: 0.2em 0; } .knowl__content { margin: 0.75em 0; border: 3px solid var(--knowl-border-color); border-radius: 0; padding: 12px; background-color: var(--knowl-background); } .knowl__content .incontext { display: block; font-size: 85%; text-align: right; } .knowl__content .knowl__content { background-color: var(--knowl-nested-1-background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-2-background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-3-background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-4-background); } .knowl__content > figure { margin-left: 0; margin-right: 0; } .theorem-like:not(.knowl__content, .born-hidden-knowl) { border: 3px solid var(--theorem-like-border-color); background-color: var(--theorem-like-body-background); padding: 20px; padding-top: calc(20px + 0.25ex); margin-top: 2.5em !important; } .theorem-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--theorem-like-border-color); display: block; color: var(--block-head-color); margin-bottom: 0.5em; padding: 5px 10px; margin-top: calc(-25px - 1.65ex); width: fit-content; border: 0; } .theorem-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .knowl__content *:first-child .theorem-like { margin-top: 1em; } .theorem-like > .heading { font-size: 1.125em; } .definition-like:not(.knowl__content, .born-hidden-knowl) { border: 3px solid var(--definition-like-border-color); background-color: var(--definition-like-body-background); padding: 20px; padding-top: calc(20px + 0.25ex); margin-top: 2.5em !important; } .definition-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--definition-like-border-color); display: block; color: var(--block-head-color); margin-bottom: 0.5em; padding: 5px 10px; margin-top: calc(-25px - 1.65ex); width: fit-content; border: 0; } .definition-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .knowl__content *:first-child .definition-like { margin-top: 1em; } .definition-like > .heading { font-size: 1.125em; } .assemblage-like:not(.knowl__content, .born-hidden-knowl) { border: 3px solid var(--assemblage-like-border-color); background-color: var(--assemblage-like-body-background); padding: 20px; padding-top: calc(20px + 0.25ex); margin-top: 2.5em !important; } .assemblage-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--assemblage-like-border-color); display: block; color: var(--block-head-color); margin-bottom: 0.5em; padding: 5px 10px; margin-top: calc(-25px - 1.65ex); width: fit-content; border: 0; } .assemblage-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .knowl__content *:first-child .assemblage-like { margin-top: 1em; } .assemblage-like > .heading { font-size: 1.125em; } .project-like > .heading { font-style: italic; font-size: 1.125em; } .project-like > .heading { font-size: 1.125em; } .project-like:not(.knowl__content, .born-hidden-knowl) { border: 3px solid var(--project-like-border-color); background-color: var(--content-background); padding: 20px; padding-top: calc(20px + 0.25ex); margin-top: 2.5em !important; } .project-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--content-background); display: block; color: var(--body-text-color); margin-bottom: 0.5em; padding: 5px 10px; margin-top: calc(-25px - 1.65ex); width: fit-content; border: 0; } .project-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .knowl__content *:first-child .project-like { margin-top: 1em; } .proof { padding-bottom: 1.5em; padding-left: 1em; padding-right: 1em; } .proof::after { content: "\220e"; position: absolute; right: 0; bottom: 1.5em; } .proof .heading { display: inline; font-size: unset; font-weight: bolder; } .proof > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .proof > .heading:first-child:after { content: "\2009"; } .proof > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .proof > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .proof > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } .solution-like .heading { display: inline; font-style: italic; font-size: unset; } .remark-like:not(.knowl__content, .born-hidden-knowl) { padding: 10px; padding-left: 15px; border-left: 6px solid var(--remark-like-border-color); background-color: var(--remark-like-body-background); } .remark-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-top: 0; } .remark-like > .heading { font-size: 1.125em; } .goal-like:not(.knowl__content, .born-hidden-knowl) { padding: 0.7em; border-top: 3px solid var(--goal-like-border-color); border-bottom: 3px solid var(--goal-like-border-color); border-left: none; border-right: none; background-color: var(--content-background); margin-top: 2em; margin-bottom: 1em; } .goal-like > .heading:first-child { background-color: var(--content-background); display: block; color: var(--body-text-colorolor); margin-bottom: 0.5em; margin-top: -1.5em; margin-left: 10px; width: fit-content; padding: 5px 1em; } .goal-like > .heading { font-size: 1.125em; } .example-like:not(.knowl__content, .born-hidden-knowl) { border-left: 3px solid var(--example-like-border-color); border-bottom: 3px solid var(--example-like-border-color); background-color: var(--content-background-background); padding: 0 20px 20px 20px; } .example-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--example-like-border-color); display: inline-block; color: var(--block-head-color); padding: 5px 10px; margin-left: -20px; margin-top: 0; } .example-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .example-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-bottom: 20px; } .example-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child + * { margin-top: 0; } .example-like > .heading { font-size: 1.125em; } .exercise-like.born-hidden-knowl:not(.knowl__content, .born-hidden-knowl) { border-left: 3px solid var(--exercise-like-border-color); border-bottom: 3px solid var(--exercise-like-border-color); background-color: var(--content-background-background); padding: 0 20px 20px 20px; } .exercise-like.born-hidden-knowl:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--exercise-like-border-color); display: inline-block; color: var(--block-head-color); padding: 5px 10px; margin-left: -20px; margin-top: 0; } .exercise-like.born-hidden-knowl:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .exercise-like.born-hidden-knowl:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-bottom: 20px; } .exercise-like.born-hidden-knowl:not(.knowl__content, .born-hidden-knowl) > .heading:first-child + * { margin-top: 0; } .exercise-like.born-hidden-knowl > .heading { font-size: 1.125em; } .exercise-like:not(.project-like .exercise-like, .exercise-like .exercise-like, .exercises .exercise-like, .reading-questions .exercise-like, .task, .worksheet .exercise-like, .problem-content .exercise-like):not(.knowl__content, .born-hidden-knowl) { border-left: 3px solid var(--exercise-like-border-color); border-bottom: 3px solid var(--exercise-like-border-color); background-color: var(--content-background-background); padding: 0 20px 20px 20px; } .exercise-like:not(.project-like .exercise-like, .exercise-like .exercise-like, .exercises .exercise-like, .reading-questions .exercise-like, .task, .worksheet .exercise-like, .problem-content .exercise-like):not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--exercise-like-border-color); display: inline-block; color: var(--block-head-color); padding: 5px 10px; margin-left: -20px; margin-top: 0; } .exercise-like:not(.project-like .exercise-like, .exercise-like .exercise-like, .exercises .exercise-like, .reading-questions .exercise-like, .task, .worksheet .exercise-like, .problem-content .exercise-like):not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .exercise-like:not(.project-like .exercise-like, .exercise-like .exercise-like, .exercises .exercise-like, .reading-questions .exercise-like, .task, .worksheet .exercise-like, .problem-content .exercise-like):not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-bottom: 20px; } .exercise-like:not(.project-like .exercise-like, .exercise-like .exercise-like, .exercises .exercise-like, .reading-questions .exercise-like, .task, .worksheet .exercise-like, .problem-content .exercise-like):not(.knowl__content, .born-hidden-knowl) > .heading:first-child + * { margin-top: 0; } .exercise-like:not(.project-like .exercise-like, .exercise-like .exercise-like, .exercises .exercise-like, .reading-questions .exercise-like, .task, .worksheet .exercise-like, .problem-content .exercise-like) > .heading { font-size: 1.125em; } .computation-like:not(.knowl__content, .born-hidden-knowl) { border-left: 3px solid var(--computation-like-border-color); border-bottom: 3px solid var(--computation-like-border-color); background-color: var(--content-background-background); padding: 0 20px 20px 20px; } .computation-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--computation-like-border-color); display: inline-block; color: var(--block-head-color); padding: 5px 10px; margin-left: -20px; margin-top: 0; } .computation-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .computation-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-bottom: 20px; } .computation-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child + * { margin-top: 0; } .computation-like > .heading { font-size: 1.125em; } .knowl__content { border: none; } .knowl__content .theorem-like, .knowl__content .definition-like, .knowl__content .example-like, .knowl__content .project-like, .knowl__content .remark-like, .knowl__content .openproblem-like, .knowl__content .computation-like, .knowl__content .project-like, .knowl__content .commentary { padding-left: 0; margin-left: 0; border-left: none; } .knowl__content .theorem-like::after, .knowl__content .definition-like::after, .knowl__content .example-like::after, .knowl__content .project-like::after, .knowl__content .remark-like::after, .knowl__content .openproblem-like::after, .knowl__content .computation-like::after, .knowl__content .project-like::after, .knowl__content .commentary::after { border-bottom: none; display: none; } .exercises .exercise-like > .heading:first-child, .worksheet .exercise-like > .heading:first-child, .task > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .exercises .exercise-like > .heading:first-child:after, .worksheet .exercise-like > .heading:first-child:after, .task > .heading:first-child:after { content: "\2009"; } .exercises .exercise-like > .heading:first-child + :is(.para, .para.logical, .introduction), .worksheet .exercise-like > .heading:first-child + :is(.para, .para.logical, .introduction), .task > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .exercises .exercise-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child, .worksheet .exercise-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child, .task > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .exercises .exercise-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child, .worksheet .exercise-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child, .task > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } * { box-sizing: border-box; } @layer spacing { :is(section, article, .knowl__content) > *:not(:first-child) { margin-top: 1.5em; } :is(section, article, .knowl__content) > .para + .para { margin-top: 1em; } .ptx-content :is(ul, td, li, dd, .blockquote, .sbspanel, .para.logical) > *:not(:first-child) { margin-top: 0.5em; } } ol.no-marker, ul.no-marker, li.no-marker { list-style-type: none; } ol.decimal { list-style-type: decimal; } ol.lower-alpha { list-style-type: lower-alpha; } ol.lower-alpha-level-1 > li::marker { content: "(" counter(list-item, lower-alpha) ") "; } ol.upper-alpha { list-style-type: upper-alpha; } ol.lower-roman { list-style-type: lower-roman; } ol.upper-roman { list-style-type: upper-roman; } ul.disc { list-style-type: disc; } ul.square { list-style-type: square; } ul.circle { list-style-type: circle; } dl:is(.description-list, .glossary) { margin: 0; } dl:is(.description-list, .glossary) dt { font-weight: bold; max-width: 55ex; } dl:is(.description-list, .glossary) dd::after { content: ""; display: block; clear: both; } .para > dl:is(.description-list) { margin-top: 0.5em; margin-bottom: 0.5em; } dl.glossary dt { margin-top: 1.25em; } dl.glossary dt:first-of-type { margin-top: 0; } dl.glossary dd { margin-left: 5ex; } dl.description-list dt, dl.description-list dd { margin-top: 1em; } dl.description-list dt:first-of-type, dl.description-list dd:first-of-type { margin-top: 0; } dl.description-list dt { float: left; clear: both; text-align: right; width: 18ex; margin-right: 1ex; } dl.description-list dd { margin-left: 22ex; } dl.description-list.narrow dt { width: 11ex; } dl.description-list.narrow dd { margin-left: 15ex; } dl.description-list.wide dt { width: 25ex; } dl.description-list.wide dd { margin-left: 29ex; } dl.description-list dt:first-of-type { clear: none; } .description-list + * { clear: both; } dl.description-list dl dt { width: 8ex; } dl.description-list dd dd { margin-left: 18ex; } dl.description-list dl dd { margin-left: 12ex; } @media screen and (max-width: 480px) { dl.description-list dt, dl.description-list.narrow dt { float: none; margin-left: 0; text-align: left; width: 25ex; } dl.description-list dd, dl.description-list.narrow dd, dl.description-list.wide dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } .cols2 > li { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > li { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > li { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > li { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > li { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .ptx-content li { margin-top: 0.5em; } .ptx-content li .li--heading-title { font-size: 100%; font-weight: normal; font-style: italic; } .para > :is(ol, ul) { margin-top: 0.5em; margin-bottom: 0.5em; } ol > li { padding-left: 0.25em; } .fillin { display: inline-block; border: none; border-width: 1px; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; } .fillin.underline { border-bottom-style: solid; border-width: 1px; } .fillin.box { outline: 1px solid var(--body-text-color); height: 1.3em; } .fillin.shade { background-color: var(--fillin-background-color, #eee); height: 1.3em; } :root.dark-mode { --fillin-background-color: #444; } .heading:is(h1, h2, h3, h4, h5, h6) { margin: 0; font-size: unset; } .heading { line-height: 1.1; font-family: var(--font-headings); font-weight: 700; margin-top: 0; margin-bottom: 0; } section > .heading { font-size: 1.75em; color: var(--body-title-color); line-height: 1.25em; margin-top: 2.5em; margin-bottom: 0.5em; } section > .heading + * { margin-top: 0.5em; } .ptx-content > section > .heading { margin-top: 0.5em; } section section > .heading { font-size: 1.5em; margin-top: 2em; } section section section > .heading { font-size: 1.4em; margin-top: 2em; } article > .heading { font-size: 1.25em; margin-top: 1.5em; } article > .heading + * { margin-top: 0.5em; } .paragraphs > .heading { font-size: 1.125em; } :is(section, article) > .heading + :is(section, article) > .heading { margin-top: 0.5em; } @media screen and (max-width: 480px) { section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } section section > .heading { font-size: 1.3em; line-height: 1.15em; } section section section > .heading { font-size: 1.15em; line-height: 1em; } } .heading.hide-type > .type { display: none; } a { color: var(--link-text-color); text-decoration: none; } a:hover, a:focus { text-decoration: none; } a[href^="mailto:"] { white-space: pre; } .ptx-content a.internal { color: var(--link-text-color); font-weight: bold; } .ptx-content a.external { color: var(--link-alt-text-color); font-weight: bold; } .ptx-content a.internal:hover, .ptx-content a.internal:hover *, .ptx-content a.internal:focus, .ptx-content a.internal:focus * { color: var(--link-active-text-color); background-color: var(--link-active-background); font-weight: bold; } .ptx-content a.external:hover, .ptx-content a.external:hover *, .ptx-content a.external:focus, .ptx-content a.external:focus * { color: var(--link-alt-active-text-color); background-color: var(--link-alt-active-background); font-weight: bold; } .ptx-content table { border-spacing: 0; border-collapse: collapse; } .ptx-content td { padding: 2px 5px; font-size: 90%; } .ptx-content td img { max-width: 200px; margin-right: 30px; } .ptx-content th { padding: 2px 5px; } .ptx-content th .lines { white-space: nowrap; } .ptx-content th.l { text-align: left; } .ptx-content th.c { text-align: center; } .ptx-content th.r { text-align: right; } .ptx-content th.j { text-align: justify; } .ptx-content th.t { vertical-align: top; } .ptx-content th.b { vertical-align: bottom; } .ptx-content th.m { vertical-align: middle; } .ptx-content th.l0 { border-left: none; } .ptx-content th.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content th.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content th.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content th.r0 { border-right: none; } .ptx-content th.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content th.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content th.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content th.t0 { border-top: none; } .ptx-content th.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content th.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content th.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content th.b0 { border-bottom: none; } .ptx-content th.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content th.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content th.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content td .lines { white-space: nowrap; } .ptx-content td.l { text-align: left; } .ptx-content td.c { text-align: center; } .ptx-content td.r { text-align: right; } .ptx-content td.j { text-align: justify; } .ptx-content td.t { vertical-align: top; } .ptx-content td.b { vertical-align: bottom; } .ptx-content td.m { vertical-align: middle; } .ptx-content td.l0 { border-left: none; } .ptx-content td.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content td.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content td.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content td.r0 { border-right: none; } .ptx-content td.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content td.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content td.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content td.t0 { border-top: none; } .ptx-content td.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content td.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content td.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content td.b0 { border-bottom: none; } .ptx-content td.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content td.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content td.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content th.r0.l0, .ptx-content td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content tr.header-vertical th { writing-mode: vertical-rl; transform: rotate(180deg); padding-top: 5px; } .ptx-content .center table { text-align: center; margin-left: auto; margin-right: auto; } .tabular-box { margin-top: 0.5em; overflow-x: auto; } .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } table.notation-list tr th { text-align: left; margin-left: 1em; } table.notation-list tr td { text-align: left; vertical-align: top; } .frontmatter > .heading { display: block; text-align: center; } .frontmatter > .heading .title, .frontmatter .book > .heading .title { font-size: 1.3em; } .frontmatter > .heading .subtitle, .frontmatter .book > .heading .subtitle { display: block; font-weight: normal; color: var(--byline-color); font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .frontmatter > .para:first-of-type { margin-top: 4em; } .frontmatter > .author, .frontmatter > .credit { margin-top: 2em; text-align: center; } .frontmatter .author:first-of-type { margin-top: 4em; } .frontmatter > .author .author-name { font-size: 120%; } .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .frontmatter .credit .title { font-size: 1em; } .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .frontmatter .author-info { font-size: 90%; } .frontmatter .summary-links { margin-top: 4em; } .frontmatter .abstract { margin: 4em 2em; } .frontmatter .keywords, .frontmatter .support { margin-top: 2em; } .frontmatter .abstract > .title, .frontmatter .keywords > .title, .frontmatter .support > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .frontmatter .abstract > .title::after, .frontmatter .keywords > .title::after, .frontmatter .support > .title::after { content: ".\2009\2009\2009"; } .frontmatter .abstract > .title + .para, .frontmatter .keywords > .title + .para, .frontmatter .support > .title + .para { display: inline; } .frontmatter .colophon .copyright { margin-top: 2.5em; } .frontmatter .colophon .license { margin-top: 2.5em; } .ptx-content .summary-links { font-family: var(--font-headings); display: block; margin-top: 1em; } .ptx-content .summary-links a { color: var(--summary-link-text-color); background: var(--summary-link-background); font-size: 1.5em; line-height: 1.25em; padding: 10px 20px; padding-right: 60px; border-radius: 3px; position: relative; display: block; font-weight: unset; } .ptx-content .summary-links a .title { font-style: normal; } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a::after { right: 0.83333em; content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid var(--summary-link-text-color); } .ptx-content .summary-links a:hover { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover * { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover .title { font-weight: normal; } .ptx-content .summary-links a:hover::after { border-left: 0.4em solid var(--summary-link-hover-text-color); } .ptx-content .summary-links ul { list-style-type: none; padding: 0; margin-top: 0; } .ptx-content .summary-links li { margin-top: 5px; } @media screen and (width <= 480px) { .ptx-content .summary-links a { font-size: 100%; line-height: 1.25em; } } .ptx-footnote { display: inline-block; position: relative; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: smaller; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote[open] .ptx-footnote__number sup { display: none; } .ptx-footnote__number { display: inline-block; cursor: pointer; min-width: 1em; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowl-background); border-radius: 0px; padding: 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowl-border-color); color: var(--body-text-color); font-weight: normal; font-size: var(1rem); } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: var(--activated-content-bg); } .indexitem { margin-top: 4px; } .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .indexknowl { margin-left: 0.11em; } em + .indexknowl { margin-left: -0.25em; } .indexknowl a { margin-left: 2em; } .indexitem .see, .subindexitem .see, .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .indexitem .seealso, .subindexitem .seealso, .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .indexitem .see em, .subindexitem .see em, .subsubindexitem .see em, .indexitem .seealso em, .subindexitem .seealso em, .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .indexitem .see + .see, .subindexitem .see + .see, .subsubindexitem .see + .see, .indexitem .seealso + .seealso, .subindexitem .seealso + .seealso, .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .indexitem .indexknowl { font-size: 90%; } .indexitem [data-knowl], .subindexitem [data-knowl], .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .indexknowl [data-knowl]:hover, .indexknowl .active[data-knowl] { margin-left: 2em; } .subindexitem .indexknowl { font-size: 95%; } .subsubindexitem .indexknowl { font-size: 95%; } .indexletter { margin-top: 1.5em; } .image-box, .audio-box, .video-box, .asymptote-box { position: relative; } .image-box .asymptote-box iframe.asymptote, iframe.asymptote, .video-box .video, .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .image-box img, img.contained { width: 100%; } .asymptote-fullsize-link { text-align: center; font-size: 0.9em; } .ptx-content img, .ptx-content svg { background: var(--ptx-image-bg); } .mermaid > svg { background: none; } .image-description summary { list-style: none; cursor: pointer; } .image-archive { margin: 0.75em auto 0; font-family: var(--font-monospace); justify-content: center; display: flex; gap: 0.5em; } .image-box > img:not(.mag_popup) { cursor: zoom-in; } img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; } .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .audio { width: 100%; } .video-poster { cursor: pointer; } figure { clear: both; position: relative; margin-left: 0; margin-right: 0; } figcaption { margin-left: auto; margin-right: auto; margin-top: 0.5em; } figcaption code.code-inline { white-space: pre; } figcaption .codenumber, figcaption .type { font-weight: 700; } figcaption .codenumber::after, figcaption .type:last-of-type::after { content: "\2002"; } figcaption .para:first-of-type { display: inline; } figure.table-like { margin-left: 30px; margin-right: 30px; } figure.table-like .list { margin-right: 0; } @media (max-width <= 943px) { .figure-like { overflow-x: auto; } } .poem { display: table; margin: 0 auto; width: auto; max-width: 90%; } .poem > .heading { display: block; text-align: center; } section article.poem > .heading::after { content: ""; } .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .poem .author { font-style: italic; margin-top: 0.75em; } .poem .author.left { text-align: left; } .poem .author.center { text-align: center; } .poem .author.right { text-align: right; } .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .poem .stanza + .stanza { margin-top: 1em; } .poem .heading + .stanza { margin-top: 0.2em; } .poem .heading + .line { margin-top: 0.2em; } .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .poem .line.center { text-align: center; } .poem .line.right { text-align: right; } .poem .tab { margin-left: 2em; } pre[class*=language-] { margin: 0; overflow: auto; border: 1px solid #e1e1e1; } :not(pre) > code[class*=language-] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } code[class*=language-], pre[class*=language-] { color: black; background: #fdfdfd; text-shadow: none; font-family: var(--font-monospace); text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.2; tab-size: 4; hyphens: none; } code[class*=language-].code-inline, pre[class*=language-].code-inline { line-height: normal; padding: 0.0625em 0.15em; } code[class*=language-]::selection, code[class*=language-] ::selection, pre[class*=language-]::selection, pre[class*=language-] ::selection { background: #b3d4fc; } code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #2a9716; } code[class*=language-] .token.punctuation, pre[class*=language-] .token.punctuation { color: #000; } code[class*=language-] .token.namespace, pre[class*=language-] .token.namespace { opacity: 0.9; } code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: rgb(41, 120, 15); } code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #a11; } code[class*=language-] .token:is(.operator, .entity, .url), pre[class*=language-] .token:is(.operator, .entity, .url) { color: #000; background: none; } code[class*=language-] .token:is(.atrule, .attr-value, .keyword), pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #0679B7; } code[class*=language-] .token.function, code[class*=language-] .token.class-name, pre[class*=language-] .token.function, pre[class*=language-] .token.class-name { color: #30a; } code[class*=language-] .token.important, code[class*=language-] .token.variable, pre[class*=language-] .token.important, pre[class*=language-] .token.variable { color: rgb(0, 0, 0); } code[class*=language-] .token.important, code[class*=language-] .token.bold, pre[class*=language-] .token.important, pre[class*=language-] .token.bold { font-weight: bold; } code[class*=language-] .token.italic, pre[class*=language-] .token.italic { font-style: italic; } code[class*=language-] .token.entity, pre[class*=language-] .token.entity { cursor: help; } code[class*=language-].line-numbers, pre[class*=language-].line-numbers { position: relative; padding-left: 3.8em; counter-reset: linenumber; overflow: auto; } code[class*=language-].line-numbers > code, pre[class*=language-].line-numbers > code { position: relative; white-space: inherit; } code[class*=language-].line-numbers .line-numbers-rows, pre[class*=language-].line-numbers .line-numbers-rows { position: absolute; pointer-events: none; top: 0; font-size: 100%; left: -3.8em; width: 3em; letter-spacing: -1px; border-right: 1px solid #999; user-select: none; } code[class*=language-].line-numbers .line-numbers-rows > span, pre[class*=language-].line-numbers .line-numbers-rows > span { display: block; counter-increment: linenumber; } code[class*=language-].line-numbers .line-numbers-rows > span::before, pre[class*=language-].line-numbers .line-numbers-rows > span::before { content: counter(linenumber); color: #999; display: block; padding-right: 0.8em; text-align: right; } code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { position: absolute; margin-top: 4px; left: 0; right: 0; padding: inherit 0; font-size: inherit; background: hsla(24, 20%, 50%, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } :root.dark-mode { } :root.dark-mode pre[class*=language-] { border: 1px solid #3d3d3d; } :root.dark-mode code[class*=language-], :root.dark-mode pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } :root.dark-mode code[class*=language-]::selection, :root.dark-mode code[class*=language-] ::selection, :root.dark-mode pre[class*=language-]::selection, :root.dark-mode pre[class*=language-] ::selection { background: hsl(200, 4%, 16%); } :root.dark-mode code[class*=language-] .token, :root.dark-mode pre[class*=language-] .token { position: relative; z-index: 1; } :root.dark-mode code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), :root.dark-mode pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #68a950; } :root.dark-mode code[class*=language-] .token.punctuation, :root.dark-mode pre[class*=language-] .token.punctuation { color: white; opacity: 1; } :root.dark-mode code[class*=language-] .token.namespace, :root.dark-mode pre[class*=language-] .token.namespace { opacity: 0.9; } :root.dark-mode code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), :root.dark-mode pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: #abc792; } :root.dark-mode code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), :root.dark-mode pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #ca9147; } :root.dark-mode code[class*=language-] .token:is(.operator, .entity, .url), :root.dark-mode pre[class*=language-] .token:is(.operator, .entity, .url) { color: white; } :root.dark-mode code[class*=language-] .token:is(.atrule, .attr-value, .keyword), :root.dark-mode pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #2d94fb; } :root.dark-mode code[class*=language-] .token.function, :root.dark-mode code[class*=language-] .token.class-name, :root.dark-mode pre[class*=language-] .token.function, :root.dark-mode pre[class*=language-] .token.class-name { color: #e3e1c2; } :root.dark-mode code[class*=language-] .token.important, :root.dark-mode code[class*=language-] .token.bold, :root.dark-mode pre[class*=language-] .token.important, :root.dark-mode pre[class*=language-] .token.bold { font-weight: bold; } :root.dark-mode code[class*=language-] .token.italic, :root.dark-mode pre[class*=language-] .token.italic { font-style: italic; } :root.dark-mode code[class*=language-] .token.entity, :root.dark-mode pre[class*=language-] .token.entity { cursor: help; } :root.dark-mode .line-highlight { background: hsla(0, 0%, 33%, 0.1); border-bottom: 1px dashed hsl(0, 0%, 33%); border-top: 1px dashed hsl(0, 0%, 33%); z-index: 0; } @media print { code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { color-adjust: exact; } } .displaymath { overflow-x: auto; overflow-y: hidden; } .displaymath mjx-container[jax=CHTML][display=true] { margin: 0 0 0 0; padding-top: 0.3em; } .process-math mjx-container svg { background: none; } [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .knowl mjx-mtext > mjx-utext, mjx-mtext > mjx-utext { width: revert !important; } mjx-msup mjx-utext, mjx-msub mjx-utext { display: inline; } em.alert { font-weight: bold; } .bib { margin-top: 0.25em; } .bib .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .bib .bibitem + .bibentry { display: inline-block; width: 90%; margin-top: 0; } .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .contributor { margin-top: 1.5ex; } .contributor:first-child { margin-top: 0em; } .contributor + .para { margin-top: 3ex; } .contributor .contributor-name { font-variant: small-caps; } .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } iframe { margin: 0; border: none; } .kbdkey { background: #f1f1f1; color: #333; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .unit, .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .unit sub, .unit sup, .quantity sub, .quantity sup { word-spacing: normal; } .terminology { font-style: italic; font-weight: bold; } .times-sign { font-size: larger; vertical-align: -0.15ex; } .emphasis { font-style: italic; } .emphasis .emphasis { font-weight: bold; } .definition-like .emphasis { font-weight: 700; } article.theorem-like .emphasis { font-weight: 700; } .para { line-height: 1.35; } .hidden { display: none !important; } .taxon { font-style: italic; } .quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .booktitle { font-style: oblique; } .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; } .ptx-page, .ptx-main, .ptx-main .ptx-content { all: unset !important; width: 100%; border: none; padding: 0; margin: 0; } .ptx-sagecell, .tabular, .table-like, .figure-like, .exercise-like { break-inside: avoid; } .heading { break-after: avoid; } .code-inline { border: unset; background: unset; } @page { margin: 0.75in 0.75in 0.75in 0.75in; } } .heading .print-links { float: right; position: relative; z-index: 100; vertical-align: bottom; } .heading .print-links .print-link { font-family: var(--font-body); padding: 0.1em 0.2em; } .heading .print-links .material-symbols-outlined { margin-top: 5pt; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .pretext .searchwrapper .cse .gsc-control-cse input, .searchwrapper .gsc-control-cse { padding: 5px; } .searchbox .searchwidget { height: 100%; } .searchbox .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; padding: 1em; left: max(10vw, (100vw - 800px) / 2); width: 80vw; max-width: 800px; border: 2px solid var(--body-text-color); background: var(--knowl-background, #eaf0f6); z-index: 5000; display: flex; flex-direction: column; } .searchbox .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; height: 35px; } .searchbox .ptxsearch { flex: 1 1; } .searchbox .closesearchresults { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .searchbox .closesearchresults:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .searchbox .closesearchresults:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .searchbox .closesearchresults.disabled { opacity: 0.4; cursor: not-allowed; } .searchbox .closesearchresults.hidden { display: none; } .searchbox .closesearchresults.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .searchbox .detailed_result { margin-bottom: 10px; } .searchbox .searchresults a:hover { text-decoration: underline; background: var(--link-active-background); } .searchbox .searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; background: var(--content-background, white); border: 1px solid var(--page-border-color, #ccc); } .searchbox .searchresults:empty { display: none; } .searchbox .search-result-bullet { list-style-type: none; } .searchbox .search-result-score { display: none; } .searchbox .no_result { font-size: 90%; font-weight: 200; } .searchbox .low_result { font-weight: 200; } .searchbox .medium_result { font-weight: 500; } .searchbox .high_result { font-weight: 700; } .searchbox .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .searchbox .search-results-unshown-count { margin-top: 0.6em; } .searchbox .search-result-clip-highlight { background: var(--searchresultshighlight); } .searchbox .searchresultsbackground { position: fixed; top: 0; background: var(--searchresultsbackground, white); width: 100vw; height: 100%; left: 0; z-index: 4999; } @media screen and (max-width: 800px) { .searchbox .searchresultsplaceholder { bottom: 10vh; } } :root { --searchresultsbackground: #fff8; --searchresultshighlight: rgba(255, 255, 0, 50%); } :root.dark-mode { --searchresultsbackground: #0008; --searchresultshighlight: rgba(255, 255, 0, 15%); } .ptx-content .ptx-runestone-container .runestone { margin: unset; border-radius: 0; border-width: 1px; } .multiplechoice_section label > .para { display: inline; } .ptx-content .ptx-runestone-container .ac_question { max-width: var(--base-content-width); margin: 0 auto 10px; } .runestone .runestone_caption { display: none; } .ptx-content .ptx-runestone-container .rsdraggable { font-size: 100%; } .ptx-content .bottom { position: unset; } .ptx-runestone-container .runestone code, .ptx-runestone-container .runestone pre { font-size: 0.93rem; line-height: 1.2; font-family: var(--font-monospace); } .ptx-runestone-container code[class*=language-], .ptx-runestone-container pre[class*=language-] { color: black; background: #fdfdfd; } .runestone.datafile .datafile_caption { background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); display: block; width: fit-content; margin: 0 auto; } .runestone.datafile img { margin: 0 auto; display: block; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); } .runestone.datafile pre, .runestone.datafile textarea { margin: 0 auto; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); background-color: var(--page-color); } .runestone.datafile + .program { margin-top: 0; } ul[data-component=timedAssessment] { margin: 0; padding: 0; } :root.dark-mode .ptx-runestone-container code[class*=language-], :root.dark-mode .ptx-runestone-container pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } @layer spacing { .runestone :is(.exercise-statement, .exercise-content) > *:not(:first-child) { margin-top: 1em; } .ptx-runestone-container + .solutions { margin-top: 0.5em; } } .interactive-iframe-container { max-width: 100%; overflow: auto; } .interactive-iframe-container > iframe { margin-left: auto; margin-right: auto; display: block; } .interactive__instructions { max-width: var(--base-content-width); } .standalone-page .interactive-iframe-container { margin-left: auto; margin-right: auto; } .standalone-page .interactive__instructions { margin: 5px auto 20px; } .interactive-iframe-container__opener { display: block; margin-right: 5px; margin-top: 11px; margin-bottom: 5px; font-size: 0.8rem; } .interactive-iframe-container__opener .icon { font-size: 18px; } .interactive-iframe-container__opener:has(+ figcaption, + .instructions) { float: left; z-index: 1; position: relative; } .interactive-iframe-container__opener + .instructions + figcaption { clear: left; } .interactive-iframe-container__opener + .instructions { margin-top: 0.5em; } .clipboardable { position: relative; display: flow-root; } .clipboardable .code-copy { position: absolute; right: 0; top: 0; opacity: 0.25; border-width: 0; background: none; cursor: pointer; z-index: 1; white-space-collapse: collapse; padding: 1px; scale: 0.85; } .clipboardable .code-copy:hover { opacity: 0.7; } .clipboardable .code-copy .checkmark { display: none; } .clipboardable .code-copy.copied { opacity: 1; color: mediumseagreen; cursor: not-allowed; pointer-events: none; } .clipboardable .code-copy.copied .copyicon { display: none; } .clipboardable .code-copy.copied .checkmark { display: inline; } .clipboardable:has(.code-display) { margin: 0.25em 0; } .clipboardable:has(.code-display) .code-display { margin: 0; padding: 0.25em 0; } .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } label.feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } .exercise-wrapper > *:not(:first-child) { margin-top: 1.5em; } .ptx-content .problem-buttons { display: flex; } .ptx-content .webwork-button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-content .webwork-button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content .webwork-button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-content .webwork-button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-content .webwork-button.hidden { display: none; } .ptx-content .webwork-button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .problem-buttons.hidden-content, .problem-contents.hidden-content { display: none; } .sagecell_sessionOutput pre { font-family: var(--font-monospace); } .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .sage-interact.sagecell { margin: 0; } .sagecell_evalButton { font-family: var(--font-body); font-size: 16px; padding: 0 0.65em; } .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .sagecell_evalButton:focus, .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .sagecell .sagecell_editor { margin-bottom: 8px; } .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .sageanswer .output { display: inline-block; vertical-align: top; } .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } section, article, li, blockquote, figcaption, dt, .exercisegroup, .discussion-like, .solution-like, .para { position: relative; } .autopermalink { position: absolute; display: inline-block; top: 0.5ex; left: -2em; font-size: 85%; opacity: var(--permalink-opacity, 0); transition: opacity 0.2s; margin-top: 0 !important; user-select: none; } li > .autopermalink { left: -3.5em; } .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } .appendix > .autopermalink, .chapter > .autopermalink, .index > .autopermalink, .section > .autopermalink, .subsection > .autopermalink, .references > .autopermalink, .exercises > .autopermalink { top: 1.5ex; } .assemblage-like > .para > .autopermalink, .example-like > .para > .autopermalink, .example-like > .exercise-like > .autopermalink, .project-like > .para > .autopermalink, .project-like > .exercise-like > .autopermalink, .project-like > .exercise-like > .introduction > .para > .autopermalink, .project-like > .exercise-like > .conclusion > .para > .autopermalink, .remark-like > .para > .autopermalink { left: -2.9em; } .axiom-like > .para:first-of-type > .autopermalink, .example-like > .para:first-of-type > .autopermalink, .exercise-like > .para:first-of-type > .autopermalink, .solution-like > .para:first-of-type > .autopermalink, .assemblage-like > .para:first-of-type > .autopermalink, .definition-like > .para:first-of-type > .autopermalink, .remark-like > .para:first-of-type > .autopermalink, .project-like > .para:first-of-type > .autopermalink, .openproblem-like > .para:first-of-type > .autopermalink, .computation-like > .para:first-of-type > .autopermalink, .theorem-like > .para:first-of-type > .autopermalink, .proof > .para:first-of-type > .autopermalink, .case > .para:first-of-type > .autopermalink, li > .para:first-of-type > .autopermalink, dd > .para:first-of-type > .autopermalink { display: none; } .axiom-like > .introduction > .para:first-of-type > .autopermalink, .example-like > .introduction > .para:first-of-type > .autopermalink, .exercise-like > .introduction > .para:first-of-type > .autopermalink, .solution-like > .introduction > .para:first-of-type > .autopermalink, .assemblage-like > .introduction > .para:first-of-type > .autopermalink, .definition-like > .introduction > .para:first-of-type > .autopermalink, .remark-like > .introduction > .para:first-of-type > .autopermalink, .project-like > .introduction > .para:first-of-type > .autopermalink, .openproblem-like > .introduction > .para:first-of-type > .autopermalink, .computation-like > .introduction > .para:first-of-type > .autopermalink, .theorem-like > .introduction > .para:first-of-type > .autopermalink, .proof > .introduction > .para:first-of-type > .autopermalink, .case > .introduction > .para:first-of-type > .autopermalink, li > .introduction > .para:first-of-type > .autopermalink, dd > .introduction > .para:first-of-type > .autopermalink { display: none; } .ptx-content:has(.autopermalink:hover) .autopermalink { opacity: 0.2; } .ptx-content:has(.autopermalink:hover) .autopermalink:hover { opacity: 1; } .autopermalink:has(a:focus-visible) { opacity: 1; } .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: var(--content-background); border: 3px solid var(--page-border-color); z-index: 2001; } :target { scroll-margin-top: 45px; animation: target-fade 10s 1; } @keyframes target-fade { 0% { background-color: var(--activated-content-bg); } 100% { background-color: inherit; opacity: 1; } } :is(.chapter, .section, .subsection, .subsubsection) > .tabular-box, :is(.chapter, .section, .subsection, .subsubsection) > .table > .tabular-box { overflow-x: auto; } @container ptx-main (width > 640px) { :is(.chapter, .section, .subsection, .subsubsection) > .tabular-box, :is(.chapter, .section, .subsection, .subsubsection) > .table > .tabular-box { --max-width: calc(min((100cqw - 2 * 20px), 10000px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); margin-left: calc(-0.5 * (100cqw - 640px)); } } figure.table-like { margin-left: 0px; margin-right: 0px; } :root { --font-body: Open Sans, Helvetica Neue, Helvetica, Arial, sans-serif; } :root { --font-headings: Noto Sans, Helvetica Neue, Helvetica, Arial, sans-serif; } :root { --font-monospace: Inconsolata, Consolas, Monaco, monospace; } :root { --font-print: PT Serif, Times New Roman, Times, serif; } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon { font-size: 30px; } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon:before { content: "chevron_left"; } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before { content: "chevron_left"; } .hide-type .codenumber:not(:empty)::after { content: " "; } .ptx-navbar { background: linear-gradient( to bottom, var(--banner-background), var(--navbar-background)); } .ptx-navbar .button:not(.copy-embed-button) { background: linear-gradient( to bottom, var(--banner-background), var(--navbar-background)); } .ptx-navbar .button:not(.copy-embed-button):hover:not(.disabled) { background-image: none; } .ptx-navbar .button:not(.copy-embed-button).open { background-image: none; } :root { color-scheme: light; } :root:not(.dark-mode) { --page-color: white; --content-background: white; --page-border-color: #ccc; --doc-title-color: var(--primary-color); --byline-color: #333; --banner-background: #fafafa; --navbar-background: #ededed; --footer-background: var(--banner-background); --toc-border-color: var(--primary-color-white-80); --toc-background: var(--content-background); --tocitem-background: var(--toc-background); --toc-text-color: var(--primary-color-black-30); --tocitem-highlight-background: var(--primary-color-white-15); --tocitem-highlight-text-color: white; --tocitem-highlight-border-color: var(--toc-border-color); --tocitem-active-background: var(--primary-color-white-15); --tocitem-active-text-color: white; --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--content-background); --toclevel1-text-color: var(--toc-text-color); --toclevel2-background: var(--content-background); --toclevel2-text-color: var(--toc-text-color); --toclevel3-background: var(--content-background); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #000; --body-title-color: var(--primary-color-black-20); --ptx-image-bg: transparent; --activated-content-bg: rgba(241, 185, 255, 0.3); --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color); --link-background: transparent; --link-active-text-color: var(--primary-color-white-40); --link-active-background: var(--background-color-gray-30); --link-alt-text-color: var(--link-text-color); --link-alt-background: transparent; --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--link-active-text-color); --knowl-link-color: var(--link-text-color); --knowl-background: #f1f3f9; --knowl-border-color: #3d5893; --knowl-nested-1-background: #e2e9f8; --knowl-nested-2-background: #f1f3f9; --knowl-nested-3-background: #e2e9f8; --knowl-nested-4-background: #f1f3f9; --block-body-background: #f1f3f9; --block-border-color: #3d5893; --block-head-color: white; --aside-like-link-color: var(--link-text-color); --button-background: #ededed; --button-text-color: #333333; --button-border-color: #ccc; --button-hover-background: var(--primary-color-white-80); --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: #fdfdfd; --code-inline-background: #ededed; --assemblage-like-body-background: var(--block-body-background); --assemblage-like-border-color: var(--block-border-color); --definition-like-body-background: #f6f3f7; --definition-like-border-color: #9a51b3; --theorem-like-body-background: #f6f3f7; --theorem-like-border-color: #9a51b3; --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: #f7f3f4; --remark-like-border-color: #b3516a; --computation-like-body-background: #f6f3f7; --computation-like-border-color: #9a51b3; --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--block-body-background); --aside-like-border-color: var(--block-border-color); --proof-like-body-background: #f6f3f7; --proof-like-border-color: #9a51b3; --example-like-body-background: var(--content-background); --example-like-border-color: var(--color-main); --project-like-body-background: #f3f7f6; --project-like-border-color: #51b39a; --goal-like-body-background: #f7f3f4; --goal-like-border-color: #b3516a; --solution-like-body-background: #f3f7f6; --solution-like-border-color: #51b39a; --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); --primary-color: hsl(221, 61%, 21%); --assemb-border-color: var(--primary-color-white-50); --color-main: hsl(221, 61%, 21%); --color-meta: #b3516a; --color-do: #51b39a; --color-fact: #9a51b3; --exercise-like-body-background: #f3f7f6; --exercise-like-border-color: #51b39a; --asside-like-body-background: #f7f3f4; --asside-like-border-color: #b3516a; } :root.dark-mode { color-scheme: dark; --page-color: var(--background-color); --content-background: var(--page-color); --page-border-color: var(--background-color-white-25); --doc-title-color: var(--primary-color); --byline-color: var(--background-color-white-50); --banner-background: hsl(210, 10%, 10%); --navbar-background: var(--background-color-gray-15); --footer-background: var(--background-color-black-10); --toc-border-color: #555; --toc-background: var(--content-background); --tocitem-background: var(--toc-background); --toc-text-color: var(--body-text-color); --tocitem-highlight-background: var(--primary-color-gray-5); --tocitem-highlight-text-color: var(--background-color-black-50); --tocitem-highlight-border-color: var(--toc-border-color); --tocitem-active-background: var(--primary-color-gray-5); --tocitem-active-text-color: var(--background-color-black-50); --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--content-background); --toclevel1-text-color: var(--primary-color-white-40); --toclevel2-background: var(--content-background); --toclevel2-text-color: var(--toclevel1-text-color); --toclevel3-background: var(--content-background); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #f2f2f2; --body-title-color: var(--primary-color-white-20); --ptx-image-bg: white; --activated-content-bg: rgba(255, 237, 185, 0.2); --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color-white-10); --link-background: transparent; --link-active-text-color: var(--primary-color-white-40); --link-active-background: var(--background-color-gray-30); --link-alt-text-color: var(--link-text-color); --link-alt-background: transparent; --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--link-active-text-color); --knowl-link-color: var(--doc-title-color); --knowl-background: var(--background-color-black-10); --knowl-border-color: var(--background-color-white-20); --knowl-nested-1-background: var(--background-color-gray-10); --knowl-nested-2-background: var(--background-color-black-10); --knowl-nested-3-background: var(--background-color-gray-10); --knowl-nested-4-background: var(--background-color-black-10); --block-body-background: var(--content-background); --block-border-color: var(--knowl-border-color); --block-head-color: var(--body-text-color); --aside-like-link-color: var(--link-text-color); --button-background: var(--background-color-gray-15); --button-text-color: var(--body-text-color); --button-border-color: var(--background-color-white-25); --button-hover-background: var(--primary-color-black-50); --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: var(--background-color-gray-20); --code-inline-background: var(--background-color-gray-20); --assemblage-like-body-background: var(--block-body-background); --assemblage-like-border-color: var(--block-border-color); --definition-like-body-background: var(--block-body-background); --definition-like-border-color: var(--block-border-color); --theorem-like-body-background: var(--block-body-background); --theorem-like-border-color: var(--block-border-color); --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: var(--block-body-background); --remark-like-border-color: var(--block-border-color); --computation-like-body-background: var(--block-body-background); --computation-like-border-color: var(--block-border-color); --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--block-body-background); --aside-like-border-color: var(--block-border-color); --proof-like-body-background: var(--block-body-background); --proof-like-border-color: var(--block-border-color); --example-like-body-background: var(--block-body-background); --example-like-border-color: var(--block-border-color); --project-like-body-background: var(--block-body-background); --project-like-border-color: var(--block-border-color); --goal-like-body-background: var(--block-body-background); --goal-like-border-color: var(--block-border-color); --solution-like-body-background: var(--block-body-background); --solution-like-border-color: var(--block-border-color); --primary-color: hsl(210, 50%, 50%); --background-color: hsl(210, 10%, 10%); --background-color-white-1: color-mix(in oklab, var(--background-color), white 1%); --background-color-white-2: color-mix(in oklab, var(--background-color), white 2%); --background-color-white-3: color-mix(in oklab, var(--background-color), white 3%); --background-color-white-4: color-mix(in oklab, var(--background-color), white 4%); --background-color-white-5: color-mix(in oklab, var(--background-color), white 5%); --background-color-white-10: color-mix(in oklab, var(--background-color), white 10%); --background-color-white-15: color-mix(in oklab, var(--background-color), white 15%); --background-color-white-20: color-mix(in oklab, var(--background-color), white 20%); --background-color-white-25: color-mix(in oklab, var(--background-color), white 25%); --background-color-white-30: color-mix(in oklab, var(--background-color), white 30%); --background-color-white-35: color-mix(in oklab, var(--background-color), white 35%); --background-color-white-40: color-mix(in oklab, var(--background-color), white 40%); --background-color-white-50: color-mix(in oklab, var(--background-color), white 50%); --background-color-white-60: color-mix(in oklab, var(--background-color), white 60%); --background-color-white-65: color-mix(in oklab, var(--background-color), white 65%); --background-color-white-70: color-mix(in oklab, var(--background-color), white 70%); --background-color-white-75: color-mix(in oklab, var(--background-color), white 75%); --background-color-white-80: color-mix(in oklab, var(--background-color), white 80%); --background-color-white-85: color-mix(in oklab, var(--background-color), white 85%); --background-color-white-90: color-mix(in oklab, var(--background-color), white 90%); --background-color-white-95: color-mix(in oklab, var(--background-color), white 95%); --background-color-white-96: color-mix(in oklab, var(--background-color), white 96%); --background-color-white-97: color-mix(in oklab, var(--background-color), white 97%); --background-color-white-98: color-mix(in oklab, var(--background-color), white 98%); --background-color-white-99: color-mix(in oklab, var(--background-color), white 99%); --background-color-black-1: color-mix(in oklab, var(--background-color), black 1%); --background-color-black-2: color-mix(in oklab, var(--background-color), black 2%); --background-color-black-3: color-mix(in oklab, var(--background-color), black 3%); --background-color-black-4: color-mix(in oklab, var(--background-color), black 4%); --background-color-black-5: color-mix(in oklab, var(--background-color), black 5%); --background-color-black-10: color-mix(in oklab, var(--background-color), black 10%); --background-color-black-15: color-mix(in oklab, var(--background-color), black 15%); --background-color-black-20: color-mix(in oklab, var(--background-color), black 20%); --background-color-black-25: color-mix(in oklab, var(--background-color), black 25%); --background-color-black-30: color-mix(in oklab, var(--background-color), black 30%); --background-color-black-35: color-mix(in oklab, var(--background-color), black 35%); --background-color-black-40: color-mix(in oklab, var(--background-color), black 40%); --background-color-black-50: color-mix(in oklab, var(--background-color), black 50%); --background-color-black-60: color-mix(in oklab, var(--background-color), black 60%); --background-color-black-65: color-mix(in oklab, var(--background-color), black 65%); --background-color-black-70: color-mix(in oklab, var(--background-color), black 70%); --background-color-black-75: color-mix(in oklab, var(--background-color), black 75%); --background-color-black-80: color-mix(in oklab, var(--background-color), black 80%); --background-color-black-85: color-mix(in oklab, var(--background-color), black 85%); --background-color-black-90: color-mix(in oklab, var(--background-color), black 90%); --background-color-black-95: color-mix(in oklab, var(--background-color), black 95%); --background-color-black-96: color-mix(in oklab, var(--background-color), black 96%); --background-color-black-97: color-mix(in oklab, var(--background-color), black 97%); --background-color-black-98: color-mix(in oklab, var(--background-color), black 98%); --background-color-black-99: color-mix(in oklab, var(--background-color), black 99%); --background-color-gray-1: color-mix(in oklab, var(--background-color), gray 1%); --background-color-gray-2: color-mix(in oklab, var(--background-color), gray 2%); --background-color-gray-3: color-mix(in oklab, var(--background-color), gray 3%); --background-color-gray-4: color-mix(in oklab, var(--background-color), gray 4%); --background-color-gray-5: color-mix(in oklab, var(--background-color), gray 5%); --background-color-gray-10: color-mix(in oklab, var(--background-color), gray 10%); --background-color-gray-15: color-mix(in oklab, var(--background-color), gray 15%); --background-color-gray-20: color-mix(in oklab, var(--background-color), gray 20%); --background-color-gray-25: color-mix(in oklab, var(--background-color), gray 25%); --background-color-gray-30: color-mix(in oklab, var(--background-color), gray 30%); --background-color-gray-35: color-mix(in oklab, var(--background-color), gray 35%); --background-color-gray-40: color-mix(in oklab, var(--background-color), gray 40%); --background-color-gray-50: color-mix(in oklab, var(--background-color), gray 50%); --background-color-gray-60: color-mix(in oklab, var(--background-color), gray 60%); --background-color-gray-65: color-mix(in oklab, var(--background-color), gray 65%); --background-color-gray-70: color-mix(in oklab, var(--background-color), gray 70%); --background-color-gray-75: color-mix(in oklab, var(--background-color), gray 75%); --background-color-gray-80: color-mix(in oklab, var(--background-color), gray 80%); --background-color-gray-85: color-mix(in oklab, var(--background-color), gray 85%); --background-color-gray-90: color-mix(in oklab, var(--background-color), gray 90%); --background-color-gray-95: color-mix(in oklab, var(--background-color), gray 95%); --background-color-gray-96: color-mix(in oklab, var(--background-color), gray 96%); --background-color-gray-97: color-mix(in oklab, var(--background-color), gray 97%); --background-color-gray-98: color-mix(in oklab, var(--background-color), gray 98%); --background-color-gray-99: color-mix(in oklab, var(--background-color), gray 99%); --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); } /*! Theme: denver */ /*# sourceMappingURL=theme-denver.css.map */ ================================================ FILE: css/dist/theme-greeley.css ================================================ @charset "UTF-8"; @import "https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=swap"; @import "https://fonts.googleapis.com/css2?family=PT Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap"; @import "https://fonts.googleapis.com/css2?family=Inconsolata:ital,wght@0,400..700;1,400..700&display=swap"; /* ../../css/targets/html/greeley/theme-greeley.scss */ * { box-sizing: border-box; } @layer spacing { :is(section, article, .knowl__content) > *:not(:first-child) { margin-top: 1.5em; } :is(section, article, .knowl__content) > .para + .para { margin-top: 1em; } .ptx-content :is(ul, td, li, dd, .blockquote, .sbspanel, .para.logical) > *:not(:first-child) { margin-top: 0.5em; } } ol.no-marker, ul.no-marker, li.no-marker { list-style-type: none; } ol.decimal { list-style-type: decimal; } ol.lower-alpha { list-style-type: lower-alpha; } ol.lower-alpha-level-1 > li::marker { content: "(" counter(list-item, lower-alpha) ") "; } ol.upper-alpha { list-style-type: upper-alpha; } ol.lower-roman { list-style-type: lower-roman; } ol.upper-roman { list-style-type: upper-roman; } ul.disc { list-style-type: disc; } ul.square { list-style-type: square; } ul.circle { list-style-type: circle; } dl:is(.description-list, .glossary) { margin: 0; } dl:is(.description-list, .glossary) dt { font-weight: bold; max-width: 55ex; } dl:is(.description-list, .glossary) dd::after { content: ""; display: block; clear: both; } .para > dl:is(.description-list) { margin-top: 0.5em; margin-bottom: 0.5em; } dl.glossary dt { margin-top: 1.25em; } dl.glossary dt:first-of-type { margin-top: 0; } dl.glossary dd { margin-left: 5ex; } dl.description-list dt, dl.description-list dd { margin-top: 1em; } dl.description-list dt:first-of-type, dl.description-list dd:first-of-type { margin-top: 0; } dl.description-list dt { float: left; clear: both; text-align: right; width: 18ex; margin-right: 1ex; } dl.description-list dd { margin-left: 22ex; } dl.description-list.narrow dt { width: 11ex; } dl.description-list.narrow dd { margin-left: 15ex; } dl.description-list.wide dt { width: 25ex; } dl.description-list.wide dd { margin-left: 29ex; } dl.description-list dt:first-of-type { clear: none; } .description-list + * { clear: both; } dl.description-list dl dt { width: 8ex; } dl.description-list dd dd { margin-left: 18ex; } dl.description-list dl dd { margin-left: 12ex; } @media screen and (max-width: 480px) { dl.description-list dt, dl.description-list.narrow dt { float: none; margin-left: 0; text-align: left; width: 25ex; } dl.description-list dd, dl.description-list.narrow dd, dl.description-list.wide dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } :is(.cols2, .cols3, .cols4, .cols5, .cols6) { display: flex; flex-wrap: wrap; justify-content: start; } .cols2 > li { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > li { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > li { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > li { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > li { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .ptx-content li { margin-top: 0.5em; } .ptx-content li .li--heading-title { font-size: 100%; font-weight: normal; font-style: italic; } .para > :is(ol, ul) { margin-top: 0.5em; margin-bottom: 0.5em; } ol > li { padding-left: 0.25em; } .fillin { display: inline-block; border: none; border-width: 1px; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; } .fillin.underline { border-bottom-style: solid; border-width: 1px; } .fillin.box { outline: 1px solid var(--body-text-color); height: 1.3em; } .fillin.shade { background-color: var(--fillin-background-color, #eee); height: 1.3em; } :root.dark-mode { --fillin-background-color: #444; } .heading:is(h1, h2, h3, h4, h5, h6) { margin: 0; font-size: unset; } .heading { line-height: 1.1; font-family: var(--font-headings); font-weight: 700; margin-top: 0; margin-bottom: 0; } section > .heading { font-size: 1.75em; color: var(--body-title-color); line-height: 1.25em; margin-top: 2.5em; margin-bottom: 0.5em; } section > .heading + * { margin-top: 0.5em; } .ptx-content > section > .heading { margin-top: 0.5em; } section section > .heading { font-size: 1.5em; margin-top: 2em; } section section section > .heading { font-size: 1.4em; margin-top: 2em; } article > .heading { font-size: 1.25em; margin-top: 1.5em; } article > .heading + * { margin-top: 0.5em; } .paragraphs > .heading { font-size: 1.125em; } :is(section, article) > .heading + :is(section, article) > .heading { margin-top: 0.5em; } @media screen and (max-width: 480px) { section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } section section > .heading { font-size: 1.3em; line-height: 1.15em; } section section section > .heading { font-size: 1.15em; line-height: 1em; } } .heading.hide-type > .type { display: none; } a { color: var(--link-text-color); text-decoration: none; } a:hover, a:focus { text-decoration: none; } a[href^="mailto:"] { white-space: pre; } .ptx-content a.internal { color: var(--link-text-color); font-weight: bold; } .ptx-content a.external { color: var(--link-alt-text-color); font-weight: bold; } .ptx-content a.internal:hover, .ptx-content a.internal:hover *, .ptx-content a.internal:focus, .ptx-content a.internal:focus * { color: var(--link-active-text-color); background-color: var(--link-active-background); font-weight: bold; } .ptx-content a.external:hover, .ptx-content a.external:hover *, .ptx-content a.external:focus, .ptx-content a.external:focus * { color: var(--link-alt-active-text-color); background-color: var(--link-alt-active-background); font-weight: bold; } .ptx-content table { border-spacing: 0; border-collapse: collapse; } .ptx-content td { padding: 2px 5px; font-size: 90%; } .ptx-content td img { max-width: 200px; margin-right: 30px; } .ptx-content th { padding: 2px 5px; } .ptx-content th .lines { white-space: nowrap; } .ptx-content th.l { text-align: left; } .ptx-content th.c { text-align: center; } .ptx-content th.r { text-align: right; } .ptx-content th.j { text-align: justify; } .ptx-content th.t { vertical-align: top; } .ptx-content th.b { vertical-align: bottom; } .ptx-content th.m { vertical-align: middle; } .ptx-content th.l0 { border-left: none; } .ptx-content th.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content th.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content th.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content th.r0 { border-right: none; } .ptx-content th.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content th.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content th.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content th.t0 { border-top: none; } .ptx-content th.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content th.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content th.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content th.b0 { border-bottom: none; } .ptx-content th.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content th.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content th.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content td .lines { white-space: nowrap; } .ptx-content td.l { text-align: left; } .ptx-content td.c { text-align: center; } .ptx-content td.r { text-align: right; } .ptx-content td.j { text-align: justify; } .ptx-content td.t { vertical-align: top; } .ptx-content td.b { vertical-align: bottom; } .ptx-content td.m { vertical-align: middle; } .ptx-content td.l0 { border-left: none; } .ptx-content td.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content td.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content td.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content td.r0 { border-right: none; } .ptx-content td.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content td.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content td.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content td.t0 { border-top: none; } .ptx-content td.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content td.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content td.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content td.b0 { border-bottom: none; } .ptx-content td.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content td.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content td.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content th.r0.l0, .ptx-content td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content tr.header-vertical th { writing-mode: vertical-rl; transform: rotate(180deg); padding-top: 5px; } .ptx-content .center table { text-align: center; margin-left: auto; margin-right: auto; } .tabular-box { margin-top: 0.5em; overflow-x: auto; } .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } table.notation-list tr th { text-align: left; margin-left: 1em; } table.notation-list tr td { text-align: left; vertical-align: top; } .frontmatter > .heading { display: block; text-align: center; } .frontmatter > .heading .title, .frontmatter .book > .heading .title { font-size: 1.3em; } .frontmatter > .heading .subtitle, .frontmatter .book > .heading .subtitle { display: block; font-weight: normal; color: var(--byline-color); font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .frontmatter > .para:first-of-type { margin-top: 4em; } .frontmatter > .author, .frontmatter > .credit { margin-top: 2em; text-align: center; } .frontmatter .author:first-of-type { margin-top: 4em; } .frontmatter > .author .author-name { font-size: 120%; } .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .frontmatter .credit .title { font-size: 1em; } .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .frontmatter .author-info { font-size: 90%; } .frontmatter .summary-links { margin-top: 4em; } .frontmatter .abstract { margin: 4em 2em; } .frontmatter .keywords, .frontmatter .support { margin-top: 2em; } .frontmatter .abstract > .title, .frontmatter .keywords > .title, .frontmatter .support > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .frontmatter .abstract > .title::after, .frontmatter .keywords > .title::after, .frontmatter .support > .title::after { content: ".\2009\2009\2009"; } .frontmatter .abstract > .title + .para, .frontmatter .keywords > .title + .para, .frontmatter .support > .title + .para { display: inline; } .frontmatter .colophon .copyright { margin-top: 2.5em; } .frontmatter .colophon .license { margin-top: 2.5em; } .ptx-content .summary-links { font-family: var(--font-headings); display: block; margin-top: 1em; } .ptx-content .summary-links a { color: var(--summary-link-text-color); background: var(--summary-link-background); font-size: 1.5em; line-height: 1.25em; padding: 10px 20px; padding-right: 60px; border-radius: 3px; position: relative; display: block; font-weight: unset; } .ptx-content .summary-links a .title { font-style: normal; } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a::after { right: 0.83333em; content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid var(--summary-link-text-color); } .ptx-content .summary-links a:hover { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover * { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover .title { font-weight: normal; } .ptx-content .summary-links a:hover::after { border-left: 0.4em solid var(--summary-link-hover-text-color); } .ptx-content .summary-links ul { list-style-type: none; padding: 0; margin-top: 0; } .ptx-content .summary-links li { margin-top: 5px; } @media screen and (width <= 480px) { .ptx-content .summary-links a { font-size: 100%; line-height: 1.25em; } } .ptx-footnote { display: inline-block; position: relative; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: smaller; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote[open] .ptx-footnote__number sup { display: none; } .ptx-footnote__number { display: inline-block; cursor: pointer; min-width: 1em; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowl-background); border-radius: 0px; padding: 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowl-border-color); color: var(--body-text-color); font-weight: normal; font-size: var(1rem); } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: var(--activated-content-bg); } .indexitem { margin-top: 4px; } .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .indexknowl { margin-left: 0.11em; } em + .indexknowl { margin-left: -0.25em; } .indexknowl a { margin-left: 2em; } .indexitem .see, .subindexitem .see, .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .indexitem .seealso, .subindexitem .seealso, .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .indexitem .see em, .subindexitem .see em, .subsubindexitem .see em, .indexitem .seealso em, .subindexitem .seealso em, .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .indexitem .see + .see, .subindexitem .see + .see, .subsubindexitem .see + .see, .indexitem .seealso + .seealso, .subindexitem .seealso + .seealso, .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .indexitem .indexknowl { font-size: 90%; } .indexitem [data-knowl], .subindexitem [data-knowl], .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .indexknowl [data-knowl]:hover, .indexknowl .active[data-knowl] { margin-left: 2em; } .subindexitem .indexknowl { font-size: 95%; } .subsubindexitem .indexknowl { font-size: 95%; } .indexletter { margin-top: 1.5em; } .image-box, .audio-box, .video-box, .asymptote-box { position: relative; } .image-box .asymptote-box iframe.asymptote, iframe.asymptote, .video-box .video, .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .image-box img, img.contained { width: 100%; } .asymptote-fullsize-link { text-align: center; font-size: 0.9em; } .ptx-content img, .ptx-content svg { background: var(--ptx-image-bg); } .mermaid > svg { background: none; } .image-description summary { list-style: none; cursor: pointer; } .image-archive { margin: 0.75em auto 0; font-family: var(--font-monospace); justify-content: center; display: flex; gap: 0.5em; } .image-box > img:not(.mag_popup) { cursor: zoom-in; } img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; } .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .audio { width: 100%; } .video-poster { cursor: pointer; } figure { clear: both; position: relative; margin-left: 0; margin-right: 0; } figcaption { margin-left: auto; margin-right: auto; margin-top: 0.5em; } figcaption code.code-inline { white-space: pre; } figcaption .codenumber, figcaption .type { font-weight: 700; } figcaption .codenumber::after, figcaption .type:last-of-type::after { content: "\2002"; } figcaption .para:first-of-type { display: inline; } figure.table-like { margin-left: 30px; margin-right: 30px; } figure.table-like .list { margin-right: 0; } @media (max-width <= 943px) { .figure-like { overflow-x: auto; } } .poem { display: table; margin: 0 auto; width: auto; max-width: 90%; } .poem > .heading { display: block; text-align: center; } section article.poem > .heading::after { content: ""; } .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .poem .author { font-style: italic; margin-top: 0.75em; } .poem .author.left { text-align: left; } .poem .author.center { text-align: center; } .poem .author.right { text-align: right; } .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .poem .stanza + .stanza { margin-top: 1em; } .poem .heading + .stanza { margin-top: 0.2em; } .poem .heading + .line { margin-top: 0.2em; } .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .poem .line.center { text-align: center; } .poem .line.right { text-align: right; } .poem .tab { margin-left: 2em; } .code-box { overflow-x: auto; } .code-display { overflow-x: auto; font-family: var(--font-monospace); margin: 0.5em 0; } .console, .program { border: 1px solid var(--page-border-color); padding: 5px 15px; overflow-x: auto; margin: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-inline { font-family: var(--font-monospace); white-space: pre; color: var(--body-text-color); background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); border-radius: 0.2em; display: inline-block; overflow-x: auto; max-width: 100%; vertical-align: middle; line-height: normal; padding: 0.0625em 0.15em; } .prompt.unselectable { user-select: none; } .code-block { border-left: 1px solid #aaa; padding: 0 15px 5px; overflow-x: auto; background: var(--code-background); margin-top: 0; margin-bottom: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-block::before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } @media print { .code-copy { display: none; } } pre[class*=language-] { margin: 0; overflow: auto; border: 1px solid #e1e1e1; } :not(pre) > code[class*=language-] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } code[class*=language-], pre[class*=language-] { color: black; background: #fdfdfd; text-shadow: none; font-family: var(--font-monospace); text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.2; tab-size: 4; hyphens: none; } code[class*=language-].code-inline, pre[class*=language-].code-inline { line-height: normal; padding: 0.0625em 0.15em; } code[class*=language-]::selection, code[class*=language-] ::selection, pre[class*=language-]::selection, pre[class*=language-] ::selection { background: #b3d4fc; } code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #2a9716; } code[class*=language-] .token.punctuation, pre[class*=language-] .token.punctuation { color: #000; } code[class*=language-] .token.namespace, pre[class*=language-] .token.namespace { opacity: 0.9; } code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: rgb(41, 120, 15); } code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #a11; } code[class*=language-] .token:is(.operator, .entity, .url), pre[class*=language-] .token:is(.operator, .entity, .url) { color: #000; background: none; } code[class*=language-] .token:is(.atrule, .attr-value, .keyword), pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #0679B7; } code[class*=language-] .token.function, code[class*=language-] .token.class-name, pre[class*=language-] .token.function, pre[class*=language-] .token.class-name { color: #30a; } code[class*=language-] .token.important, code[class*=language-] .token.variable, pre[class*=language-] .token.important, pre[class*=language-] .token.variable { color: rgb(0, 0, 0); } code[class*=language-] .token.important, code[class*=language-] .token.bold, pre[class*=language-] .token.important, pre[class*=language-] .token.bold { font-weight: bold; } code[class*=language-] .token.italic, pre[class*=language-] .token.italic { font-style: italic; } code[class*=language-] .token.entity, pre[class*=language-] .token.entity { cursor: help; } code[class*=language-].line-numbers, pre[class*=language-].line-numbers { position: relative; padding-left: 3.8em; counter-reset: linenumber; overflow: auto; } code[class*=language-].line-numbers > code, pre[class*=language-].line-numbers > code { position: relative; white-space: inherit; } code[class*=language-].line-numbers .line-numbers-rows, pre[class*=language-].line-numbers .line-numbers-rows { position: absolute; pointer-events: none; top: 0; font-size: 100%; left: -3.8em; width: 3em; letter-spacing: -1px; border-right: 1px solid #999; user-select: none; } code[class*=language-].line-numbers .line-numbers-rows > span, pre[class*=language-].line-numbers .line-numbers-rows > span { display: block; counter-increment: linenumber; } code[class*=language-].line-numbers .line-numbers-rows > span::before, pre[class*=language-].line-numbers .line-numbers-rows > span::before { content: counter(linenumber); color: #999; display: block; padding-right: 0.8em; text-align: right; } code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { position: absolute; margin-top: 4px; left: 0; right: 0; padding: inherit 0; font-size: inherit; background: hsla(24, 20%, 50%, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } :root.dark-mode { } :root.dark-mode pre[class*=language-] { border: 1px solid #3d3d3d; } :root.dark-mode code[class*=language-], :root.dark-mode pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } :root.dark-mode code[class*=language-]::selection, :root.dark-mode code[class*=language-] ::selection, :root.dark-mode pre[class*=language-]::selection, :root.dark-mode pre[class*=language-] ::selection { background: hsl(200, 4%, 16%); } :root.dark-mode code[class*=language-] .token, :root.dark-mode pre[class*=language-] .token { position: relative; z-index: 1; } :root.dark-mode code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), :root.dark-mode pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #68a950; } :root.dark-mode code[class*=language-] .token.punctuation, :root.dark-mode pre[class*=language-] .token.punctuation { color: white; opacity: 1; } :root.dark-mode code[class*=language-] .token.namespace, :root.dark-mode pre[class*=language-] .token.namespace { opacity: 0.9; } :root.dark-mode code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), :root.dark-mode pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: #abc792; } :root.dark-mode code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), :root.dark-mode pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #ca9147; } :root.dark-mode code[class*=language-] .token:is(.operator, .entity, .url), :root.dark-mode pre[class*=language-] .token:is(.operator, .entity, .url) { color: white; } :root.dark-mode code[class*=language-] .token:is(.atrule, .attr-value, .keyword), :root.dark-mode pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #2d94fb; } :root.dark-mode code[class*=language-] .token.function, :root.dark-mode code[class*=language-] .token.class-name, :root.dark-mode pre[class*=language-] .token.function, :root.dark-mode pre[class*=language-] .token.class-name { color: #e3e1c2; } :root.dark-mode code[class*=language-] .token.important, :root.dark-mode code[class*=language-] .token.bold, :root.dark-mode pre[class*=language-] .token.important, :root.dark-mode pre[class*=language-] .token.bold { font-weight: bold; } :root.dark-mode code[class*=language-] .token.italic, :root.dark-mode pre[class*=language-] .token.italic { font-style: italic; } :root.dark-mode code[class*=language-] .token.entity, :root.dark-mode pre[class*=language-] .token.entity { cursor: help; } :root.dark-mode .line-highlight { background: hsla(0, 0%, 33%, 0.1); border-bottom: 1px dashed hsl(0, 0%, 33%); border-top: 1px dashed hsl(0, 0%, 33%); z-index: 0; } @media print { code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { color-adjust: exact; } } .displaymath { overflow-x: auto; overflow-y: hidden; } .displaymath mjx-container[jax=CHTML][display=true] { margin: 0 0 0 0; padding-top: 0.3em; } .process-math mjx-container svg { background: none; } [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .knowl mjx-mtext > mjx-utext, mjx-mtext > mjx-utext { width: revert !important; } mjx-msup mjx-utext, mjx-msub mjx-utext { display: inline; } em.alert { font-weight: bold; } .bib { margin-top: 0.25em; } .bib .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .bib .bibitem + .bibentry { display: inline-block; width: 90%; margin-top: 0; } .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .contributor { margin-top: 1.5ex; } .contributor:first-child { margin-top: 0em; } .contributor + .para { margin-top: 3ex; } .contributor .contributor-name { font-variant: small-caps; } .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } iframe { margin: 0; border: none; } .kbdkey { background: #f1f1f1; color: #333; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .unit, .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .unit sub, .unit sup, .quantity sub, .quantity sup { word-spacing: normal; } .terminology { font-style: italic; font-weight: bold; } .times-sign { font-size: larger; vertical-align: -0.15ex; } .emphasis { font-style: italic; } .emphasis .emphasis { font-weight: bold; } .definition-like .emphasis { font-weight: 700; } article.theorem-like .emphasis { font-weight: 700; } .para { line-height: 1.35; } .hidden { display: none !important; } .taxon { font-style: italic; } .quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .booktitle { font-style: oblique; } .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; } .ptx-page, .ptx-main, .ptx-main .ptx-content { all: unset !important; width: 100%; border: none; padding: 0; margin: 0; } .ptx-sagecell, .tabular, .table-like, .figure-like, .exercise-like { break-inside: avoid; } .heading { break-after: avoid; } .code-inline { border: unset; background: unset; } @page { margin: 0.75in 0.75in 0.75in 0.75in; } } .heading .print-links { float: right; position: relative; z-index: 100; vertical-align: bottom; } .heading .print-links .print-link { font-family: var(--font-body); padding: 0.1em 0.2em; } .heading .print-links .material-symbols-outlined { margin-top: 5pt; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .pretext .searchwrapper .cse .gsc-control-cse input, .searchwrapper .gsc-control-cse { padding: 5px; } .searchbox .searchwidget { height: 100%; } .searchbox .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; padding: 1em; left: max(10vw, (100vw - 800px) / 2); width: 80vw; max-width: 800px; border: 2px solid var(--body-text-color); background: var(--knowl-background, #eaf0f6); z-index: 5000; display: flex; flex-direction: column; } .searchbox .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; height: 35px; } .searchbox .ptxsearch { flex: 1 1; } .searchbox .closesearchresults { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .searchbox .closesearchresults:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .searchbox .closesearchresults:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .searchbox .closesearchresults.disabled { opacity: 0.4; cursor: not-allowed; } .searchbox .closesearchresults.hidden { display: none; } .searchbox .closesearchresults.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .searchbox .detailed_result { margin-bottom: 10px; } .searchbox .searchresults a:hover { text-decoration: underline; background: var(--link-active-background); } .searchbox .searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; background: var(--content-background, white); border: 1px solid var(--page-border-color, #ccc); } .searchbox .searchresults:empty { display: none; } .searchbox .search-result-bullet { list-style-type: none; } .searchbox .search-result-score { display: none; } .searchbox .no_result { font-size: 90%; font-weight: 200; } .searchbox .low_result { font-weight: 200; } .searchbox .medium_result { font-weight: 500; } .searchbox .high_result { font-weight: 700; } .searchbox .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .searchbox .search-results-unshown-count { margin-top: 0.6em; } .searchbox .search-result-clip-highlight { background: var(--searchresultshighlight); } .searchbox .searchresultsbackground { position: fixed; top: 0; background: var(--searchresultsbackground, white); width: 100vw; height: 100%; left: 0; z-index: 4999; } @media screen and (max-width: 800px) { .searchbox .searchresultsplaceholder { bottom: 10vh; } } :root { --searchresultsbackground: #fff8; --searchresultshighlight: rgba(255, 255, 0, 50%); } :root.dark-mode { --searchresultsbackground: #0008; --searchresultshighlight: rgba(255, 255, 0, 15%); } .ptx-content .ptx-runestone-container .runestone { margin: unset; border-radius: 0; border-width: 1px; } .multiplechoice_section label > .para { display: inline; } .ptx-content .ptx-runestone-container .ac_question { max-width: var(--base-content-width); margin: 0 auto 10px; } .runestone .runestone_caption { display: none; } .ptx-content .ptx-runestone-container .rsdraggable { font-size: 100%; } .ptx-content .bottom { position: unset; } .ptx-runestone-container .runestone code, .ptx-runestone-container .runestone pre { font-size: 0.93rem; line-height: 1.2; font-family: var(--font-monospace); } .ptx-runestone-container code[class*=language-], .ptx-runestone-container pre[class*=language-] { color: black; background: #fdfdfd; } .runestone.datafile .datafile_caption { background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); display: block; width: fit-content; margin: 0 auto; } .runestone.datafile img { margin: 0 auto; display: block; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); } .runestone.datafile pre, .runestone.datafile textarea { margin: 0 auto; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); background-color: var(--page-color); } .runestone.datafile + .program { margin-top: 0; } ul[data-component=timedAssessment] { margin: 0; padding: 0; } :root.dark-mode .ptx-runestone-container code[class*=language-], :root.dark-mode .ptx-runestone-container pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } @layer spacing { .runestone :is(.exercise-statement, .exercise-content) > *:not(:first-child) { margin-top: 1em; } .ptx-runestone-container + .solutions { margin-top: 0.5em; } } .interactive-iframe-container { max-width: 100%; overflow: auto; } .interactive-iframe-container > iframe { margin-left: auto; margin-right: auto; display: block; } .interactive__instructions { max-width: var(--base-content-width); } .standalone-page .interactive-iframe-container { margin-left: auto; margin-right: auto; } .standalone-page .interactive__instructions { margin: 5px auto 20px; } .interactive-iframe-container__opener { display: block; margin-right: 5px; margin-top: 11px; margin-bottom: 5px; font-size: 0.8rem; } .interactive-iframe-container__opener .icon { font-size: 18px; } .interactive-iframe-container__opener:has(+ figcaption, + .instructions) { float: left; z-index: 1; position: relative; } .interactive-iframe-container__opener + .instructions + figcaption { clear: left; } .interactive-iframe-container__opener + .instructions { margin-top: 0.5em; } .clipboardable { position: relative; display: flow-root; } .clipboardable .code-copy { position: absolute; right: 0; top: 0; opacity: 0.25; border-width: 0; background: none; cursor: pointer; z-index: 1; white-space-collapse: collapse; padding: 1px; scale: 0.85; } .clipboardable .code-copy:hover { opacity: 0.7; } .clipboardable .code-copy .checkmark { display: none; } .clipboardable .code-copy.copied { opacity: 1; color: mediumseagreen; cursor: not-allowed; pointer-events: none; } .clipboardable .code-copy.copied .copyicon { display: none; } .clipboardable .code-copy.copied .checkmark { display: inline; } .clipboardable:has(.code-display) { margin: 0.25em 0; } .clipboardable:has(.code-display) .code-display { margin: 0; padding: 0.25em 0; } .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } label.feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } .exercise-wrapper > *:not(:first-child) { margin-top: 1.5em; } .ptx-content .problem-buttons { display: flex; } .ptx-content .webwork-button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-content .webwork-button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content .webwork-button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-content .webwork-button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-content .webwork-button.hidden { display: none; } .ptx-content .webwork-button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .problem-buttons.hidden-content, .problem-contents.hidden-content { display: none; } .sagecell_sessionOutput pre { font-family: var(--font-monospace); } .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .sage-interact.sagecell { margin: 0; } .sagecell_evalButton { font-family: var(--font-body); font-size: 16px; padding: 0 0.65em; } .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .sagecell_evalButton:focus, .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .sagecell .sagecell_editor { margin-bottom: 8px; } .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .sageanswer .output { display: inline-block; vertical-align: top; } .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } section, article, li, blockquote, figcaption, dt, .exercisegroup, .discussion-like, .solution-like, .para { position: relative; } .autopermalink { position: absolute; display: inline-block; top: 0.5ex; left: -2em; font-size: 85%; opacity: var(--permalink-opacity, 0); transition: opacity 0.2s; margin-top: 0 !important; user-select: none; } li > .autopermalink { left: -3.5em; } .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } .appendix > .autopermalink, .chapter > .autopermalink, .index > .autopermalink, .section > .autopermalink, .subsection > .autopermalink, .references > .autopermalink, .exercises > .autopermalink { top: 1.5ex; } .assemblage-like > .para > .autopermalink, .example-like > .para > .autopermalink, .example-like > .exercise-like > .autopermalink, .project-like > .para > .autopermalink, .project-like > .exercise-like > .autopermalink, .project-like > .exercise-like > .introduction > .para > .autopermalink, .project-like > .exercise-like > .conclusion > .para > .autopermalink, .remark-like > .para > .autopermalink { left: -2.9em; } .axiom-like > .para:first-of-type > .autopermalink, .example-like > .para:first-of-type > .autopermalink, .exercise-like > .para:first-of-type > .autopermalink, .solution-like > .para:first-of-type > .autopermalink, .assemblage-like > .para:first-of-type > .autopermalink, .definition-like > .para:first-of-type > .autopermalink, .remark-like > .para:first-of-type > .autopermalink, .project-like > .para:first-of-type > .autopermalink, .openproblem-like > .para:first-of-type > .autopermalink, .computation-like > .para:first-of-type > .autopermalink, .theorem-like > .para:first-of-type > .autopermalink, .proof > .para:first-of-type > .autopermalink, .case > .para:first-of-type > .autopermalink, li > .para:first-of-type > .autopermalink, dd > .para:first-of-type > .autopermalink { display: none; } .axiom-like > .introduction > .para:first-of-type > .autopermalink, .example-like > .introduction > .para:first-of-type > .autopermalink, .exercise-like > .introduction > .para:first-of-type > .autopermalink, .solution-like > .introduction > .para:first-of-type > .autopermalink, .assemblage-like > .introduction > .para:first-of-type > .autopermalink, .definition-like > .introduction > .para:first-of-type > .autopermalink, .remark-like > .introduction > .para:first-of-type > .autopermalink, .project-like > .introduction > .para:first-of-type > .autopermalink, .openproblem-like > .introduction > .para:first-of-type > .autopermalink, .computation-like > .introduction > .para:first-of-type > .autopermalink, .theorem-like > .introduction > .para:first-of-type > .autopermalink, .proof > .introduction > .para:first-of-type > .autopermalink, .case > .introduction > .para:first-of-type > .autopermalink, li > .introduction > .para:first-of-type > .autopermalink, dd > .introduction > .para:first-of-type > .autopermalink { display: none; } .ptx-content:has(.autopermalink:hover) .autopermalink { opacity: 0.2; } .ptx-content:has(.autopermalink:hover) .autopermalink:hover { opacity: 1; } .autopermalink:has(a:focus-visible) { opacity: 1; } .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: var(--content-background); border: 3px solid var(--page-border-color); z-index: 2001; } :target { scroll-margin-top: 45px; animation: target-fade 10s 1; } @keyframes target-fade { 0% { background-color: var(--activated-content-bg); } 100% { background-color: inherit; opacity: 1; } } :is(.chapter, .section, .subsection, .subsubsection) > .tabular-box, :is(.chapter, .section, .subsection, .subsubsection) > .table > .tabular-box { overflow-x: auto; } @container ptx-main (width > 640px) { :is(.chapter, .section, .subsection, .subsubsection) > .tabular-box, :is(.chapter, .section, .subsection, .subsubsection) > .table > .tabular-box { --max-width: calc(min((100cqw - 2 * 20px), 10000px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); margin-left: calc(-0.5 * (100cqw - 640px)); } } figure.table-like { margin-left: 0px; margin-right: 0px; } :root { --base-content-width: 600px; --content-padding: 120px; } body { margin: 0; min-height: 100vh; display: flex; flex-direction: column; align-items: stretch; } body.pretext { color: var(--body-text-color); font-family: var(--font-body); } .ptx-page { position: relative; display: flex; flex-grow: 1; width: 100%; } .ptx-main { flex-grow: 1; position: relative; max-width: 100%; container-name: ptx-main; container-type: inline-size; } .ptx-main .ptx-content { max-width: 840px; padding: 24px 120px 60px; margin-left: auto; margin-right: auto; } .worksheet .ptx-main .ptx-content { max-width: 960px; } .ptx-page { max-width: 1480px; margin-left: auto; margin-right: auto; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; background: var(--page-color, white); } .ptx-content .print-preview-header { display: none; } body.pretext > a.assistive { padding: 6px; position: absolute; top: -40px; left: 0px; color: white; border-right: 1px solid white; border-bottom: 1px solid white; border-bottom-right-radius: 8px; background: #BF1722; z-index: 10000; } body.pretext > a.assistive:focus { top: 0px; outline: 0; transition: top 0.1s ease-in, background 0.5s linear; } .ptx-content-footer { display: flex; justify-content: space-around; max-width: 840px; padding-top: 2em; padding-bottom: 2em; padding-left: 120px; padding-right: 120px; margin-left: auto; margin-right: auto; } .ptx-content-footer .button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-content-footer .button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content-footer .button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-content-footer .button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-content-footer .button.hidden { display: none; } .ptx-content-footer .button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content-footer .button .icon { margin: 0 -7px; } body.standalone-page .ptx-page { max-width: 1600px; } .ptx-masthead { position: relative; background: var(--banner-background); width: 100%; display: flex; justify-content: center; } .ptx-masthead .ptx-banner { border-top: 1px solid transparent; overflow: hidden; padding: 10px 10px; border-bottom: none; display: flex; width: 100%; align-items: center; max-width: 840px; } .ptx-masthead a { color: var(--doc-title-color, #2a5ea4); } .ptx-masthead a:active { color: var(--link-active-text-color); } .ptx-masthead .title-container { font-family: var(--font-headings); font-size: 2em; padding-left: 9.68px; overflow: hidden; flex: 1; } .ptx-masthead .title-container .heading { font-weight: 700; font-size: 100%; line-height: 1.25em; } .ptx-masthead .title-container .title:has(+ .subtitle)::after { content: ":"; } .ptx-masthead .title-container .subtitle { font-weight: normal; } .ptx-masthead .logo-link { height: 5em; display: flex; } .ptx-masthead .logo-link img { max-height: 100%; } .ptx-masthead .logo-link img[src$=".svg"] { height: 100%; } .ptx-masthead .byline { color: var(--byline-color); font-weight: normal; margin: 0; font-size: 62.5%; min-height: inherit; } @media screen and (max-width: 800px) { .ptx-masthead { border-bottom: 1px solid var(--page-border-color); } .ptx-masthead .ptx-banner { padding: 10px 28px; display: flex; justify-content: center; } .ptx-masthead .logo-link::before { font-size: 1rem; margin-top: 0; } .ptx-masthead .title-container { width: fit-content; flex: unset; } .ptx-masthead .title-container .heading { line-height: 1em; } .ptx-masthead .title-container .heading .subtitle { display: block; font-size: 80%; line-height: 1em; } .ptx-masthead .byline { font-size: 50%; } } @media screen and (width <= 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; font-size: 1em; } .ptx-masthead .logo-link { display: none; } .ptx-masthead .byline { display: none; } } .ptx-navbar { position: sticky; top: 0; height: 36px; width: 100%; background: var(--navbar-background); border: 0; border-top: 1px solid var(--page-border-color); border-bottom: 1px solid var(--page-border-color); margin: 0; z-index: 500; overflow: visible; display: flex; } .ptx-navbar .ptx-navbar-contents { position: relative; display: flex; flex: 1; justify-content: center; align-items: center; max-width: 840px; margin: 0 auto; } .ptx-navbar .button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-navbar .button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-navbar .button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-navbar .button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-navbar .button.hidden { display: none; } .ptx-navbar .button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-navbar .button { height: 100%; border-width: 0; } .ptx-navbar .toc-toggle { width: 240px; gap: 0.4em; margin-left: 0; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls, .nav-other-controls) { display: flex; } .ptx-navbar .treebuttons { flex: 1 1 210px; justify-content: end; } .ptx-navbar .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .ptx-navbar .pretext .navbar .dropdown { height: 34px; } .ptx-navbar .embed-popup { padding: 10px; background-color: var(--navbar-background); position: absolute; margin-top: 36px; border: 1px solid var(--page-border-color); border-radius: 3px; box-shadow: 0 0 5px var(--primary-color-gray-80); color: var(--button-text-color); } .ptx-navbar .embed-popup .embed-code-container { width: "100%"; padding: 5px; } .ptx-navbar .embed-popup .embed-code-container .embed-code-textbox { width: 100%; padding: 10px; height: 5em; } .ptx-navbar .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .ptx-navbar .treebuttons .icon { margin: 0 -7px; } .ptx-navbar :is(.index-button) .icon { display: none; } .ptx-navbar :is(.runestone-profile, .activecode-toggle, .searchbutton, .calculator-toggle, .light-dark-button, .embed-button) .name { display: none; } .ptx-navbar .index-button { min-width: 70px; } .runestone-profile { position: relative; } .runestone-profile .dropdown-content { display: none; position: absolute; background-color: var(--dropdown-background); min-width: 160px; z-index: 100; border: 1px solid var(--dropdown-border-color); right: 0; top: 35px; text-align: start; padding: 0; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: var(--dropdown-text-color); padding: 2px 8px; } .runestone-profile .dropdown-content a:is(:hover, :focus-visible) { background-color: var(--dropdown-hover-background); color: var(--dropdown-hover-text-color); } .runestone-profile .dropdown-content hr { color: var(--dropdown-border-color); margin: 4px 0; } .runestone-profile:is(:hover, :focus-visible, :focus-within) { overflow: visible; } .runestone-profile:is(:hover, :focus-visible, :focus-within) .dropdown-content { display: block; } @media screen and (max-width: 800px) { .ptx-navbar .button { border-left-width: 1px; border-right-width: 1px; border-color: var(--page-border-color); } .ptx-navbar > *:not(:first-child) { margin-left: -1px; } .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; z-index: 1100; background: var(--button-border-color); max-width: 100vw; } .ptx-navbar .ptx-navbar-contents { max-width: 100vw; } .ptx-navbar .nav-runestone-controls { flex: 0; } .ptx-navbar .toc-toggle { flex: 2 1 100px; } .ptx-navbar .treebuttons { flex: 3 1 150px; } .ptx-navbar .treebuttons > * { flex: 1 1; min-width: 35px; } .ptx-navbar .index-button { display: none; } .ptx-navbar .embed-popup { margin-top: unset; bottom: 36px; } .ptx-navbar .dropdown-content { top: unset; bottom: 36px; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button, .embed-button) .name { display: none; } } .ptx-sidebar { align-self: flex-start; } .ptx-sidebar.visible { display: block; } .ptx-sidebar.hidden { display: none; height: 0; } .ptx-toc { --codenumber-pad-left: 0.3rem; --codenumber-pad-right: 0.5rem; --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); background: var(--toc-background); margin: 0; font-size: 0.9rem; } .ptx-toc:is(.depth1, .parts.depth2) { --codenumber-pad-right: 0.5rem; } .ptx-toc .toc-item-list { margin: 0; padding: 0; list-style: none; background: var(--tocitem-background); } .ptx-toc .toc-item-list .active { list-style: none; } .ptx-toc .toc-item { background-color: var(--tocitem-background); color: var(--toc-text-color); border-color: var(--toc-border-color); } .ptx-toc .toc-item a { color: inherit; } .ptx-toc .toc-item.active:not(:has(.toc-item.active)) { color: var(--tocitem-active-text-color) !important; background-color: var(--tocitem-active-background) !important; border-color: var(--tocitem-active-border-color) !important; } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--tocitem-highlight-text-color); background-color: var(--tocitem-highlight-background); border-color: var(--tocitem-highlight-border-color); } .ptx-toc .toc-title-box { display: flex; } .ptx-toc .toc-title-box > .internal { position: relative; display: flex; flex-grow: 1; padding: 0.2em; font-weight: 500; } .ptx-toc .toc-item-list .toc-item-list .toc-title-box > .internal { font-weight: normal; } .ptx-toc .codenumber { min-width: var(--toc-indent-first); padding-left: var(--codenumber-pad-left); padding-right: var(--codenumber-pad-right); display: inline-block; text-align: left; flex-grow: 0; } .ptx-toc .toc-item { color: var(--toclevel1-text-color); background-color: var(--toclevel1-background); } .ptx-toc .toc-item .toc-item { color: var(--toclevel2-text-color); background-color: var(--toclevel2-background); } .ptx-toc .toc-item .toc-item .toc-item { color: var(--toclevel3-text-color); background-color: var(--toclevel3-background); } .book .ptx-toc .toc-chapter .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .codenumber { font-size: 80%; padding-top: 0.16em; min-width: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber { min-width: var(--toc-indent-third); visibility: hidden; } .ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber { visibility: visible; } .ptx-toc .toc-item .toc-title-box .title { margin-left: var(--toc-indent-first); } .book .ptx-toc .toc-chapter .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .title { margin-left: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { margin-left: var(--toc-indent-third); } .ptx-toc .toc-item > .toc-title-box .codenumber + .title { margin-left: 0 !important; } .ptx-toc .toc-chapter .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { font-size: 90%; } .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title { font-style: italic; } .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth1 ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-backgrounde); color: var(--tocitem-active-text-color); } .ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-background); color: var(--tocitem-active-text-color); } .ptx-toc.focused { } .ptx-toc.focused ul.structural:not(.contains-active) > .toc-item { display: none; } .ptx-toc.focused ul.structural:not(.contains-active) > .toc-item.visible { display: block; } .ptx-toc.focused ul.structural .toc-item.active > ul.structural > .toc-item { display: block; } .ptx-toc.focused ul.structural .toc-item.active > ul.structural > .toc-item.hidden { display: none; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 1.25em; line-height: 18px; font-variation-settings: "wght" 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--tocitem-highlight-background); color: var(--tocitem-highlight-text-color); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--tocitem-highlight-text-color); } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon:before { content: "add"; } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before { content: "remove"; } .ptx-sidebar { flex: 0 0 240px; position: sticky; top: 36px; overflow-y: hidden; } .ptx-toc { position: sticky; top: 36px; overflow-y: auto; overflow-x: hidden; height: calc(100vh - 36px); margin-top: -1px; } .ptx-toc > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 3px solid var(--toc-border-color); } @media screen and (max-width: 944px) { .ptx-sidebar { display: none; position: sticky; top: 36px; background: var(--content-background); min-height: 30vh; border-right: 2px solid var(--toc-border-color); border-bottom: 2px solid var(--toc-border-color); width: 240px; } } @media screen and (max-width: 800px) { .ptx-sidebar { position: fixed; z-index: 1000; top: unset; height: auto; max-height: 80vh; max-width: 80vw; bottom: 36px; border-right: 2px solid var(--toc-border-color); border-top: 2px solid var(--toc-border-color); } .ptx-toc { border-top: 2px solid var(--toc-border-color); border-bottom: 0; max-height: 80vh; } } .ptx-toc { scrollbar-color: var(--content-background) var(--content-background); } .ptx-toc:hover { scrollbar-color: var(--page-border-color) var(--content-background); } .ptx-page-footer { background: var(--footer-background); padding-top: 0; border-top: 2px solid var(--page-border-color); border-bottom: 2px solid var(--page-border-color); display: flex; flex-direction: row; justify-content: center; width: 100%; gap: 90px; position: relative; } .ptx-page-footer > a { margin: 1em 0; color: var(--body-text-color); } .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } .ptx-page-footer .feedback-link { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-page-footer .feedback-link:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-page-footer .feedback-link:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-page-footer .feedback-link.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-page-footer .feedback-link.hidden { display: none; } .ptx-page-footer .feedback-link.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } @media screen and (max-width: 800px) { .ptx-page-footer { gap: 20px; justify-content: center; margin-bottom: 34px; } .ptx-page-footer > a > .logo:first-child { height: 2em; } } @container ptx-main (width > 640px) { .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { --max-width: calc(min((100cqw - 2 * 20px), 10000px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); margin-left: calc(-0.5 * (100cqw - 640px)); } } .ptx-runestone-container .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; min-width: 100%; margin-left: auto; } @container ptx-main (width > 640px) { :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { --max-width: calc(min((100cqw - 2 * 20px), 10000px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); margin-left: calc(-0.5 * (100cqw - 640px)); } } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; margin-left: auto; } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content) .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; margin-left: 0; } .runestone.ac_section > div > div > *:not(.ac_code_div):not(.ac_output):not(.codelens):not(.ac_actions) { max-width: 600px; margin-left: auto; margin-right: auto; } .runestone .exercise-statement { max-width: 600px; margin-left: auto; margin-right: auto; } .hparsons_section .hp_question, .hparsons_section .hp_feedback { max-width: 600px; margin-left: auto; margin-right: auto; } .runestone.parsons_section > .parsons { width: 100%; padding-right: 0; } .runestone.parsons_section > .parsons .sortable-code-container { display: flex; flex-flow: wrap; justify-content: center; gap: 15px; margin: 10px auto; } .runestone.parsons_section > .parsons .sortable-code { margin: 0; } .runestone.parsons_section > .parsons .runestone_caption_text { max-width: unset; } .runestone.parsons_section > .parsons > div > *:not(.sortable-code-container) { max-width: 600px; margin-left: auto; margin-right: auto; } @media (width < 850px) { .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100cqw; margin-left: calc(-0.5 * (100cqw - 100%)); } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100cqw; margin-left: calc(-0.5 * (100cqw - 100%)); } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content) .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; margin-left: 0px; } } .ptx-main { margin-right: 320px; } .ptx-sidebar.hidden + .ptx-main { margin-left: 320px; } .ptx-main { box-shadow: 5px 10px 40px -10px var(--primary-color-gray-80); } @media (prefers-color-scheme: dark) { .ptx-main { box-shadow: 5px 10px 40px -10px black; } } .ptx-sidebar { margin-right: 80px; } .ptx-navbar { border: none; } .ptx-navbar .toc-toggle { transform: translateX(-320px); position: absolute; left: 0; justify-content: left; } .ptx-toc { border: none; position: sticky; top: 36px; } .toc-item.visible { font-size: 0.95em; padding-left: 8px; } .ptx-page { margin-top: 36px; margin-bottom: 36px; } @media screen and (width <= 1480px) { .ptx-page { margin-left: 0; max-width: 100%; } .ptx-main { margin-right: calc(100% - 840px - 320px); max-width: 840px; } .ptx-sidebar.hidden + .ptx-main { margin-right: auto; margin-left: auto; } .ptx-navbar .ptx-navbar-contents { margin-left: 320px; } } @media screen and (width <= 1240px) { .ptx-main { box-shadow: unset; margin-right: auto; } .ptx-main .ptx-content { padding-left: 20px; padding-right: 20px; max-width: 640px; } .ptx-sidebar { margin-right: 0; } .ptx-navbar .ptx-navbar-contents { margin-left: 240px; } .ptx-navbar .toc-toggle { transform: translateX(-240px); justify-content: center; } .ptx-page { margin-top: unset; margin-bottom: unset; } .ptx-toc { padding-top: 36px; } } @media screen and (width <= 880px) { .ptx-sidebar { display: none; } } @media screen and (max-width: 800px) { .ptx-navbar .ptx-navbar-contents { margin-left: 0; } .ptx-navbar .toc-toggle { transform: none; position: relative; justify-content: center; } .ptx-content-footer { padding-left: 20px; padding-right: 20px; } } .toc-item:is(:hover, :focus) { color: var(--tocitem-highlight-text-color); background-color: var(--tocitem-highlight-background); border-color: var(--tocitem-highlight-border-color); } .standalone-page { margin: 0; padding: 0; } .standalone-page .ptx-page { margin-top: 0; margin-bottom: 0; } .standalone-page .ptx-main { margin-right: auto; margin-left: auto; box-shadow: none; max-width: 100%; } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon { font-size: 30px; } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon:before { content: "chevron_left"; } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before { content: "chevron_left"; } .hide-type .codenumber:not(:empty)::after { content: ". "; } .aside-like > .knowl__link { color: var(--aside-like-link-color); border-bottom-color: var(--aside-like-link-color); } .aside-like > .knowl__content { margin-left: 30px; margin-right: 30px; border: 2px solid var(--aside-like-border-color); background-color: var(--aside-like-body-background); } @media screen and (min-width: 1450px) { details.aside-like { position: relative; margin-left: -365px; width: 200px; right: -365px; float: right; clear: right; } .multicolumn details.aside-like { position: relative; margin-left: inherit; width: auto; right: 0; float: none; clear: none; } details.aside-like > .knowl__content { margin-left: 0; margin-right: 0; background-color: var(--aside-like-body-background); z-index: 100; } } .cols2 > .exercise-like { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > .exercise-like { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > .exercise-like { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > .exercise-like { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > .exercise-like { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .exercise-like > .heading { font-size: inherit; } .exercisegroup .exercise-like { margin-top: 1em; } .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .exercisegroup > .heading + .introduction { display: inline; } .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .exercisegroup .exercisegroup-exercises { margin-top: 1em; padding-left: 40px; } .exercisegroup .conclusion { margin-left: 40px; } .exercisegroup .conclusion .heading { font-size: inherit; } .exercise-like > .exercise-like.task { margin-left: 20px; } .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .exercise-wrapper form button:active { background-color: #f0f0f0; } .exercise-wrapper form button + button { margin-left: 0.8em; } .exercise-wrapper, .exercise-wrapper form, .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .knowl .exercise-wrapper, .knowl .exercise-wrapper form, .knowl .exercise-wrapper form > div:first-child { width: 100%; } .exercise-wrapper > .para:first-child, .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .cols2 .heading + .exercise-wrapper { width: auto; } section.solutions > .heading + .heading { margin-top: 0.5em; } section.solutions > h3.heading, section.solutions section > h3.heading { font-size: 1.6em; } section.solutions > h4.heading, section.solutions section > h4.heading { font-size: 1.45em; } section.solutions > h5.heading, section.solutions section > h5.heading { font-size: 1.35em; } section.solutions > h6.heading, section.solutions section > h6.heading { font-size: 1.25em; } .sbsgroup > *:not(:first-child) { margin-top: 1.5em; } .sbsrow { display: grid; grid-template-rows: auto auto; } .sbspanel { grid-row: 1; } .sbspanel > .table > figcaption { text-align: center; } .sbspanel .tabular { overflow-x: auto; margin-left: auto; margin-right: auto; } .sbspanel--top { align-self: start; } .sbspanel--middle { align-self: center; } .sbspanel--bottom { align-self: end; } .sbspanel:has(.figure-like, .table-like), .sbspanel > :is(.figure-like, .table-like) { display: contents; } .sbspanel > :is(.figure-like, .table-like) > *:first-child { grid-row: 1; align-items: start; align-self: start; } .sbspanel--top > :is(.figure-like, .table-like) > *:first-child { align-items: start; align-self: start; } .sbspanel--middle > :is(.figure-like, .table-like) > *:first-child { align-items: center; align-self: center; } .sbspanel--bottom > :is(.figure-like, .table-like) > *:first-child { align-items: end; align-self: end; } .sbspanel > :is(.figure-like, .table-like) > *:nth-child(2) { margin-top: 0.5em; grid-row: 2; width: 100%; } .sbspanel:nth-of-type(2) * { grid-column: 2; } .sbspanel:nth-of-type(3) * { grid-column: 3; } .sbspanel:nth-of-type(4) * { grid-column: 4; } .sbspanel:nth-of-type(5) * { grid-column: 5; } .sbspanel:nth-of-type(6) * { grid-column: 6; } .sbspanel:nth-of-type(7) * { grid-column: 7; } .sbspanel:nth-of-type(8) * { grid-column: 8; } .sbspanel:nth-of-type(9) * { grid-column: 9; } .sbspanel:nth-of-type(10) * { grid-column: 10; } .discussion-like > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .discussion-like > .heading:first-child:after { content: "\2009"; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } .discussion-like > .heading ::after { content: "\2009"; } .discussion-like > .heading + .para { display: inline; } .discussion-like > .heading .space, .discussion-like > .heading .codenumber, .discussion-like > .heading .period { display: none; } .discussion-like > .heading .type::after { content: ". "; } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowl-link-color); border-bottom: 1px dotted var(--knowl-link-color); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--knowl-background); border-bottom-color: transparent; } .source-view__content { margin: 0.2em 0; } .knowl__content { margin: 0.75em 0; border: 3px solid var(--knowl-border-color); border-radius: 8px; padding: 12px; background-color: var(--knowl-background); } .knowl__content .incontext { display: block; font-size: 85%; text-align: right; } .knowl__content .knowl__content { background-color: var(--knowl-nested-1-background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-2-background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-3-background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-4-background); } .knowl__content > figure { margin-left: 0; margin-right: 0; } .assemblage-like:not(.knowl__content, .born-hidden-knowl), .goal-like:not(.knowl__content, .born-hidden-knowl) { padding: 10px; padding-left: 15px; border-left: 4px solid var(--block-border-color); background-color: var(--goal-like-body-background); } .assemblage-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child, .goal-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-top: 0; } .theorem-like .heading, .definition-like .heading { display: block; font-size: 1.1em; } .theorem-like .para, .definition-like .para { font-style: italic; } .example-like > .heading, .project-like > .heading, .remark-like > .heading, .openproblem-like > .heading, .computation-like > .heading, .commentary > .heading { display: block; font-size: 1.1em; } .proof { padding-bottom: 1.5em; padding-left: 1em; padding-right: 1em; } .proof::after { content: "\25a1"; position: absolute; right: 0; bottom: 1.5em; } .proof .heading { font-size: unset; font-weight: bold; font-style: italic; } .solution-like .heading { display: inline; font-style: italic; font-size: unset; } .tasks .knowl__content { border: none; } .tasks .knowl__content .theorem-like, .tasks .knowl__content .definition-like, .tasks .knowl__content .example-like, .tasks .knowl__content .project-like, .tasks .knowl__content .remark-like, .tasks .knowl__content .openproblem-like, .tasks .knowl__content .computation-like, .tasks .knowl__content .project-like, .tasks .knowl__content .commentary { padding-left: 0; margin-left: 0; border-left: none; } .tasks .knowl__content .theorem-like::after, .tasks .knowl__content .definition-like::after, .tasks .knowl__content .example-like::after, .tasks .knowl__content .project-like::after, .tasks .knowl__content .remark-like::after, .tasks .knowl__content .openproblem-like::after, .tasks .knowl__content .computation-like::after, .tasks .knowl__content .project-like::after, .tasks .knowl__content .commentary::after { border-bottom: none; display: none; } section.solutions:not(:is(:first-child)):not(.knowl__content, .born-hidden-knowl) { padding: 10px; padding-left: 15px; border-left: 2px solid var(--solution-border-color); background-color: var(--content-background); } section.solutions:not(:is(:first-child)):not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-top: 0; } .paragraphs > .heading:first-child, article > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .paragraphs > .heading:first-child:after, article > .heading:first-child:after { content: "\2009"; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction), article > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child, article > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child, article > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } :root { --font-body: Open Sans, Helvetica Neue, Helvetica, Arial, sans-serif; } :root { --font-headings: PT Serif, Times New Roman, Times, serif; } :root { --font-monospace: Inconsolata, Consolas, Monaco, monospace; } :root { --font-print: PT Serif, Times New Roman, Times, serif; } :root { color-scheme: light; } :root:not(.dark-mode) { --page-color: white; --content-background: white; --page-border-color: #ccc; --doc-title-color: var(--primary-color); --byline-color: #333; --banner-background: #f8f8f8; --navbar-background: var(--primary-color); --footer-background: var(--banner-background); --toc-border-color: #666; --toc-background: var(--content-background); --tocitem-background: var(--toc-background); --toc-text-color: var(--primary-color-black-30); --tocitem-highlight-background: #3a3a3a; --tocitem-highlight-text-color: #fff; --tocitem-highlight-border-color: #3a3a3a; --tocitem-active-background: var(--primary-color-white-15); --tocitem-active-text-color: white; --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--content-background); --toclevel1-text-color: var(--toc-text-color); --toclevel2-background: var(--content-background); --toclevel2-text-color: var(--toc-text-color); --toclevel3-background: var(--content-background); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #000; --body-title-color: var(--primary-color-black-20); --ptx-image-bg: transparent; --activated-content-bg: rgba(241, 185, 255, 0.3); --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color); --link-background: transparent; --link-active-text-color: var(--primary-color); --link-active-background: var(--primary-color-white-96); --link-alt-text-color: var(--link-text-color); --link-alt-background: transparent; --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--primary-color-white-96); --knowl-link-color: var(--link-text-color); --knowl-background: #f8f8f8; --knowl-border-color: var(--primary-color-gray-80); --knowl-nested-1-background: #f5f5ff; --knowl-nested-2-background: #fffff5; --knowl-nested-3-background: #f5ffff; --knowl-nested-4-background: #fff5f5; --block-body-background: var(--content-background); --block-border-color: var(--knowl-border-color); --block-head-color: var(--body-text-color); --aside-like-link-color: var(--link-text-color); --button-background: var(--primary-color); --button-text-color: var(--primary-color-white-90); --button-border-color: #3a3a3a; --button-hover-background: #3a3a3a; --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: #fdfdfd; --code-inline-background: #ededed; --assemblage-like-body-background: var(--block-body-background); --assemblage-like-border-color: var(--block-border-color); --definition-like-body-background: var(--block-body-background); --definition-like-border-color: var(--block-border-color); --theorem-like-body-background: var(--block-body-background); --theorem-like-border-color: var(--block-border-color); --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: var(--block-body-background); --remark-like-border-color: var(--block-border-color); --computation-like-body-background: var(--block-body-background); --computation-like-border-color: var(--block-border-color); --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--block-body-background); --aside-like-border-color: var(--block-border-color); --proof-like-body-background: var(--block-body-background); --proof-like-border-color: var(--block-border-color); --example-like-body-background: var(--block-body-background); --example-like-border-color: var(--block-border-color); --project-like-body-background: var(--block-body-background); --project-like-border-color: var(--block-border-color); --goal-like-body-background: var(--block-body-background); --goal-like-border-color: var(--block-border-color); --solution-like-body-background: var(--block-body-background); --solution-like-border-color: var(--block-border-color); --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); --primary-color: hsl(214, 59%, 40%); --toc-border: var(--primary-color-gray-10); } :root.dark-mode { color-scheme: dark; --page-color: var(--background-color); --content-background: var(--page-color); --page-border-color: var(--background-color-white-25); --doc-title-color: var(--primary-color); --byline-color: var(--background-color-white-50); --banner-background: hsl(214, 20%, 10%); --navbar-background: var(--background-color-gray-15); --footer-background: var(--background-color-black-10); --toc-border-color: #555; --toc-background: var(--content-background); --tocitem-background: var(--toc-background); --toc-text-color: var(--body-text-color); --tocitem-highlight-background: var(--primary-color-gray-5); --tocitem-highlight-text-color: var(--background-color-black-50); --tocitem-highlight-border-color: var(--toc-border-color); --tocitem-active-background: var(--primary-color-gray-5); --tocitem-active-text-color: var(--background-color-black-50); --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--content-background); --toclevel1-text-color: var(--primary-color-white-40); --toclevel2-background: var(--content-background); --toclevel2-text-color: var(--toclevel1-text-color); --toclevel3-background: var(--content-background); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #f2f2f2; --body-title-color: var(--primary-color-white-20); --ptx-image-bg: white; --activated-content-bg: rgba(255, 237, 185, 0.2); --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color-white-10); --link-background: transparent; --link-active-text-color: var(--primary-color-white-40); --link-active-background: var(--background-color-gray-30); --link-alt-text-color: var(--link-text-color); --link-alt-background: transparent; --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--link-active-text-color); --knowl-link-color: var(--doc-title-color); --knowl-background: var(--background-color-black-10); --knowl-border-color: var(--background-color-white-20); --knowl-nested-1-background: var(--background-color-gray-10); --knowl-nested-2-background: var(--background-color-black-10); --knowl-nested-3-background: var(--background-color-gray-10); --knowl-nested-4-background: var(--background-color-black-10); --block-body-background: var(--content-background); --block-border-color: var(--knowl-border-color); --block-head-color: var(--body-text-color); --aside-like-link-color: var(--link-text-color); --button-background: var(--background-color-gray-15); --button-text-color: var(--body-text-color); --button-border-color: var(--background-color-white-25); --button-hover-background: var(--primary-color-black-50); --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: var(--background-color-gray-20); --code-inline-background: var(--background-color-gray-20); --assemblage-like-body-background: var(--block-body-background); --assemblage-like-border-color: var(--block-border-color); --definition-like-body-background: var(--block-body-background); --definition-like-border-color: var(--block-border-color); --theorem-like-body-background: var(--block-body-background); --theorem-like-border-color: var(--block-border-color); --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: var(--block-body-background); --remark-like-border-color: var(--block-border-color); --computation-like-body-background: var(--block-body-background); --computation-like-border-color: var(--block-border-color); --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--block-body-background); --aside-like-border-color: var(--block-border-color); --proof-like-body-background: var(--block-body-background); --proof-like-border-color: var(--block-border-color); --example-like-body-background: var(--block-body-background); --example-like-border-color: var(--block-border-color); --project-like-body-background: var(--block-body-background); --project-like-border-color: var(--block-border-color); --goal-like-body-background: var(--block-body-background); --goal-like-border-color: var(--block-border-color); --solution-like-body-background: var(--block-body-background); --solution-like-border-color: var(--block-border-color); --primary-color: hsl(214, 50%, 50%); --background-color: hsl(214, 20%, 10%); --background-color-white-1: color-mix(in oklab, var(--background-color), white 1%); --background-color-white-2: color-mix(in oklab, var(--background-color), white 2%); --background-color-white-3: color-mix(in oklab, var(--background-color), white 3%); --background-color-white-4: color-mix(in oklab, var(--background-color), white 4%); --background-color-white-5: color-mix(in oklab, var(--background-color), white 5%); --background-color-white-10: color-mix(in oklab, var(--background-color), white 10%); --background-color-white-15: color-mix(in oklab, var(--background-color), white 15%); --background-color-white-20: color-mix(in oklab, var(--background-color), white 20%); --background-color-white-25: color-mix(in oklab, var(--background-color), white 25%); --background-color-white-30: color-mix(in oklab, var(--background-color), white 30%); --background-color-white-35: color-mix(in oklab, var(--background-color), white 35%); --background-color-white-40: color-mix(in oklab, var(--background-color), white 40%); --background-color-white-50: color-mix(in oklab, var(--background-color), white 50%); --background-color-white-60: color-mix(in oklab, var(--background-color), white 60%); --background-color-white-65: color-mix(in oklab, var(--background-color), white 65%); --background-color-white-70: color-mix(in oklab, var(--background-color), white 70%); --background-color-white-75: color-mix(in oklab, var(--background-color), white 75%); --background-color-white-80: color-mix(in oklab, var(--background-color), white 80%); --background-color-white-85: color-mix(in oklab, var(--background-color), white 85%); --background-color-white-90: color-mix(in oklab, var(--background-color), white 90%); --background-color-white-95: color-mix(in oklab, var(--background-color), white 95%); --background-color-white-96: color-mix(in oklab, var(--background-color), white 96%); --background-color-white-97: color-mix(in oklab, var(--background-color), white 97%); --background-color-white-98: color-mix(in oklab, var(--background-color), white 98%); --background-color-white-99: color-mix(in oklab, var(--background-color), white 99%); --background-color-black-1: color-mix(in oklab, var(--background-color), black 1%); --background-color-black-2: color-mix(in oklab, var(--background-color), black 2%); --background-color-black-3: color-mix(in oklab, var(--background-color), black 3%); --background-color-black-4: color-mix(in oklab, var(--background-color), black 4%); --background-color-black-5: color-mix(in oklab, var(--background-color), black 5%); --background-color-black-10: color-mix(in oklab, var(--background-color), black 10%); --background-color-black-15: color-mix(in oklab, var(--background-color), black 15%); --background-color-black-20: color-mix(in oklab, var(--background-color), black 20%); --background-color-black-25: color-mix(in oklab, var(--background-color), black 25%); --background-color-black-30: color-mix(in oklab, var(--background-color), black 30%); --background-color-black-35: color-mix(in oklab, var(--background-color), black 35%); --background-color-black-40: color-mix(in oklab, var(--background-color), black 40%); --background-color-black-50: color-mix(in oklab, var(--background-color), black 50%); --background-color-black-60: color-mix(in oklab, var(--background-color), black 60%); --background-color-black-65: color-mix(in oklab, var(--background-color), black 65%); --background-color-black-70: color-mix(in oklab, var(--background-color), black 70%); --background-color-black-75: color-mix(in oklab, var(--background-color), black 75%); --background-color-black-80: color-mix(in oklab, var(--background-color), black 80%); --background-color-black-85: color-mix(in oklab, var(--background-color), black 85%); --background-color-black-90: color-mix(in oklab, var(--background-color), black 90%); --background-color-black-95: color-mix(in oklab, var(--background-color), black 95%); --background-color-black-96: color-mix(in oklab, var(--background-color), black 96%); --background-color-black-97: color-mix(in oklab, var(--background-color), black 97%); --background-color-black-98: color-mix(in oklab, var(--background-color), black 98%); --background-color-black-99: color-mix(in oklab, var(--background-color), black 99%); --background-color-gray-1: color-mix(in oklab, var(--background-color), gray 1%); --background-color-gray-2: color-mix(in oklab, var(--background-color), gray 2%); --background-color-gray-3: color-mix(in oklab, var(--background-color), gray 3%); --background-color-gray-4: color-mix(in oklab, var(--background-color), gray 4%); --background-color-gray-5: color-mix(in oklab, var(--background-color), gray 5%); --background-color-gray-10: color-mix(in oklab, var(--background-color), gray 10%); --background-color-gray-15: color-mix(in oklab, var(--background-color), gray 15%); --background-color-gray-20: color-mix(in oklab, var(--background-color), gray 20%); --background-color-gray-25: color-mix(in oklab, var(--background-color), gray 25%); --background-color-gray-30: color-mix(in oklab, var(--background-color), gray 30%); --background-color-gray-35: color-mix(in oklab, var(--background-color), gray 35%); --background-color-gray-40: color-mix(in oklab, var(--background-color), gray 40%); --background-color-gray-50: color-mix(in oklab, var(--background-color), gray 50%); --background-color-gray-60: color-mix(in oklab, var(--background-color), gray 60%); --background-color-gray-65: color-mix(in oklab, var(--background-color), gray 65%); --background-color-gray-70: color-mix(in oklab, var(--background-color), gray 70%); --background-color-gray-75: color-mix(in oklab, var(--background-color), gray 75%); --background-color-gray-80: color-mix(in oklab, var(--background-color), gray 80%); --background-color-gray-85: color-mix(in oklab, var(--background-color), gray 85%); --background-color-gray-90: color-mix(in oklab, var(--background-color), gray 90%); --background-color-gray-95: color-mix(in oklab, var(--background-color), gray 95%); --background-color-gray-96: color-mix(in oklab, var(--background-color), gray 96%); --background-color-gray-97: color-mix(in oklab, var(--background-color), gray 97%); --background-color-gray-98: color-mix(in oklab, var(--background-color), gray 98%); --background-color-gray-99: color-mix(in oklab, var(--background-color), gray 99%); --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); } /*! Theme: greeley */ /*# sourceMappingURL=theme-greeley.css.map */ ================================================ FILE: css/dist/theme-min-legacy.css ================================================ @charset "UTF-8"; /* ../../css/targets/html/legacy/min/theme-min.scss */ * { box-sizing: border-box; } body.pretext { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } body.pretext[data-font=OS] { font-family: "Open Sans", sans-serif; } body.pretext[data-font=RS] { font-family: "Roboto Serif", serif; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; } body.pretext { background: #fff; } a { color: inherit; text-decoration: none; } a:hover, a:focus { text-decoration: none; } body.pretext > a.assistive { padding: 6px; position: absolute; top: -40px; left: 0px; color: white; border-right: 1px solid white; border-bottom: 1px solid white; border-bottom-right-radius: 8px; background: transparent; z-index: 10000; } body.pretext > a.assistive:focus { top: 0px; background: #BF1722; outline: 0; transition: top 0.1s ease-in, background 0.5s linear; } nav .ptx-navbar { border-top: none; border-right: none; border-left: none; min-height: unset; } .ptx-navbar .activecode-toggle { padding: 3px 5px; } .pretext #brand-navbar, .pretext .brand-navbar { left: 0; position: fixed; right: 0; z-index: 1030; height: 50px; border-width: 0 0 1px; top: 0; margin-bottom: 0; } .pretext #brand-navbar > .container::before, .pretext .brand-navbar > .container::before, .pretext #brand-navbar > .container::after, .pretext .brand-navbar > .container::after { display: none; } .pretext #brand-navbar + .ptx-masthead, .pretext .brand-navbar + .ptx-masthead { margin-top: 50px; } .pretext #brand-navbar .navbar-collapse.collapse, .pretext .brand-navbar .navbar-collapse.collapse { overflow: hidden !important; } .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: 50px; } @media screen and (max-width: 800px) { .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: auto; } } .ptx-content section, .ptx-content article, .ptx-content figure, .ptx-content figcaption, .ptx-content .exercisegroup, .ptx-content .discussion-like, .ptx-content .para { position: relative; } .ptx-content .para > p:first-child, .ptx-content .para > .para:first-child { display: inline; } .ptx-content pre { margin: 0; padding: 0; border: none; } .ptx-content pre { border-radius: 0; } .ptx-content textarea { padding: 0; } .ptx-content h1, .ptx-content h2, .ptx-content h3, .ptx-content h4, .ptx-content h5, .ptx-content h6 { margin: 0; font-size: unset; } .pretext h1, .pretext h2, .pretext h3, .pretext h4, .pretext h5, .pretext h6 { margin: 0; font-size: unset; } .ptx-content .heading { line-height: 1.1; } .ptx-content .para { margin-top: 1.25em; margin-bottom: 0; line-height: 1.35; } .ptx-content .para.continuation { margin-top: 0; } .ptx-content pre + .para.continuation, .ptx-content pre + form, .ptx-content div + form { margin-top: 1em; } .ptx-content ul + .para.continuation, .ptx-content ol + .para.continuation, .ptx-content dl + .para.continuation { margin-top: 0.75em; } .ptx-content .aside-like > .para:first-child, .ptx-content td > .para:first-child, .ptx-content .solution-like > .para:first-child { margin-top: 0; } .ptx-content .assemblage-like > .para:first-of-type { margin-top: 0; } .ptx-content .assemblage-like > .heading + .para { margin-top: 0.25em; } .ptx-content .assemblage-like + .para { margin-top: 1.75em; } .ptx-content .para.intertext { margin-top: -0.25em; text-indent: 0; } .ptx-content .para + table { margin-top: 1em; } .ptx-content table tr td .para + .para { margin-top: 1em; } .ptx-content table + .para { margin-top: 1.5em; } .ptx-content .para + figure.figure-like > table { margin-top: 1em; } .ptx-content .exercise-like .para + ol { margin-top: 0.5em; } .ptx-content .para + pre.prettyprint, .ptx-content .para + pre.plainprint { margin-top: 1.25em; } .ptx-content .para + .code-box { margin-top: 1.25em; } .ptx-content .code-box > .console { margin-left: 1.5em; } .ptx-content .exercisegroup { padding-top: 1.25em; margin-bottom: 1em; } .ptx-content section .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .ptx-content section .exercisegroup > .heading + .introduction { display: inline; } .ptx-content section .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .ptx-content .exercisegroup article.exercise-like li > .para:first-child { margin-top: 0; } .ptx-content .exercisegroup article.exercise-like .heading { margin: 0; } .ptx-content article.exercise-like .task > .heading + .heading { font-weight: 600; } .ptx-content article.exercise-like .task > .heading + .heading + .para, .ptx-content article.exercise-like .task > .heading + .heading + div { display: block; margin-top: 0; } .ptx-content .exercisegroup .conclusion .heading { margin-top: 0.5em; } .ptx-content .exercisegroup article + article { margin-top: 1em; } .ptx-content .exercisegroup > article, .ptx-content .exercisegroup-exercises > article { margin-left: 2em; } .ptx-content .exercisegroup .cols2 > article { margin-left: 1.25em; } .ptx-content .exercisegroup > .introduction, .ptx-content .exercisegroup > .conclusion { margin-left: 0; } .ptx-content .exercisegroup > .introduction { margin-top: 1.25em; margin-top: 0; } .ptx-content .exercisegroup > .introduction > .para:first-child::before { content: "\25a0\2009"; color: #06a; position: relative; top: -1px; right: 1px; } .ptx-content .exercisegroup > .heading + .introduction > .para:first-child::before { content: "\2003"; } .ptx-content .exercisegroup > .introduction > .para:first-child { margin-top: 0; } .ptx-content section > article, .ptx-content section > section.paragraphs, .ptx-content .paragraphs > article { margin-top: 1.25em; } .ptx-content section article + article, .ptx-content section .introduction + article, .ptx-content section .para + article, .ptx-content section .posterior + article { margin-top: 1.75em; } .ptx-content section article > .introduction + article { margin-top: 1em; } .ptx-content section article > .discussion-like { margin-top: 1em; } .ptx-content section article > .discussion-like .para { margin-top: 1em; } .ptx-content article + .posterior { margin-top: 0.5em; } .ptx-content section .para + .tabular-box { margin-top: 0.75em; } .ptx-content section .tabular-box + .tabular-box { margin-top: 1em; } .ptx-content section .proof { margin-top: 0.75em; } .ptx-content section > pre, .ptx-content .para + pre { margin-top: 1.25em; } .ptx-content ol .para + .para, .ptx-content ul .para + .para { margin-top: 1em; } .ptx-content .introduction + .sidebyside, .ptx-content .para + .sidebyside, .ptx-content ol + .sidebyside, .ptx-content ul + .sidebyside { margin-top: 1em; } .ptx-content section .heading, .ptx-content article .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; } .ptx-content article .exercise-stage { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; font-size: 100%; margin-top: 0.4em; } .ptx-content article > .heading + .para { margin-top: 0; } .ptx-content section .heading + .para, .ptx-content section .title + .para, .ptx-content section .heading + .introduction > .para:first-child, .ptx-content section .blob > .para:first-child { margin-top: 0.25em; } .ptx-content section .heading + article { margin-top: 1em; } .ptx-content section .heading + .sidebyside { margin-top: 1em; } .ptx-content a > .heading { display: inline; } .ptx-content section > .heading { font-size: 1.75em; line-height: 1.25em; margin-top: 1em; margin-bottom: 0.35em; } .ptx-content section section > .heading { font-size: 1.5em; line-height: 1.25em; margin-bottom: 0; } .ptx-content .paragraphs > .heading { font-size: 1.125em; line-height: 1.125em; display: inline; } .ptx-content .paragraphs .heading + .para { display: inline; } .ptx-content .para.logical > .para:first-child { display: inline; } .ptx-content .runestone label > .para { display: inline; } .ptx-content .paragraphs .para .title { font-family: "PT Serif", "Times New Roman", Times, serif; font-size: 1.125em; font-weight: 700; } .ptx-content .paragraphs > .heading { margin-top: 0; } .ptx-content .paragraphs + .paragraphs { margin-top: 3em; } .ptx-content article .paragraphs > .heading { font-size: 1.05em; } .ptx-content section section section > .heading { font-size: 1.4em; line-height: 1.15em; margin-top: 0.75em; } @media screen and (max-width: 480px) { .ptx-content section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } .ptx-content section section > .heading { font-size: 1.3em; line-height: 1.15em; } .ptx-content section section section > .heading { font-size: 1.15em; line-height: 1em; } } .ptx-content .abstract { margin: 4em 2em; } .ptx-content .abstract > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .ptx-content .abstract > .title::after { content: ".\2009\2009\2009"; } .ptx-content .abstract > .title + .para { display: inline; } .ptx-content article > .heading, .ptx-content article > a .heading { font-size: 1.125em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like > .heading { font-size: 1em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like.discussion > .heading .codenumber, .ptx-content .discussion-like.discussion > .heading .space, .ptx-content .discussion-like.discussion > .heading .period { display: none; } .ptx-content .discussion-like.discussion > .heading .type::after { content: ". "; } .ptx-content .discussion-like.status > .heading { display: none; } .ptx-content .discussion-like.status > .heading + .para, .ptx-content .discussion-like.status > .para { font-style: italic; display: block; padding-left: 1em; } .ptx-content article > .heading::after, .ptx-content .discussion-like > .heading::after, .ptx-content .paragraphs > .heading::after, .ptx-content article > a > .heading::after { content: "\2009"; } .ptx-content .posterior .heading { font-weight: normal; font-size: 1.125em; line-height: 1.125em; margin-top: 0; } .ptx-content article > .heading + .para, .ptx-content .discussion-like > .heading + .para, .ptx-content article > .heading + .introduction, .ptx-content article > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article > .heading + ol, .ptx-content article > .heading + ul { padding-left: 1.5em; } .ptx-content article.theorem-like .para, .ptx-content article.theorem-like li { font-style: italic; } .ptx-content article.theorem-like .emphasis { font-weight: 700; } .ptx-content ol, .ptx-content ul { margin-bottom: 0; } .ptx-content li { margin-bottom: 0; } .ptx-content li .title { font-size: 100%; font-weight: normal; font-style: italic; } .ptx-content article.theorem-like li .title { font-weight: 600; font-style: normal; font-size: 96%; } .ptx-content figure { margin-bottom: 0; } .ptx-content .heading { margin-top: 0; margin-bottom: 0; } .ptx-content .conclusion { margin-top: 1em; } .ptx-content .conclusion > .para:first-child { margin-top: 0.5em; } .ptx-content ol, .ptx-content ul { margin-top: 0.75em; } .ptx-content .exercise-like > ol:first-child, .ptx-content .exercise-like > ul:first-child { margin-top: 0; } .ptx-content .heading + ol, .ptx-content .heading + ul { margin-top: 0.45em; } .ptx-content li > .heading + ol, .ptx-content li > .heading + ul { margin-top: 0.25em; } .ptx-content li > .heading + ol > li:nth-child(1), .ptx-content li > .heading + ul > li:nth-child(1) { margin-top: 0; } .ptx-content li > .heading + ol.cols2 > li:nth-child(2), .ptx-content li > .heading + ul.cols2 > li:nth-child(2) { margin-top: 0; } .ptx-content li { margin-top: 0.5em; } .ptx-content li > .para:first-child { margin-top: 0; } .ptx-content article .para:first-child { margin-top: 0; } .ptx-content ol ol, .ptx-content ol ul, .ptx-content ul ol, .ptx-content ul ul { margin-top: 0.5em; } .ptx-content .frontmatter > .heading { display: block; text-align: center; } .ptx-content .frontmatter > .heading .title, .ptx-content .book > .heading .title { font-size: 1.3em; } .ptx-content .frontmatter > .heading .subtitle, .ptx-content .book > .heading .subtitle { display: block; font-weight: normal; color: #666666; font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .ptx-content .frontmatter .author:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .para:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .author, .ptx-content .frontmatter > .credit { margin-top: 2em; text-align: center; } .ptx-content .frontmatter > .author .author-name { font-size: 120%; } .ptx-content .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .ptx-content .frontmatter .credit .title { font-size: 1em; } .ptx-content .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .ptx-content .frontmatter .author-info { font-size: 90%; } .ptx-content a[href^="mailto:"] { white-space: pre; } .ptx-content .colophon .credit { margin-top: 1em; } button { font: inherit; } .print-button { position: relative; right: 2px; top: 66px; background-color: LightGreen; z-index: 1; margin-top: -4em; float: right; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; border: none; } .pretext .ptx-page main.ptx-main { margin-left: 0; left: auto; border: none; box-shadow: none; padding: 0; } .pretext .ptx-page .ptx-main .ptx-content { margin-top: 0; } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section { margin-top: 1em; } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section .heading { margin-top: 0; } .pretext a[href]::after { content: ""; } .print-button { display: none; } } @media print { body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { width: 820px; max-width: 820px; font-size: 12.5px; } body.standalone.worksheet { margin: 0; } body.standalone .ptx-content section.worksheet { border: none; } body.standalone.worksheet .ptx-masthead, body.standalone.worksheet .ptx-page-footer { display: none; } body.standalone.worksheet.has-sidebar-left.mathbook-loaded .ptx-page .ptx-main { margin: 0; } body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { margin: 0; } body.standalone.worksheet .ptx-content section.onepage { max-height: 100%; max-width: 100%; overflow: hidden; page-break-after: always; border: none; page-break-inside: avoid; } body.standalone.worksheet .ptx-content .onepage.lastpage { margin-bottom: -2em; page-break-after: auto; } body.standalone.worksheet.a4 .ptx-content .onepage { } body.standalone.worksheet .ptx-content .onepage div.workspace, body.standalone.worksheet .ptx-content .onepage div.workspace.squashed.tight { border: none; padding: 0; background: none !important; } body.standalone.worksheet a { color: black; } body.standalone.worksheet .ptx-page .ptx-main { padding: 0; } body.standalone.worksheet.mathbook-loaded .ptx-page .ptx-main .ptx-content.ptx-content section.onepage { padding-bottom: 20px; } @page { margin: 0; } } .hidden { display: none; } .ptx-navbar .preferences_menu_holder .active > li { color: #ddd; } .ptx-navbar .preferences_menu_holder > ol > li:focus { background: #eef; border: 2px solid #909; padding: 2px 24px 2px 8px; } .ptx-navbar .preferences_menu_holder > ol > li > ol > li:focus { background: #eef; border: 2px solid #909; padding: 4px 4px 2px 4px; } .ptx-navbar .preferences_menu_holder .active .selected { background: #eef; color: #111; } .ptx-navbar .button.user-preferences-button { overflow: visible; display: none; } .preferences_menu_holder { z-index: 30; background: #fee; color: #222; position: absolute; left: -11em; top: 4em; } .preferences_menu_holder ol { list-style-type: none; padding: 0; margin: 0; } .preferences_menu_holder > ol { width: 12.5em; } .preferences_menu_holder > ol > li { padding: 4px 26px 4px 10px; } .preferences_menu_holder ol li ol { z-index: 40; position: absolute; left: 13em; top: -2em; background: #fee; } .preferences_menu_holder ol li ol li { padding: 6px 6px 4px 6px; display: flex; align-items: center; } .preferences_menu_holder ol.fonts:not(.hidden) { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; } .preferences_menu_holder ol.fonts li:nth-child(8n+1), .preferences_menu_holder ol.fonts li:nth-child(8n+2), .preferences_menu_holder ol.fonts li:nth-child(8n+3), .preferences_menu_holder ol.fonts li:nth-child(8n+4) { background-color: #eff; } .preferences_menu_holder ol.fonts li:nth-child(4n+2) { width: 4em; justify-content: center; text-align: center; align-items: center; } .preferences_menu_holder ol.fonts li:nth-child(4n+1) { padding-left: 14px; } .preferences_menu_holder .wrap_to_submenu { float: right; line-height: 0.95em; margin-right: -7px; } .preferences_menu_holder .to_submenu { position: absolute; } .preferences_menu_holder .avatars li { font-size: 200%; text-align: center; } .preferences_menu_holder .fontfamily .name { margin-right: 2em; } .preferences_menu_holder .fontfamily .sample { margin-left: auto; } .preferences_menu_holder .fonts .byunits { font-size: 80%; margin-bottom: -0.3em; } #choose_topic { background: #eef; } .ffcheck, .atmospherecheck, .avatarcheck, .rulercheck, .motioncheck { width: 1em; margin-left: 0.2em; margin-right: 0.7em; font-size: 11pt; } .preferences_menu_holder .moveQ { padding-top: 0.5em; border-top: 0.3em solid #eef; } .preferences_menu_holder .moveQ, .preferences_menu_holder .moveQ ~ li { background: #efe; } [data-ruler=greybar] .onelineX:hover { padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: #f3f3f3; } [data-atmosphere*=dark][data-ruler=greybar] .onelineX:hover { color: #333; } [data-ruler=lightbox] .onelineX { background-color: #e3e3e3; } [data-ruler=lightbox] .onelineX:hover { padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: inherit; } [data-ruler=sunrise] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler=sunrise] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunrise] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] .onelineX:hover { background-color: inherit; border-bottom: 2px solid black; margin-bottom: -2px; position: relative; z-index: 10; } xxxxxx[data-ruler=sunriseunderline] .onelineX:hover + .onelineX { margin-top: -2px; } [data-ruler=sunriseunderline] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=underline] .onelineX:hover { background-color: inherit; border-bottom: 1px solid black; margin-bottom: -1px; } [data-ruler=lunderline] .onelineX:hover { background-color: inherit; border-bottom: 1px solid black; border-left: 1px solid black; padding-left: 4px; margin-left: -5px; margin-bottom: -1px; } [data-atmosphere*=dark][data-ruler*=underline] .onelineX:hover { border-bottom: 1.5px solid #ddd; margin-bottom: -1.5px; } [data-atmosphere*=dark][data-ruler=lunderline] .onelineX:hover { border-left: 1.5px solid #ddd; padding-left: 3.5px; margin-left: -5px; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } .ptx-footnote { display: inline-block; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number { visibility: hidden; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: 0.6rem; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote__number { display: inline; cursor: pointer; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowlbackground); border-radius: 6px; padding: 0px 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowlborder); } .ptx-content section .para.credit + .para.credit { margin-top: 0.25em; } .ptx-content section .para.credit > .title { font-weight: 700; margin-right: 0.5em; } .ptx-content section .para.copyright { margin-top: 2.5em; } .ptx-content section .para.license { margin-top: 2.5em; } .ptx-content section > .heading + .heading, .ptx-content section section > .heading + .heading { margin-top: 0.5em; } .ptx-content section.solutions > h3.heading, .ptx-content section.solutions section > h3.heading { font-size: 1.6em; } .ptx-content section.solutions > h4.heading, .ptx-content section.solutions section > h4.heading { font-size: 1.45em; } .ptx-content section.solutions > h5.heading, .ptx-content section.solutions section > h5.heading { font-size: 1.35em; } .ptx-content section.solutions > h6.heading, .ptx-content section.solutions section > h6.heading { font-size: 1.25em; } .ptx-content .bibitem + .bibentry { display: inline-block; width: 90%; } .ptx-content .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .ptx-content figcaption { font-weight: normal; } .ptx-content figcaption { margin-top: 0.6em; margin-left: auto; margin-right: auto; } .ptx-content figure.table-like figcaption:first-child { font-style: oblique; margin-top: 0; } .ptx-content figure.table-like figcaption:first-child .type, .ptx-content figure.table-like figcaption:first-child .codenumber { font-style: normal; } .ptx-content section figcaption .codenumber, .ptx-content section figcaption .type { font-weight: 700; font-size: inherit; } .ptx-content figcaption .codenumber:after { content: "\2002"; } .ptx-content figcaption .type:last-of-type::after { content: "\2002"; } .ptx-content figcaption code.code-inline { white-space: pre; } .ptx-content figure.figure > figcaption { margin-top: 1em; } .ptx-content figure.listing > figcaption + * { margin-top: 0.5em; } .ptx-content figcaption + .named-list-content { margin-top: 0.6em; } .ptx-content figcaption + .named-list-content > .introduction > .para:first-child { margin-top: 0; } .ptx-content figcaption + table, .ptx-content figcaption + .tabular-box { margin-top: 0.5em; } .ptx-content .definition-like .para > .emphasis { font-weight: 700; } .ptx-content em.alert { font-weight: bold; } .unprocessed { padding: 8px; background-color: rgb(255, 230, 230); } .unprocessed .unprocessed { margin: 8px; background-color: rgb(255, 200, 255); } .unprocessed .unprocessed .unprocessed { margin: 8px; background-color: rgb(205, 205, 255); } .ptx-content section.introduction + section { margin-top: 2em; } .ptx-content { margin: 0; } .ptx-content .runestone.parsons_section { display: inline-block; max-width: unset; } .ptx-content .runestone.ac_section { width: 60em; max-width: unset; } .ptx-content .runestone.ac_section .ac_section { max-width: unset; } .ptx-content .runestone.ac_section > div { max-width: unset; } .ptx-content .runestone > .parsons { width: 60em; max-width: unset; } .ptx-content .runestone .parsons { margin: 0; } .ptx-content .runestone.parsons_section > .parsons { width: max-content; padding-right: 1em; } .ptx-content .runestone .parsons .sortable-code-container { text-align: unset; } .ptx-content .runestone .parsons .parsons-text, .ptx-content .runestone .parsons .parsons-controls { margin-left: 0; margin-right: 0; } .ptx-content .runestone .parsons .sortable-code + .sortable-code { margin-right: 0; } .ptx-content .runestone .parsons .runestone_caption_text { max-width: 660px; } .runestonebustmenu { position: absolute; right: 0; top: 0; } .runestonebustmenu .dropdown-content { position: absolute; right: 2em; left: unset; top: 1em; } @media screen and (max-width: 800px) { nav .dropdown .dropdown-content { top: unset; bottom: 36px; } .activecode-toggle { display: none; } } .pretext .navbar .dropdown { height: 35px; } .ptx-content section section + section { margin-top: 3em; } .ptx-content .sidebyside > .para, .ptx-content .sidebyside > figure, .ptx-content .sidebyside > img, .ptx-content .sidebyside > table, .ptx-content .sidebyside > tabular, .ptx-content .sidebyside > section, .ptx-content .sidebyside > .paragraphs { display: inline-block; margin: 0; } .ptx-content .sidebyside .sbspanel > table { overflow-x: auto; margin-left: auto; margin-right: auto; } .ptx-content .sidebyside figcaption { padding-left: 1em; padding-right: 0; padding-bottom: 0; margin: 0.75em 0 0 0; } .ptx-content figcaption { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .sidebyside > .para { width: 32%; vertical-align: top; } .ptx-content .sidebyside > .para.left, .ptx-content .sidebyside > .para.middle, .ptx-content .sidebyside > .para.right { vertical-align: middle; } .ptx-content .sidebyside > .para + img { vertical-align: middle; } .ptx-content .sidebyside .sbsrow .sbsheader { margin-top: 0; } .ptx-content .sbsgroup { width: 100%; } .ptx-content .sidebyside { width: 100%; } .ptx-content .sbsrow { display: flex; justify-content: space-between; } .ptx-content .sbsheader { text-align: center; justify-content: center; font-size: 1em; } .ptx-content .sbspanel:empty { height: 10em; background-color: rgb(221, 221, 255); } .ptx-content .sbspanel { display: flex; flex-direction: column; justify-content: flex-start; } .ptx-content .sbspanel.top { justify-content: flex-start; } .ptx-content .sbspanel.middle { justify-content: center; } .ptx-content .sbspanel.bottom { justify-content: flex-end; } .ptx-content .sbspanel > .para:first-child { margin-top: 0; } .ptx-content .fixed-width { align-items: center; } .ptx-content .sbscaption { justify-content: center; } .ptx-content table { border-spacing: 0; } .ptx-content table { border-collapse: collapse; } .ptx-content .image-box + table, .ptx-content .image-box + .sidebyside > .sbsrow:first-child > .sbspanel > table:first-child { margin-top: 1.5em; } .ptx-content table tr td, .ptx-content table tr th { padding-top: 2px; padding-bottom: 2px; padding-left: 5px; padding-right: 5px; } .ptx-content table tr td { font-size: 90%; } .ptx-content table tr td.l { text-align: left; } .ptx-content table tr td.c { text-align: center; } .ptx-content table tr td.r { text-align: right; } .ptx-content table tr td.j { text-align: justify; } .ptx-content table tr td.lines { white-space: nowrap; } .ptx-content table tr td.t { vertical-align: top; } .ptx-content table tr td.b { vertical-align: bottom; } .ptx-content table tr td.m { vertical-align: middle; } .ptx-content table tr td.vv { border-left: 2px solid #000; border-right: 2px solid #000; } .ptx-content table tr td.vcv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.vcvv { border-left: 2px solid #000; border-right: 4px solid #000; text-align: center; } .ptx-content table tr td.vlv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vrv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.rv { border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.vr { border-left: 2px solid #000; text-align: right; } .ptx-content table tr td.lv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vl { border-left: 2px solid #000; text-align: left; } .ptx-content table tr td.cv { border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.Xv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vc { border-left: 2px solid #000; text-align: center; } .ptx-content table tr td.hline { padding: 0; } .ptx-content table tr td.hlinethick { padding-left: 0px; padding-right: 0px; } .ptx-content table tr td.hline hr { margin-top: 0; margin-bottom: 0; margin-left: -1px; margin-right: -1px; border: 1px solid rgb(0, 0, 0); } .ptx-content table tr td.hlinethick hr { margin-top: 0; margin-bottom: 0; margin-left: -1px; margin-right: -1px; border: 2px solid rgb(0, 0, 0); } .center table { text-align: center; margin-left: auto; margin-right: auto; } .ptx-content table tr th.b1, .ptx-content table tr td.b1 { border-bottom: 1px solid #000; } .ptx-content table tr th.b2, .ptx-content table tr td.b2 { border-bottom: 2px solid #000; } .ptx-content table tr th.b3, .ptx-content table tr td.b3 { border-bottom: 3px solid #000; } .ptx-content table tr th.b0, .ptx-content table tr td.b0 { border-bottom: none; } .ptx-content table tr th.t1, .ptx-content table tr td.t1 { border-top: 1px solid #000; } .ptx-content table tr th.t2, .ptx-content table tr td.t2 { border-top: 2px solid #000; } .ptx-content table tr th.t3, .ptx-content table tr td.t3 { border-top: 3px solid #000; } .ptx-content table tr th.t0, .ptx-content table tr td.t0 { border-top: none; } .ptx-content table tr th.r1, .ptx-content table tr td.r1 { border-right: 1px solid #000; } .ptx-content table tr th.r2, .ptx-content table tr td.r2 { border-right: 2px solid #000; } .ptx-content table tr th.r3, .ptx-content table tr td.r3 { border-right: 3px solid #000; } .ptx-content table tr th.r0, .ptx-content table tr td.r0 { border-right: none; } .ptx-content table tr th.l1, .ptx-content table tr td.l1 { border-left: 1px solid #000; } .ptx-content table tr th.l2, .ptx-content table tr td.l2 { border-left: 2px solid #000; } .ptx-content table tr th.l3, .ptx-content table tr td.l3 { border-left: 3px solid #000; } .ptx-content table tr th.l0, .ptx-content table tr td.l0 { border-left: none; } .ptx-content table tr td img { max-width: 200px; margin-right: 30px; } .ptx-content table.notation-list tr th { text-align: left; } .ptx-content table.notation-list tr td { text-align: left; vertical-align: top; } .ptx-content table.notation-list tr th { margin-left: 2em; } .ptx-content table.notation-list tr td { margin-left: 1em; } .ptx-content tr th.r0.l0, .ptx-content tr td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content table tr td span.decimal { float: left; text-align: right; } .ptx-content table tr.header-vertical th { writing-mode: vertical-rl; padding-left: 2em; } .ptx-content table + article { margin-top: 1em; } .ptx-content .hidden-knowl-wrapper .hiddenproof, .ptx-content .blob > article.hiddenproof, .ptx-content section > article.hiddenproof { margin-top: 0.3em; } .ptx-content .hidden-knowl-wrapper article { display: inline; } .apretext-content figure.figure-like { overflow: auto; } .ptx-content figure.figure-like { margin-left: 0; margin-right: 0; } .ptx-content figure.table-like { margin-left: 30px; margin-right: 30px; } .ptx-content figure.table-like.list { margin-right: 0; } .ptx-content a > tt { font-size: 110%; } .ptx-content section .videolink a:link { background-size: 0; } .ptx-content .playvideo { cursor: pointer; } .ptx-content .videobig { padding-right: 0.3em; padding-left: 0.3em; font-size: 85%; background-color: rgba(255, 255, 100, 0.9); display: inline-block; position: relative; top: 100px; cursor: zoom-in; } .ptx-content .videobig.nofigure { } .ptx-content .knowl .videobig { display: none; } .ptx-content .videosmall { padding-right: 0.3em; padding-left: 0.3em; font-size: 80%; background-color: rgba(255, 255, 100, 0.9); display: inline-block; position: absolute; left: -250px; z-index: 1001; cursor: zoom-out; } .ptx-content .exercise-like ol li table { margin-bottom: 0.5em; } .ptx-content .exercise-like > ol li + li { margin-top: 0.5em; } .ptx-content .solution > ol li + li { margin-top: 0.5em; } .ptx-content section.worksheet > .heading > .codenumber { display: inline-block; vertical-align: top; } .ptx-content section.worksheet > .heading > .title { display: inline-block; max-width: 70%; } .ptx-content .heading .print-links { display: inline-block; float: right; vertical-align: top; width: 19%; text-align: right; } .standalone .ptx-content .heading .print-links { display: none; } .standalone.worksheet .previous-button, .standalone.worksheet .up-button, .standalone.worksheet .next-button { display: none; } .standalone.worksheet .ptx-navbar .toc-toggle { display: none; } .standalone.worksheet .ptx-content [data-knowl]:hover, .standalone.worksheet .ptx-content [data-knowl]:active, .standalone.worksheet .ptx-content [data-knowl].active { background: none; color: black; } .standalone.worksheet .ptx-content [data-knowl]::after { border: none; } .standalone.worksheet .ptx-content .knowl-content { padding: 0; } .standalone.worksheet .ptx-content article > .knowl-output.original { margin: 0; } .ptx-content .appendix .heading > .type { display: inline; } .ptx-content .heading.hide-type > .type { display: none; } .ptx-content .heading .print-links > a { font-family: "Open Sans"; font-size: 0.6em; font-weight: bold; padding: 0.1em 0.2em; background: #ffa; border: 2px solid green; } .ptx-content .heading .print-links > a.us { background: #eef; color: #9b1c2c; border-color: #041E42; } .ptx-content .heading .print-links > a + a { margin-left: 0.25em; } .ptx-content .autopermalink { position: absolute; display: inline-block; top: 3px; left: -1.9em; font-size: 85%; color: #a00; opacity: 0.05; margin-top: 0.1em; } .ptx-content li > .para > .autopermalink { left: -3.4em; top: 0; } .ptx-content .autopermalink a { color: #a00; } .ptx-content .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } :target { scroll-margin-top: 45px; } .ptx-content .para > .autopermalink { margin-top: 0.2em; } .ptx-content .exercises > .autopermalink, .ptx-content .introduction > .autopermalink, .ptx-content .glossary > .autopermalink { margin-top: 0.3em; } .ptx-content .appendix > .autopermalink, .ptx-content .chapter > .autopermalink, .ptx-content .index > .autopermalink, .ptx-content .section > .autopermalink { margin-top: 0.3em; } .ptx-content .subsection > .autopermalink, .ptx-content .references > .autopermalink, .ptx-content .exercises > .autopermalink { margin-top: 0.3em; } .ptx-content .figure-like > .autopermalink { margin-top: 1.4em; } .ptx-content .subsubsection > .autopermalink { margin-top: 0; } .ptx-content .exercisegroup > .autopermalink { margin-top: 1.4em; } .ptx-content .autopermalink:hover { opacity: 1; background: #eeddff; } .ptx-content .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: #fff; border: 3px solid blue; z-index: 2001; } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: #eeaaff; } .ptx-content .indexitem { margin-top: 2px; } .ptx-content .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .ptx-content .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .ptx-content .indexknowl { margin-left: 0.11em; } .ptx-content em + .indexknowl { margin-left: -0.25em; } .ptx-content .indexknowl a { margin-left: 2em; } .ptx-content .indexitem .see, .ptx-content .subindexitem .see, .ptx-content .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .seealso, .ptx-content .subindexitem .seealso, .ptx-content .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .see em, .ptx-content .subindexitem .see em, .ptx-content .subsubindexitem .see em, .ptx-content .indexitem .seealso em, .ptx-content .subindexitem .seealso em, .ptx-content .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .ptx-content .indexitem .see + .see, .ptx-content .subindexitem .see + .see, .ptx-content .subsubindexitem .see + .see, .ptx-content .indexitem .seealso + .seealso, .ptx-content .subindexitem .seealso + .seealso, .ptx-content .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .ptx-content .indexitem .indexknowl { font-size: 90%; } .ptx-content .indexitem [data-knowl], .ptx-content .subindexitem [data-knowl], .ptx-content .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .ptx-content .indexknowl [data-knowl]:hover, .ptx-content .indexknowl .active[data-knowl] { margin-left: 2em; } .ptx-content .subindexitem .indexknowl { font-size: 95%; } .ptx-content .subsubindexitem .indexknowl { font-size: 95%; } .ptx-content .indexletter { margin-top: 1.5em; } .ptx-content .hidden-knowl-wrapper .heading { display: inline; } .ptx-content .heading + .hidden-knowl-wrapper { display: inline; } .ptx-content .cols2 .knowl-output, .ptx-content .cols3 .knowl-output, .ptx-content .cols4 .knowl-output, .ptx-content .cols5 .knowl-output, .ptx-content .cols5 .knowl-output { width: 100%; } .ptx-content .cols2 + *, .ptx-content .cols3 + *, .ptx-content .cols4 + *, .ptx-content .cols5 + *, .ptx-content .cols6 + * { clear: both; } .ptx-content .cols2::after, .ptx-content .cols3::after, .ptx-content .cols4::after, .ptx-content .cols5::after, .ptx-content .cols6::after { content: ""; display: block; clear: both; } .ptx-content section > ol:last-child, .ptx-content section > ul:last-child { margin-bottom: 1.5em; } .ptx-content section > ol:last-child > li:last-child, .ptx-content section > ul:last-child > li:last-child { padding-bottom: 0em; } .ptx-content .cols2 > li:nth-child(2n+1), .ptx-content .cols3 > li:nth-child(3n+1), .ptx-content .cols4 > li:nth-child(4n+1), .ptx-content .cols5 > li:nth-child(5n+1), .ptx-content .cols6 > li:nth-child(6n+1) { clear: left; } .ptx-content .exercise-like ol.cols2 li { margin-top: 0.5em; } .ptx-content .cols2 > li, .ptx-content .cols3 > li, .ptx-content .cols4 > li, .ptx-content .cols5 > li, .ptx-content .cols6 > li { float: left; } .ptx-content .incontext { display: block; font-size: 85%; text-align: right; } .ptx-content .terminology { font-style: italic; font-weight: bold; } .ptx-content .emphasis { font-style: italic; } .ptx-content .emphasis .emphasis { font-weight: bold; } :target { animation: target-fade 15s 1; } @-webkit-keyframes target-fade { 0% { background-color: rgba(120, 0, 120, 0.3); } 100% { background-color: inherit; opacity: 1; } } @-moz-keyframes target-fade { 0% { background-color: rgba(120, 0, 120, 0.3); } 100% { background-color: inherit; opacity: 1; } } .ptx-content .autoterm [knowl], .ptx-content .autoterm [knowl]:after { font-weight: inherit; color: inherit; padding: 0; margin-bottom: inherit; border-bottom: inherit; border-bottom-color: inherit; } .ptx-content .autoterm [knowl]:hover { background: #ffddff; border-top: 2px dotted purple; border-bottom: 1px dotted red; border-top-left-radius: 0; border-top-right-radius: 0; } .ptx-content ol li.custom-list-style-type { list-style-type: none; } .ptx-content ol li.custom-list-style-type:before { content: attr(label) "\a0\a0"; } .ptx-content ol.no-marker, .ptx-content ul.no-marker, .ptx-content li.no-marker { list-style-type: none; } .ptx-content ol.decimal { list-style-type: decimal; } .ptx-content ol.lower-alpha { list-style-type: lower-alpha; } .ptx-content ol.upper-alpha { list-style-type: upper-alpha; } .ptx-content ol.lower-roman { list-style-type: lower-roman; } .ptx-content ol.upper-roman { list-style-type: upper-roman; } .ptx-content ul.disc { list-style-type: disc; } .ptx-content ul.square { list-style-type: square; } .ptx-content ul.circle { list-style-type: circle; } .ptx-content ol.no-marker, .ptx-content ul.no-marker { list-style-type: none; } .ptx-content section, .ptx-content article, .ptx-content figure { clear: both; } .ptx-content dl { margin-top: 1em; margin-left: 0; margin-bottom: 0; overflow: hidden; } .ptx-content dl dd { margin-top: 0; } .ptx-content dl dd::after { content: ""; display: block; clear: both; } .ptx-content dl.glossary dt { margin-top: 1.25em; } .ptx-content dl.description-list dt, .ptx-content dl.description-list dd { margin-top: 1em; } .ptx-content dl.description-list.narrow dt { margin-top: 0; } .ptx-content dl.glosary dt:first-of-type, .ptx-content dl.description-list dt:first-of-type, .ptx-content dl.glosary dd:first-of-type, .ptx-content dl.description-list dd:first-of-type { margin-top: 0; } .ptx-content dl dd .para { margin-top: 1em; } .ptx-content dl dt > .para:first-child, .ptx-content dl dd > .para:first-child { margin-top: 0; } .ptx-content dl > dt { font-weight: bold; max-width: 55ex; } .ptx-content dl.description-list dt { float: left; clear: left; text-align: right; width: 18ex; } .ptx-content dl.description-list.narrow dt, .ptx-content dl.glossary dt { text-align: left; } .ptx-content dl.glossary dd { margin-left: 5ex; } .ptx-content dl.description-list dd { margin-left: 22ex; } .ptx-content dl.description-list.narrow dd { margin-left: 12ex; } .ptx-content dl.description-list dt:first-of-type { clear: none; } .ptx-content dl.description-list.narrow dd::after { content: ""; display: block; height: 1em; clear: left; } .ptx-content dl.description-list.narrow dd:last-child::after { height: 0; } .ptx-content dl.description-list dt { float: left; clear: both; margin-right: 1ex; } .ptx-content dl.description-list.narrow dt { width: unset; max-width: 55ex; text-align: left; } .ptx-content dl.description-list.narrow dd { margin-left: 0; margin-top: 0; width: 31em; max-width: calc(100% - 12ex); float: right; clear: right; } .ptx-content dl.description-list + * { clear: both; } @media screen and (max-width: 480px) { .ptx-content dl.description-list dt { float: none; margin-left: 0; text-align: left; } .ptx-content dl.description-list dd, .ptx-content dl.description-list.narrow dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } .ptx-content dl.description-list dl dt { width: 8ex; } .ptx-content dl.description-list dd dd { margin-left: 18ex; } .ptx-content dl.description-list dl dd { margin-left: 12ex; } .ptx-content [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .ptx-content .knowl mjx-mtext > mjx-utext, .ptx-content mjx-mtext > mjx-utext { width: revert !important; } .ptx-content mjx-msup mjx-utext, .ptx-content mjx-msub mjx-utext { display: inline; } a.mjx-svg-href { fill: inherit; stroke: inherit; } .displaymath + .para { margin-top: 0; } @media screen and (max-width: 943px) { .ptx-content .displaymath { position: relative; overflow-x: auto; } .ptx-content .mjx-chtml.MJXc-display { overflow-x: auto; overflow-y: hidden; } .ptx-content .figure-like { overflow-x: auto; } .ptx-content #MathJax_ZoomFrame { position: static; background: white; } .ptx-content #MathJax_Zoom { background-color: inherit; border: 0; padding: 0; position: absolute; overflow-x: auto; overflow-y: visible; left: 10% !important; max-height: none !important; } } .ptx-content dd .displaymath:last-child .MJXc-display { margin-bottom: 0; } .floatnav { margin-top: 8px; margin-left: 50px; } .floatnav a { padding-left: 3px; margin-right: -1px; color: inherit; } .ptx-content a .heading .mjx-chtml { z-index: 1; background: #fff; } .ptx-content .hidden-knowl-wrapper [data-knowl]::after, .ptx-content .hidden-knowl-wrapper [data-knowl]:hover::after, .ptx-content .hidden-knowl-wrapper .active[data-knowl]::after { right: 7px; } .floatnav a:hover { background: #eeaaff; } .ptx-content .unselectable { user-select: none; } .ptx-content .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .ptx-content .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } .ptx-content .fillin { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.underline { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.box { display: inline-block; border: none; margin-left: 0.1em; margin-right: 0.1em; margin-bottom: -0.25em; outline: 1px solid black; height: 1.3em; } .ptx-content .fillin.shade { display: inline-block; border: none; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; background-color: #eee; height: 1.3em; } .ptx-content .hiddenproof > a > .heading { font-style: italic; font-weight: normal; } .ptx-content .MJXc-display, .ptx-content .knowl-output .knowl-output .knowl-output .knowl-output .MJXc-display, .ptx-content pre.prettyprint, .ptx-content pre.plainprint, .ptx-content pre.console, .ptx-content .code-box { background-image: linear-gradient( to right, white, white), linear-gradient( to right, white, white), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 255, 255, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 255, 255, 0)); background-position: left center, right center, left center, right center; background-repeat: no-repeat; background-color: inherit; background-size: 20px 100%, 20px 100%, 10px 100%, 10px 100%; background-attachment: local, local, scroll, scroll; } .ptx-content .runestone .code-box { background-image: none; } .ptx-content .knowl-output .MJXc-display { background-image: linear-gradient( to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient( to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient( to right, rgba(0, 0, 0, 0.25), var(--knowlbackground)), linear-gradient( to left, rgba(0, 0, 0, 0.25), var(--knowlbackground)); } .ptx-content .knowl-output.original .MJXc-display { background: inherit; } .ptx-content .assemblage-like .MJXc-display { background-image: linear-gradient( to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient( to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient( to right, rgba(0, 0, 0, 0.25), var(--assemblagebackground)), linear-gradient( to left, rgba(0, 0, 0, 0.25), var(--assemblagebackground)); } .ptx-content .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient( to right, #fffff5, #fffff5), linear-gradient( to right, #fffff5, #fffff5), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 255, 243, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 255, 243, 0)); } .ptx-content .knowl-output .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient( to right, #fff5fe, #fff5fe), linear-gradient( to right, #fff5fe, #fff5fe), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 243, 254, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 243, 254, 0)); } .ptx-content .knowl-output .knowl-content > *:last-child:not(.incontext) { margin-bottom: 0.5em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like, .ptx-content .knowl-output .knowl .knowl-content > .solution-like:not(.incontext) { margin-bottom: 0.15em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.hint { border-left: 1px solid #0f0; padding-left: 0.35em; background: #efe; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.answer { border-left: 2px solid #00f; padding-left: 0.35em; background: #eef; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.solution { border-left: 3px solid #c0c; padding-left: 0.5em; background: #fef; } .ptx-content .knowl-content > article:first-child, .ptx-content .knowl-content > .solution-like:first-child { padding-top: 0.25em; } .ptx-content .exercisegroup > .conclusion { margin-left: 1.5em; } .ptx-content .exercise-like .introduction { display: inline; } .ptx-content .exercise-like .introduction .heading { display: inline; } .ptx-content .exercise-like .introduction .para:first-child { display: inline; } .ptx-content .exercise-like .introduction::after { content: ""; display: block; } .ptx-content .exercise-like .conclusion::before { content: ""; display: block; margin-top: 0.25em; } .ptx-content .exercisegroup .exercisegroup-exercises.cols2, .ptx-content .exercisegroup .exercisegroup-exercises.cols3, .ptx-content .exercisegroup .exercisegroup-exercises.cols4, .ptx-content .exercisegroup .exercisegroup-exercises.cols5, .ptx-content .exercisegroup .exercisegroup-exercises.cols6 { width: 100%; display: inline-flex; flex-direction: row; flex-wrap: wrap; justify-content: flex-start; align-items: flex-start; align-content: flex-start; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 { display: inline; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 .knowl-output { display: block; } .ptx-content .exercisegroup .cols1 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(33.33% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(25% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(20% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(16.66% - 2em); } .ptx-content .mathword { white-space: nowrap; } .ptx-content .unit, .ptx-content .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .ptx-content .unit sub, .ptx-content .unit sup, .ptx-content .quantity sub, .ptx-content .quantity sup { word-spacing: normal; } .ptx-content .code-inline, .ptx-content .code-block, .ptx-content .console, .ptx-content .program, .ptx-content .program code { font-family: "Inconsolata", monospace; } .ptx-content .code-block, .ptx-content .console, .ptx-content .program { overflow-x: auto; } .ptx-content .code-inline { font-size: 1em; white-space: pre; color: inherit; background: #eeeeee; border: 1px solid #dddddd; padding: 0.0625em 0.25em; margin-left: 0.2em; margin-right: 0.2em; border-radius: 0.2em; } .ptx-content .code-inline:first-child { margin-left: 0; } .ptx-content .title .code-inline { padding-left: 0; padding-right: 0; margin-left: 0; margin-right: 0; } .ptx-content a .code-inline { background: #f6f6f6; } .ptx-content .kbdkey { background: #f1f1f1; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .ptx-content .kbdkey { color: #333; } .ptx-content .sagecell_sessionOutput pre { font-family: "Inconsolata", monospace; } .ptx-content .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .ptx-content .sage-interact.sagecell { margin: 0; } .ptx-content .sagecell_evalButton { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px; padding: 0 0.65em; } .ptx-content .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .ptx-content .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .ptx-content .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .ptx-content .sagecell_evalButton:focus, .ptx-content .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .ptx-content .sagecell .sagecell_editor { margin-bottom: 8px; } .ptx-content .booktitle { font-style: oblique; } .ptx-content .objectives > .heading, .ptx-content .outcomes > .heading { font-size: 1.25em; } .ptx-content a .heading { white-space: normal; } .ptx-content .solutions > a, .ptx-content .solutions > a:hover, .ptx-content .solutions > a.active, .ptx-content .instructions > a, .ptx-content .instructions > a:hover, .ptx-content .instructions > a.active { display: inline-block; margin-right: 1.5em; } .ptx-content .solutions > a::before, .ptx-content .instructions > a::before { content: "\25ba"; font-size: 70%; color: #06a; position: relative; top: -2px; right: 3px; } .ptx-content .solutions > a.active::before, .ptx-content .instructions > a.active::before { content: "\25bc"; animation-name: solutiontriangle; animation-duration: 3s; animation-iteration-count: 1; } .ptx-content .solutions > a[data-knowl]::after, .ptx-content .instructions > a[data-knowl]::after { left: 12px; } @keyframes solutiontriangle { from { content: "\25ba"; } to { content: "\25bc"; } } .ptx-content section.solutions { font-size: 90%; padding-left: 1em; border-left: 1em solid #eeeeee; } .ptx-content.ptx-content > section.solutions:first-child { padding-left: 0; border-left: none; } .ptx-content article.example-like > .solution-like, .ptx-content article.exercise-like > .solution-like { margin-top: 1em; padding-left: 0.7em; } .ptx-content article.example-like > .solution-like > .heading, .ptx-content article.exercise-like > .solution-like > .heading { font-size: 100%; font-weight: 700; margin-right: 0.25em; display: inline; } .ptx-content article.example-like > .solution-like > .heading + .para, .ptx-content article.exercise-like > .solution-like > .heading + .para { display: inline; } .ptx-content article > figure:first-child { margin-top: 0; } .ptx-content figure + figure, .ptx-content figure + .sidebyside, .ptx-content .sidebyside + .sidebyside, .ptx-content article + figure, .ptx-content .sidebyside + figure { padding-top: 1em; } .ptx-content img { display: inline-block; margin-left: auto; margin-right: auto; } .ptx-content img.cs { display: block; margin-top: 20px; margin-bottom: 20px; margin-left: auto; margin-right: auto; } .ptx-content img:not(.cs) { max-width: 650px; } .ptx-content .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } .ptx-content figure img { display: block; margin-left: auto; margin-right: auto; } .ptx-content figure img + img { margin-top: 30px; } .ptx-content div.center img { display: block; margin-left: auto; margin-right: auto; } .ptx-content div.center + div.center > img { margin-top: 60px; } .ptx-content div.center > img + img { margin-top: 60px; } .ptx-content figure table { margin-left: auto; margin-right: auto; } .ptx-content .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .ptx-content figure.wrap img { width: 250px; } .ptx-content figure.wrap { float: right; margin-right: 0; margin-left: 30px; } .ptx-content figure img.wrap { float: right; margin: 0; } .ptx-content figure figcaption.wrap { margin: 10px; font-size: 100%; text-align: center; } .ptx-content figure, .ptx-content .image-box { margin-top: 0.5em; } .ptx-content figure.listing { margin-top: 1em; } .ptx-content figure .image-box { margin-top: 0; } .ptx-content .sidebyside figure { margin-top: 0; } .ptx-content .image-box img, .ptx-content img.contained, .ptx-content .sbspanel img { width: 100%; height: auto; } .ptx-content .image-box > img:not(.draw_on_me):not(.mag_popup) { cursor: zoom-in; } .ptx-content img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; max-width: 600px; } .ptx-content .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .ptx-content .image-box, .ptx-content .audio-box, .ptx-content .video-box, .ptx-content .asymptote-box { position: relative; } .ptx-content .image-box .asymptote-box iframe.asymptote, .ptx-content iframe.asymptote, .ptx-content .video-box .video, .ptx-content .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .ptx-content section > .audio-box, .ptx-content section > .video-box, .ptx-content section > .image-box { margin-top: 0.75em; } .ptx-content .audio { width: 100%; } .caption .heading { font-weight: bold; } .caption .counter { font-weight: bold; } .ptx-content div.quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .minipage + .minipage { display: inline-block; } .ptx-content code.inline { background: none; border: none; } .ptx-content pre.program, .ptx-content pre.program code, .ptx-content pre.code-block, .ptx-content pre.code-block code { line-height: 1.1; } .ptx-content section > .code-box, .ptx-content .para + .code-box, .ptx-content section > .code-block, .ptx-content .para + .code-block { margin-top: 1em; } .ptx-content pre.program, .ptx-content pre.code-block { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.program:before, .ptx-content pre.code-block:before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } .ptx-content pre[data-line].program, .ptx-content pre[data-line].code-block { padding-left: 2.5em; } .ptx-content pre[data-line].program:before, .ptx-content pre[data-line].code-block:before { margin-left: -5em; } .ptx-content pre.program.line-numbers, .ptx-content pre.code-block.line-numbers { padding-left: 3.5em; overflow: visible; } .ptx-content pre.program.line-numbers:before, .ptx-content pre.code-block.line-numbers:before { margin-left: -7em; } .ptx-content pre[data-line].line-numbers code { padding-top: 0em; } .ptx-content pre[data-line].line-numbers .line-highlight { margin-top: 0em; } .ptx-content pre[data-line]:not(.line-numbers) .line-highlight { margin-top: 0.6em; } .ptx-content pre.prettyprint, .ptx-content pre.plainprint { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.prettyprint:before, .ptx-content pre.plainprint:before { content: ""; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 2.5em; } .ptx-content .objectives { margin-bottom: 1.25em; } .ptx-content ol > li { padding-left: 0.25em; } .ptx-content ol.cols2 > li, .ptx-content ul.cols2 > li { width: calc(49% - 1.75em); min-width: 190px; } .ptx-content ol.cols3 > li, .ptx-content ul.cols3 > li { width: calc(33% - 1.25em); min-width: 160px; } .ptx-content ol.cols4 > li, .ptx-content ul.cols4 > li { width: calc(24.5% - 1.25em); min-width: 100px; } .ptx-content ol.cols5 > li, .ptx-content ul.cols5 > li { width: calc(19.5% - 0.75em); min-width: 90px; } .ptx-content ol.cols6 > li, .ptx-content ul.cols6 > li { width: calc(16.3% - 0.5em); min-width: 80px; } .ptx-content ul.cols2 > li:nth-child(odd), .ptx-content ol.cols2 > li:nth-child(odd) { margin-right: 2em; } .ptx-content .cols2 ol, .ptx-content .cols3 ol, .ptx-content .cols4 ol, .ptx-content .cols5 ol, .ptx-content .cols6 ol { padding-left: 0.7em; } .ptx-content .exercisegroup-exercises > article.exercise-like { margin-top: 1em; } .ptx-content .cols2 > li:last-child:nth-child(odd) { float: none !important; padding-top: 0.5em; } .ptx-content .solution ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .solution ol li > .para:first-child, .ptx-content .solution ol li > .displaymath:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .solution ol li > .displaymath:first-child .MJXc-display { margin-top: 0; } .ptx-content .exercise-like ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .exercise-like > .cols2 > li { width: calc(49% - 2.5em); } .ptx-content .exercise-like > .cols3 > li { width: calc(33% - 2.5em); } .ptx-content .exercise-like > .cols4 > li { width: calc(24.5% - 2.5em); } .ptx-content .exercise-like > .cols5 > li { width: calc(19.5% - 2.5em); } .ptx-content .exercise-like > .cols6 > li { width: calc(16.3% - 2.5em); } .ptx-content .knowl .exercise-like > .cols2 > li { width: calc(49% - 2em); } .ptx-content .knowl .exercise-like > .cols3 > li { width: calc(33% - 2em); } .ptx-content .knowl .exercise-like > .cols4 > li { width: calc(24.5% - 2em); } .ptx-content .knowl .exercise-like > .cols5 > li { width: calc(19.5% - 2em); } .ptx-content .knowl .exercise-like > .cols6 > li { width: calc(16.3% - 2em); } .ptx-content .exercise-like ol li > .para:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .contributor .contributor-name { font-variant: small-caps; } .ptx-content .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .ptx-content .contributor { margin-top: 3ex; } .ptx-content .contributor + .contributor { margin-top: 1.5ex; } .ptx-content .contributor + .para { margin-top: 3ex; } .ptx-content .frontmatter .contributors, .ptx-content .book .contributors { text-align: center; font-style: normal; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .searchwrapper .gsc-control-cse { padding: 0; border: none; width: 25ex; } .pretext .searchwrapper .cse .gsc-search-button input.gsc-search-button-v2, .searchwrapper input.gsc-search-button-v2 { padding: 2px 2px; } .pretext .searchwrapper form.gsc-search-box { margin: 0; } .pretext .searchwrapper table.gsc-search-box { margin: 0; } .pretext .searchwrapper .gsc-search-box-tools .gsc-search-box .gsc-input { padding: 0; } .pretext .searchwrapper .gsib_a { padding: 0 0 0 5px; } .pretext .searchwrapper .gsc-input-box { height: 3ex; } .pretext .searchwrapper form.gsc-search-box { font-size: 12px; } .ptx-content div.CodeMirror span.CodeMirror-matchingbracket { color: #090; } .ptx-content .image-archive { margin-left: auto; margin-right: auto; margin-bottom: 0; margin-top: 0.75em; padding-bottom: 0.25em; text-align: center; } .ptx-content .image-archive > a { display: inline-block; padding-left: 0.5em; padding-right: 0.5em; font-family: monospace; } .ptx-content iframe { margin: 0; border: none; box-sizing: border-box; } .ptx-content .times-sign { font-size: larger; vertical-align: -0.15ex; } .ptx-content article.notranslate { margin-top: 0; } .ptx-content article.exercise-like > .exercise-like { margin-left: 40px; } .ptx-content article.exercise-like > .exercise-like.task { margin-left: 20px; } .ptx-content article.exercise-like > .exercise-like > .para { margin-top: 1.25em; } .ptx-content article.example-like > .heading + .introduction { display: inline; } .ptx-content article.example-like > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article.example-like > .exercise-like > .para { margin-top: 1.25em; } .ptx-content .taxon { font-style: italic; } .ptx-content .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .ptx-content .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .ptx-content .sageanswer .output { display: inline-block; vertical-align: top; } .ptx-content .CodeMirror-code pre.CodeMirror-line { padding-bottom: 5px; padding-left: 6px; } .ptx-content .hidden-content, .pretext .hidden-content { display: none; } .ptx-content hr.ptx-pagebreak { width: 30em; text-align: center; margin-left: auto; margin-right: auto; margin-bottom: 2em; margin-top: 0; height: 4em; border: 0; border-bottom: 1px dashed #ccc; } .ptx-content hr.ptx-pagebreak:after { content: "page"; display: inline-block; position: relative; top: 4em; font-size: 80%; padding: 0 0.25em; background: white; } .ptx-content .example-like > .exercise-like > .para:first-of-type { display: inline; } .ptx-content .example-like > .exercise-like > .aside-like { margin-top: -3em; } .ptx-content .example-like > .exercise-like > .aside-like.front { margin-top: 0; } .ptx-content meta { display: none; } .ptx-content .summary-links a { color: #671d12; background: #f0f0f0; text-decoration: none; cursor: pointer; } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: white; background: #671d12; } .ptx-content .summary-links a .codenumber { color: #303030; margin-right: 0.41667em; } .ptx-content .summary-links a:hover .codenumber, .ptx-content .summary-links a:focus .codenumber { color: #f0f0f0; } .ptx-content .summary-links { margin-top: 4em; } .ptx-content section + .summary-links { margin-top: 2em; } .ptx-content .summary-links ul { list-style-type: none; } .ptx-content .summary-links li { margin-top: 0; } .ptx-content section .summary-links li .title { font-style: normal; } .ptx-content .summary-links a { position: relative; display: block; font-size: 1.5em; line-height: 1.25em; padding: 0.41667em 0.83333em; margin-top: 0.20833em; border-radius: 3px; padding-right: 2.06667em; } .ptx-content .summary-links a:after { right: 0.83333em; } .ptx-content .summary-links a:after { content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid #c9c9c9; } .ptx-content .summary-links a, .ptx-content .summary-links a:link, .ptx-content .summary-links a:visited { cursor: pointer; } .ptx-content .summary-links a:hover:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a { font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-content .summary-links a { font-size: 1em; line-height: 1.25em; } } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a:active { position: relative; color: white; background: #932919; text-decoration: none; box-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px 5px inset; } .ptx-content .summary-links a:active:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a:focus { outline: thin dotted #333; outline-offset: -2px; } body.standalone.worksheet .ptx-content .onepage > .heading { margin-top: 0; font-size: 1.3em; } body.standalone.worksheet .ptx-content .onepage > .introduction { margin-top: 0.4em; } body.standalone.worksheet .ptx-content .onepage > .introduction > .heading { font-size: 1.1em; } body.standalone.worksheet .ptx-content .onepage .solutions, body.standalone.worksheet .ptx-content .onepage .instructions { display: none; } body.standalone .ptx-content .worksheet { padding: 40px 0 45px 0; border: 2px solid grey; margin: 0; } body.standalone .ptx-content .onepage { padding: 40px 45px 45px 55px; border-bottom: 2px solid grey; margin: 0; } body.standalone .ptx-content .onepage + .onepage { border-top: 2px solid grey; } body.standalone .ptx-content .onepage.firstpage { padding-top: 0; } body.standalone .ptx-content .onepage.lastpage { padding-bottom: 0; border-bottom: none; } body.standalone .ptx-content .worksheet > *:last-child { padding-bottom: 0 !important; } .ptx-content .onepage + .onepage { margin-top: 2.5em; padding-top: 1.5em; border-top: 1px dashed #aaa; } .ptx-content .onepage + .onepage::before { content: "pagebreak"; text-align: center; margin-left: 40%; padding-left: 1em; padding-right: 1em; position: absolute; top: -0.8em; font-size: 80%; font-style: italic; background: white; } body.standalone .ptx-content .onepage + .onepage { margin-top: 10px; } body.standalone .ptx-content .onepage + .onepage::before { content: none; } body.standalone .ptx-content .onepage article { padding-left: 0; border: none; } body.standalone .ptx-content .onepage article::after { all: unset; } .ptx-content .onepage > .para:first-child, .ptx-content .onepage > article:first-child { margin-top: 0; } .ptx-content section + .onepage.firstpage, .ptx-content article + .onepage.firstpage, .ptx-content .para + .onepage.firstpage { margin-top: 1.25em; } body.worksheet .ptx-content .onepage .sbspanel + .sbspanel > .exercise::before { content: ""; position: absolute; top: 0; bottom: 0; right: 0; left: 0; padding-left: 1.25em; border-left: 1px solid grey; margin-left: -1.25em; z-index: -100; } body.standalone.worksheet .ptx-content section article.task { margin-left: 0; } body.standalone.worksheet .ptx-content section article.task > .heading { font-weight: normal; } body.standalone .autopermalink { display: none; } body.standalone.worksheet .ptx-content .onepage .workspace { border: 2px dotted grey; background: #f3fff3; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed { border: 2px dotted grey; background: #ffe; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed.tight { border: 15px solid; border-image: repeating-linear-gradient( -35deg, #f33, #f33 10px, #000 10px, #000 20px) 20; background: yellow; } body.has-sidebar-left.mathbook-loaded.standalone.worksheet .ptx-page .ptx-main { margin-left: 0; } body.standalone.worksheet .ptx-content .goal-like { border: none; padding: 0; } body.standalone.worksheet .ptx-content .goal-like > .heading { margin-top: -0.5em; padding: 0; margin: 0; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading { display: inline; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading, body.standalone.worksheet .ptx-content section.worksheet > .objectives, body.standalone.worksheet .ptx-content section.worksheet > .introduction, body.standalone.worksheet .ptx-content section.worksheet > .conclusion { margin-left: 55px; margin-right: 40px; } body.standalone.worksheet .ptx-content section.worksheet > .heading + .para { display: inline; } .ui-dialog.ui-widget.ui-widget-content.ui-corner-all.ui-draggable.ui-resizable { left: 0 !important; top: 0 !important; } .ptx-content a.url, .ptx-content a.external { color: #22a; } .ptx-content a.url:hover, .ptx-content a.external:hover { background: #ffd; } .ptx-content .poem { margin-top: 1.5em; } .ptx-content .poem { display: table; margin-top: 1.5em; margin-left: auto; margin-right: auto; margin-bottom: 0; width: auto; max-width: 90%; } .ptx-content .poem > .heading { display: block; text-align: center; } .ptx-content section article.poem > .heading::after { content: ""; } .ptx-content .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .ptx-content .poem .author { font-style: italic; margin-top: 0.75em; } .ptx-content .poem .author.left { text-align: left; } .ptx-content .poem .author.center { text-align: center; } .ptx-content .poem .author.right { text-align: right; } .ptx-content .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .ptx-content .poem .stanza + .stanza { margin-top: 1em; } .ptx-content .poem .heading + .stanza { margin-top: 0.2em; } .ptx-content .poem .heading + .line { margin-top: 0.2em; } .ptx-content .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .ptx-content .poem .line.center { text-align: center; } .ptx-content .poem .line.right { text-align: right; } .ptx-content .poem .tab { margin-left: 2em; } .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } .toolBPanel { overflow: hidden !important; } .toolBPanel:hover { overflow: auto !important; } #aboelkins-ACS .ptx-main .ptx-content > section:first-of-type > section:first-of-type > .project-like:first-of-type li { font-size: 300%; } .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } .ptx-content .marginresource { position: relative; height: 0; left: 40em; top: 1em; } .ptx-content .marginresource a { color: blue; } .ptx-content .marginresource a[knowl] { border-bottom: 1px dotted blue; } .ptx-content .marginresource .icon { font-size: 200%; margin-right: 1em; display: inline-block; } .ptx-content .marginresource .resource_description { display: inline-block; } .ptx-content .marginresource .resource_links { display: block; margin-left: 2em; } .collectedworks .knowl-output { border: 12px solid #D6E3FF; background: none repeat scroll 0% 0% #FAFCFF; border-radius: 4px; margin-bottom: 1.25em; } .collectedworks .subjectwork { max-width: 750px; } .collectedworks .bib { margin-bottom: 1em; } .collectedworks .bibitem + .bibentry { display: inline; } .collectedworks .bibitem { display: inline; font-weight: bold; margin-right: 1em; } .collectedworks .work .title a { text-decoration: none; color: #009; } .iconlegend { position: absolute; margin-top: 0.5em; top: 0; left: 920px; line-height: 1; } .iconlegend .icon_name { font-size: 90%; margin-right: 1em; } .icongroup + .icongroup { margin-left: 1em; } label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } .feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .ptx-content .webwork-button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; background-color: #ffffff; } .ptx-content .webwork-button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .webwork-button:active { cursor: pointer; background-color: #a0a0a0; border: 1px solid #999; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } .ptx-content .exercise-wrapper form button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; color: black; background-color: #ffffff; } .ptx-content .webwork-button.activate { width: 22px; height: 22px; background-image: url(https://raw.githubusercontent.com/openwebwork/webwork2/main/htdocs/images/favicon.ico); background-size: contain; position: absolute; right: -35px; } article.project-like > .heading + div.ptx-runestone-container > div.runestone, article.exercise-like > .heading + div.ptx-runestone-container > div.runestone { margin-top: 0.5em; } .ptx-content .bottom { position: unset; } .ptx-content .rsdraggable { font-size: 100%; } .ptx-content .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .exercise-wrapper form button:active { background-color: #f0f0f0; } .ptx-content .exercise-wrapper form button + button { margin-left: 0.8em; } .ptx-content .exercise-wrapper, .ptx-content .exercise-wrapper form, .ptx-content .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .ptx-content .knowl .exercise-wrapper, .ptx-content .knowl .exercise-wrapper form, .ptx-content .knowl .exercise-wrapper form > div:first-child { width: 100%; } .ptx-content .exercise-wrapper > .para:first-child, .ptx-content .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .ptx-content .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .ptx-content .cols2 .heading + .exercise-wrapper { width: auto; } @media screen and (max-width: 600px) { .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(33.3% - 2em); } .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } @media screen and (max-width: 850px) and (min-width: 786px) { .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(33.3% - 2em); } .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } .APEXlogo { white-space: nowrap; } .APEXlogo .A { margin-right: -0.07em; } .APEXlogo .P { margin-right: -0.33em; position: relative; top: -0.3em; } .APEXlogo .E { position: relative; top: 0.33em; } .runestone-profile .dropdown-content { position: absolute; display: none; right: 0; top: 35px; text-align: left; border: 1px solid; border-color: #600; border-color: var(--tocborder); } .runestone-profile.dropdown:hover { background-color: #ddd; overflow: visible; } .runestone-profile.dropdown:hover .dropdown-content { display: block; } .runestone-profile .dropdown-content { background-color: white; z-index: 1800; min-width: 100px; padding: 5px; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: #662211; padding: 2px 8px; } .runestone-profile.dropdown .dropdown-content a:hover { background-color: #671d12; color: #ffffff; text-decoration: none; background-color: var(--chaptertoc); } .runestone-profile.dropdown .dropdown-content hr { margin-bottom: 4px; margin-top: 4px; border-color: #600; border-color: var(--sectiontoctext); } .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox { } .ptxsearch { height: 35px; flex: 1 1; } .searchbutton .name { display: none; } .searchwidget { text-align: right; } .searchwidget input { } .helpbox { display: none; } .detailed_result { margin-bottom: 10px; } .all_results a:link { text-decoration: none; font-size: large; } .all_results a:hover { background-color: lightgray; } .searchresults a:hover { background-color: #eee; } .searchresults a { text-decoration: none; color: #222; } .searchresults a:hover { text-decoration: underline; color: #33f; } .searchresults ul li { list-style-type: none; } ol.searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; } ol.searchresults > li { list-style-type: none; } .search-result-score { display: none; } .high_result { font-weight: 700; } .medium_result { font-weight: 500; } .low_result { font-weight: 200; } .no_result { font-weight: 200; color: #444; } .detailed_result .no_result { font-size: 90%; } .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; left: 152px; width: 600px; padding: 1em; border: 0.2em solid #009; background: aliceblue; z-index: 5000; display: flex; flex-direction: column; } .search-results-heading { border-bottom: 1px solid rgba(0, 0, 125, 0.5); } .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; } .closesearchresults { display: flex; justify-content: space-between; align-items: center; border: 1px solid black; } .closesearchresults:hover { color: #c00; background-color: #fee; border-color: #f00; } .closesearchresults + h2 { margin-top: -1em; } .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .search-result-bullet { margin-top: 0.3em; } .search-result-clip { font-size: 80%; font-style: italic; color: #444; padding-left: 15px; } .search-results-unshown-count { margin-top: 0.6em; } .search-result-clip-highlight { background: rgba(255, 255, 0, 0.5); } @media screen and (max-width: 800px) { .searchresultsplaceholder { width: 80vw; left: 10vw; bottom: 10vh; } } .pretext .ptx-masthead { position: relative; background: #fafafa; min-height: inherit; border: none; } .pretext .ptx-navbar { position: sticky; top: 0; max-width: 904px; } .pretext .ptx-page { position: relative; } .pretext .ptx-sidebar { position: sticky; top: 41px; float: left; width: 240px; } .pretext .ptx-toc { position: sticky; top: 50px; box-sizing: border-box; overflow-y: scroll; height: calc(100vh - 60px); } .pretext .ptx-page > .ptx-main { display: block; position: relative; overflow-y: hidden; margin: 0 0 0 240px; padding: 1px 0 0 0; background: white; border-left: 1px solid #ccc; } @media screen and (max-width: 800px) { .pretext .ptx-page > .ptx-main { margin-left: 0; left: auto; } } .pretext .ptx-page > .ptx-main .ptx-content { max-width: 600px; margin: 32px; } @media screen and (max-width: 663px) { .pretext .ptx-page > .ptx-main .ptx-content { margin: 28px; } } .ptx-content.serif .para .para, .ptx-content[data-font=RS] .para .para { font-size: 100%; } .ptx-content[data-font=RS] .code-inline { background: #f6f6f6; border: 1px solid #eee; padding: 0.01em 0.15em 0.03em 0.15em; margin-left: 0.15em; margin-right: 0.15em; border-radius: 0; } .pretext .ptx-content-footer { margin-top: 2em; display: flex; flex-direction: row; justify-content: space-around; max-width: 650px; } .pretext .ptx-content-footer .button { cursor: pointer; text-align: center; color: #333333; background-color: #ededed; border: 1px solid #bababa; padding: 0; display: flex; align-items: center; } .pretext .ptx-content-footer .button:hover, .pretext .ptx-content-footer .button:active, .pretext .ptx-content-footer .button:focus { background-color: #fafafa; } .pretext .ptx-content-footer .button.top-button { text-align: center; width: 40px; height: 50px; } .pretext .ptx-content-footer .button.previous-button, .pretext .ptx-content-footer .button.next-button { font-size: 1em; cursor: pointer; display: inline-block; vertical-align: middle; height: 35px; width: 65px; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; float: left; position: relative; margin-top: 0.5em; } .pretext .ptx-content-footer .previous-button { text-align: left; } .pretext .ptx-content-footer .next-button { text-align: right; } .pretext .ptx-content-footer .name { position: relative; bottom: 0; } .pretext .ptx-content-footer .icon { font-size: 1.3em; Position: relative; bottom: -0.1em; } .pretext .ptx-content-footer .previous-button .icon { margin-left: 0.3em; margin-right: 0.2em; } .pretext .ptx-content-footer .next-button .icon { margin-left: 0.2em; margin-right: 0.3em; } .pretext .ptx-content-footer .next-button { text-align: right; } .pretext .ptx-content-footer .previous-button { width: 70px; float: right; border-left: 1px solid #bababa; border-right: 1px solid #bababa; } .pretext .ptx-content-footer .next-button { width: 70px; float: right; border-right: 1px solid #bababa; } .pretext .ptx-content-footer .top-button { display: block; } .pretext .ptx-content-footer .top-button .icon, .pretext .ptx-content-footer .top-button .name { display: block; } .pretext .ptx-content-footer .top-button .icon { bottom: 0; } .pretext .ptx-content-footer .top-button .name { position: relative; bottom: 0.4em; } @media screen and (max-width: 800px) { .pretext .ptx-navbar { position: fixed; top: auto; bottom: 0; } .pretext .ptx-sidebar { display: none; } .pretext .ptx-content-footer { display: none; } .pretext .ptx-toc { height: calc(100vh - 50px); } .pretext .ptx-navbar .calculator-toggle, .pretext .ptx-navbar .index-button { display: none; } .pretext .ptx-navbar .toc-toggle { width: 25%; } .pretext .ptx-navbar .treebuttons { width: 75%; } .pretext .ptx-navbar .previous-button, .pretext .ptx-navbar .up-button, .pretext .ptx-navbar .next-button { width: 33.3%; } } .ptx-masthead .ptx-banner { border-bottom: 1px solid #d4d4d4; border-top: 1px solid transparent; overflow: hidden; padding-top: 0.625em; padding-bottom: 1.125em; border-bottom: none; } .ptx-masthead { max-width: 904px; border-right: 1px solid #bababa; } .ptx-masthead .title-container { font-size: 1em; padding-left: 9.68px; overflow: hidden; } @media screen and (max-width: 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; margin-top: 0.625em; } } .ptx-masthead .title-container > .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; margin: 0; font-size: 2em; line-height: 1.25em; color: #932919; } @media screen and (max-width: 480px) { .ptx-masthead .title-container > .heading { font-size: 1.5em; line-height: 1.25em; margin: 0; margin-bottom: 0.41667em; } } .ptx-masthead .title-container > .heading a { color: #932919; background: none; text-decoration: none; } .ptx-masthead .title-container > .heading .subtitle { font-weight: normal; } @media screen and (max-width: 800px) { .ptx-masthead .title-container > .heading .subtitle { display: block; font-size: 1.16667em; line-height: 1.42857em; color: #595959; } .ptx-masthead .title-container > .heading .subtitle:before { content: normal; } } .ptx-masthead .logo-link { position: relative; float: left; font-size: 50px; margin-top: 0.1em; margin-left: 9.68px; text-align: center; line-height: 1; } .ptx-masthead .logo-link img { width: auto; height: auto; max-height: 1em; } .ptx-masthead .logo-link:empty:before { font-family: "Open Sans"; font-size: 1em; content: "\2211"; line-height: 1; width: 1em; display: inline-block; vertical-align: top; text-align: center; color: #ccc; } .ptx-masthead .logo-link:empty:hover:before { color: #932919; } .ptx-masthead .logo-link:empty:active:before { color: #3572a0; } .ptx-masthead .logo-link { background: transparent; border: none; text-decoration: none; } @media screen and (max-width: 480px) { .ptx-masthead .logo-link { display: block; float: none; margin: 0; font-size: 50px; } } .ptx-masthead .byline { color: #333333; font-weight: normal; margin: 0; font-size: 1.3125em; line-height: 1.42857em; min-height: inherit; font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-masthead .byline { margin-top: 0; font-size: 1em; line-height: 1.25em; } } .ptx-masthead .byline a { color: #333333; } .ptx-masthead .byline a:hover, .ptx-masthead .byline a:focus { color: #932919; } .ptx-masthead .byline a:active { color: #3572a0; } nav.ptx-navbar { background: #ededed; border: 0; border-top: 1px solid #bababa; border-bottom: 1px solid #bababa; margin: 0; z-index: 100; font-family: "Open Sans"; overflow: visible; display: flex; } .ptx-navbar-contents { display: flex; flex: 1; max-width: 100%; } .ptx-navbar .button { font-size: 1em; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: #333333; background-color: #ededed; border: 0; border-right: 1px solid #bababa; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .ptx-navbar .button:focus { outline: thin dotted #333; outline-offset: -2px; } .ptx-navbar .button:active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-navbar .button:hover { background-color: #fafafa; } .ptx-navbar .button:active { background-color: #e0e0e0; } .ptx-navbar .button.disabled { opacity: 0.4; color: #333333; background: #ededed; box-shadow: none; } .ptx-navbar .toc-toggle { width: 240px; gap: 0.4em; } .ptx-navbar .button .icon { font-size: 1.5em; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls) { display: flex; } .ptx-navbar .treebuttons { flex: 1 1 210px; justify-content: end; } .ptx-navbar .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .pretext .navbar .dropdown { height: 34px; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls) > *:first-child { border-left: 1px solid #bababa; } .ptx-navbar .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .ptx-navbar .treebuttons .icon { margin: 0 -7px; } .ptx-navbar :is(.index-button, .calculator-toggle) .icon { display: none; } .ptx-navbar :is(.runestone-profile, .activecode-toggle, .searchbutton) .name { display: none; } .ptx-navbar .index-button { width: 70px; } .ptx-navbar .calculator-toggle { width: 60px; min-height: 32px; text-align: center; border-radius: 20px; margin-left: 5px; border: 2px solid #66f; line-height: 25px; margin-top: 1px; background-color: #eef; } .ptx-navbar .calculator-toggle.open { background: #fee; border: 2px solid #f66; } @media screen and (max-width: 800px) { .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; background: #ededed; box-shadow: rgba(0, 0, 0, 0.3) 0px -2px 5px; } .ptx-navbar .nav-runestone-controls { flex: 0; } .ptx-navbar .toc-toggle { flex: 2 1 100px; } .ptx-navbar .treebuttons { flex: 3 1 150px; } .ptx-navbar .treebuttons > * { flex: 1 1; min-width: 35px; } .ptx-navbar .index-button { display: none; } .ptx-navbar :is(.treebuttons) > *:first-child { border-left: 0; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button) .name { display: none; } .pretext .ptx-navbar :is(.calculator-toggle, .index-button) .icon { display: inline-block; } .ptx-navbar .nav-runestone-controls > *:first-child { border-left: 0; } .ptx-navbar .calculator-toggle { width: auto; height: 35px; border-radius: 0; margin-left: 0; border: 0; border-right: 1px solid #bababa; line-height: inherit; margin-top: 0; background-color: inherit; } } .ptx-toc { width: 240px; margin: 0; font-size: 14.72px; overflow-y: auto; overflow-x: hidden; } .ptx-toc ul { margin: 0px; padding: 0px; list-style-type: none; } .ptx-toc .codenumber { position: absolute; margin-right: 0; margin-left: 0em; left: 0.3em; display: inline-block; } .ptx-toc ul.structural ul.structural a > .codenumber { display: none; } .ptx-toc ul.structural .title { margin-left: 1.4em; display: inline-block; } .ptx-toc ul.structural ul.structural .title { margin-left: 1.5em; } .ptx-toc ul.structural ul.structural .title:empty::after { content: "empty heading!"; font-weight: bold; } .ptx-toc ul.structural ul.structural ul.structural .title { margin-left: 2.5em; font-size: 90%; } .ptx-toc ul.structural ul.structural ul.structural ul.structural .title { margin-left: 3.2em; font-size: 90%; font-style: italic; } .ptx-toc ul.structural li ul.structural li ul.structural li:last-child { margin-bottom: 0; border-bottom: 1px solid #ddd; } .ptx-toc .part > a .codenumber { position: relative; display: block; float: left; margin-right: 0.7em; } .ptx-toc .part > a .title { display: block; margin-left: 1em; } .ptx-toc ul.structural li a { position: relative; display: block; padding: 2.86957px; padding: 0.2em; border-top: 1px solid #d1d1d1; border-bottom: 1px solid #d1d1d1; font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: bold; } .ptx-toc ul.structural ul.structural li a { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: normal; } .ptx-toc > ul.structural > li:not(:first-child) { margin-top: 0.3em; } .ptx-toc > ul.structural > li.part + li, .ptx-toc > ul.structural > li.frontmatter + li, .ptx-toc > ul.structural > li.backmatter + li { margin-top: 0; } .ptx-toc ul.structural li a, .ptx-toc ul.structural li a:link, .ptx-toc ul.structural li a:visited, .ptx-toc ul.structural li a:hover, .ptx-toc ul.structural li a:focus, .ptx-toc ul.structural li a:active { text-decoration: none; } .ptx-toc ul.structural li ul.structural a { border-top: none; } .ptx-toc ul.structural li ul.structural a:hover { border-top: 1px solid #3c110a; margin-top: -1px; } .ptx-toc ul.structural li ul.structural li:last-child { margin-bottom: -0.3em; } .ptx-toc ul.structural li ul.structural li:last-child a { border-bottom: none; } .ptx-toc ul.structural li a:active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-toc ul.structural li a.has-chevron { padding-right: 2em; } .ptx-toc .toc-item { position: relative; } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowlLinkColor); border-bottom: 1px dotted var(--knowlLinkColor); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--linkbackground); border-bottom-color: transparent; } .knowl__content { margin: 0.2em; border: 6px solid var(--knowlborder); border-radius: 0.4em; padding: 0.8em; background-color: var(--knowlbackground); } .source-view__content { margin: 0.2em 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like, .proof)::after { content: "" !important; border-bottom: none; margin: 0; padding: 0; width: 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like) { padding-left: 0; border-left: none; } .ptx-content .knowl__content > article:is(.proof) { padding-right: 0; border-right: none; } .knowl__content .knowl__content { background-color: var(--knowlNested1Background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested2Background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested3Background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested4Background); } .ptx-content .knowl__content > figure { margin-left: 0; margin-right: 0; } .ptx-content .proof { border-right: 1px solid #666; padding-right: 0.625em; margin-right: -0.725em; } .ptx-content .proof:after { content: ""; border-bottom: 1px solid #666; display: block; margin-left: auto; margin-right: -0.625em; width: 1.5em; padding-bottom: 0.25em; } .ptx-content.epub .proof { margin-right: 1px; } .ptx-content .proof .proof { margin-right: -0.2em; border-right: 1.5px solid #ddd; } .ptx-content .proof .proof:after { border-bottom: 1.5px solid #ddd; width: 1em; } .ptx-content article.theorem-like, .ptx-content article.definition-like, .ptx-content article.example-like, .ptx-content article.project-like, .ptx-content article.remark-like, .ptx-content article.openproblem-like, .ptx-content article.openproblems-like, .ptx-content article.computation-like { padding-left: 0.4em; border-left: 1px solid #569; } .ptx-content.epub article.theorem-like, .ptx-content.epub article.definition-like, .ptx-content.epub article.example-like, .ptx-content.epub article.project-like, .ptx-content.epub article.remark-like, .ptx-content article.openproblem-like, .ptx-content article.openproblems-like, .ptx-content.epub article.computation-like { margin-left: 1px; } .ptx-content article.theorem-like::after, .ptx-content article.definition-like::after, .ptx-content article.example-like::after, .ptx-content article.project-like::after, .ptx-content article.remark-like::after, .ptx-content article.openproblem-like::after, .ptx-content article.openproblems-like::after, .ptx-content article.computation-like::after { content: ""; border-bottom: 1px solid #569; display: block; margin-right: auto; margin-left: -0.5em; padding-top: 0.25em; width: 1.5em; } .ptx-content article.project-like { border-left: 1px dotted #569; } .ptx-content article.project-like::after { border-bottom: 1px dotted #569; } .ptx-content article.commentary { padding-left: 0.6em; border-left: 3px solid #c33; } .ptx-content article.commentary::after { content: ""; border-bottom: 3px solid #c33; display: block; margin-right: auto; margin-left: -0.6em; padding-top: 0.25em; width: 1.5em; } .ptx-content .assemblage-like { border: solid 2px #1100AA; border-radius: 12px; padding: 10px; background-color: #f4f4fe; } .ptx-content .assemblage-like .heading { margin-top: 0; } .ptx-content .assemblage-like + .sidebyside { margin-top: 1.25em; } .ptx-content section article.assemblage-like .heading + .para { display: block; } .ptx-content .goal-like { border: solid 3px #999999; padding: 0.7em; margin-bottom: 1em; } .ptx-content .goal-like > .heading { margin-top: -1.5em; background-color: white; display: table; padding: 5px 1em; margin-left: 5px; font-style: italic; font-size: 120%; } .ptx-content .goal-like > .heading .codenumber { display: none; } .ptx-content .goal-like > .heading::after { display: none; } .ptx-content .aside-like { position: absolute; margin-left: 45%; overflow-x: hidden; max-width: 495px; max-height: 7em; overflow-y: hidden; border: none; padding: 4px 10px 0 10px; color: #888; z-index: 100; } .ptx-content .example-like .aside-like { margin-top: 0; position: absolute; } .ptx-content .aside-like { font-size: 90%; } .ptx-content .aside-like { margin-bottom: 5px; background-color: #f5faff; box-shadow: 0 0 1em 0.2em #fff inset; } .ptx-content .aside-like .para { overflow-x: auto; } .ptx-content .aside-like:first-child { margin-top: -2.25em; } .ptx-content .aside-like:after { content: ""; position: absolute; z-index: 1; top: 0em; bottom: 0; left: 0; pointer-events: none; background-image: linear-gradient( to bottom, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 1) 90%); width: 550px; height: 8em; } .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { position: relative; z-index: 0; padding: 8px 15px 10px 15px; padding: 2px 10px; margin: 5px 0px 5px 10px; border: 2px solid #dcebfa; max-height: none; max-width: 550px; color: inherit; font-size: 100%; box-shadow: none; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .example-like .aside-like.front { margin-top: 1.25em; } .ptx-content .aside-like.front + p { margin-top: 1.25em !important; padding-top: 0; } .ptx-content .aside-like .aside-like { background-color: #fafff5; border: 1px dotted #aaa; } .ptx-content article.aside-like > p:first-child { margin-top: 0; } .ptx-content .aside-like > .heading { font-size: 95%; } .ptx-content .aside-like + * { margin-top: 3em; margin-right: 3em; } @media screen and (min-width: 943px) { .ptx-content .aside-like + * { margin-right: 0; } } @media screen and (min-width: 1100px) { .ptx-content .aside-like, .ptx-content .aside-like.front, .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { position: absolute; margin-top: -2em; margin-left: 660px; max-width: 200px; width: 200px; color: inherit; } .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { max-height: none; max-width: 223px; border: 2px solid #dcebfa; } .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { margin-left: 654px; } .ptx-content .aside-like + * { margin-top: 1.25em; margin-right: 0; } .ptx-content .aside-like + .solutions, .ptx-content .aside-like + .instructions { margin-top: 0; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .aside-like:nth-of-type(3n+1) { margin-left: 660px; } .ptx-content .aside-like:nth-of-type(3n) { margin-left: 680px; } .ptx-content .aside-like:nth-of-type(3n+2) { margin-left: 640px; } } .ptx-content .aside-like:hover:after, .ptx-content .aside-like:focus:after { top: 3em; height: auto; background-image: none; } .ptx-content .aside-like:hover, .ptx-content .aside-like:focus { color: inherit; padding: 2px 8px 0 8px; border: 2px solid #dcebfa; height: auto; max-height: none; } .ptx-content .aside-like.front:hover, .ptx-content .aside-like.front:focus { padding: 4px 10px; } .ptx-content section dl dd .aside-like { margin-top: 0 !important; margin-left: 100px !important; } .ptx-content section dl dd .aside-like.front { margin-left: -300px !important; } @media screen and (max-width: 1099px) { .ptx-content .aside-like { position: relative; float: right; z-index: 0; overflow-x: hidden; margin-left: 1em; margin-top: 1em; max-width: 195px; max-height: 4em; margin-right: -8em; } .ptx-content li > .aside-like:last-child { position: absolute; } } .searchbox .searchresultsplaceholder { background: #eaf0f6; } :root[data-legacy-colorscheme=blue_green] { --documenttitle: #2a5ea4; --bodytitle: #2b5f82; --bodysubtitle: #a62e1c; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #28803f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } :root[data-legacy-colorscheme=blue_grey] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #525252; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=blue_red] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #932c1c; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=blue_red_dark] { --bodyfontcolor: #eee; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abf; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #316; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #932c1c; --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: #666; --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); body.pretext { background: #222; } .pretext .ptx-page > .ptx-main { background: #444; color: var(--bodyfontcolor); } .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .ptx-navbar { background: #333; } .ptx-navbar .button { background-color: #635; color: #fff; } .ptx-navbar .button:hover { background-color: #fafafa; color: #000; } .ptx-navbar .calculator-toggle { background-color: #336; } .ptx-navbar .calculator-toggle:hover { background-color: #fce; } .pretext .ptx-masthead { background: #555; } .pretext .ptx-masthead .title-container > .pretext .heading, .pretext .ptx-masthead .title-container > .heading a, .pretext .ptx-masthead .logo-link:empty:hover::before, .pretext .ptx-masthead .byline, .pretext .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext .ptx-content .code-inline { color: var(--documenttitledark); } .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext .ptx-content [data-knowl], .pretext .ptx-content [data-knowl]:hover, .pretext .ptx-content [data-knowl]:active, .pretext .ptx-content [data-knowl].active { color: var(--documenttitlelight); } .pretext .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } } :root[data-legacy-colorscheme=bluegreen_grey] { --bluegreen: hsl(192, 98%, 23%); --documenttitle: var(--bluegreen); --bodytitle: var(--bluegreen); --bodysubtitle: var(--bluegreen); --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #ddd; --chaptertoctext: var(--bluegreen); --chaptertocactive: hsl(192, 98%, 19%); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: var(--bluegreen); --sectiontocactive: hsl(192, 98%, 19%); --sectiontoctextactive: white; --tocborder: var(--bluegreen); --highlighttoc: var(--bluegreen); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } :root[data-legacy-colorscheme=brown_gold] { --documenttitle: #472200; --bodytitle: #8e4a0c; --bodysubtitle: #864E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #eaaf0f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #140a00 --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=darkmartiansands] { --documenttitle: #880000; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #b58039; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #550000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=default] { --documenttitle: #932919; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --parttoc: #234b6a; --parttoctext: white; --parttocactive: var(--documenttitle); --parttoctextactive: white; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblagebackground: #F0EAF6; --assemblageborder: #CAAEE0; --assemblagedarkborder: #472664; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=focused_gray_aqua] { --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #1d686e; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #343b48; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --toc-text-dark: #343b48; --toc-text-light: white; --tocborder: var(--toc-text-dark); --active-toc-item: #e5ca34; --parttoc: var(--toc-text-dark); --parttoctext: var(--toc-text-light); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #1d686e; --chaptertoctext: var(--toc-text-light); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fffffd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: var(--active-toc-item); --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } :root[data-legacy-colorscheme=focused_light] { --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --toc-text-dark: #333; --tocborder: var(--toc-text-dark); --active-toc-item: #dbebf1; --parttoc: #e8e8e8; --parttoctext: var(--toc-text-dark); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #f2f2f2; --chaptertoctext: var(--toc-text-dark); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fdfdfd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: #c2e5f2; --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } :root[data-legacy-colorscheme=green_blue] { --documenttitle: #248038; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #2650a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #195827; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=green_plum] { --documenttitle: #28803f; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #822060; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20602f; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=maroon_grey] { --documenttitle: #660000; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6d8899; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #330000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=martiansands] { --documenttitle: #944921; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #d19e69; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #6a3418; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=orange_navy] { --documenttitle: #d64000; --bodytitle: #00408a; --bodysubtitle: #9e2f00; --bodytitlehighlight: #ffcdbd; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #00326b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #00326b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #006deb; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=pastel_blue_orange] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffffff; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } :root[data-legacy-colorscheme=red_blue] { --documenttitle: #932919; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_amethyst] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6f080b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #008099; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_emerald] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d9ffe9; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #16a67d; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_turquoise] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #008099; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } body.pretext { color: var(--bodyfontcolor); } .ptx-masthead .title-container > .heading, .ptx-masthead .title-container > .heading a, .ptx-masthead .logo-link:empty:hover::before, .ptx-masthead .byline a { color: var(--documenttitle, #2a5ea4); } .ptx-masthead .title-container > .heading a:active, .ptx-masthead .logo-link:empty:active::before, .ptx-masthead .byline a:active { color: var(--bodytitle, #932c1c); } .ptx-toc .toc-item { color: var(--sectiontoctext, #404040); background-color: var(--sectiontoc); border-color: var(--tocborder, #afc2e5); } .ptx-toc .toc-item.active { color: var(--sectiontoctextactive); background-color: var(--sectiontocactive); border-color: var(--highlighttocborder); } .ptx-toc:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc > .toc-item-list > .toc-item { color: var(--chaptertoctext); background-color: var(--chaptertoc); } .ptx-toc > .toc-item-list > .toc-item.active { color: var(--chaptertoctextactive); background-color: var(--chaptertocactive); border-color: var(--highlighttocborder); } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--highlighttoctext, #321a0c); background-color: var(--highlighttoc); border-color: var(--highlighttocborder, #ec704b); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter) { background-color: var(--parttoc); color: var(--parttoctext); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter).active { background-color: var(--parttocactive); color: var(--parttoctextactive); } .ptx-toc.focused .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused .toc-chapter.active { background-color: var(--chaptertocactive); color: var(--chaptertoctextactive); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item { background-color: var(--sectiontoc); color: var(--sectiontoctext); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item.active { background-color: var(--sectiontocactive); color: var(--sectiontoctextactive); } .ptx-content .summary-links a { color: var(--sectiontoctext); } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: var(--highlighttoctext); background: var(--highlighttoc); } .ptx-content .para > a.internal { color: var(--bodysubtitle); } .ptx-content .para > a.external { color: var(--bodysubtitle); } .ptx-content .para > a.internal:hover, .ptx-content .para > a.internal:hover *, .ptx-content .para > a.internal:focus, .ptx-content .para > a.internal:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .para > a.external:hover, .ptx-content .para > a.external:hover *, .ptx-content .para > a.external:focus, .ptx-content .para > a.external:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .playvideo { background-color: var(--videoplay); } .ptx-content .goal-like { border-color: var(--goalborder); } .ptx-content .assemblage-like { border-color: var(--assemblageborder); background-color: var(--assemblagebackground); } .ptx-content .knowl-output { border-color: var(--knowlborder); background-color: var(--knowlbackground); } .pretext[data-atmosphere=pastel], .pretext[data-atmosphere=pastel] .ptx-main { background: #dbf5ff; background: #efe; } .pretext[data-atmosphere=pastel] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoc: #dcdcf9; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffeeee; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoc: #fadfa3; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } .pretext[data-atmosphere=pastel] .ptx-toc { scrollbar-color: var(--documenttitlelight) #efe; } .pretext[data-atmosphere=pastel] .ptx-navbar { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere=pastel] .ptx-masthead { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere=pastel] .ptx-sidebar { background: #ffd; } .pretext[data-atmosphere=darktwilight] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abd; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(9, 72%, 30%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 40%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 33%); --navbarbackground: hsl(0, 0%, 33%); --footerbackground: hsl(0, 0%, 30%); --mainbackground: hsl(0, 0%, 27%); --buttonbackground: hsl(225, 80%, 25%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 23%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 20%); } .pretext[data-atmosphere=dark] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(5, 86%, 24%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 27%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 20%); --navbarbackground: hsl(0, 0%, 20%); --footerbackground: hsl(0, 0%, 22%); --mainbackground: hsl(0, 0%, 17%); --buttonbackground: hsl(232, 90%, 19%); --codebackground: hsl(120, 100%, 15%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 19%); } .pretext[data-atmosphere=darkmidnight] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad9; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(0, 100%, 17%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 13%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 16%); --navbarbackground: hsl(0, 0%, 16%); --footerbackground: hsl(0, 0%, 13%); --mainbackground: hsl(0, 0%, 7%); --buttonbackground: hsl(240, 100%, 13%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 17%); } .pretext[data-atmosphere*=dark] { background: var(--mainbackground); } .pretext[data-atmosphere*=dark] .ptx-page > .ptx-main { background: var(--mainbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .pretext[data-atmosphere*=dark] .ptx-navbar { background: var(--navbarbackground); } .pretext[data-atmosphere*=dark] .ptx-page-footer .feedback-link, .pretext[data-atmosphere*=dark] .ptx-content-footer .button, .pretext[data-atmosphere*=dark] .ptx-navbar .button { background-color: var(--buttonbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-page-footer .feedback-link:hover, .pretext[data-atmosphere*=dark] .ptx-content-footer .button:hover, .pretext[data-atmosphere*=dark] .ptx-navbar .button:hover, .pretext[data-atmosphere*=dark] .ptx-content-footer .button:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-navbar .calculator-toggle { background-color: var(--buttonbackground); } .pretext[data-atmosphere*=dark] .ptx-navbar .calculator-toggle:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-masthead { background: var(--bannerbackground); } .pretext[data-atmosphere*=dark] .ptx-page-footer { background: var(--footerbackground); border-top-color: #447; border-bottom-color: #447; } .pretext[data-atmosphere*=dark] .ptx-page-footer .logo { background: #779; border-radius: 0.4em; } .pretext[data-atmosphere*=dark] .ptx-masthead .title-container > .pretext .heading, .pretext[data-atmosphere*=dark] .ptx-masthead .title-container > .heading a, .pretext[data-atmosphere*=dark] .ptx-masthead .logo-link:empty:hover::before, .pretext[data-atmosphere*=dark] .ptx-masthead .byline, .pretext[data-atmosphere*=dark] .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext[data-atmosphere*=dark] .ptx-toc { scrollbar-color: var(--documenttitlelight) var(--footerbackground); } .pretext[data-atmosphere*=dark] .ptx-content .code-inline { background: var(--codebackground); } .pretext[data-atmosphere*=dark] .ptx-content .kbdkey { background: var(--keybackground); } .pretext[data-atmosphere*=dark] .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext[data-atmosphere*=dark] .ptx-content a.url, .pretext[data-atmosphere*=dark] .ptx-content a.internal, .pretext[data-atmosphere*=dark] .ptx-content a.external { background-color: var(--linkbackground); color: var(--bodyfontcolor, #ddc); } .pretext[data-atmosphere*=dark] .ptx-content [data-knowl] { background-color: var(--linkbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-content [data-knowl]:hover, .pretext[data-atmosphere*=dark] .ptx-content [data-knowl]:active, .pretext[data-atmosphere*=dark] .ptx-content [data-knowl].active { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } :root { --knowlLinkColor: var(--documenttitle); --linkColor: var(--bodysubtitle); --linkBackground: var(--bodysubtitlehighlight); --knowlNested1Background: #f5f5ff; --knowlNested2Background: #fffff5; --knowlNested3Background: #f5ffff; --knowlNested4Background: #fff5f5; } /*! Theme: min-legacy */ /*# sourceMappingURL=theme-min-legacy.css.map */ ================================================ FILE: css/dist/theme-oscarlevin-legacy.css ================================================ @charset "UTF-8"; /* ../../css/targets/html/legacy/oscarlevin/theme-oscarlevin.scss */ * { box-sizing: border-box; } body.pretext { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } body.pretext[data-font=OS] { font-family: "Open Sans", sans-serif; } body.pretext[data-font=RS] { font-family: "Roboto Serif", serif; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; } body.pretext { background: #fff; } a { color: inherit; text-decoration: none; } a:hover, a:focus { text-decoration: none; } body.pretext > a.assistive { padding: 6px; position: absolute; top: -40px; left: 0px; color: white; border-right: 1px solid white; border-bottom: 1px solid white; border-bottom-right-radius: 8px; background: transparent; z-index: 10000; } body.pretext > a.assistive:focus { top: 0px; background: #BF1722; outline: 0; transition: top 0.1s ease-in, background 0.5s linear; } nav .ptx-navbar { border-top: none; border-right: none; border-left: none; min-height: unset; } .ptx-navbar .activecode-toggle { padding: 3px 5px; } .pretext #brand-navbar, .pretext .brand-navbar { left: 0; position: fixed; right: 0; z-index: 1030; height: 50px; border-width: 0 0 1px; top: 0; margin-bottom: 0; } .pretext #brand-navbar > .container::before, .pretext .brand-navbar > .container::before, .pretext #brand-navbar > .container::after, .pretext .brand-navbar > .container::after { display: none; } .pretext #brand-navbar + .ptx-masthead, .pretext .brand-navbar + .ptx-masthead { margin-top: 50px; } .pretext #brand-navbar .navbar-collapse.collapse, .pretext .brand-navbar .navbar-collapse.collapse { overflow: hidden !important; } .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: 50px; } @media screen and (max-width: 800px) { .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: auto; } } .ptx-content section, .ptx-content article, .ptx-content figure, .ptx-content figcaption, .ptx-content .exercisegroup, .ptx-content .discussion-like, .ptx-content .para { position: relative; } .ptx-content .para > p:first-child, .ptx-content .para > .para:first-child { display: inline; } .ptx-content pre { margin: 0; padding: 0; border: none; } .ptx-content pre { border-radius: 0; } .ptx-content textarea { padding: 0; } .ptx-content h1, .ptx-content h2, .ptx-content h3, .ptx-content h4, .ptx-content h5, .ptx-content h6 { margin: 0; font-size: unset; } .pretext h1, .pretext h2, .pretext h3, .pretext h4, .pretext h5, .pretext h6 { margin: 0; font-size: unset; } .ptx-content .heading { line-height: 1.1; } .ptx-content .para { margin-top: 1.25em; margin-bottom: 0; line-height: 1.35; } .ptx-content .para.continuation { margin-top: 0; } .ptx-content pre + .para.continuation, .ptx-content pre + form, .ptx-content div + form { margin-top: 1em; } .ptx-content ul + .para.continuation, .ptx-content ol + .para.continuation, .ptx-content dl + .para.continuation { margin-top: 0.75em; } .ptx-content .aside-like > .para:first-child, .ptx-content td > .para:first-child, .ptx-content .solution-like > .para:first-child { margin-top: 0; } .ptx-content .assemblage-like > .para:first-of-type { margin-top: 0; } .ptx-content .assemblage-like > .heading + .para { margin-top: 0.25em; } .ptx-content .assemblage-like + .para { margin-top: 1.75em; } .ptx-content .para.intertext { margin-top: -0.25em; text-indent: 0; } .ptx-content .para + table { margin-top: 1em; } .ptx-content table tr td .para + .para { margin-top: 1em; } .ptx-content table + .para { margin-top: 1.5em; } .ptx-content .para + figure.figure-like > table { margin-top: 1em; } .ptx-content .exercise-like .para + ol { margin-top: 0.5em; } .ptx-content .para + pre.prettyprint, .ptx-content .para + pre.plainprint { margin-top: 1.25em; } .ptx-content .para + .code-box { margin-top: 1.25em; } .ptx-content .code-box > .console { margin-left: 1.5em; } .ptx-content .exercisegroup { padding-top: 1.25em; margin-bottom: 1em; } .ptx-content section .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .ptx-content section .exercisegroup > .heading + .introduction { display: inline; } .ptx-content section .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .ptx-content .exercisegroup article.exercise-like li > .para:first-child { margin-top: 0; } .ptx-content .exercisegroup article.exercise-like .heading { margin: 0; } .ptx-content article.exercise-like .task > .heading + .heading { font-weight: 600; } .ptx-content article.exercise-like .task > .heading + .heading + .para, .ptx-content article.exercise-like .task > .heading + .heading + div { display: block; margin-top: 0; } .ptx-content .exercisegroup .conclusion .heading { margin-top: 0.5em; } .ptx-content .exercisegroup article + article { margin-top: 1em; } .ptx-content .exercisegroup > article, .ptx-content .exercisegroup-exercises > article { margin-left: 2em; } .ptx-content .exercisegroup .cols2 > article { margin-left: 1.25em; } .ptx-content .exercisegroup > .introduction, .ptx-content .exercisegroup > .conclusion { margin-left: 0; } .ptx-content .exercisegroup > .introduction { margin-top: 1.25em; margin-top: 0; } .ptx-content .exercisegroup > .introduction > .para:first-child::before { content: "\25a0\2009"; color: #06a; position: relative; top: -1px; right: 1px; } .ptx-content .exercisegroup > .heading + .introduction > .para:first-child::before { content: "\2003"; } .ptx-content .exercisegroup > .introduction > .para:first-child { margin-top: 0; } .ptx-content section > article, .ptx-content section > section.paragraphs, .ptx-content .paragraphs > article { margin-top: 1.25em; } .ptx-content section article + article, .ptx-content section .introduction + article, .ptx-content section .para + article, .ptx-content section .posterior + article { margin-top: 1.75em; } .ptx-content section article > .introduction + article { margin-top: 1em; } .ptx-content section article > .discussion-like { margin-top: 1em; } .ptx-content section article > .discussion-like .para { margin-top: 1em; } .ptx-content article + .posterior { margin-top: 0.5em; } .ptx-content section .para + .tabular-box { margin-top: 0.75em; } .ptx-content section .tabular-box + .tabular-box { margin-top: 1em; } .ptx-content section .proof { margin-top: 0.75em; } .ptx-content section > pre, .ptx-content .para + pre { margin-top: 1.25em; } .ptx-content ol .para + .para, .ptx-content ul .para + .para { margin-top: 1em; } .ptx-content .introduction + .sidebyside, .ptx-content .para + .sidebyside, .ptx-content ol + .sidebyside, .ptx-content ul + .sidebyside { margin-top: 1em; } .ptx-content section .heading, .ptx-content article .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; } .ptx-content article .exercise-stage { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; font-size: 100%; margin-top: 0.4em; } .ptx-content article > .heading + .para { margin-top: 0; } .ptx-content section .heading + .para, .ptx-content section .title + .para, .ptx-content section .heading + .introduction > .para:first-child, .ptx-content section .blob > .para:first-child { margin-top: 0.25em; } .ptx-content section .heading + article { margin-top: 1em; } .ptx-content section .heading + .sidebyside { margin-top: 1em; } .ptx-content a > .heading { display: inline; } .ptx-content section > .heading { font-size: 1.75em; line-height: 1.25em; margin-top: 1em; margin-bottom: 0.35em; } .ptx-content section section > .heading { font-size: 1.5em; line-height: 1.25em; margin-bottom: 0; } .ptx-content .paragraphs > .heading { font-size: 1.125em; line-height: 1.125em; display: inline; } .ptx-content .paragraphs .heading + .para { display: inline; } .ptx-content .para.logical > .para:first-child { display: inline; } .ptx-content .runestone label > .para { display: inline; } .ptx-content .paragraphs .para .title { font-family: "PT Serif", "Times New Roman", Times, serif; font-size: 1.125em; font-weight: 700; } .ptx-content .paragraphs > .heading { margin-top: 0; } .ptx-content .paragraphs + .paragraphs { margin-top: 3em; } .ptx-content article .paragraphs > .heading { font-size: 1.05em; } .ptx-content section section section > .heading { font-size: 1.4em; line-height: 1.15em; margin-top: 0.75em; } @media screen and (max-width: 480px) { .ptx-content section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } .ptx-content section section > .heading { font-size: 1.3em; line-height: 1.15em; } .ptx-content section section section > .heading { font-size: 1.15em; line-height: 1em; } } .ptx-content .abstract { margin: 4em 2em; } .ptx-content .abstract > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .ptx-content .abstract > .title::after { content: ".\2009\2009\2009"; } .ptx-content .abstract > .title + .para { display: inline; } .ptx-content article > .heading, .ptx-content article > a .heading { font-size: 1.125em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like > .heading { font-size: 1em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like.discussion > .heading .codenumber, .ptx-content .discussion-like.discussion > .heading .space, .ptx-content .discussion-like.discussion > .heading .period { display: none; } .ptx-content .discussion-like.discussion > .heading .type::after { content: ". "; } .ptx-content .discussion-like.status > .heading { display: none; } .ptx-content .discussion-like.status > .heading + .para, .ptx-content .discussion-like.status > .para { font-style: italic; display: block; padding-left: 1em; } .ptx-content article > .heading::after, .ptx-content .discussion-like > .heading::after, .ptx-content .paragraphs > .heading::after, .ptx-content article > a > .heading::after { content: "\2009"; } .ptx-content .posterior .heading { font-weight: normal; font-size: 1.125em; line-height: 1.125em; margin-top: 0; } .ptx-content article > .heading + .para, .ptx-content .discussion-like > .heading + .para, .ptx-content article > .heading + .introduction, .ptx-content article > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article > .heading + ol, .ptx-content article > .heading + ul { padding-left: 1.5em; } .ptx-content article.theorem-like .para, .ptx-content article.theorem-like li { font-style: italic; } .ptx-content article.theorem-like .emphasis { font-weight: 700; } .ptx-content ol, .ptx-content ul { margin-bottom: 0; } .ptx-content li { margin-bottom: 0; } .ptx-content li .title { font-size: 100%; font-weight: normal; font-style: italic; } .ptx-content article.theorem-like li .title { font-weight: 600; font-style: normal; font-size: 96%; } .ptx-content figure { margin-bottom: 0; } .ptx-content .heading { margin-top: 0; margin-bottom: 0; } .ptx-content .conclusion { margin-top: 1em; } .ptx-content .conclusion > .para:first-child { margin-top: 0.5em; } .ptx-content ol, .ptx-content ul { margin-top: 0.75em; } .ptx-content .exercise-like > ol:first-child, .ptx-content .exercise-like > ul:first-child { margin-top: 0; } .ptx-content .heading + ol, .ptx-content .heading + ul { margin-top: 0.45em; } .ptx-content li > .heading + ol, .ptx-content li > .heading + ul { margin-top: 0.25em; } .ptx-content li > .heading + ol > li:nth-child(1), .ptx-content li > .heading + ul > li:nth-child(1) { margin-top: 0; } .ptx-content li > .heading + ol.cols2 > li:nth-child(2), .ptx-content li > .heading + ul.cols2 > li:nth-child(2) { margin-top: 0; } .ptx-content li { margin-top: 0.5em; } .ptx-content li > .para:first-child { margin-top: 0; } .ptx-content article .para:first-child { margin-top: 0; } .ptx-content ol ol, .ptx-content ol ul, .ptx-content ul ol, .ptx-content ul ul { margin-top: 0.5em; } .ptx-content .frontmatter > .heading { display: block; text-align: center; } .ptx-content .frontmatter > .heading .title, .ptx-content .book > .heading .title { font-size: 1.3em; } .ptx-content .frontmatter > .heading .subtitle, .ptx-content .book > .heading .subtitle { display: block; font-weight: normal; color: #666666; font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .ptx-content .frontmatter .author:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .para:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .author, .ptx-content .frontmatter > .credit { margin-top: 2em; text-align: center; } .ptx-content .frontmatter > .author .author-name { font-size: 120%; } .ptx-content .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .ptx-content .frontmatter .credit .title { font-size: 1em; } .ptx-content .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .ptx-content .frontmatter .author-info { font-size: 90%; } .ptx-content a[href^="mailto:"] { white-space: pre; } .ptx-content .colophon .credit { margin-top: 1em; } button { font: inherit; } .print-button { position: relative; right: 2px; top: 66px; background-color: LightGreen; z-index: 1; margin-top: -4em; float: right; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; border: none; } .pretext .ptx-page main.ptx-main { margin-left: 0; left: auto; border: none; box-shadow: none; padding: 0; } .pretext .ptx-page .ptx-main .ptx-content { margin-top: 0; } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section { margin-top: 1em; } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section .heading { margin-top: 0; } .pretext a[href]::after { content: ""; } .print-button { display: none; } } @media print { body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { width: 820px; max-width: 820px; font-size: 12.5px; } body.standalone.worksheet { margin: 0; } body.standalone .ptx-content section.worksheet { border: none; } body.standalone.worksheet .ptx-masthead, body.standalone.worksheet .ptx-page-footer { display: none; } body.standalone.worksheet.has-sidebar-left.mathbook-loaded .ptx-page .ptx-main { margin: 0; } body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { margin: 0; } body.standalone.worksheet .ptx-content section.onepage { max-height: 100%; max-width: 100%; overflow: hidden; page-break-after: always; border: none; page-break-inside: avoid; } body.standalone.worksheet .ptx-content .onepage.lastpage { margin-bottom: -2em; page-break-after: auto; } body.standalone.worksheet.a4 .ptx-content .onepage { } body.standalone.worksheet .ptx-content .onepage div.workspace, body.standalone.worksheet .ptx-content .onepage div.workspace.squashed.tight { border: none; padding: 0; background: none !important; } body.standalone.worksheet a { color: black; } body.standalone.worksheet .ptx-page .ptx-main { padding: 0; } body.standalone.worksheet.mathbook-loaded .ptx-page .ptx-main .ptx-content.ptx-content section.onepage { padding-bottom: 20px; } @page { margin: 0; } } .hidden { display: none; } .ptx-navbar .preferences_menu_holder .active > li { color: #ddd; } .ptx-navbar .preferences_menu_holder > ol > li:focus { background: #eef; border: 2px solid #909; padding: 2px 24px 2px 8px; } .ptx-navbar .preferences_menu_holder > ol > li > ol > li:focus { background: #eef; border: 2px solid #909; padding: 4px 4px 2px 4px; } .ptx-navbar .preferences_menu_holder .active .selected { background: #eef; color: #111; } .ptx-navbar .button.user-preferences-button { overflow: visible; display: none; } .preferences_menu_holder { z-index: 30; background: #fee; color: #222; position: absolute; left: -11em; top: 4em; } .preferences_menu_holder ol { list-style-type: none; padding: 0; margin: 0; } .preferences_menu_holder > ol { width: 12.5em; } .preferences_menu_holder > ol > li { padding: 4px 26px 4px 10px; } .preferences_menu_holder ol li ol { z-index: 40; position: absolute; left: 13em; top: -2em; background: #fee; } .preferences_menu_holder ol li ol li { padding: 6px 6px 4px 6px; display: flex; align-items: center; } .preferences_menu_holder ol.fonts:not(.hidden) { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; } .preferences_menu_holder ol.fonts li:nth-child(8n+1), .preferences_menu_holder ol.fonts li:nth-child(8n+2), .preferences_menu_holder ol.fonts li:nth-child(8n+3), .preferences_menu_holder ol.fonts li:nth-child(8n+4) { background-color: #eff; } .preferences_menu_holder ol.fonts li:nth-child(4n+2) { width: 4em; justify-content: center; text-align: center; align-items: center; } .preferences_menu_holder ol.fonts li:nth-child(4n+1) { padding-left: 14px; } .preferences_menu_holder .wrap_to_submenu { float: right; line-height: 0.95em; margin-right: -7px; } .preferences_menu_holder .to_submenu { position: absolute; } .preferences_menu_holder .avatars li { font-size: 200%; text-align: center; } .preferences_menu_holder .fontfamily .name { margin-right: 2em; } .preferences_menu_holder .fontfamily .sample { margin-left: auto; } .preferences_menu_holder .fonts .byunits { font-size: 80%; margin-bottom: -0.3em; } #choose_topic { background: #eef; } .ffcheck, .atmospherecheck, .avatarcheck, .rulercheck, .motioncheck { width: 1em; margin-left: 0.2em; margin-right: 0.7em; font-size: 11pt; } .preferences_menu_holder .moveQ { padding-top: 0.5em; border-top: 0.3em solid #eef; } .preferences_menu_holder .moveQ, .preferences_menu_holder .moveQ ~ li { background: #efe; } [data-ruler=greybar] .onelineX:hover { padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: #f3f3f3; } [data-atmosphere*=dark][data-ruler=greybar] .onelineX:hover { color: #333; } [data-ruler=lightbox] .onelineX { background-color: #e3e3e3; } [data-ruler=lightbox] .onelineX:hover { padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: inherit; } [data-ruler=sunrise] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler=sunrise] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunrise] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] .onelineX:hover { background-color: inherit; border-bottom: 2px solid black; margin-bottom: -2px; position: relative; z-index: 10; } xxxxxx[data-ruler=sunriseunderline] .onelineX:hover + .onelineX { margin-top: -2px; } [data-ruler=sunriseunderline] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=underline] .onelineX:hover { background-color: inherit; border-bottom: 1px solid black; margin-bottom: -1px; } [data-ruler=lunderline] .onelineX:hover { background-color: inherit; border-bottom: 1px solid black; border-left: 1px solid black; padding-left: 4px; margin-left: -5px; margin-bottom: -1px; } [data-atmosphere*=dark][data-ruler*=underline] .onelineX:hover { border-bottom: 1.5px solid #ddd; margin-bottom: -1.5px; } [data-atmosphere*=dark][data-ruler=lunderline] .onelineX:hover { border-left: 1.5px solid #ddd; padding-left: 3.5px; margin-left: -5px; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } .ptx-footnote { display: inline-block; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number { visibility: hidden; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: 0.6rem; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote__number { display: inline; cursor: pointer; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowlbackground); border-radius: 6px; padding: 0px 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowlborder); } .ptx-content section .para.credit + .para.credit { margin-top: 0.25em; } .ptx-content section .para.credit > .title { font-weight: 700; margin-right: 0.5em; } .ptx-content section .para.copyright { margin-top: 2.5em; } .ptx-content section .para.license { margin-top: 2.5em; } .ptx-content section > .heading + .heading, .ptx-content section section > .heading + .heading { margin-top: 0.5em; } .ptx-content section.solutions > h3.heading, .ptx-content section.solutions section > h3.heading { font-size: 1.6em; } .ptx-content section.solutions > h4.heading, .ptx-content section.solutions section > h4.heading { font-size: 1.45em; } .ptx-content section.solutions > h5.heading, .ptx-content section.solutions section > h5.heading { font-size: 1.35em; } .ptx-content section.solutions > h6.heading, .ptx-content section.solutions section > h6.heading { font-size: 1.25em; } .ptx-content .bibitem + .bibentry { display: inline-block; width: 90%; } .ptx-content .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .ptx-content figcaption { font-weight: normal; } .ptx-content figcaption { margin-top: 0.6em; margin-left: auto; margin-right: auto; } .ptx-content figure.table-like figcaption:first-child { font-style: oblique; margin-top: 0; } .ptx-content figure.table-like figcaption:first-child .type, .ptx-content figure.table-like figcaption:first-child .codenumber { font-style: normal; } .ptx-content section figcaption .codenumber, .ptx-content section figcaption .type { font-weight: 700; font-size: inherit; } .ptx-content figcaption .codenumber:after { content: "\2002"; } .ptx-content figcaption .type:last-of-type::after { content: "\2002"; } .ptx-content figcaption code.code-inline { white-space: pre; } .ptx-content figure.figure > figcaption { margin-top: 1em; } .ptx-content figure.listing > figcaption + * { margin-top: 0.5em; } .ptx-content figcaption + .named-list-content { margin-top: 0.6em; } .ptx-content figcaption + .named-list-content > .introduction > .para:first-child { margin-top: 0; } .ptx-content figcaption + table, .ptx-content figcaption + .tabular-box { margin-top: 0.5em; } .ptx-content .definition-like .para > .emphasis { font-weight: 700; } .ptx-content em.alert { font-weight: bold; } .unprocessed { padding: 8px; background-color: rgb(255, 230, 230); } .unprocessed .unprocessed { margin: 8px; background-color: rgb(255, 200, 255); } .unprocessed .unprocessed .unprocessed { margin: 8px; background-color: rgb(205, 205, 255); } .ptx-content section.introduction + section { margin-top: 2em; } .ptx-content { margin: 0; } .ptx-content .runestone.parsons_section { display: inline-block; max-width: unset; } .ptx-content .runestone.ac_section { width: 60em; max-width: unset; } .ptx-content .runestone.ac_section .ac_section { max-width: unset; } .ptx-content .runestone.ac_section > div { max-width: unset; } .ptx-content .runestone > .parsons { width: 60em; max-width: unset; } .ptx-content .runestone .parsons { margin: 0; } .ptx-content .runestone.parsons_section > .parsons { width: max-content; padding-right: 1em; } .ptx-content .runestone .parsons .sortable-code-container { text-align: unset; } .ptx-content .runestone .parsons .parsons-text, .ptx-content .runestone .parsons .parsons-controls { margin-left: 0; margin-right: 0; } .ptx-content .runestone .parsons .sortable-code + .sortable-code { margin-right: 0; } .ptx-content .runestone .parsons .runestone_caption_text { max-width: 660px; } .runestonebustmenu { position: absolute; right: 0; top: 0; } .runestonebustmenu .dropdown-content { position: absolute; right: 2em; left: unset; top: 1em; } @media screen and (max-width: 800px) { nav .dropdown .dropdown-content { top: unset; bottom: 36px; } .activecode-toggle { display: none; } } .pretext .navbar .dropdown { height: 35px; } .ptx-content section section + section { margin-top: 3em; } .ptx-content .sidebyside > .para, .ptx-content .sidebyside > figure, .ptx-content .sidebyside > img, .ptx-content .sidebyside > table, .ptx-content .sidebyside > tabular, .ptx-content .sidebyside > section, .ptx-content .sidebyside > .paragraphs { display: inline-block; margin: 0; } .ptx-content .sidebyside .sbspanel > table { overflow-x: auto; margin-left: auto; margin-right: auto; } .ptx-content .sidebyside figcaption { padding-left: 1em; padding-right: 0; padding-bottom: 0; margin: 0.75em 0 0 0; } .ptx-content figcaption { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .sidebyside > .para { width: 32%; vertical-align: top; } .ptx-content .sidebyside > .para.left, .ptx-content .sidebyside > .para.middle, .ptx-content .sidebyside > .para.right { vertical-align: middle; } .ptx-content .sidebyside > .para + img { vertical-align: middle; } .ptx-content .sidebyside .sbsrow .sbsheader { margin-top: 0; } .ptx-content .sbsgroup { width: 100%; } .ptx-content .sidebyside { width: 100%; } .ptx-content .sbsrow { display: flex; justify-content: space-between; } .ptx-content .sbsheader { text-align: center; justify-content: center; font-size: 1em; } .ptx-content .sbspanel:empty { height: 10em; background-color: rgb(221, 221, 255); } .ptx-content .sbspanel { display: flex; flex-direction: column; justify-content: flex-start; } .ptx-content .sbspanel.top { justify-content: flex-start; } .ptx-content .sbspanel.middle { justify-content: center; } .ptx-content .sbspanel.bottom { justify-content: flex-end; } .ptx-content .sbspanel > .para:first-child { margin-top: 0; } .ptx-content .fixed-width { align-items: center; } .ptx-content .sbscaption { justify-content: center; } .ptx-content table { border-spacing: 0; } .ptx-content table { border-collapse: collapse; } .ptx-content .image-box + table, .ptx-content .image-box + .sidebyside > .sbsrow:first-child > .sbspanel > table:first-child { margin-top: 1.5em; } .ptx-content table tr td, .ptx-content table tr th { padding-top: 2px; padding-bottom: 2px; padding-left: 5px; padding-right: 5px; } .ptx-content table tr td { font-size: 90%; } .ptx-content table tr td.l { text-align: left; } .ptx-content table tr td.c { text-align: center; } .ptx-content table tr td.r { text-align: right; } .ptx-content table tr td.j { text-align: justify; } .ptx-content table tr td.lines { white-space: nowrap; } .ptx-content table tr td.t { vertical-align: top; } .ptx-content table tr td.b { vertical-align: bottom; } .ptx-content table tr td.m { vertical-align: middle; } .ptx-content table tr td.vv { border-left: 2px solid #000; border-right: 2px solid #000; } .ptx-content table tr td.vcv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.vcvv { border-left: 2px solid #000; border-right: 4px solid #000; text-align: center; } .ptx-content table tr td.vlv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vrv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.rv { border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.vr { border-left: 2px solid #000; text-align: right; } .ptx-content table tr td.lv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vl { border-left: 2px solid #000; text-align: left; } .ptx-content table tr td.cv { border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.Xv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vc { border-left: 2px solid #000; text-align: center; } .ptx-content table tr td.hline { padding: 0; } .ptx-content table tr td.hlinethick { padding-left: 0px; padding-right: 0px; } .ptx-content table tr td.hline hr { margin-top: 0; margin-bottom: 0; margin-left: -1px; margin-right: -1px; border: 1px solid rgb(0, 0, 0); } .ptx-content table tr td.hlinethick hr { margin-top: 0; margin-bottom: 0; margin-left: -1px; margin-right: -1px; border: 2px solid rgb(0, 0, 0); } .center table { text-align: center; margin-left: auto; margin-right: auto; } .ptx-content table tr th.b1, .ptx-content table tr td.b1 { border-bottom: 1px solid #000; } .ptx-content table tr th.b2, .ptx-content table tr td.b2 { border-bottom: 2px solid #000; } .ptx-content table tr th.b3, .ptx-content table tr td.b3 { border-bottom: 3px solid #000; } .ptx-content table tr th.b0, .ptx-content table tr td.b0 { border-bottom: none; } .ptx-content table tr th.t1, .ptx-content table tr td.t1 { border-top: 1px solid #000; } .ptx-content table tr th.t2, .ptx-content table tr td.t2 { border-top: 2px solid #000; } .ptx-content table tr th.t3, .ptx-content table tr td.t3 { border-top: 3px solid #000; } .ptx-content table tr th.t0, .ptx-content table tr td.t0 { border-top: none; } .ptx-content table tr th.r1, .ptx-content table tr td.r1 { border-right: 1px solid #000; } .ptx-content table tr th.r2, .ptx-content table tr td.r2 { border-right: 2px solid #000; } .ptx-content table tr th.r3, .ptx-content table tr td.r3 { border-right: 3px solid #000; } .ptx-content table tr th.r0, .ptx-content table tr td.r0 { border-right: none; } .ptx-content table tr th.l1, .ptx-content table tr td.l1 { border-left: 1px solid #000; } .ptx-content table tr th.l2, .ptx-content table tr td.l2 { border-left: 2px solid #000; } .ptx-content table tr th.l3, .ptx-content table tr td.l3 { border-left: 3px solid #000; } .ptx-content table tr th.l0, .ptx-content table tr td.l0 { border-left: none; } .ptx-content table tr td img { max-width: 200px; margin-right: 30px; } .ptx-content table.notation-list tr th { text-align: left; } .ptx-content table.notation-list tr td { text-align: left; vertical-align: top; } .ptx-content table.notation-list tr th { margin-left: 2em; } .ptx-content table.notation-list tr td { margin-left: 1em; } .ptx-content tr th.r0.l0, .ptx-content tr td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content table tr td span.decimal { float: left; text-align: right; } .ptx-content table tr.header-vertical th { writing-mode: vertical-rl; padding-left: 2em; } .ptx-content table + article { margin-top: 1em; } .ptx-content .hidden-knowl-wrapper .hiddenproof, .ptx-content .blob > article.hiddenproof, .ptx-content section > article.hiddenproof { margin-top: 0.3em; } .ptx-content .hidden-knowl-wrapper article { display: inline; } .apretext-content figure.figure-like { overflow: auto; } .ptx-content figure.figure-like { margin-left: 0; margin-right: 0; } .ptx-content figure.table-like { margin-left: 30px; margin-right: 30px; } .ptx-content figure.table-like.list { margin-right: 0; } .ptx-content a > tt { font-size: 110%; } .ptx-content section .videolink a:link { background-size: 0; } .ptx-content .playvideo { cursor: pointer; } .ptx-content .videobig { padding-right: 0.3em; padding-left: 0.3em; font-size: 85%; background-color: rgba(255, 255, 100, 0.9); display: inline-block; position: relative; top: 100px; cursor: zoom-in; } .ptx-content .videobig.nofigure { } .ptx-content .knowl .videobig { display: none; } .ptx-content .videosmall { padding-right: 0.3em; padding-left: 0.3em; font-size: 80%; background-color: rgba(255, 255, 100, 0.9); display: inline-block; position: absolute; left: -250px; z-index: 1001; cursor: zoom-out; } .ptx-content .exercise-like ol li table { margin-bottom: 0.5em; } .ptx-content .exercise-like > ol li + li { margin-top: 0.5em; } .ptx-content .solution > ol li + li { margin-top: 0.5em; } .ptx-content section.worksheet > .heading > .codenumber { display: inline-block; vertical-align: top; } .ptx-content section.worksheet > .heading > .title { display: inline-block; max-width: 70%; } .ptx-content .heading .print-links { display: inline-block; float: right; vertical-align: top; width: 19%; text-align: right; } .standalone .ptx-content .heading .print-links { display: none; } .standalone.worksheet .previous-button, .standalone.worksheet .up-button, .standalone.worksheet .next-button { display: none; } .standalone.worksheet .ptx-navbar .toc-toggle { display: none; } .standalone.worksheet .ptx-content [data-knowl]:hover, .standalone.worksheet .ptx-content [data-knowl]:active, .standalone.worksheet .ptx-content [data-knowl].active { background: none; color: black; } .standalone.worksheet .ptx-content [data-knowl]::after { border: none; } .standalone.worksheet .ptx-content .knowl-content { padding: 0; } .standalone.worksheet .ptx-content article > .knowl-output.original { margin: 0; } .ptx-content .appendix .heading > .type { display: inline; } .ptx-content .heading.hide-type > .type { display: none; } .ptx-content .heading .print-links > a { font-family: "Open Sans"; font-size: 0.6em; font-weight: bold; padding: 0.1em 0.2em; background: #ffa; border: 2px solid green; } .ptx-content .heading .print-links > a.us { background: #eef; color: #9b1c2c; border-color: #041E42; } .ptx-content .heading .print-links > a + a { margin-left: 0.25em; } .ptx-content .autopermalink { position: absolute; display: inline-block; top: 3px; left: -1.9em; font-size: 85%; color: #a00; opacity: 0.05; margin-top: 0.1em; } .ptx-content li > .para > .autopermalink { left: -3.4em; top: 0; } .ptx-content .autopermalink a { color: #a00; } .ptx-content .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } :target { scroll-margin-top: 45px; } .ptx-content .para > .autopermalink { margin-top: 0.2em; } .ptx-content .exercises > .autopermalink, .ptx-content .introduction > .autopermalink, .ptx-content .glossary > .autopermalink { margin-top: 0.3em; } .ptx-content .appendix > .autopermalink, .ptx-content .chapter > .autopermalink, .ptx-content .index > .autopermalink, .ptx-content .section > .autopermalink { margin-top: 0.3em; } .ptx-content .subsection > .autopermalink, .ptx-content .references > .autopermalink, .ptx-content .exercises > .autopermalink { margin-top: 0.3em; } .ptx-content .figure-like > .autopermalink { margin-top: 1.4em; } .ptx-content .subsubsection > .autopermalink { margin-top: 0; } .ptx-content .exercisegroup > .autopermalink { margin-top: 1.4em; } .ptx-content .autopermalink:hover { opacity: 1; background: #eeddff; } .ptx-content .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: #fff; border: 3px solid blue; z-index: 2001; } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: #eeaaff; } .ptx-content .indexitem { margin-top: 2px; } .ptx-content .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .ptx-content .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .ptx-content .indexknowl { margin-left: 0.11em; } .ptx-content em + .indexknowl { margin-left: -0.25em; } .ptx-content .indexknowl a { margin-left: 2em; } .ptx-content .indexitem .see, .ptx-content .subindexitem .see, .ptx-content .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .seealso, .ptx-content .subindexitem .seealso, .ptx-content .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .see em, .ptx-content .subindexitem .see em, .ptx-content .subsubindexitem .see em, .ptx-content .indexitem .seealso em, .ptx-content .subindexitem .seealso em, .ptx-content .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .ptx-content .indexitem .see + .see, .ptx-content .subindexitem .see + .see, .ptx-content .subsubindexitem .see + .see, .ptx-content .indexitem .seealso + .seealso, .ptx-content .subindexitem .seealso + .seealso, .ptx-content .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .ptx-content .indexitem .indexknowl { font-size: 90%; } .ptx-content .indexitem [data-knowl], .ptx-content .subindexitem [data-knowl], .ptx-content .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .ptx-content .indexknowl [data-knowl]:hover, .ptx-content .indexknowl .active[data-knowl] { margin-left: 2em; } .ptx-content .subindexitem .indexknowl { font-size: 95%; } .ptx-content .subsubindexitem .indexknowl { font-size: 95%; } .ptx-content .indexletter { margin-top: 1.5em; } .ptx-content .hidden-knowl-wrapper .heading { display: inline; } .ptx-content .heading + .hidden-knowl-wrapper { display: inline; } .ptx-content .cols2 .knowl-output, .ptx-content .cols3 .knowl-output, .ptx-content .cols4 .knowl-output, .ptx-content .cols5 .knowl-output, .ptx-content .cols5 .knowl-output { width: 100%; } .ptx-content .cols2 + *, .ptx-content .cols3 + *, .ptx-content .cols4 + *, .ptx-content .cols5 + *, .ptx-content .cols6 + * { clear: both; } .ptx-content .cols2::after, .ptx-content .cols3::after, .ptx-content .cols4::after, .ptx-content .cols5::after, .ptx-content .cols6::after { content: ""; display: block; clear: both; } .ptx-content section > ol:last-child, .ptx-content section > ul:last-child { margin-bottom: 1.5em; } .ptx-content section > ol:last-child > li:last-child, .ptx-content section > ul:last-child > li:last-child { padding-bottom: 0em; } .ptx-content .cols2 > li:nth-child(2n+1), .ptx-content .cols3 > li:nth-child(3n+1), .ptx-content .cols4 > li:nth-child(4n+1), .ptx-content .cols5 > li:nth-child(5n+1), .ptx-content .cols6 > li:nth-child(6n+1) { clear: left; } .ptx-content .exercise-like ol.cols2 li { margin-top: 0.5em; } .ptx-content .cols2 > li, .ptx-content .cols3 > li, .ptx-content .cols4 > li, .ptx-content .cols5 > li, .ptx-content .cols6 > li { float: left; } .ptx-content .incontext { display: block; font-size: 85%; text-align: right; } .ptx-content .terminology { font-style: italic; font-weight: bold; } .ptx-content .emphasis { font-style: italic; } .ptx-content .emphasis .emphasis { font-weight: bold; } :target { animation: target-fade 15s 1; } @-webkit-keyframes target-fade { 0% { background-color: rgba(120, 0, 120, 0.3); } 100% { background-color: inherit; opacity: 1; } } @-moz-keyframes target-fade { 0% { background-color: rgba(120, 0, 120, 0.3); } 100% { background-color: inherit; opacity: 1; } } .ptx-content .autoterm [knowl], .ptx-content .autoterm [knowl]:after { font-weight: inherit; color: inherit; padding: 0; margin-bottom: inherit; border-bottom: inherit; border-bottom-color: inherit; } .ptx-content .autoterm [knowl]:hover { background: #ffddff; border-top: 2px dotted purple; border-bottom: 1px dotted red; border-top-left-radius: 0; border-top-right-radius: 0; } .ptx-content ol li.custom-list-style-type { list-style-type: none; } .ptx-content ol li.custom-list-style-type:before { content: attr(label) "\a0\a0"; } .ptx-content ol.no-marker, .ptx-content ul.no-marker, .ptx-content li.no-marker { list-style-type: none; } .ptx-content ol.decimal { list-style-type: decimal; } .ptx-content ol.lower-alpha { list-style-type: lower-alpha; } .ptx-content ol.upper-alpha { list-style-type: upper-alpha; } .ptx-content ol.lower-roman { list-style-type: lower-roman; } .ptx-content ol.upper-roman { list-style-type: upper-roman; } .ptx-content ul.disc { list-style-type: disc; } .ptx-content ul.square { list-style-type: square; } .ptx-content ul.circle { list-style-type: circle; } .ptx-content ol.no-marker, .ptx-content ul.no-marker { list-style-type: none; } .ptx-content section, .ptx-content article, .ptx-content figure { clear: both; } .ptx-content dl { margin-top: 1em; margin-left: 0; margin-bottom: 0; overflow: hidden; } .ptx-content dl dd { margin-top: 0; } .ptx-content dl dd::after { content: ""; display: block; clear: both; } .ptx-content dl.glossary dt { margin-top: 1.25em; } .ptx-content dl.description-list dt, .ptx-content dl.description-list dd { margin-top: 1em; } .ptx-content dl.description-list.narrow dt { margin-top: 0; } .ptx-content dl.glosary dt:first-of-type, .ptx-content dl.description-list dt:first-of-type, .ptx-content dl.glosary dd:first-of-type, .ptx-content dl.description-list dd:first-of-type { margin-top: 0; } .ptx-content dl dd .para { margin-top: 1em; } .ptx-content dl dt > .para:first-child, .ptx-content dl dd > .para:first-child { margin-top: 0; } .ptx-content dl > dt { font-weight: bold; max-width: 55ex; } .ptx-content dl.description-list dt { float: left; clear: left; text-align: right; width: 18ex; } .ptx-content dl.description-list.narrow dt, .ptx-content dl.glossary dt { text-align: left; } .ptx-content dl.glossary dd { margin-left: 5ex; } .ptx-content dl.description-list dd { margin-left: 22ex; } .ptx-content dl.description-list.narrow dd { margin-left: 12ex; } .ptx-content dl.description-list dt:first-of-type { clear: none; } .ptx-content dl.description-list.narrow dd::after { content: ""; display: block; height: 1em; clear: left; } .ptx-content dl.description-list.narrow dd:last-child::after { height: 0; } .ptx-content dl.description-list dt { float: left; clear: both; margin-right: 1ex; } .ptx-content dl.description-list.narrow dt { width: unset; max-width: 55ex; text-align: left; } .ptx-content dl.description-list.narrow dd { margin-left: 0; margin-top: 0; width: 31em; max-width: calc(100% - 12ex); float: right; clear: right; } .ptx-content dl.description-list + * { clear: both; } @media screen and (max-width: 480px) { .ptx-content dl.description-list dt { float: none; margin-left: 0; text-align: left; } .ptx-content dl.description-list dd, .ptx-content dl.description-list.narrow dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } .ptx-content dl.description-list dl dt { width: 8ex; } .ptx-content dl.description-list dd dd { margin-left: 18ex; } .ptx-content dl.description-list dl dd { margin-left: 12ex; } .ptx-content [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .ptx-content .knowl mjx-mtext > mjx-utext, .ptx-content mjx-mtext > mjx-utext { width: revert !important; } .ptx-content mjx-msup mjx-utext, .ptx-content mjx-msub mjx-utext { display: inline; } a.mjx-svg-href { fill: inherit; stroke: inherit; } .displaymath + .para { margin-top: 0; } @media screen and (max-width: 943px) { .ptx-content .displaymath { position: relative; overflow-x: auto; } .ptx-content .mjx-chtml.MJXc-display { overflow-x: auto; overflow-y: hidden; } .ptx-content .figure-like { overflow-x: auto; } .ptx-content #MathJax_ZoomFrame { position: static; background: white; } .ptx-content #MathJax_Zoom { background-color: inherit; border: 0; padding: 0; position: absolute; overflow-x: auto; overflow-y: visible; left: 10% !important; max-height: none !important; } } .ptx-content dd .displaymath:last-child .MJXc-display { margin-bottom: 0; } .floatnav { margin-top: 8px; margin-left: 50px; } .floatnav a { padding-left: 3px; margin-right: -1px; color: inherit; } .ptx-content a .heading .mjx-chtml { z-index: 1; background: #fff; } .ptx-content .hidden-knowl-wrapper [data-knowl]::after, .ptx-content .hidden-knowl-wrapper [data-knowl]:hover::after, .ptx-content .hidden-knowl-wrapper .active[data-knowl]::after { right: 7px; } .floatnav a:hover { background: #eeaaff; } .ptx-content .unselectable { user-select: none; } .ptx-content .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .ptx-content .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } .ptx-content .fillin { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.underline { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.box { display: inline-block; border: none; margin-left: 0.1em; margin-right: 0.1em; margin-bottom: -0.25em; outline: 1px solid black; height: 1.3em; } .ptx-content .fillin.shade { display: inline-block; border: none; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; background-color: #eee; height: 1.3em; } .ptx-content .hiddenproof > a > .heading { font-style: italic; font-weight: normal; } .ptx-content .MJXc-display, .ptx-content .knowl-output .knowl-output .knowl-output .knowl-output .MJXc-display, .ptx-content pre.prettyprint, .ptx-content pre.plainprint, .ptx-content pre.console, .ptx-content .code-box { background-image: linear-gradient( to right, white, white), linear-gradient( to right, white, white), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 255, 255, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 255, 255, 0)); background-position: left center, right center, left center, right center; background-repeat: no-repeat; background-color: inherit; background-size: 20px 100%, 20px 100%, 10px 100%, 10px 100%; background-attachment: local, local, scroll, scroll; } .ptx-content .runestone .code-box { background-image: none; } .ptx-content .knowl-output .MJXc-display { background-image: linear-gradient( to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient( to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient( to right, rgba(0, 0, 0, 0.25), var(--knowlbackground)), linear-gradient( to left, rgba(0, 0, 0, 0.25), var(--knowlbackground)); } .ptx-content .knowl-output.original .MJXc-display { background: inherit; } .ptx-content .assemblage-like .MJXc-display { background-image: linear-gradient( to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient( to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient( to right, rgba(0, 0, 0, 0.25), var(--assemblagebackground)), linear-gradient( to left, rgba(0, 0, 0, 0.25), var(--assemblagebackground)); } .ptx-content .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient( to right, #fffff5, #fffff5), linear-gradient( to right, #fffff5, #fffff5), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 255, 243, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 255, 243, 0)); } .ptx-content .knowl-output .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient( to right, #fff5fe, #fff5fe), linear-gradient( to right, #fff5fe, #fff5fe), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 243, 254, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 243, 254, 0)); } .ptx-content .knowl-output .knowl-content > *:last-child:not(.incontext) { margin-bottom: 0.5em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like, .ptx-content .knowl-output .knowl .knowl-content > .solution-like:not(.incontext) { margin-bottom: 0.15em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.hint { border-left: 1px solid #0f0; padding-left: 0.35em; background: #efe; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.answer { border-left: 2px solid #00f; padding-left: 0.35em; background: #eef; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.solution { border-left: 3px solid #c0c; padding-left: 0.5em; background: #fef; } .ptx-content .knowl-content > article:first-child, .ptx-content .knowl-content > .solution-like:first-child { padding-top: 0.25em; } .ptx-content .exercisegroup > .conclusion { margin-left: 1.5em; } .ptx-content .exercise-like .introduction { display: inline; } .ptx-content .exercise-like .introduction .heading { display: inline; } .ptx-content .exercise-like .introduction .para:first-child { display: inline; } .ptx-content .exercise-like .introduction::after { content: ""; display: block; } .ptx-content .exercise-like .conclusion::before { content: ""; display: block; margin-top: 0.25em; } .ptx-content .exercisegroup .exercisegroup-exercises.cols2, .ptx-content .exercisegroup .exercisegroup-exercises.cols3, .ptx-content .exercisegroup .exercisegroup-exercises.cols4, .ptx-content .exercisegroup .exercisegroup-exercises.cols5, .ptx-content .exercisegroup .exercisegroup-exercises.cols6 { width: 100%; display: inline-flex; flex-direction: row; flex-wrap: wrap; justify-content: flex-start; align-items: flex-start; align-content: flex-start; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 { display: inline; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 .knowl-output { display: block; } .ptx-content .exercisegroup .cols1 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(33.33% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(25% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(20% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(16.66% - 2em); } .ptx-content .mathword { white-space: nowrap; } .ptx-content .unit, .ptx-content .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .ptx-content .unit sub, .ptx-content .unit sup, .ptx-content .quantity sub, .ptx-content .quantity sup { word-spacing: normal; } .ptx-content .code-inline, .ptx-content .code-block, .ptx-content .console, .ptx-content .program, .ptx-content .program code { font-family: "Inconsolata", monospace; } .ptx-content .code-block, .ptx-content .console, .ptx-content .program { overflow-x: auto; } .ptx-content .code-inline { font-size: 1em; white-space: pre; color: inherit; background: #eeeeee; border: 1px solid #dddddd; padding: 0.0625em 0.25em; margin-left: 0.2em; margin-right: 0.2em; border-radius: 0.2em; } .ptx-content .code-inline:first-child { margin-left: 0; } .ptx-content .title .code-inline { padding-left: 0; padding-right: 0; margin-left: 0; margin-right: 0; } .ptx-content a .code-inline { background: #f6f6f6; } .ptx-content .kbdkey { background: #f1f1f1; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .ptx-content .kbdkey { color: #333; } .ptx-content .sagecell_sessionOutput pre { font-family: "Inconsolata", monospace; } .ptx-content .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .ptx-content .sage-interact.sagecell { margin: 0; } .ptx-content .sagecell_evalButton { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px; padding: 0 0.65em; } .ptx-content .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .ptx-content .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .ptx-content .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .ptx-content .sagecell_evalButton:focus, .ptx-content .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .ptx-content .sagecell .sagecell_editor { margin-bottom: 8px; } .ptx-content .booktitle { font-style: oblique; } .ptx-content .objectives > .heading, .ptx-content .outcomes > .heading { font-size: 1.25em; } .ptx-content a .heading { white-space: normal; } .ptx-content .solutions > a, .ptx-content .solutions > a:hover, .ptx-content .solutions > a.active, .ptx-content .instructions > a, .ptx-content .instructions > a:hover, .ptx-content .instructions > a.active { display: inline-block; margin-right: 1.5em; } .ptx-content .solutions > a::before, .ptx-content .instructions > a::before { content: "\25ba"; font-size: 70%; color: #06a; position: relative; top: -2px; right: 3px; } .ptx-content .solutions > a.active::before, .ptx-content .instructions > a.active::before { content: "\25bc"; animation-name: solutiontriangle; animation-duration: 3s; animation-iteration-count: 1; } .ptx-content .solutions > a[data-knowl]::after, .ptx-content .instructions > a[data-knowl]::after { left: 12px; } @keyframes solutiontriangle { from { content: "\25ba"; } to { content: "\25bc"; } } .ptx-content section.solutions { font-size: 90%; padding-left: 1em; border-left: 1em solid #eeeeee; } .ptx-content.ptx-content > section.solutions:first-child { padding-left: 0; border-left: none; } .ptx-content article.example-like > .solution-like, .ptx-content article.exercise-like > .solution-like { margin-top: 1em; padding-left: 0.7em; } .ptx-content article.example-like > .solution-like > .heading, .ptx-content article.exercise-like > .solution-like > .heading { font-size: 100%; font-weight: 700; margin-right: 0.25em; display: inline; } .ptx-content article.example-like > .solution-like > .heading + .para, .ptx-content article.exercise-like > .solution-like > .heading + .para { display: inline; } .ptx-content article > figure:first-child { margin-top: 0; } .ptx-content figure + figure, .ptx-content figure + .sidebyside, .ptx-content .sidebyside + .sidebyside, .ptx-content article + figure, .ptx-content .sidebyside + figure { padding-top: 1em; } .ptx-content img { display: inline-block; margin-left: auto; margin-right: auto; } .ptx-content img.cs { display: block; margin-top: 20px; margin-bottom: 20px; margin-left: auto; margin-right: auto; } .ptx-content img:not(.cs) { max-width: 650px; } .ptx-content .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } .ptx-content figure img { display: block; margin-left: auto; margin-right: auto; } .ptx-content figure img + img { margin-top: 30px; } .ptx-content div.center img { display: block; margin-left: auto; margin-right: auto; } .ptx-content div.center + div.center > img { margin-top: 60px; } .ptx-content div.center > img + img { margin-top: 60px; } .ptx-content figure table { margin-left: auto; margin-right: auto; } .ptx-content .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .ptx-content figure.wrap img { width: 250px; } .ptx-content figure.wrap { float: right; margin-right: 0; margin-left: 30px; } .ptx-content figure img.wrap { float: right; margin: 0; } .ptx-content figure figcaption.wrap { margin: 10px; font-size: 100%; text-align: center; } .ptx-content figure, .ptx-content .image-box { margin-top: 0.5em; } .ptx-content figure.listing { margin-top: 1em; } .ptx-content figure .image-box { margin-top: 0; } .ptx-content .sidebyside figure { margin-top: 0; } .ptx-content .image-box img, .ptx-content img.contained, .ptx-content .sbspanel img { width: 100%; height: auto; } .ptx-content .image-box > img:not(.draw_on_me):not(.mag_popup) { cursor: zoom-in; } .ptx-content img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; max-width: 600px; } .ptx-content .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .ptx-content .image-box, .ptx-content .audio-box, .ptx-content .video-box, .ptx-content .asymptote-box { position: relative; } .ptx-content .image-box .asymptote-box iframe.asymptote, .ptx-content iframe.asymptote, .ptx-content .video-box .video, .ptx-content .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .ptx-content section > .audio-box, .ptx-content section > .video-box, .ptx-content section > .image-box { margin-top: 0.75em; } .ptx-content .audio { width: 100%; } .caption .heading { font-weight: bold; } .caption .counter { font-weight: bold; } .ptx-content div.quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .minipage + .minipage { display: inline-block; } .ptx-content code.inline { background: none; border: none; } .ptx-content pre.program, .ptx-content pre.program code, .ptx-content pre.code-block, .ptx-content pre.code-block code { line-height: 1.1; } .ptx-content section > .code-box, .ptx-content .para + .code-box, .ptx-content section > .code-block, .ptx-content .para + .code-block { margin-top: 1em; } .ptx-content pre.program, .ptx-content pre.code-block { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.program:before, .ptx-content pre.code-block:before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } .ptx-content pre[data-line].program, .ptx-content pre[data-line].code-block { padding-left: 2.5em; } .ptx-content pre[data-line].program:before, .ptx-content pre[data-line].code-block:before { margin-left: -5em; } .ptx-content pre.program.line-numbers, .ptx-content pre.code-block.line-numbers { padding-left: 3.5em; overflow: visible; } .ptx-content pre.program.line-numbers:before, .ptx-content pre.code-block.line-numbers:before { margin-left: -7em; } .ptx-content pre[data-line].line-numbers code { padding-top: 0em; } .ptx-content pre[data-line].line-numbers .line-highlight { margin-top: 0em; } .ptx-content pre[data-line]:not(.line-numbers) .line-highlight { margin-top: 0.6em; } .ptx-content pre.prettyprint, .ptx-content pre.plainprint { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.prettyprint:before, .ptx-content pre.plainprint:before { content: ""; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 2.5em; } .ptx-content .objectives { margin-bottom: 1.25em; } .ptx-content ol > li { padding-left: 0.25em; } .ptx-content ol.cols2 > li, .ptx-content ul.cols2 > li { width: calc(49% - 1.75em); min-width: 190px; } .ptx-content ol.cols3 > li, .ptx-content ul.cols3 > li { width: calc(33% - 1.25em); min-width: 160px; } .ptx-content ol.cols4 > li, .ptx-content ul.cols4 > li { width: calc(24.5% - 1.25em); min-width: 100px; } .ptx-content ol.cols5 > li, .ptx-content ul.cols5 > li { width: calc(19.5% - 0.75em); min-width: 90px; } .ptx-content ol.cols6 > li, .ptx-content ul.cols6 > li { width: calc(16.3% - 0.5em); min-width: 80px; } .ptx-content ul.cols2 > li:nth-child(odd), .ptx-content ol.cols2 > li:nth-child(odd) { margin-right: 2em; } .ptx-content .cols2 ol, .ptx-content .cols3 ol, .ptx-content .cols4 ol, .ptx-content .cols5 ol, .ptx-content .cols6 ol { padding-left: 0.7em; } .ptx-content .exercisegroup-exercises > article.exercise-like { margin-top: 1em; } .ptx-content .cols2 > li:last-child:nth-child(odd) { float: none !important; padding-top: 0.5em; } .ptx-content .solution ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .solution ol li > .para:first-child, .ptx-content .solution ol li > .displaymath:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .solution ol li > .displaymath:first-child .MJXc-display { margin-top: 0; } .ptx-content .exercise-like ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .exercise-like > .cols2 > li { width: calc(49% - 2.5em); } .ptx-content .exercise-like > .cols3 > li { width: calc(33% - 2.5em); } .ptx-content .exercise-like > .cols4 > li { width: calc(24.5% - 2.5em); } .ptx-content .exercise-like > .cols5 > li { width: calc(19.5% - 2.5em); } .ptx-content .exercise-like > .cols6 > li { width: calc(16.3% - 2.5em); } .ptx-content .knowl .exercise-like > .cols2 > li { width: calc(49% - 2em); } .ptx-content .knowl .exercise-like > .cols3 > li { width: calc(33% - 2em); } .ptx-content .knowl .exercise-like > .cols4 > li { width: calc(24.5% - 2em); } .ptx-content .knowl .exercise-like > .cols5 > li { width: calc(19.5% - 2em); } .ptx-content .knowl .exercise-like > .cols6 > li { width: calc(16.3% - 2em); } .ptx-content .exercise-like ol li > .para:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .contributor .contributor-name { font-variant: small-caps; } .ptx-content .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .ptx-content .contributor { margin-top: 3ex; } .ptx-content .contributor + .contributor { margin-top: 1.5ex; } .ptx-content .contributor + .para { margin-top: 3ex; } .ptx-content .frontmatter .contributors, .ptx-content .book .contributors { text-align: center; font-style: normal; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .searchwrapper .gsc-control-cse { padding: 0; border: none; width: 25ex; } .pretext .searchwrapper .cse .gsc-search-button input.gsc-search-button-v2, .searchwrapper input.gsc-search-button-v2 { padding: 2px 2px; } .pretext .searchwrapper form.gsc-search-box { margin: 0; } .pretext .searchwrapper table.gsc-search-box { margin: 0; } .pretext .searchwrapper .gsc-search-box-tools .gsc-search-box .gsc-input { padding: 0; } .pretext .searchwrapper .gsib_a { padding: 0 0 0 5px; } .pretext .searchwrapper .gsc-input-box { height: 3ex; } .pretext .searchwrapper form.gsc-search-box { font-size: 12px; } .ptx-content div.CodeMirror span.CodeMirror-matchingbracket { color: #090; } .ptx-content .image-archive { margin-left: auto; margin-right: auto; margin-bottom: 0; margin-top: 0.75em; padding-bottom: 0.25em; text-align: center; } .ptx-content .image-archive > a { display: inline-block; padding-left: 0.5em; padding-right: 0.5em; font-family: monospace; } .ptx-content iframe { margin: 0; border: none; box-sizing: border-box; } .ptx-content .times-sign { font-size: larger; vertical-align: -0.15ex; } .ptx-content article.notranslate { margin-top: 0; } .ptx-content article.exercise-like > .exercise-like { margin-left: 40px; } .ptx-content article.exercise-like > .exercise-like.task { margin-left: 20px; } .ptx-content article.exercise-like > .exercise-like > .para { margin-top: 1.25em; } .ptx-content article.example-like > .heading + .introduction { display: inline; } .ptx-content article.example-like > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article.example-like > .exercise-like > .para { margin-top: 1.25em; } .ptx-content .taxon { font-style: italic; } .ptx-content .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .ptx-content .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .ptx-content .sageanswer .output { display: inline-block; vertical-align: top; } .ptx-content .CodeMirror-code pre.CodeMirror-line { padding-bottom: 5px; padding-left: 6px; } .ptx-content .hidden-content, .pretext .hidden-content { display: none; } .ptx-content hr.ptx-pagebreak { width: 30em; text-align: center; margin-left: auto; margin-right: auto; margin-bottom: 2em; margin-top: 0; height: 4em; border: 0; border-bottom: 1px dashed #ccc; } .ptx-content hr.ptx-pagebreak:after { content: "page"; display: inline-block; position: relative; top: 4em; font-size: 80%; padding: 0 0.25em; background: white; } .ptx-content .example-like > .exercise-like > .para:first-of-type { display: inline; } .ptx-content .example-like > .exercise-like > .aside-like { margin-top: -3em; } .ptx-content .example-like > .exercise-like > .aside-like.front { margin-top: 0; } .ptx-content meta { display: none; } .ptx-content .summary-links a { color: #671d12; background: #f0f0f0; text-decoration: none; cursor: pointer; } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: white; background: #671d12; } .ptx-content .summary-links a .codenumber { color: #303030; margin-right: 0.41667em; } .ptx-content .summary-links a:hover .codenumber, .ptx-content .summary-links a:focus .codenumber { color: #f0f0f0; } .ptx-content .summary-links { margin-top: 4em; } .ptx-content section + .summary-links { margin-top: 2em; } .ptx-content .summary-links ul { list-style-type: none; } .ptx-content .summary-links li { margin-top: 0; } .ptx-content section .summary-links li .title { font-style: normal; } .ptx-content .summary-links a { position: relative; display: block; font-size: 1.5em; line-height: 1.25em; padding: 0.41667em 0.83333em; margin-top: 0.20833em; border-radius: 3px; padding-right: 2.06667em; } .ptx-content .summary-links a:after { right: 0.83333em; } .ptx-content .summary-links a:after { content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid #c9c9c9; } .ptx-content .summary-links a, .ptx-content .summary-links a:link, .ptx-content .summary-links a:visited { cursor: pointer; } .ptx-content .summary-links a:hover:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a { font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-content .summary-links a { font-size: 1em; line-height: 1.25em; } } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a:active { position: relative; color: white; background: #932919; text-decoration: none; box-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px 5px inset; } .ptx-content .summary-links a:active:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a:focus { outline: thin dotted #333; outline-offset: -2px; } body.standalone.worksheet .ptx-content .onepage > .heading { margin-top: 0; font-size: 1.3em; } body.standalone.worksheet .ptx-content .onepage > .introduction { margin-top: 0.4em; } body.standalone.worksheet .ptx-content .onepage > .introduction > .heading { font-size: 1.1em; } body.standalone.worksheet .ptx-content .onepage .solutions, body.standalone.worksheet .ptx-content .onepage .instructions { display: none; } body.standalone .ptx-content .worksheet { padding: 40px 0 45px 0; border: 2px solid grey; margin: 0; } body.standalone .ptx-content .onepage { padding: 40px 45px 45px 55px; border-bottom: 2px solid grey; margin: 0; } body.standalone .ptx-content .onepage + .onepage { border-top: 2px solid grey; } body.standalone .ptx-content .onepage.firstpage { padding-top: 0; } body.standalone .ptx-content .onepage.lastpage { padding-bottom: 0; border-bottom: none; } body.standalone .ptx-content .worksheet > *:last-child { padding-bottom: 0 !important; } .ptx-content .onepage + .onepage { margin-top: 2.5em; padding-top: 1.5em; border-top: 1px dashed #aaa; } .ptx-content .onepage + .onepage::before { content: "pagebreak"; text-align: center; margin-left: 40%; padding-left: 1em; padding-right: 1em; position: absolute; top: -0.8em; font-size: 80%; font-style: italic; background: white; } body.standalone .ptx-content .onepage + .onepage { margin-top: 10px; } body.standalone .ptx-content .onepage + .onepage::before { content: none; } body.standalone .ptx-content .onepage article { padding-left: 0; border: none; } body.standalone .ptx-content .onepage article::after { all: unset; } .ptx-content .onepage > .para:first-child, .ptx-content .onepage > article:first-child { margin-top: 0; } .ptx-content section + .onepage.firstpage, .ptx-content article + .onepage.firstpage, .ptx-content .para + .onepage.firstpage { margin-top: 1.25em; } body.worksheet .ptx-content .onepage .sbspanel + .sbspanel > .exercise::before { content: ""; position: absolute; top: 0; bottom: 0; right: 0; left: 0; padding-left: 1.25em; border-left: 1px solid grey; margin-left: -1.25em; z-index: -100; } body.standalone.worksheet .ptx-content section article.task { margin-left: 0; } body.standalone.worksheet .ptx-content section article.task > .heading { font-weight: normal; } body.standalone .autopermalink { display: none; } body.standalone.worksheet .ptx-content .onepage .workspace { border: 2px dotted grey; background: #f3fff3; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed { border: 2px dotted grey; background: #ffe; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed.tight { border: 15px solid; border-image: repeating-linear-gradient( -35deg, #f33, #f33 10px, #000 10px, #000 20px) 20; background: yellow; } body.has-sidebar-left.mathbook-loaded.standalone.worksheet .ptx-page .ptx-main { margin-left: 0; } body.standalone.worksheet .ptx-content .goal-like { border: none; padding: 0; } body.standalone.worksheet .ptx-content .goal-like > .heading { margin-top: -0.5em; padding: 0; margin: 0; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading { display: inline; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading, body.standalone.worksheet .ptx-content section.worksheet > .objectives, body.standalone.worksheet .ptx-content section.worksheet > .introduction, body.standalone.worksheet .ptx-content section.worksheet > .conclusion { margin-left: 55px; margin-right: 40px; } body.standalone.worksheet .ptx-content section.worksheet > .heading + .para { display: inline; } .ui-dialog.ui-widget.ui-widget-content.ui-corner-all.ui-draggable.ui-resizable { left: 0 !important; top: 0 !important; } .ptx-content a.url, .ptx-content a.external { color: #22a; } .ptx-content a.url:hover, .ptx-content a.external:hover { background: #ffd; } .ptx-content .poem { margin-top: 1.5em; } .ptx-content .poem { display: table; margin-top: 1.5em; margin-left: auto; margin-right: auto; margin-bottom: 0; width: auto; max-width: 90%; } .ptx-content .poem > .heading { display: block; text-align: center; } .ptx-content section article.poem > .heading::after { content: ""; } .ptx-content .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .ptx-content .poem .author { font-style: italic; margin-top: 0.75em; } .ptx-content .poem .author.left { text-align: left; } .ptx-content .poem .author.center { text-align: center; } .ptx-content .poem .author.right { text-align: right; } .ptx-content .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .ptx-content .poem .stanza + .stanza { margin-top: 1em; } .ptx-content .poem .heading + .stanza { margin-top: 0.2em; } .ptx-content .poem .heading + .line { margin-top: 0.2em; } .ptx-content .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .ptx-content .poem .line.center { text-align: center; } .ptx-content .poem .line.right { text-align: right; } .ptx-content .poem .tab { margin-left: 2em; } .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } .toolBPanel { overflow: hidden !important; } .toolBPanel:hover { overflow: auto !important; } #aboelkins-ACS .ptx-main .ptx-content > section:first-of-type > section:first-of-type > .project-like:first-of-type li { font-size: 300%; } .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } .ptx-content .marginresource { position: relative; height: 0; left: 40em; top: 1em; } .ptx-content .marginresource a { color: blue; } .ptx-content .marginresource a[knowl] { border-bottom: 1px dotted blue; } .ptx-content .marginresource .icon { font-size: 200%; margin-right: 1em; display: inline-block; } .ptx-content .marginresource .resource_description { display: inline-block; } .ptx-content .marginresource .resource_links { display: block; margin-left: 2em; } .collectedworks .knowl-output { border: 12px solid #D6E3FF; background: none repeat scroll 0% 0% #FAFCFF; border-radius: 4px; margin-bottom: 1.25em; } .collectedworks .subjectwork { max-width: 750px; } .collectedworks .bib { margin-bottom: 1em; } .collectedworks .bibitem + .bibentry { display: inline; } .collectedworks .bibitem { display: inline; font-weight: bold; margin-right: 1em; } .collectedworks .work .title a { text-decoration: none; color: #009; } .iconlegend { position: absolute; margin-top: 0.5em; top: 0; left: 920px; line-height: 1; } .iconlegend .icon_name { font-size: 90%; margin-right: 1em; } .icongroup + .icongroup { margin-left: 1em; } label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } .feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .ptx-content .webwork-button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; background-color: #ffffff; } .ptx-content .webwork-button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .webwork-button:active { cursor: pointer; background-color: #a0a0a0; border: 1px solid #999; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } .ptx-content .exercise-wrapper form button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; color: black; background-color: #ffffff; } .ptx-content .webwork-button.activate { width: 22px; height: 22px; background-image: url(https://raw.githubusercontent.com/openwebwork/webwork2/main/htdocs/images/favicon.ico); background-size: contain; position: absolute; right: -35px; } article.project-like > .heading + div.ptx-runestone-container > div.runestone, article.exercise-like > .heading + div.ptx-runestone-container > div.runestone { margin-top: 0.5em; } .ptx-content .bottom { position: unset; } .ptx-content .rsdraggable { font-size: 100%; } .ptx-content .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .exercise-wrapper form button:active { background-color: #f0f0f0; } .ptx-content .exercise-wrapper form button + button { margin-left: 0.8em; } .ptx-content .exercise-wrapper, .ptx-content .exercise-wrapper form, .ptx-content .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .ptx-content .knowl .exercise-wrapper, .ptx-content .knowl .exercise-wrapper form, .ptx-content .knowl .exercise-wrapper form > div:first-child { width: 100%; } .ptx-content .exercise-wrapper > .para:first-child, .ptx-content .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .ptx-content .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .ptx-content .cols2 .heading + .exercise-wrapper { width: auto; } @media screen and (max-width: 600px) { .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(33.3% - 2em); } .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } @media screen and (max-width: 850px) and (min-width: 786px) { .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(33.3% - 2em); } .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } .APEXlogo { white-space: nowrap; } .APEXlogo .A { margin-right: -0.07em; } .APEXlogo .P { margin-right: -0.33em; position: relative; top: -0.3em; } .APEXlogo .E { position: relative; top: 0.33em; } .runestone-profile .dropdown-content { position: absolute; display: none; right: 0; top: 35px; text-align: left; border: 1px solid; border-color: #600; border-color: var(--tocborder); } .runestone-profile.dropdown:hover { background-color: #ddd; overflow: visible; } .runestone-profile.dropdown:hover .dropdown-content { display: block; } .runestone-profile .dropdown-content { background-color: white; z-index: 1800; min-width: 100px; padding: 5px; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: #662211; padding: 2px 8px; } .runestone-profile.dropdown .dropdown-content a:hover { background-color: #671d12; color: #ffffff; text-decoration: none; background-color: var(--chaptertoc); } .runestone-profile.dropdown .dropdown-content hr { margin-bottom: 4px; margin-top: 4px; border-color: #600; border-color: var(--sectiontoctext); } .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox { } .ptxsearch { height: 35px; flex: 1 1; } .searchbutton .name { display: none; } .searchwidget { text-align: right; } .searchwidget input { } .helpbox { display: none; } .detailed_result { margin-bottom: 10px; } .all_results a:link { text-decoration: none; font-size: large; } .all_results a:hover { background-color: lightgray; } .searchresults a:hover { background-color: #eee; } .searchresults a { text-decoration: none; color: #222; } .searchresults a:hover { text-decoration: underline; color: #33f; } .searchresults ul li { list-style-type: none; } ol.searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; } ol.searchresults > li { list-style-type: none; } .search-result-score { display: none; } .high_result { font-weight: 700; } .medium_result { font-weight: 500; } .low_result { font-weight: 200; } .no_result { font-weight: 200; color: #444; } .detailed_result .no_result { font-size: 90%; } .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; left: 152px; width: 600px; padding: 1em; border: 0.2em solid #009; background: aliceblue; z-index: 5000; display: flex; flex-direction: column; } .search-results-heading { border-bottom: 1px solid rgba(0, 0, 125, 0.5); } .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; } .closesearchresults { display: flex; justify-content: space-between; align-items: center; border: 1px solid black; } .closesearchresults:hover { color: #c00; background-color: #fee; border-color: #f00; } .closesearchresults + h2 { margin-top: -1em; } .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .search-result-bullet { margin-top: 0.3em; } .search-result-clip { font-size: 80%; font-style: italic; color: #444; padding-left: 15px; } .search-results-unshown-count { margin-top: 0.6em; } .search-result-clip-highlight { background: rgba(255, 255, 0, 0.5); } @media screen and (max-width: 800px) { .searchresultsplaceholder { width: 80vw; left: 10vw; bottom: 10vh; } } .pretext .ptx-masthead { position: relative; background: #fafafa; min-height: inherit; border: none; position: relative; } .pretext .ptx-navbar { position: sticky; top: 0; max-width: 904px; height: 36px; } .pretext .ptx-page { position: relative; min-height: 100vh; } .ptx-content { min-height: 60vh; } .pretext .ptx-sidebar { position: sticky; top: 36px; left: 0; float: left; width: 240px; } .pretext .ptx-toc { position: sticky; top: 50px; box-sizing: border-box; overflow-y: scroll; height: calc(100vh - 60px); } .pretext .ptx-page > .ptx-main { display: block; position: relative; overflow-y: hidden; margin: 0 0 0 240px; padding: 1px 0 0 0; background: white; border-left: 1px solid #ccc; } .pretext .ptx-page .ptx-sidebar.hidden + .ptx-main { margin-left: 0; } .pretext .ptx-page > .ptx-main.notoc { margin-left: 0; transition-property: margin-left; transition-duration: 0.3s; } @media screen and (max-width: 800px) { .pretext .ptx-page > .ptx-main { margin-left: 0; left: auto; } .pretext .ptx-page-footer { margin-bottom: 38px; } } .pretext .ptx-page > .ptx-main .ptx-content { max-width: 600px; margin: 32px; } @media screen and (max-width: 663px) { .pretext .ptx-page > .ptx-main .ptx-content { margin: 28px; } } .ptx-content.serif .para .para, .ptx-content[data-font=RS] .para .para { font-size: 100%; } .ptx-content[data-font=RS] .code-inline { background: #f6f6f6; border: 1px solid #eee; padding: 0.01em 0.15em 0.03em 0.15em; margin-left: 0.15em; margin-right: 0.15em; border-radius: 0; } .pretext .ptx-content-footer { margin-top: 2em; display: flex; justify-content: space-around; max-width: 600px; margin-left: 32px; } .pretext .ptx-content-footer .button { min-width: 80px; height: 35px; color: #333333; background-color: #ededed; border: 1px solid #bababa; padding: 0 10px; display: flex; gap: 10px; align-items: center; justify-content: center; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .pretext .ptx-content-footer .button .icon { margin: 0 -7px; } .pretext .ptx-content-footer .button:hover, .pretext .ptx-content-footer .button:active, .pretext .ptx-content-footer .button:focus { background-color: #fafafa; } .pretext .ptx-sidebar.visible { display: block; } .pretext .ptx-page-footer .feedback-link { cursor: pointer; text-align: center; color: #333333; background-color: #ededed; border: 1px solid #bababa; margin: 1.5em 0 0 0; padding: 0 1em 0 1em; height: 2em; display: flex; align-items: center; } .pretext .ptx-page-footer { background: #f4f4f4; margin-top: 2em; padding-top: 0; max-width: 900px; border-top: 2px solid var(--sectiontoctext); border-bottom: 2px solid var(--sectiontoctext); display: flex; flex-direction: row; justify-content: space-around; position: relative; } .pretext .ptx-page-footer > a { margin: 1em 0; } .pretext .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } @media screen and (max-width: 800px) { .pretext .ptx-navbar { position: fixed; top: auto; bottom: 0; z-index: 1100; } .pretext .ptx-sidebar { display: none; position: fixed; top: 10px; z-index: 1000; background: white; } .pretext .ptx-content-footer { display: none; } .pretext .ptx-toc { height: calc(100vh - 50px); } } .ptx-masthead .ptx-banner { border-bottom: 1px solid #d4d4d4; border-top: 1px solid transparent; overflow: hidden; padding-top: 0.625em; padding-bottom: 1.125em; border-bottom: none; } .ptx-masthead { max-width: 904px; border-right: 1px solid #bababa; } .ptx-masthead .title-container { font-size: 1em; padding-left: 9.68px; overflow: hidden; } @media screen and (max-width: 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; margin-top: 0.625em; } } .ptx-masthead .title-container > .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; margin: 0; font-size: 2em; line-height: 1.25em; color: #932919; } @media screen and (max-width: 480px) { .ptx-masthead .title-container > .heading { font-size: 1.5em; line-height: 1.25em; margin: 0; margin-bottom: 0.41667em; } } .ptx-masthead .title-container > .heading a { color: #932919; background: none; text-decoration: none; } .ptx-masthead .title-container > .heading .subtitle { font-weight: normal; } @media screen and (max-width: 800px) { .ptx-masthead .title-container > .heading .subtitle { display: block; font-size: 1.16667em; line-height: 1.42857em; color: #595959; } .ptx-masthead .title-container > .heading .subtitle:before { content: normal; } } .ptx-masthead .logo-link { position: relative; float: left; font-size: 50px; margin-top: 0.1em; margin-left: 9.68px; text-align: center; line-height: 1; } .ptx-masthead .logo-link img { width: auto; height: auto; max-height: 1em; } .ptx-masthead .logo-link:empty:before { font-family: "Open Sans"; font-size: 1em; content: "\2211"; line-height: 1; width: 1em; display: inline-block; vertical-align: top; text-align: center; color: #ccc; } .ptx-masthead .logo-link:empty:hover:before { color: #932919; } .ptx-masthead .logo-link:empty:active:before { color: #3572a0; } .ptx-masthead .logo-link { background: transparent; border: none; text-decoration: none; } @media screen and (max-width: 480px) { .ptx-masthead .logo-link { display: block; float: none; margin: 0; font-size: 50px; } } .ptx-masthead .byline { color: #333333; font-weight: normal; margin: 0; font-size: 1.3125em; line-height: 1.42857em; min-height: inherit; font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-masthead .byline { margin-top: 0; font-size: 1em; line-height: 1.25em; } } .ptx-masthead .byline a { color: #333333; } .ptx-masthead .byline a:hover, .ptx-masthead .byline a:focus { color: #932919; } .ptx-masthead .byline a:active { color: #3572a0; } nav.ptx-navbar { background: #ededed; border: 0; border-top: 1px solid #bababa; border-bottom: 1px solid #bababa; margin: 0; z-index: 100; font-family: "Open Sans"; overflow: visible; display: flex; } .ptx-navbar-contents { display: flex; flex: 1; max-width: 100%; } .ptx-navbar .button { font-size: 1em; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: #333333; background-color: #ededed; border: 0; border-right: 1px solid #bababa; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .ptx-navbar .button:focus { outline: thin dotted #333; outline-offset: -2px; } .ptx-navbar .button:active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-navbar .button:hover { background-color: #fafafa; } .ptx-navbar .button:active { background-color: #e0e0e0; } .ptx-navbar .button.disabled { opacity: 0.4; color: #333333; background: #ededed; box-shadow: none; } .ptx-navbar .toc-toggle { width: 240px; gap: 0.4em; } .ptx-navbar .button .icon { font-size: 1.5em; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls) { display: flex; } .ptx-navbar .treebuttons { flex: 1 1 210px; justify-content: end; } .ptx-navbar .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .pretext .navbar .dropdown { height: 34px; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls) > *:first-child { border-left: 1px solid #bababa; } .ptx-navbar .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .ptx-navbar .treebuttons .icon { margin: 0 -7px; } .ptx-navbar :is(.index-button, .calculator-toggle) .icon { display: none; } .ptx-navbar :is(.runestone-profile, .activecode-toggle, .searchbutton) .name { display: none; } .ptx-navbar .index-button { width: 70px; } .ptx-navbar .calculator-toggle { width: 60px; min-height: 32px; text-align: center; border-radius: 20px; margin-left: 5px; border: 2px solid #66f; line-height: 25px; margin-top: 1px; background-color: #eef; } .ptx-navbar .calculator-toggle.open { background: #fee; border: 2px solid #f66; } @media screen and (max-width: 800px) { .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; background: #ededed; box-shadow: rgba(0, 0, 0, 0.3) 0px -2px 5px; } .ptx-navbar .nav-runestone-controls { flex: 0; } .ptx-navbar .toc-toggle { flex: 2 1 100px; } .ptx-navbar .treebuttons { flex: 3 1 150px; } .ptx-navbar .treebuttons > * { flex: 1 1; min-width: 35px; } .ptx-navbar .index-button { display: none; } .ptx-navbar :is(.treebuttons) > *:first-child { border-left: 0; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button) .name { display: none; } .pretext .ptx-navbar :is(.calculator-toggle, .index-button) .icon { display: inline-block; } .ptx-navbar .nav-runestone-controls > *:first-child { border-left: 0; } .ptx-navbar .calculator-toggle { width: auto; height: 35px; border-radius: 0; margin-left: 0; border: 0; border-right: 1px solid #bababa; line-height: inherit; margin-top: 0; background-color: inherit; } } .ptx-toc { width: 240px; margin: 0; font-size: 14.72px; overflow-y: auto; overflow-x: hidden; } .ptx-toc::after { content: url("data:image/svg+xml; utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='338 3000 8772 6866'%3E%3Cg style='stroke-width:.025in; stroke:black; fill:none'%3E%3Cpolyline points='472,3590 472,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,9448 A 4660 4660 0 0 1 8598 9259 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4488,9685 A 4228 4228 0 0 0 472 9732 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,3590 A 4241 4241 0 0 1 8598 3496 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,3496 A 4241 4241 0 0 1 4724 3590 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,9259 A 4507 4507 0 0 1 4724 9448 '%3E%3C/path%3E%3Cpolyline points='5385,4299 4062,8125 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8598,3496 8598,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='850,3496 850,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='4960,9685 4488,9685 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='3070,4582 1889,6141 3070,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='6418,4582 7600,6141 6418,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8976,3590 8976,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4960,9685 A 4228 4228 0 0 1 8976 9732 '%3E%3C/path%3E%3C/g%3E%3C/svg%3E"); display: block; height: 13em; padding: 2em 1em; background: #fff; } .ptx-toc > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 8px solid #999; } .ptx-toc { --codenumber-pad-left: 0.3rem; --codenumber-pad-right: 0.5rem; --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); } .ptx-toc:is(.depth1, .parts.depth2) { --codenumber-pad-right: 0.5rem; } .ptx-toc .toc-item-list { margin: 0px; padding: 0px; list-style-type: none; } .ptx-toc .toc-item { border-top: 1px solid var(--tocborder, #d1d1d1); } .ptx-toc .toc-title-box { display: flex; } .ptx-toc .toc-title-box > .internal { position: relative; display: flex; flex-grow: 1; padding: 0.2em; font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: bold; } .ptx-toc .toc-item-list .toc-item-list .toc-title-box > .internal { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: normal; } .ptx-toc > .toc-item-list > .toc-item { border-top: 2px solid var(--tocborder, #d1d1d1); } .ptx-toc .toc-item.active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-toc .codenumber { min-width: var(--toc-indent-first); padding-left: var(--codenumber-pad-left); padding-right: var(--codenumber-pad-right); display: inline-block; text-align: left; flex-grow: 0; } .book .ptx-toc .toc-chapter .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .codenumber { font-size: 80%; padding-top: 0.16em; min-width: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber { min-width: var(--toc-indent-third); visibility: hidden; } .ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber { visibility: visible; } .ptx-toc .toc-title-box .title { flex-grow: 1; } .ptx-toc .toc-item .toc-title-box .title { margin-left: var(--toc-indent-first); } .book .ptx-toc .toc-chapter .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .title { margin-left: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { margin-left: var(--toc-indent-third); } .ptx-toc .toc-item > .toc-title-box .codenumber + .title { margin-left: 0 !important; } .ptx-toc ul.structural ul.structural .title:empty::after { content: "empty heading!"; font-weight: bold; } .ptx-toc .toc-chapter .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { font-size: 90%; } .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title { font-style: italic; } .ptx-toc ul.structural li a.has-chevron { padding-right: 2em; } .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth1 ul.structural .toc-item.contains-active { background-color: var(--chaptertocactive); color: var(--chaptertoctextactive); } .ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active { background-color: var(--parttocactive); color: var(--parttoctextactive); } .ptx-toc.focused ul.structural:not(.contains-active) > li { display: none; } .ptx-toc.focused ul.structural li.active > ul > li { display: block; } .ptx-toc.focused ul.structural:not(.contains-active) > li.visible { display: block; } .ptx-toc.focused ul.structural li.active > ul > li.hidden { display: none; } .ptx-toc.focused > ul.structural > li:not(:first-child) { margin-top: 0em; } .ptx-toc.focused ul.structural li ul.structural a:hover { border: 0; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 30px; line-height: 18px; font-variation-settings: "wght" 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--highlighttoc); color: var(--highlighttoctext); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--highlighttoctext); } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); } :root { --parttoc: var(--chaptertoc); --parttoctext: var(--chaptertoctext); --parttocactive: var(--documenttitle); --parttoctextactive: var(--chaptertoctextactive); } @supports (background: color-mix(in srgb, red 50%, blue)) { :root { --parttoc: color-mix(in srgb, var(--chaptertoc), black 15%); } } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowlLinkColor); border-bottom: 1px dotted var(--knowlLinkColor); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--linkbackground); border-bottom-color: transparent; } .knowl__content { margin: 0.2em; border: 6px solid var(--knowlborder); border-radius: 0.4em; padding: 0.8em; background-color: var(--knowlbackground); } .source-view__content { margin: 0.2em 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like, .proof)::after { content: "" !important; border-bottom: none; margin: 0; padding: 0; width: 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like) { padding-left: 0; border-left: none; } .ptx-content .knowl__content > article:is(.proof) { padding-right: 0; border-right: none; } .knowl__content .knowl__content { background-color: var(--knowlNested1Background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested2Background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested3Background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested4Background); } .ptx-content .knowl__content > figure { margin-left: 0; margin-right: 0; } .ptx-content article.theorem-like::after, .ptx-content article.definition-like::after, .ptx-content article.example-like::after, .ptx-content article.project-like::after, .ptx-content article.remark-like::after, .ptx-content article.openproblem-like::after, .ptx-content article.openproblems-like::after, .ptx-content article.computation-like::after { content: unset; } .ptx-content article.theorem-like, .ptx-content article.definition-like, .ptx-content article.example-like, .ptx-content article.project-like, .ptx-content article.remark-like, .ptx-content article.openproblem-like, .ptx-content article.openproblems-like, .ptx-content article.computation-like { padding: unset; border: unset; } :root { --assembbody: var(--bluelight, hsl(210, 90%, 90%)); --assembborder: var(--blue, hsl(210, 40%, 60%)); --assembhead: var(--blue, hsl(210, 40%, 75%)); --definitionbody: var(--greenlight, hsl(180, 40%, 90%)); --definitionborder: var(--green, hsl(180, 40%, 50%)); --definitionhead: var(--green, hsl(180, 40%, 50%)); --theorembody: var(--violetlight, hsl(270, 40%, 90%)); --theoremborder: var(--violet, hsl(270, 40%, 75%)); --theoremhead: var(--violetdark, hsl(270, 40%, 25%)); --examplebody: var(--bluedull, hsl(240, 40%, 90%)); --exampleborder: var(--bluedark, hsl(240, 40%, 25%)); --examplehead: var(--exampleborder); --examplelikebody: var(--examplebody); --examplelikeborder: var(--bluedull, hsl(240, 40%, 75%)); --examplelikehead: var(--examplelikeborder); --projectbody: var(--greenlight, hsl(180, 40%, 90%)); --projectborder: var(--green, hsl(180, 40%, 75%)); --projecthead: var(--green, hsl(180, 40%, 75%)); --investigateborder: var(--bluerich, hsl(180, 40%, 25%)); --goalborder: var(--violetrich, hsl(270, 90%, 25%)); --remarklikebody: var(--yellowlight, hsl(330, 55%, 90%)); --remarklikeborder: var(--yellow, hsl(330, 55%, 50%)); --remarklikehead: var(--yellow, hsl(330, 55%, 50%)); --computationborder: var(--orangedull, hsl(180, 40%, 75%)); --asemblagebackground: var(--assembbody) !important; --assemblageborder: var(--assembborder) !important; } .ptx-content article.assemblage-like, .ptx-content article.definition-like, .ptx-content article.theorem-like.theorem { margin-top: 1.75em; padding: 1em; border-radius: 2px; margin-bottom: 1em; } .ptx-content article.theorem-like { margin-top: 1.25em; padding: 1em; border-radius: 2px; margin-bottom: 1em; } .ptx-content article.assemblage-like { background-color: var(--assembbody); border: 2px solid var(--assembborder); } .ptx-content article.definition-like { background-color: var(--definitionbody); border: 2px solid var(--definitionborder); } .ptx-content article.theorem-like.theorem, .ptx-content article.theorem-like { background-color: var(--theorembody); border: 2px solid var(--theoremborder); } .ptx-content article.assemblage-like .heading, .ptx-content article.definition-like .heading, .ptx-content article.theorem-like.theorem .heading { margin-top: -1.75em; margin-left: -0.25em; display: table; padding: 0.25em 0.4em; } .ptx-content .assemblage-like .heading { background-color: var(--assembhead); color: #000; } .ptx-content .definition-like .heading { background-color: var(--definitionborder); color: #000; } .ptx-content .theorem-like.theorem .heading { background-color: var(--theoremborder); color: #000; } .ptx-content .example-like > .heading + .introduction, .ptx-content .computation-like > .heading + .introduction, .ptx-content .assemblage-like .heading + .para, .ptx-content .computation-like > .heading + .para, .ptx-content .example-like .heading + .para, .ptx-content .theorem-like.theorem .heading + .para, .ptx-content .definition-like .heading + .para { display: block; margin-top: 0.25em; } .ptx-content article.example-like, .ptx-content article.computation-like { padding-left: 0.8em; padding-bottom: 0.5em; } .ptx-content article.example-like.example { border-left: 0.1em solid var(--examplehead); border-bottom: 0.1em solid var(--examplehead); } .ptx-content article.example-like { border-left: 0.1em solid var(--examplelikeborder); border-bottom: 0.1em solid var(--examplelikeborder); } .ptx-content article.computation-like { border-left: 0.1em solid var(--computationborder); border-bottom: 0.1em solid var(--computationborder); } .ptx-content .example-like > .heading, .ptx-content .computation-like > .heading { display: inline-block; padding: 0.3em 0.5em; margin-left: -0.8em; } .ptx-content .example-like.example > .heading { border: 0.1em solid var(--examplehead); background: var(--examplehead); color: white; } .ptx-content .example-like > .heading { background: var(--examplelikeborder); color: black; } .ptx-content .computation-like > .heading { background: var(--computationborder); color: black; } .ptx-content article.project-like { background-color: white; border: solid 3px var(--projectborder); border-radius: 10px; padding: 10px; margin-bottom: 1em; } .ptx-content article.project-like.investigation { border-color: var(--investigateborder); } .ptx-content article.project-like > .heading { margin-top: -1.5em; background-color: white; display: table !important; padding: 5px 1em; margin-left: 10px; font-style: italic; font-size: 120% !important; } .ptx-content .goal-like { background-color: white; border-radius: 0em; padding: 0.7em; margin-bottom: 1em; } .ptx-content .goal-like.objectives { border-top: solid 3px var(--goalborder); border-bottom: solid 3px var(--goalborder); border-left: none; border-right: none; } .ptx-content .goal-like.outcomes { border-top: solid 3px var(--goalborder); border-bottom: solid 3px var(--goalborder); border-left: none; border-right: none; } .ptx-content .goal-like .heading { margin-top: -1.5em; background-color: white; display: table; padding: 5px 1em; margin-left: 10px; font-style: italic; font-size: 120%; } .ptx-content article.remark-like { margin-top: 1.25em; padding: 1em; padding-top: 0.7em; margin-bottom: 1em; border-radius: 0px; border-left: 5px solid var(--remarklikeborder); background-color: var(--remarklikebody); } .ptx-content section > .proof { margin-bottom: 1em; } .ptx-content article.assemblage-like .heading::after, .ptx-content article.theorem-like.theorem .heading::after, .ptx-content article.theorem-like .heading::after, .ptx-content article.example-like > .heading::after, .ptx-content article.project-like > .heading::after { content: ""; } .ptx-content .assemblage-like .MJXc-display, .ptx-content .definition-like .MJXc-display, .ptx-content .theorem-like.theorem .MJXc-display { background-image: linear-gradient( to right, #e9eff5, #e9eff5), linear-gradient( to right, #e9eff5, #e9eff5), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(242, 242, 254, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(242, 242, 254, 0)); } .ptx-content .theorem-like.corollary .MJXc-display { background-image: linear-gradient( to right, var(--bodytitlehighlight), var(--bodytitlehighlight)), linear-gradient( to right, var(--bodytitlehighlight), var(--bodytitlehighlight)), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(242, 242, 254, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(242, 242, 254, 0)); } .ptx-content .aside-like { position: absolute; margin-left: 45%; overflow-x: hidden; max-width: 495px; max-height: 7em; overflow-y: hidden; border: none; padding: 4px 10px 0 10px; color: #888; } .ptx-content .example-like .aside-like { margin-top: 0; position: absolute; } .ptx-content .aside-like { font-size: 90%; } .ptx-content .aside-like { margin-bottom: 5px; background-color: #f5faff; box-shadow: 0 0 1em 0.2em #fff inset; } .ptx-content .aside-like:first-child { margin-top: -2.25em; } .ptx-content .aside-like:after { content: ""; position: absolute; z-index: 1; top: 0em; bottom: 0; left: 0; pointer-events: none; background-image: linear-gradient( to bottom, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 1) 90%); width: 550px; height: 8em; } .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { position: relative; z-index: 0; padding: 8px 15px 10px 15px; padding: 2px 10px; margin: 5px 0px 5px 10px; border: 2px solid #dcebfa; max-height: none; max-width: 550px; color: inherit; font-size: 100%; box-shadow: none; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .example-like .aside-like.front { margin-top: 1.25em; } .ptx-content .aside-like.front + .para { margin-top: 1.25em !important; padding-top: 0; } .ptx-content .aside-like .aside-like { background-color: #fafff5; border: 1px dotted #aaa; } .ptx-content article.aside-like > .para:first-child { margin-top: 0; } .ptx-content .aside-like > .heading { font-size: 95%; } .ptx-content .aside-like + * { margin-top: 3em !important; margin-right: 3em; } @media screen and (min-width: 943px) { .ptx-content .aside-like + * { margin-right: 0; } } @media screen and (min-width: 1100px) { .ptx-content .aside-like, .ptx-content .aside-like.front, .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { position: absolute; margin-top: -2em; margin-left: 660px; max-width: 200px; width: 200px; color: inherit; } .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { max-height: none; max-width: 223px; border: 2px solid #dcebfa; } .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { margin-left: 654px; } .ptx-content .aside-like + * { margin-top: 1.25em !important; margin-right: 0; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .aside-like:nth-of-type(3n+1) { margin-left: 660px; } .ptx-content .aside-like:nth-of-type(3n) { margin-left: 680px; } .ptx-content .aside-like:nth-of-type(3n+2) { margin-left: 640px; } } .ptx-content .aside-like:hover:after, .ptx-content .aside-like:focus:after { top: 3em; height: auto; background-image: none; } .ptx-content .aside-like:hover, .ptx-content .aside-like:focus { color: inherit; padding: 2px 8px 0 8px; border: 2px solid #dcebfa; height: auto; max-height: none; } .ptx-content .aside-like.front:hover, .ptx-content .aside-like.front:focus { padding: 4px 10px; } .ptx-content section dl dd .aside-like { margin-top: 0 !important; margin-left: 100px !important; } .ptx-content section dl dd .aside-like.front { margin-left: -300px !important; } @media screen and (max-width: 1099px) { .ptx-content .aside-like { position: relative; float: right; z-index: 0; overflow-x: hidden; margin-left: 1em; margin-top: 1em; max-width: 195px; max-height: 4em; margin-right: -8em; } .ptx-content li > .aside-like:last-child { position: absolute; } } :root[data-legacy-colorscheme=blue_green] { --documenttitle: #2a5ea4; --bodytitle: #2b5f82; --bodysubtitle: #a62e1c; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #28803f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } :root[data-legacy-colorscheme=blue_grey] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #525252; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=blue_red] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #932c1c; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=blue_red_dark] { --bodyfontcolor: #eee; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abf; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #316; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #932c1c; --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: #666; --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); body.pretext { background: #222; } .pretext .ptx-page > .ptx-main { background: #444; color: var(--bodyfontcolor); } .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .ptx-navbar { background: #333; } .ptx-navbar .button { background-color: #635; color: #fff; } .ptx-navbar .button:hover { background-color: #fafafa; color: #000; } .ptx-navbar .calculator-toggle { background-color: #336; } .ptx-navbar .calculator-toggle:hover { background-color: #fce; } .pretext .ptx-masthead { background: #555; } .pretext .ptx-masthead .title-container > .pretext .heading, .pretext .ptx-masthead .title-container > .heading a, .pretext .ptx-masthead .logo-link:empty:hover::before, .pretext .ptx-masthead .byline, .pretext .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext .ptx-content .code-inline { color: var(--documenttitledark); } .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext .ptx-content [data-knowl], .pretext .ptx-content [data-knowl]:hover, .pretext .ptx-content [data-knowl]:active, .pretext .ptx-content [data-knowl].active { color: var(--documenttitlelight); } .pretext .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } } :root[data-legacy-colorscheme=bluegreen_grey] { --bluegreen: hsl(192, 98%, 23%); --documenttitle: var(--bluegreen); --bodytitle: var(--bluegreen); --bodysubtitle: var(--bluegreen); --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #ddd; --chaptertoctext: var(--bluegreen); --chaptertocactive: hsl(192, 98%, 19%); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: var(--bluegreen); --sectiontocactive: hsl(192, 98%, 19%); --sectiontoctextactive: white; --tocborder: var(--bluegreen); --highlighttoc: var(--bluegreen); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } :root[data-legacy-colorscheme=brown_gold] { --documenttitle: #472200; --bodytitle: #8e4a0c; --bodysubtitle: #864E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #eaaf0f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #140a00 --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=darkmartiansands] { --documenttitle: #880000; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #b58039; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #550000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=default] { --documenttitle: #932919; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --parttoc: #234b6a; --parttoctext: white; --parttocactive: var(--documenttitle); --parttoctextactive: white; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblagebackground: #F0EAF6; --assemblageborder: #CAAEE0; --assemblagedarkborder: #472664; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=focused_gray_aqua] { --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #1d686e; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #343b48; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --toc-text-dark: #343b48; --toc-text-light: white; --tocborder: var(--toc-text-dark); --active-toc-item: #e5ca34; --parttoc: var(--toc-text-dark); --parttoctext: var(--toc-text-light); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #1d686e; --chaptertoctext: var(--toc-text-light); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fffffd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: var(--active-toc-item); --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } :root[data-legacy-colorscheme=focused_light] { --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --toc-text-dark: #333; --tocborder: var(--toc-text-dark); --active-toc-item: #dbebf1; --parttoc: #e8e8e8; --parttoctext: var(--toc-text-dark); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #f2f2f2; --chaptertoctext: var(--toc-text-dark); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fdfdfd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: #c2e5f2; --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } :root[data-legacy-colorscheme=green_blue] { --documenttitle: #248038; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #2650a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #195827; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=green_plum] { --documenttitle: #28803f; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #822060; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20602f; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=maroon_grey] { --documenttitle: #660000; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6d8899; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #330000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=martiansands] { --documenttitle: #944921; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #d19e69; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #6a3418; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=orange_navy] { --documenttitle: #d64000; --bodytitle: #00408a; --bodysubtitle: #9e2f00; --bodytitlehighlight: #ffcdbd; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #00326b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #00326b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #006deb; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=pastel_blue_orange] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffffff; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } :root[data-legacy-colorscheme=red_blue] { --documenttitle: #932919; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_amethyst] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6f080b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #008099; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_emerald] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d9ffe9; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #16a67d; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_turquoise] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #008099; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } body.pretext { color: var(--bodyfontcolor); } .ptx-masthead .title-container > .heading, .ptx-masthead .title-container > .heading a, .ptx-masthead .logo-link:empty:hover::before, .ptx-masthead .byline a { color: var(--documenttitle, #2a5ea4); } .ptx-masthead .title-container > .heading a:active, .ptx-masthead .logo-link:empty:active::before, .ptx-masthead .byline a:active { color: var(--bodytitle, #932c1c); } .ptx-toc .toc-item { color: var(--sectiontoctext, #404040); background-color: var(--sectiontoc); border-color: var(--tocborder, #afc2e5); } .ptx-toc .toc-item.active { color: var(--sectiontoctextactive); background-color: var(--sectiontocactive); border-color: var(--highlighttocborder); } .ptx-toc:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc > .toc-item-list > .toc-item { color: var(--chaptertoctext); background-color: var(--chaptertoc); } .ptx-toc > .toc-item-list > .toc-item.active { color: var(--chaptertoctextactive); background-color: var(--chaptertocactive); border-color: var(--highlighttocborder); } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--highlighttoctext, #321a0c); background-color: var(--highlighttoc); border-color: var(--highlighttocborder, #ec704b); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter) { background-color: var(--parttoc); color: var(--parttoctext); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter).active { background-color: var(--parttocactive); color: var(--parttoctextactive); } .ptx-toc.focused .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused .toc-chapter.active { background-color: var(--chaptertocactive); color: var(--chaptertoctextactive); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item { background-color: var(--sectiontoc); color: var(--sectiontoctext); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item.active { background-color: var(--sectiontocactive); color: var(--sectiontoctextactive); } .ptx-content .summary-links a { color: var(--sectiontoctext); } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: var(--highlighttoctext); background: var(--highlighttoc); } .ptx-content .para > a.internal { color: var(--bodysubtitle); } .ptx-content .para > a.external { color: var(--bodysubtitle); } .ptx-content .para > a.internal:hover, .ptx-content .para > a.internal:hover *, .ptx-content .para > a.internal:focus, .ptx-content .para > a.internal:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .para > a.external:hover, .ptx-content .para > a.external:hover *, .ptx-content .para > a.external:focus, .ptx-content .para > a.external:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .playvideo { background-color: var(--videoplay); } .ptx-content .goal-like { border-color: var(--goalborder); } .ptx-content .assemblage-like { border-color: var(--assemblageborder); background-color: var(--assemblagebackground); } .ptx-content .knowl-output { border-color: var(--knowlborder); background-color: var(--knowlbackground); } .pretext[data-atmosphere=pastel], .pretext[data-atmosphere=pastel] .ptx-main { background: #dbf5ff; background: #efe; } .pretext[data-atmosphere=pastel] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoc: #dcdcf9; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffeeee; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoc: #fadfa3; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } .pretext[data-atmosphere=pastel] .ptx-toc { scrollbar-color: var(--documenttitlelight) #efe; } .pretext[data-atmosphere=pastel] .ptx-navbar { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere=pastel] .ptx-masthead { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere=pastel] .ptx-sidebar { background: #ffd; } .pretext[data-atmosphere=darktwilight] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abd; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(9, 72%, 30%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 40%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 33%); --navbarbackground: hsl(0, 0%, 33%); --footerbackground: hsl(0, 0%, 30%); --mainbackground: hsl(0, 0%, 27%); --buttonbackground: hsl(225, 80%, 25%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 23%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 20%); } .pretext[data-atmosphere=dark] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(5, 86%, 24%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 27%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 20%); --navbarbackground: hsl(0, 0%, 20%); --footerbackground: hsl(0, 0%, 22%); --mainbackground: hsl(0, 0%, 17%); --buttonbackground: hsl(232, 90%, 19%); --codebackground: hsl(120, 100%, 15%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 19%); } .pretext[data-atmosphere=darkmidnight] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad9; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(0, 100%, 17%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 13%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 16%); --navbarbackground: hsl(0, 0%, 16%); --footerbackground: hsl(0, 0%, 13%); --mainbackground: hsl(0, 0%, 7%); --buttonbackground: hsl(240, 100%, 13%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 17%); } .pretext[data-atmosphere*=dark] { background: var(--mainbackground); } .pretext[data-atmosphere*=dark] .ptx-page > .ptx-main { background: var(--mainbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .pretext[data-atmosphere*=dark] .ptx-navbar { background: var(--navbarbackground); } .pretext[data-atmosphere*=dark] .ptx-page-footer .feedback-link, .pretext[data-atmosphere*=dark] .ptx-content-footer .button, .pretext[data-atmosphere*=dark] .ptx-navbar .button { background-color: var(--buttonbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-page-footer .feedback-link:hover, .pretext[data-atmosphere*=dark] .ptx-content-footer .button:hover, .pretext[data-atmosphere*=dark] .ptx-navbar .button:hover, .pretext[data-atmosphere*=dark] .ptx-content-footer .button:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-navbar .calculator-toggle { background-color: var(--buttonbackground); } .pretext[data-atmosphere*=dark] .ptx-navbar .calculator-toggle:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-masthead { background: var(--bannerbackground); } .pretext[data-atmosphere*=dark] .ptx-page-footer { background: var(--footerbackground); border-top-color: #447; border-bottom-color: #447; } .pretext[data-atmosphere*=dark] .ptx-page-footer .logo { background: #779; border-radius: 0.4em; } .pretext[data-atmosphere*=dark] .ptx-masthead .title-container > .pretext .heading, .pretext[data-atmosphere*=dark] .ptx-masthead .title-container > .heading a, .pretext[data-atmosphere*=dark] .ptx-masthead .logo-link:empty:hover::before, .pretext[data-atmosphere*=dark] .ptx-masthead .byline, .pretext[data-atmosphere*=dark] .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext[data-atmosphere*=dark] .ptx-toc { scrollbar-color: var(--documenttitlelight) var(--footerbackground); } .pretext[data-atmosphere*=dark] .ptx-content .code-inline { background: var(--codebackground); } .pretext[data-atmosphere*=dark] .ptx-content .kbdkey { background: var(--keybackground); } .pretext[data-atmosphere*=dark] .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext[data-atmosphere*=dark] .ptx-content a.url, .pretext[data-atmosphere*=dark] .ptx-content a.internal, .pretext[data-atmosphere*=dark] .ptx-content a.external { background-color: var(--linkbackground); color: var(--bodyfontcolor, #ddc); } .pretext[data-atmosphere*=dark] .ptx-content [data-knowl] { background-color: var(--linkbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-content [data-knowl]:hover, .pretext[data-atmosphere*=dark] .ptx-content [data-knowl]:active, .pretext[data-atmosphere*=dark] .ptx-content [data-knowl].active { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } :root { --knowlLinkColor: var(--documenttitle); --linkColor: var(--bodysubtitle); --linkBackground: var(--bodysubtitlehighlight); --knowlNested1Background: #f5f5ff; --knowlNested2Background: #fffff5; --knowlNested3Background: #f5ffff; --knowlNested4Background: #fff5f5; } /*! Theme: oscarlevin-legacy */ /*# sourceMappingURL=theme-oscarlevin-legacy.css.map */ ================================================ FILE: css/dist/theme-salem.css ================================================ @charset "UTF-8"; @import "https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=swap"; @import "https://fonts.googleapis.com/css2?family=Noto Sans:ital,wght@0,400..700;1,400..700&display=swap"; @import "https://fonts.googleapis.com/css2?family=Inconsolata:ital,wght@0,400..700;1,400..700&display=swap"; /* ../../css/targets/html/salem/theme-salem.scss */ :root { --base-content-width: 725px; --content-padding: 48px; } body { margin: 0; min-height: 100vh; display: flex; flex-direction: column; align-items: stretch; } body.pretext { color: var(--body-text-color); font-family: var(--font-body); } .ptx-page { position: relative; display: flex; flex-grow: 1; width: 100%; } .ptx-main { flex-grow: 1; position: relative; max-width: 100%; container-name: ptx-main; container-type: inline-size; } .ptx-main .ptx-content { max-width: 821px; padding: 24px 48px 60px; margin-left: auto; margin-right: auto; } .worksheet .ptx-main .ptx-content { max-width: 960px; } .ptx-page { max-width: 1200px; margin-left: auto; margin-right: auto; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; background: var(--page-color, white); } .ptx-content .print-preview-header { display: none; } body.pretext > a.assistive { padding: 6px; position: absolute; top: -40px; left: 0px; color: white; border-right: 1px solid white; border-bottom: 1px solid white; border-bottom-right-radius: 8px; background: #BF1722; z-index: 10000; } body.pretext > a.assistive:focus { top: 0px; outline: 0; transition: top 0.1s ease-in, background 0.5s linear; } .ptx-content-footer { display: flex; justify-content: space-around; max-width: 821px; padding-top: 2em; padding-bottom: 2em; padding-left: 48px; padding-right: 48px; margin-left: auto; margin-right: auto; } .ptx-content-footer .button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-content-footer .button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content-footer .button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-content-footer .button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-content-footer .button.hidden { display: none; } .ptx-content-footer .button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content-footer .button .icon { margin: 0 -7px; } body.standalone-page .ptx-page { max-width: 1600px; } .ptx-masthead { position: relative; background: var(--banner-background); width: 100%; display: flex; justify-content: center; } .ptx-masthead .ptx-banner { border-top: 1px solid transparent; overflow: hidden; padding: 10px 10px; border-bottom: none; display: flex; width: 100%; align-items: center; max-width: 1200px; } .ptx-masthead a { color: var(--doc-title-color, #2a5ea4); } .ptx-masthead a:active { color: var(--link-active-text-color); } .ptx-masthead .title-container { font-family: var(--font-headings); font-size: 2em; padding-left: 9.68px; overflow: hidden; flex: 1; } .ptx-masthead .title-container .heading { font-weight: 700; font-size: 100%; line-height: 1.25em; } .ptx-masthead .title-container .title:has(+ .subtitle)::after { content: ":"; } .ptx-masthead .title-container .subtitle { font-weight: normal; } .ptx-masthead .logo-link { height: 5em; display: flex; } .ptx-masthead .logo-link img { max-height: 100%; } .ptx-masthead .logo-link img[src$=".svg"] { height: 100%; } .ptx-masthead .byline { color: var(--byline-color); font-weight: normal; margin: 0; font-size: 62.5%; min-height: inherit; } @media screen and (max-width: 800px) { .ptx-masthead { border-bottom: 1px solid var(--page-border-color); } .ptx-masthead .ptx-banner { padding: 10px 28px; display: flex; justify-content: center; } .ptx-masthead .logo-link::before { font-size: 1rem; margin-top: 0; } .ptx-masthead .title-container { width: fit-content; flex: unset; } .ptx-masthead .title-container .heading { line-height: 1em; } .ptx-masthead .title-container .heading .subtitle { display: block; font-size: 80%; line-height: 1em; } .ptx-masthead .byline { font-size: 50%; } } @media screen and (width <= 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; font-size: 1em; } .ptx-masthead .logo-link { display: none; } .ptx-masthead .byline { display: none; } } .ptx-navbar { position: sticky; top: 0; height: 36px; width: 100%; background: var(--navbar-background); border: 0; border-top: 1px solid var(--page-border-color); border-bottom: 1px solid var(--page-border-color); margin: 0; z-index: 500; overflow: visible; display: flex; } .ptx-navbar .ptx-navbar-contents { position: relative; display: flex; flex: 1; justify-content: center; align-items: center; max-width: 1200px; margin: 0 auto; } .ptx-navbar .button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-navbar .button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-navbar .button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-navbar .button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-navbar .button.hidden { display: none; } .ptx-navbar .button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-navbar .button { height: 100%; border-width: 0; } .ptx-navbar .toc-toggle { width: 240px; gap: 0.4em; margin-left: 0; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls, .nav-other-controls) { display: flex; } .ptx-navbar .treebuttons { flex: 1 1 210px; justify-content: end; } .ptx-navbar .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .ptx-navbar .pretext .navbar .dropdown { height: 34px; } .ptx-navbar .embed-popup { padding: 10px; background-color: var(--navbar-background); position: absolute; margin-top: 36px; border: 1px solid var(--page-border-color); border-radius: 3px; box-shadow: 0 0 5px var(--primary-color-gray-80); color: var(--button-text-color); } .ptx-navbar .embed-popup .embed-code-container { width: "100%"; padding: 5px; } .ptx-navbar .embed-popup .embed-code-container .embed-code-textbox { width: 100%; padding: 10px; height: 5em; } .ptx-navbar .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .ptx-navbar .treebuttons .icon { margin: 0 -7px; } .ptx-navbar :is(.index-button) .icon { display: none; } .ptx-navbar :is(.runestone-profile, .activecode-toggle, .searchbutton, .calculator-toggle, .light-dark-button, .embed-button) .name { display: none; } .ptx-navbar .index-button { min-width: 70px; } .runestone-profile { position: relative; } .runestone-profile .dropdown-content { display: none; position: absolute; background-color: var(--dropdown-background); min-width: 160px; z-index: 100; border: 1px solid var(--dropdown-border-color); right: 0; top: 35px; text-align: start; padding: 0; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: var(--dropdown-text-color); padding: 2px 8px; } .runestone-profile .dropdown-content a:is(:hover, :focus-visible) { background-color: var(--dropdown-hover-background); color: var(--dropdown-hover-text-color); } .runestone-profile .dropdown-content hr { color: var(--dropdown-border-color); margin: 4px 0; } .runestone-profile:is(:hover, :focus-visible, :focus-within) { overflow: visible; } .runestone-profile:is(:hover, :focus-visible, :focus-within) .dropdown-content { display: block; } @media screen and (max-width: 800px) { .ptx-navbar .button { border-left-width: 1px; border-right-width: 1px; border-color: var(--page-border-color); } .ptx-navbar > *:not(:first-child) { margin-left: -1px; } .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; z-index: 1100; background: var(--button-border-color); max-width: 100vw; } .ptx-navbar .ptx-navbar-contents { max-width: 100vw; } .ptx-navbar .nav-runestone-controls { flex: 0; } .ptx-navbar .toc-toggle { flex: 2 1 100px; } .ptx-navbar .treebuttons { flex: 3 1 150px; } .ptx-navbar .treebuttons > * { flex: 1 1; min-width: 35px; } .ptx-navbar .index-button { display: none; } .ptx-navbar .embed-popup { margin-top: unset; bottom: 36px; } .ptx-navbar .dropdown-content { top: unset; bottom: 36px; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button, .embed-button) .name { display: none; } } .ptx-sidebar { align-self: flex-start; } .ptx-sidebar.visible { display: block; } .ptx-sidebar.hidden { display: none; height: 0; } .ptx-toc { --codenumber-pad-left: 0.3rem; --codenumber-pad-right: 0.5rem; --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); background: var(--toc-background); margin: 0; font-size: 0.9rem; } .ptx-toc:is(.depth1, .parts.depth2) { --codenumber-pad-right: 0.5rem; } .ptx-toc .toc-item-list { margin: 0; padding: 0; list-style: none; background: var(--tocitem-background); } .ptx-toc .toc-item-list .active { list-style: none; } .ptx-toc .toc-item { background-color: var(--tocitem-background); color: var(--toc-text-color); border-color: var(--toc-border-color); } .ptx-toc .toc-item a { color: inherit; } .ptx-toc .toc-item.active:not(:has(.toc-item.active)) { color: var(--tocitem-active-text-color) !important; background-color: var(--tocitem-active-background) !important; border-color: var(--tocitem-active-border-color) !important; } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--tocitem-highlight-text-color); background-color: var(--tocitem-highlight-background); border-color: var(--tocitem-highlight-border-color); } .ptx-toc .toc-title-box { display: flex; } .ptx-toc .toc-title-box > .internal { position: relative; display: flex; flex-grow: 1; padding: 0.2em; font-weight: 500; } .ptx-toc .toc-item-list .toc-item-list .toc-title-box > .internal { font-weight: normal; } .ptx-toc .codenumber { min-width: var(--toc-indent-first); padding-left: var(--codenumber-pad-left); padding-right: var(--codenumber-pad-right); display: inline-block; text-align: left; flex-grow: 0; } .ptx-toc .toc-item { color: var(--toclevel1-text-color); background-color: var(--toclevel1-background); } .ptx-toc .toc-item .toc-item { color: var(--toclevel2-text-color); background-color: var(--toclevel2-background); } .ptx-toc .toc-item .toc-item .toc-item { color: var(--toclevel3-text-color); background-color: var(--toclevel3-background); } .book .ptx-toc .toc-chapter .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .codenumber { font-size: 80%; padding-top: 0.16em; min-width: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber { min-width: var(--toc-indent-third); visibility: hidden; } .ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber { visibility: visible; } .ptx-toc .toc-item .toc-title-box .title { margin-left: var(--toc-indent-first); } .book .ptx-toc .toc-chapter .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .title { margin-left: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { margin-left: var(--toc-indent-third); } .ptx-toc .toc-item > .toc-title-box .codenumber + .title { margin-left: 0 !important; } .ptx-toc .toc-chapter .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { font-size: 90%; } .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title { font-style: italic; } .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth1 ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-backgrounde); color: var(--tocitem-active-text-color); } .ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-background); color: var(--tocitem-active-text-color); } .ptx-toc.focused { } .ptx-toc.focused ul.structural:not(.contains-active) > .toc-item { display: none; } .ptx-toc.focused ul.structural:not(.contains-active) > .toc-item.visible { display: block; } .ptx-toc.focused ul.structural .toc-item.active > ul.structural > .toc-item { display: block; } .ptx-toc.focused ul.structural .toc-item.active > ul.structural > .toc-item.hidden { display: none; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 1.25em; line-height: 18px; font-variation-settings: "wght" 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--tocitem-highlight-background); color: var(--tocitem-highlight-text-color); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--tocitem-highlight-text-color); } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon:before { content: "add"; } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before { content: "remove"; } .ptx-sidebar { position: sticky; width: 0; display: none; z-index: 200; height: 0; top: 35px; } .ptx-toc { border-right: 1px solid var(--toc-border-color); border-bottom: 1px solid var(--toc-border-color); max-height: calc(100vh - 200px); overflow-y: auto; background: var(--page-color); width: 350px; } .ptx-toc > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 3px solid var(--toc-border-color); } @media screen and (max-width: 800px) { .ptx-sidebar { position: fixed; top: unset; height: auto; max-height: 80vh; max-width: 80vw; bottom: 36px; border-right: 2px solid var(--toc-border-color); border-top: 2px solid var(--toc-border-color); } .ptx-toc { border-top: 2px solid var(--toc-border-color); border-bottom: 0; max-height: 80vh; } } .ptx-page-footer { background: var(--footer-background); padding-top: 0; border-top: 2px solid var(--page-border-color); border-bottom: 2px solid var(--page-border-color); display: flex; flex-direction: row; justify-content: center; width: 100%; gap: 90px; position: relative; } .ptx-page-footer > a { margin: 1em 0; color: var(--body-text-color); } .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } .ptx-page-footer .feedback-link { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-page-footer .feedback-link:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-page-footer .feedback-link:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-page-footer .feedback-link.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-page-footer .feedback-link.hidden { display: none; } .ptx-page-footer .feedback-link.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } @media screen and (max-width: 800px) { .ptx-page-footer { gap: 20px; justify-content: center; margin-bottom: 34px; } .ptx-page-footer > a > .logo:first-child { height: 2em; } } :root { --page-width: 1100px; } .standalone-page { --page-width: 1600px; } .ptx-masthead .ptx-banner { justify-content: center; } .ptx-masthead .title-container { flex: unset; } @media screen and (width > 800px) { .ptx-masthead { max-width: var(--page-width); margin-left: auto; margin-right: auto; } } @media screen and (width > 1100px) { .ptx-masthead { border-left: 1px solid var(--page-border-color); border-right: 1px solid var(--page-border-color); } } @media screen and (width > 800px) { .ptx-navbar { max-width: var(--page-width); margin-left: auto; margin-right: auto; } } @media screen and (width > 1100px) { .ptx-navbar { border-left: 1px solid var(--page-border-color); border-right: 1px solid var(--page-border-color); } } @media screen and (width > 800px) { .ptx-page { max-width: var(--page-width); margin-left: auto; margin-right: auto; } } @media screen and (width > 1100px) { .ptx-page { border-left: 1px solid var(--page-border-color); border-right: 1px solid var(--page-border-color); } } .ptx-page-footer { border-bottom: 0; } @media screen and (width > 800px) { .ptx-page-footer { max-width: var(--page-width); margin-left: auto; margin-right: auto; } } @media screen and (width > 1100px) { .ptx-page-footer { border-left: 1px solid var(--page-border-color); border-right: 1px solid var(--page-border-color); } } .ptx-content-footer { justify-content: space-evenly; } @container ptx-main (width < 800px) { .ptx-page > .ptx-main .ptx-content { padding-left: 20px; padding-right: 20px; max-width: 765px; } } .aside-like > .knowl__link { color: var(--aside-like-link-color); border-bottom-color: var(--aside-like-link-color); } .aside-like > .knowl__content { margin-left: 30px; margin-right: 30px; border: 2px solid var(--aside-like-border-color); background-color: var(--aside-like-body-background); } @media screen and (min-width: 1820px) { details.aside-like { position: relative; margin-left: -524px; width: 300px; right: -524px; float: right; clear: right; } .multicolumn details.aside-like { position: relative; margin-left: inherit; width: auto; right: 0; float: none; clear: none; } details.aside-like > .knowl__content { margin-left: 0; margin-right: 0; background-color: var(--aside-like-body-background); z-index: 100; } } .code-box { overflow-x: auto; } .code-display { overflow-x: auto; font-family: var(--font-monospace); margin: 0.5em 0; } .console, .program { border: 1px solid var(--page-border-color); padding: 5px 15px; overflow-x: auto; margin: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-inline { font-family: var(--font-monospace); white-space: pre; color: var(--body-text-color); background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); border-radius: 0.2em; display: inline-block; overflow-x: auto; max-width: 100%; vertical-align: middle; line-height: normal; padding: 0.0625em 0.15em; } .prompt.unselectable { user-select: none; } .code-block { border-left: 1px solid #aaa; padding: 0 15px 5px; overflow-x: auto; background: var(--code-background); margin-top: 0; margin-bottom: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-block::before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } @media print { .code-copy { display: none; } } :is(.cols2, .cols3, .cols4, .cols5, .cols6) { display: flex; flex-wrap: wrap; justify-content: start; } .cols2 > .exercise-like { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > .exercise-like { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > .exercise-like { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > .exercise-like { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > .exercise-like { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .exercise-like > .heading { font-size: inherit; } .exercisegroup .exercise-like { margin-top: 1em; } .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .exercisegroup > .heading + .introduction { display: inline; } .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .exercisegroup .exercisegroup-exercises { margin-top: 1em; padding-left: 40px; } .exercisegroup .conclusion { margin-left: 40px; } .exercisegroup .conclusion .heading { font-size: inherit; } .exercise-like > .exercise-like.task { margin-left: 20px; } .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .exercise-wrapper form button:active { background-color: #f0f0f0; } .exercise-wrapper form button + button { margin-left: 0.8em; } .exercise-wrapper, .exercise-wrapper form, .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .knowl .exercise-wrapper, .knowl .exercise-wrapper form, .knowl .exercise-wrapper form > div:first-child { width: 100%; } .exercise-wrapper > .para:first-child, .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .cols2 .heading + .exercise-wrapper { width: auto; } section.solutions > .heading + .heading { margin-top: 0.5em; } section.solutions > h3.heading, section.solutions section > h3.heading { font-size: 1.6em; } section.solutions > h4.heading, section.solutions section > h4.heading { font-size: 1.45em; } section.solutions > h5.heading, section.solutions section > h5.heading { font-size: 1.35em; } section.solutions > h6.heading, section.solutions section > h6.heading { font-size: 1.25em; } .sbsgroup > *:not(:first-child) { margin-top: 1.5em; } .sbsrow { display: grid; grid-template-rows: auto auto; } .sbspanel { grid-row: 1; } .sbspanel > .table > figcaption { text-align: center; } .sbspanel .tabular { overflow-x: auto; margin-left: auto; margin-right: auto; } .sbspanel--top { align-self: start; } .sbspanel--middle { align-self: center; } .sbspanel--bottom { align-self: end; } .sbspanel:has(.figure-like, .table-like), .sbspanel > :is(.figure-like, .table-like) { display: contents; } .sbspanel > :is(.figure-like, .table-like) > *:first-child { grid-row: 1; align-items: start; align-self: start; } .sbspanel--top > :is(.figure-like, .table-like) > *:first-child { align-items: start; align-self: start; } .sbspanel--middle > :is(.figure-like, .table-like) > *:first-child { align-items: center; align-self: center; } .sbspanel--bottom > :is(.figure-like, .table-like) > *:first-child { align-items: end; align-self: end; } .sbspanel > :is(.figure-like, .table-like) > *:nth-child(2) { margin-top: 0.5em; grid-row: 2; width: 100%; } .sbspanel:nth-of-type(2) * { grid-column: 2; } .sbspanel:nth-of-type(3) * { grid-column: 3; } .sbspanel:nth-of-type(4) * { grid-column: 4; } .sbspanel:nth-of-type(5) * { grid-column: 5; } .sbspanel:nth-of-type(6) * { grid-column: 6; } .sbspanel:nth-of-type(7) * { grid-column: 7; } .sbspanel:nth-of-type(8) * { grid-column: 8; } .sbspanel:nth-of-type(9) * { grid-column: 9; } .sbspanel:nth-of-type(10) * { grid-column: 10; } .discussion-like > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .discussion-like > .heading:first-child:after { content: "\2009"; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } .discussion-like > .heading ::after { content: "\2009"; } .discussion-like > .heading + .para { display: inline; } .discussion-like > .heading .space, .discussion-like > .heading .codenumber, .discussion-like > .heading .period { display: none; } .discussion-like > .heading .type::after { content: ". "; } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowl-link-color); border-bottom: 1px dotted var(--knowl-link-color); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--knowl-background); border-bottom-color: transparent; } .source-view__content { margin: 0.2em 0; } .knowl__content { margin: 0.75em 0; border: 1px solid var(--knowl-border-color); border-radius: 2px; padding: 12px; background-color: var(--knowl-background); } .knowl__content .incontext { display: block; font-size: 85%; text-align: right; } .knowl__content .knowl__content { background-color: var(--knowl-nested-1-background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-2-background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-3-background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-4-background); } .knowl__content > figure { margin-left: 0; margin-right: 0; } .remark-like:not(.knowl__content, .born-hidden-knowl) { padding: 10px; padding-left: 15px; border-left: 4px solid var(--remark-like-border-color); background-color: var(--remark-like-body-background); border-radius: 4px; } .remark-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-top: 0; } .assemblage-like:not(.knowl__content, .born-hidden-knowl) { border: 2px solid var(--assemblage-like-border-color); background-color: var(--assemblage-like-body-background); padding: 10px; border-radius: 2px; } .assemblage-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { display: block; color: var(--block-head-color); margin-bottom: 0.5em; } .assemblage-like:not(.knowl__content, .born-hidden-knowl) > *:first-child { margin-top: 0; } .ptx-content:not(:has(> .worksheet)) .conclusion:not(.ptx-runestone-container *):not(.knowl__content, .born-hidden-knowl), .ptx-content:not(:has(> .worksheet)) .goal-like:not(.ptx-runestone-container *):not(.knowl__content, .born-hidden-knowl) { border: 3px solid var(--goal-like-border-color); background-color: var(--goal-like-body-background); padding: 20px; padding-top: calc(20px + 0.25ex); margin-top: 2.5em !important; } .ptx-content:not(:has(> .worksheet)) .conclusion:not(.ptx-runestone-container *):not(.knowl__content, .born-hidden-knowl) > .heading:first-child, .ptx-content:not(:has(> .worksheet)) .goal-like:not(.ptx-runestone-container *):not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--goal-like-border-color); display: block; color: white; margin-bottom: 0.5em; padding: 5px 10px; margin-top: calc(-25px - 1.65ex); width: fit-content; border: 0; } .ptx-content:not(:has(> .worksheet)) .conclusion:not(.ptx-runestone-container *):not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after, .ptx-content:not(:has(> .worksheet)) .goal-like:not(.ptx-runestone-container *):not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .knowl__content *:first-child .ptx-content:not(:has(> .worksheet)) .conclusion:not(.ptx-runestone-container *), .knowl__content *:first-child .ptx-content:not(:has(> .worksheet)) .goal-like:not(.ptx-runestone-container *) { margin-top: 1em; } .ptx-content:has(> .worksheet) .goal-like { margin-top: 1.5em; } .theorem-like:not(.knowl__content, .born-hidden-knowl) { border-left: 1px solid var(--theorem-like-border-color); border-bottom: 1px solid var(--theorem-like-border-color); background-color: var(--content-background-background); padding: 0 0px 12px 12px; border-bottom-left-radius: 2px; } .theorem-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--theorem-like-border-color); display: inline-block; color: white; padding: 5px 10px; margin-left: -12px; margin-top: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; } .theorem-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .theorem-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-bottom: 12px; } .theorem-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child + * { margin-top: 0; } .definition-like:not(.knowl__content, .born-hidden-knowl) { border-left: 1px solid var(--definition-like-border-color); border-bottom: 1px solid var(--definition-like-border-color); background-color: var(--content-background-background); padding: 0 0px 12px 12px; border-bottom-left-radius: 2px; } .definition-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--definition-like-border-color); display: inline-block; color: white; padding: 5px 10px; margin-left: -12px; margin-top: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; } .definition-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .definition-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-bottom: 12px; } .definition-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child + * { margin-top: 0; } .example-like:not(.knowl__content, .born-hidden-knowl) { border-left: 1px solid var(--example-like-border-color); border-bottom: 1px solid var(--example-like-border-color); background-color: var(--content-background-background); padding: 0 0px 12px 12px; border-bottom-left-radius: 2px; } .example-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--example-like-border-color); display: inline-block; color: white; padding: 5px 10px; margin-left: -12px; margin-top: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; } .example-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .example-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-bottom: 12px; } .example-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child + * { margin-top: 0; } .project-like:not(.knowl__content, .born-hidden-knowl) { border-left: 1px solid var(--project-like-border-color); border-bottom: 1px solid var(--project-like-border-color); background-color: var(--content-background-background); padding: 0 0px 12px 12px; border-bottom-left-radius: 2px; } .project-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--project-like-border-color); display: inline-block; color: white; padding: 5px 10px; margin-left: -12px; margin-top: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; } .project-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .project-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-bottom: 12px; } .project-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child + * { margin-top: 0; } .computation-like:not(.knowl__content, .born-hidden-knowl) { border-left: 1px solid var(--computation-like-border-color); border-bottom: 1px solid var(--computation-like-border-color); background-color: var(--content-background-background); padding: 0 0px 12px 12px; border-bottom-left-radius: 2px; } .computation-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--computation-like-border-color); display: inline-block; color: white; padding: 5px 10px; margin-left: -12px; margin-top: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; } .computation-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .computation-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-bottom: 12px; } .computation-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child + * { margin-top: 0; } .proof-like:not(.knowl__content, .born-hidden-knowl) { border-left: 1px solid var(--proof-like-border-color); border-bottom: 1px solid var(--proof-like-border-color); background-color: var(--content-background-background); padding: 0 0px 12px 12px; border-bottom-left-radius: 2px; } .proof-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--proof-like-border-color); display: inline-block; color: white; padding: 5px 10px; margin-left: -12px; margin-top: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; } .proof-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .proof-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-bottom: 12px; } .proof-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child + * { margin-top: 0; } .ptx-content:not(:has(> .worksheet)) .exercise-like:not(.knowl__content, .born-hidden-knowl) { border-left: 1px solid var(--exercise-like-border-color); border-bottom: 1px solid var(--exercise-like-border-color); background-color: var(--content-background-background); padding: 0 0px 12px 12px; border-bottom-left-radius: 2px; } .ptx-content:not(:has(> .worksheet)) .exercise-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { background-color: var(--exercise-like-border-color); display: inline-block; color: white; padding: 5px 10px; margin-left: -12px; margin-top: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; } .ptx-content:not(:has(> .worksheet)) .exercise-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child:after { display: none; } .ptx-content:not(:has(> .worksheet)) .exercise-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-bottom: 12px; } .ptx-content:not(:has(> .worksheet)) .exercise-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child + * { margin-top: 0; } .ptx-content:has(> .worksheet) .exercise-like > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .ptx-content:has(> .worksheet) .exercise-like > .heading:first-child:after { content: "\2009"; } .ptx-content:has(> .worksheet) .exercise-like > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .ptx-content:has(> .worksheet) .exercise-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .ptx-content:has(> .worksheet) .exercise-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } * { box-sizing: border-box; } @layer spacing { :is(section, article, .knowl__content) > *:not(:first-child) { margin-top: 1.5em; } :is(section, article, .knowl__content) > .para + .para { margin-top: 1em; } .ptx-content :is(ul, td, li, dd, .blockquote, .sbspanel, .para.logical) > *:not(:first-child) { margin-top: 0.5em; } } ol.no-marker, ul.no-marker, li.no-marker { list-style-type: none; } ol.decimal { list-style-type: decimal; } ol.lower-alpha { list-style-type: lower-alpha; } ol.lower-alpha-level-1 > li::marker { content: "(" counter(list-item, lower-alpha) ") "; } ol.upper-alpha { list-style-type: upper-alpha; } ol.lower-roman { list-style-type: lower-roman; } ol.upper-roman { list-style-type: upper-roman; } ul.disc { list-style-type: disc; } ul.square { list-style-type: square; } ul.circle { list-style-type: circle; } dl:is(.description-list, .glossary) { margin: 0; } dl:is(.description-list, .glossary) dt { font-weight: bold; max-width: 55ex; } dl:is(.description-list, .glossary) dd::after { content: ""; display: block; clear: both; } .para > dl:is(.description-list) { margin-top: 0.5em; margin-bottom: 0.5em; } dl.glossary dt { margin-top: 1.25em; } dl.glossary dt:first-of-type { margin-top: 0; } dl.glossary dd { margin-left: 5ex; } dl.description-list dt, dl.description-list dd { margin-top: 1em; } dl.description-list dt:first-of-type, dl.description-list dd:first-of-type { margin-top: 0; } dl.description-list dt { float: left; clear: both; text-align: right; width: 18ex; margin-right: 1ex; } dl.description-list dd { margin-left: 22ex; } dl.description-list.narrow dt { width: 11ex; } dl.description-list.narrow dd { margin-left: 15ex; } dl.description-list.wide dt { width: 25ex; } dl.description-list.wide dd { margin-left: 29ex; } dl.description-list dt:first-of-type { clear: none; } .description-list + * { clear: both; } dl.description-list dl dt { width: 8ex; } dl.description-list dd dd { margin-left: 18ex; } dl.description-list dl dd { margin-left: 12ex; } @media screen and (max-width: 480px) { dl.description-list dt, dl.description-list.narrow dt { float: none; margin-left: 0; text-align: left; width: 25ex; } dl.description-list dd, dl.description-list.narrow dd, dl.description-list.wide dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } .cols2 > li { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > li { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > li { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > li { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > li { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .ptx-content li { margin-top: 0.5em; } .ptx-content li .li--heading-title { font-size: 100%; font-weight: normal; font-style: italic; } .para > :is(ol, ul) { margin-top: 0.5em; margin-bottom: 0.5em; } ol > li { padding-left: 0.25em; } .fillin { display: inline-block; border: none; border-width: 1px; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; } .fillin.underline { border-bottom-style: solid; border-width: 1px; } .fillin.box { outline: 1px solid var(--body-text-color); height: 1.3em; } .fillin.shade { background-color: var(--fillin-background-color, #eee); height: 1.3em; } :root.dark-mode { --fillin-background-color: #444; } .heading:is(h1, h2, h3, h4, h5, h6) { margin: 0; font-size: unset; } .heading { line-height: 1.1; font-family: var(--font-headings); font-weight: 700; margin-top: 0; margin-bottom: 0; } section > .heading { font-size: 1.75em; color: var(--body-title-color); line-height: 1.25em; margin-top: 2.5em; margin-bottom: 0.5em; } section > .heading + * { margin-top: 0.5em; } .ptx-content > section > .heading { margin-top: 0.5em; } section section > .heading { font-size: 1.5em; margin-top: 2em; } section section section > .heading { font-size: 1.4em; margin-top: 2em; } article > .heading { font-size: 1.25em; margin-top: 1.5em; } article > .heading + * { margin-top: 0.5em; } .paragraphs > .heading { font-size: 1.125em; } :is(section, article) > .heading + :is(section, article) > .heading { margin-top: 0.5em; } @media screen and (max-width: 480px) { section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } section section > .heading { font-size: 1.3em; line-height: 1.15em; } section section section > .heading { font-size: 1.15em; line-height: 1em; } } .heading.hide-type > .type { display: none; } a { color: var(--link-text-color); text-decoration: none; } a:hover, a:focus { text-decoration: none; } a[href^="mailto:"] { white-space: pre; } .ptx-content a.internal { color: var(--link-text-color); font-weight: bold; } .ptx-content a.external { color: var(--link-alt-text-color); font-weight: bold; } .ptx-content a.internal:hover, .ptx-content a.internal:hover *, .ptx-content a.internal:focus, .ptx-content a.internal:focus * { color: var(--link-active-text-color); background-color: var(--link-active-background); font-weight: bold; } .ptx-content a.external:hover, .ptx-content a.external:hover *, .ptx-content a.external:focus, .ptx-content a.external:focus * { color: var(--link-alt-active-text-color); background-color: var(--link-alt-active-background); font-weight: bold; } .ptx-content table { border-spacing: 0; border-collapse: collapse; } .ptx-content td { padding: 2px 5px; font-size: 90%; } .ptx-content td img { max-width: 200px; margin-right: 30px; } .ptx-content th { padding: 2px 5px; } .ptx-content th .lines { white-space: nowrap; } .ptx-content th.l { text-align: left; } .ptx-content th.c { text-align: center; } .ptx-content th.r { text-align: right; } .ptx-content th.j { text-align: justify; } .ptx-content th.t { vertical-align: top; } .ptx-content th.b { vertical-align: bottom; } .ptx-content th.m { vertical-align: middle; } .ptx-content th.l0 { border-left: none; } .ptx-content th.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content th.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content th.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content th.r0 { border-right: none; } .ptx-content th.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content th.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content th.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content th.t0 { border-top: none; } .ptx-content th.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content th.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content th.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content th.b0 { border-bottom: none; } .ptx-content th.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content th.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content th.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content td .lines { white-space: nowrap; } .ptx-content td.l { text-align: left; } .ptx-content td.c { text-align: center; } .ptx-content td.r { text-align: right; } .ptx-content td.j { text-align: justify; } .ptx-content td.t { vertical-align: top; } .ptx-content td.b { vertical-align: bottom; } .ptx-content td.m { vertical-align: middle; } .ptx-content td.l0 { border-left: none; } .ptx-content td.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content td.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content td.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content td.r0 { border-right: none; } .ptx-content td.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content td.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content td.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content td.t0 { border-top: none; } .ptx-content td.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content td.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content td.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content td.b0 { border-bottom: none; } .ptx-content td.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content td.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content td.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content th.r0.l0, .ptx-content td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content tr.header-vertical th { writing-mode: vertical-rl; transform: rotate(180deg); padding-top: 5px; } .ptx-content .center table { text-align: center; margin-left: auto; margin-right: auto; } .tabular-box { margin-top: 0.5em; overflow-x: auto; } .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } table.notation-list tr th { text-align: left; margin-left: 1em; } table.notation-list tr td { text-align: left; vertical-align: top; } .frontmatter > .heading { display: block; text-align: center; } .frontmatter > .heading .title, .frontmatter .book > .heading .title { font-size: 1.3em; } .frontmatter > .heading .subtitle, .frontmatter .book > .heading .subtitle { display: block; font-weight: normal; color: var(--byline-color); font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .frontmatter > .para:first-of-type { margin-top: 4em; } .frontmatter > .author, .frontmatter > .credit { margin-top: 2em; text-align: center; } .frontmatter .author:first-of-type { margin-top: 4em; } .frontmatter > .author .author-name { font-size: 120%; } .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .frontmatter .credit .title { font-size: 1em; } .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .frontmatter .author-info { font-size: 90%; } .frontmatter .summary-links { margin-top: 4em; } .frontmatter .abstract { margin: 4em 2em; } .frontmatter .keywords, .frontmatter .support { margin-top: 2em; } .frontmatter .abstract > .title, .frontmatter .keywords > .title, .frontmatter .support > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .frontmatter .abstract > .title::after, .frontmatter .keywords > .title::after, .frontmatter .support > .title::after { content: ".\2009\2009\2009"; } .frontmatter .abstract > .title + .para, .frontmatter .keywords > .title + .para, .frontmatter .support > .title + .para { display: inline; } .frontmatter .colophon .copyright { margin-top: 2.5em; } .frontmatter .colophon .license { margin-top: 2.5em; } .ptx-content .summary-links { font-family: var(--font-headings); display: block; margin-top: 1em; } .ptx-content .summary-links a { color: var(--summary-link-text-color); background: var(--summary-link-background); font-size: 1.5em; line-height: 1.25em; padding: 10px 20px; padding-right: 60px; border-radius: 3px; position: relative; display: block; font-weight: unset; } .ptx-content .summary-links a .title { font-style: normal; } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a::after { right: 0.83333em; content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid var(--summary-link-text-color); } .ptx-content .summary-links a:hover { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover * { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover .title { font-weight: normal; } .ptx-content .summary-links a:hover::after { border-left: 0.4em solid var(--summary-link-hover-text-color); } .ptx-content .summary-links ul { list-style-type: none; padding: 0; margin-top: 0; } .ptx-content .summary-links li { margin-top: 5px; } @media screen and (width <= 480px) { .ptx-content .summary-links a { font-size: 100%; line-height: 1.25em; } } .ptx-footnote { display: inline-block; position: relative; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: smaller; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote[open] .ptx-footnote__number sup { display: none; } .ptx-footnote__number { display: inline-block; cursor: pointer; min-width: 1em; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowl-background); border-radius: 0px; padding: 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowl-border-color); color: var(--body-text-color); font-weight: normal; font-size: var(1rem); } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: var(--activated-content-bg); } .indexitem { margin-top: 4px; } .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .indexknowl { margin-left: 0.11em; } em + .indexknowl { margin-left: -0.25em; } .indexknowl a { margin-left: 2em; } .indexitem .see, .subindexitem .see, .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .indexitem .seealso, .subindexitem .seealso, .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .indexitem .see em, .subindexitem .see em, .subsubindexitem .see em, .indexitem .seealso em, .subindexitem .seealso em, .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .indexitem .see + .see, .subindexitem .see + .see, .subsubindexitem .see + .see, .indexitem .seealso + .seealso, .subindexitem .seealso + .seealso, .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .indexitem .indexknowl { font-size: 90%; } .indexitem [data-knowl], .subindexitem [data-knowl], .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .indexknowl [data-knowl]:hover, .indexknowl .active[data-knowl] { margin-left: 2em; } .subindexitem .indexknowl { font-size: 95%; } .subsubindexitem .indexknowl { font-size: 95%; } .indexletter { margin-top: 1.5em; } .image-box, .audio-box, .video-box, .asymptote-box { position: relative; } .image-box .asymptote-box iframe.asymptote, iframe.asymptote, .video-box .video, .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .image-box img, img.contained { width: 100%; } .asymptote-fullsize-link { text-align: center; font-size: 0.9em; } .ptx-content img, .ptx-content svg { background: var(--ptx-image-bg); } .mermaid > svg { background: none; } .image-description summary { list-style: none; cursor: pointer; } .image-archive { margin: 0.75em auto 0; font-family: var(--font-monospace); justify-content: center; display: flex; gap: 0.5em; } .image-box > img:not(.mag_popup) { cursor: zoom-in; } img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; } .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .audio { width: 100%; } .video-poster { cursor: pointer; } figure { clear: both; position: relative; margin-left: 0; margin-right: 0; } figcaption { margin-left: auto; margin-right: auto; margin-top: 0.5em; } figcaption code.code-inline { white-space: pre; } figcaption .codenumber, figcaption .type { font-weight: 700; } figcaption .codenumber::after, figcaption .type:last-of-type::after { content: "\2002"; } figcaption .para:first-of-type { display: inline; } figure.table-like { margin-left: 30px; margin-right: 30px; } figure.table-like .list { margin-right: 0; } @media (max-width <= 943px) { .figure-like { overflow-x: auto; } } .poem { display: table; margin: 0 auto; width: auto; max-width: 90%; } .poem > .heading { display: block; text-align: center; } section article.poem > .heading::after { content: ""; } .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .poem .author { font-style: italic; margin-top: 0.75em; } .poem .author.left { text-align: left; } .poem .author.center { text-align: center; } .poem .author.right { text-align: right; } .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .poem .stanza + .stanza { margin-top: 1em; } .poem .heading + .stanza { margin-top: 0.2em; } .poem .heading + .line { margin-top: 0.2em; } .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .poem .line.center { text-align: center; } .poem .line.right { text-align: right; } .poem .tab { margin-left: 2em; } pre[class*=language-] { margin: 0; overflow: auto; border: 1px solid #e1e1e1; } :not(pre) > code[class*=language-] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } code[class*=language-], pre[class*=language-] { color: black; background: #fdfdfd; text-shadow: none; font-family: var(--font-monospace); text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.2; tab-size: 4; hyphens: none; } code[class*=language-].code-inline, pre[class*=language-].code-inline { line-height: normal; padding: 0.0625em 0.15em; } code[class*=language-]::selection, code[class*=language-] ::selection, pre[class*=language-]::selection, pre[class*=language-] ::selection { background: #b3d4fc; } code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #2a9716; } code[class*=language-] .token.punctuation, pre[class*=language-] .token.punctuation { color: #000; } code[class*=language-] .token.namespace, pre[class*=language-] .token.namespace { opacity: 0.9; } code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: rgb(41, 120, 15); } code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #a11; } code[class*=language-] .token:is(.operator, .entity, .url), pre[class*=language-] .token:is(.operator, .entity, .url) { color: #000; background: none; } code[class*=language-] .token:is(.atrule, .attr-value, .keyword), pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #0679B7; } code[class*=language-] .token.function, code[class*=language-] .token.class-name, pre[class*=language-] .token.function, pre[class*=language-] .token.class-name { color: #30a; } code[class*=language-] .token.important, code[class*=language-] .token.variable, pre[class*=language-] .token.important, pre[class*=language-] .token.variable { color: rgb(0, 0, 0); } code[class*=language-] .token.important, code[class*=language-] .token.bold, pre[class*=language-] .token.important, pre[class*=language-] .token.bold { font-weight: bold; } code[class*=language-] .token.italic, pre[class*=language-] .token.italic { font-style: italic; } code[class*=language-] .token.entity, pre[class*=language-] .token.entity { cursor: help; } code[class*=language-].line-numbers, pre[class*=language-].line-numbers { position: relative; padding-left: 3.8em; counter-reset: linenumber; overflow: auto; } code[class*=language-].line-numbers > code, pre[class*=language-].line-numbers > code { position: relative; white-space: inherit; } code[class*=language-].line-numbers .line-numbers-rows, pre[class*=language-].line-numbers .line-numbers-rows { position: absolute; pointer-events: none; top: 0; font-size: 100%; left: -3.8em; width: 3em; letter-spacing: -1px; border-right: 1px solid #999; user-select: none; } code[class*=language-].line-numbers .line-numbers-rows > span, pre[class*=language-].line-numbers .line-numbers-rows > span { display: block; counter-increment: linenumber; } code[class*=language-].line-numbers .line-numbers-rows > span::before, pre[class*=language-].line-numbers .line-numbers-rows > span::before { content: counter(linenumber); color: #999; display: block; padding-right: 0.8em; text-align: right; } code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { position: absolute; margin-top: 4px; left: 0; right: 0; padding: inherit 0; font-size: inherit; background: hsla(24, 20%, 50%, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } :root.dark-mode { } :root.dark-mode pre[class*=language-] { border: 1px solid #3d3d3d; } :root.dark-mode code[class*=language-], :root.dark-mode pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } :root.dark-mode code[class*=language-]::selection, :root.dark-mode code[class*=language-] ::selection, :root.dark-mode pre[class*=language-]::selection, :root.dark-mode pre[class*=language-] ::selection { background: hsl(200, 4%, 16%); } :root.dark-mode code[class*=language-] .token, :root.dark-mode pre[class*=language-] .token { position: relative; z-index: 1; } :root.dark-mode code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), :root.dark-mode pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #68a950; } :root.dark-mode code[class*=language-] .token.punctuation, :root.dark-mode pre[class*=language-] .token.punctuation { color: white; opacity: 1; } :root.dark-mode code[class*=language-] .token.namespace, :root.dark-mode pre[class*=language-] .token.namespace { opacity: 0.9; } :root.dark-mode code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), :root.dark-mode pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: #abc792; } :root.dark-mode code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), :root.dark-mode pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #ca9147; } :root.dark-mode code[class*=language-] .token:is(.operator, .entity, .url), :root.dark-mode pre[class*=language-] .token:is(.operator, .entity, .url) { color: white; } :root.dark-mode code[class*=language-] .token:is(.atrule, .attr-value, .keyword), :root.dark-mode pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #2d94fb; } :root.dark-mode code[class*=language-] .token.function, :root.dark-mode code[class*=language-] .token.class-name, :root.dark-mode pre[class*=language-] .token.function, :root.dark-mode pre[class*=language-] .token.class-name { color: #e3e1c2; } :root.dark-mode code[class*=language-] .token.important, :root.dark-mode code[class*=language-] .token.bold, :root.dark-mode pre[class*=language-] .token.important, :root.dark-mode pre[class*=language-] .token.bold { font-weight: bold; } :root.dark-mode code[class*=language-] .token.italic, :root.dark-mode pre[class*=language-] .token.italic { font-style: italic; } :root.dark-mode code[class*=language-] .token.entity, :root.dark-mode pre[class*=language-] .token.entity { cursor: help; } :root.dark-mode .line-highlight { background: hsla(0, 0%, 33%, 0.1); border-bottom: 1px dashed hsl(0, 0%, 33%); border-top: 1px dashed hsl(0, 0%, 33%); z-index: 0; } @media print { code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { color-adjust: exact; } } .displaymath { overflow-x: auto; overflow-y: hidden; } .displaymath mjx-container[jax=CHTML][display=true] { margin: 0 0 0 0; padding-top: 0.3em; } .process-math mjx-container svg { background: none; } [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .knowl mjx-mtext > mjx-utext, mjx-mtext > mjx-utext { width: revert !important; } mjx-msup mjx-utext, mjx-msub mjx-utext { display: inline; } em.alert { font-weight: bold; } .bib { margin-top: 0.25em; } .bib .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .bib .bibitem + .bibentry { display: inline-block; width: 90%; margin-top: 0; } .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .contributor { margin-top: 1.5ex; } .contributor:first-child { margin-top: 0em; } .contributor + .para { margin-top: 3ex; } .contributor .contributor-name { font-variant: small-caps; } .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } iframe { margin: 0; border: none; } .kbdkey { background: #f1f1f1; color: #333; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .unit, .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .unit sub, .unit sup, .quantity sub, .quantity sup { word-spacing: normal; } .terminology { font-style: italic; font-weight: bold; } .times-sign { font-size: larger; vertical-align: -0.15ex; } .emphasis { font-style: italic; } .emphasis .emphasis { font-weight: bold; } .definition-like .emphasis { font-weight: 700; } article.theorem-like .emphasis { font-weight: 700; } .para { line-height: 1.35; } .hidden { display: none !important; } .taxon { font-style: italic; } .quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .booktitle { font-style: oblique; } .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; } .ptx-page, .ptx-main, .ptx-main .ptx-content { all: unset !important; width: 100%; border: none; padding: 0; margin: 0; } .ptx-sagecell, .tabular, .table-like, .figure-like, .exercise-like { break-inside: avoid; } .heading { break-after: avoid; } .code-inline { border: unset; background: unset; } @page { margin: 0.75in 0.75in 0.75in 0.75in; } } .heading .print-links { float: right; position: relative; z-index: 100; vertical-align: bottom; } .heading .print-links .print-link { font-family: var(--font-body); padding: 0.1em 0.2em; } .heading .print-links .material-symbols-outlined { margin-top: 5pt; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .pretext .searchwrapper .cse .gsc-control-cse input, .searchwrapper .gsc-control-cse { padding: 5px; } .searchbox .searchwidget { height: 100%; } .searchbox .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; padding: 1em; left: max(10vw, (100vw - 800px) / 2); width: 80vw; max-width: 800px; border: 2px solid var(--body-text-color); background: var(--knowl-background, #eaf0f6); z-index: 5000; display: flex; flex-direction: column; } .searchbox .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; height: 35px; } .searchbox .ptxsearch { flex: 1 1; } .searchbox .closesearchresults { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .searchbox .closesearchresults:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .searchbox .closesearchresults:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .searchbox .closesearchresults.disabled { opacity: 0.4; cursor: not-allowed; } .searchbox .closesearchresults.hidden { display: none; } .searchbox .closesearchresults.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .searchbox .detailed_result { margin-bottom: 10px; } .searchbox .searchresults a:hover { text-decoration: underline; background: var(--link-active-background); } .searchbox .searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; background: var(--content-background, white); border: 1px solid var(--page-border-color, #ccc); } .searchbox .searchresults:empty { display: none; } .searchbox .search-result-bullet { list-style-type: none; } .searchbox .search-result-score { display: none; } .searchbox .no_result { font-size: 90%; font-weight: 200; } .searchbox .low_result { font-weight: 200; } .searchbox .medium_result { font-weight: 500; } .searchbox .high_result { font-weight: 700; } .searchbox .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .searchbox .search-results-unshown-count { margin-top: 0.6em; } .searchbox .search-result-clip-highlight { background: var(--searchresultshighlight); } .searchbox .searchresultsbackground { position: fixed; top: 0; background: var(--searchresultsbackground, white); width: 100vw; height: 100%; left: 0; z-index: 4999; } @media screen and (max-width: 800px) { .searchbox .searchresultsplaceholder { bottom: 10vh; } } :root { --searchresultsbackground: #fff8; --searchresultshighlight: rgba(255, 255, 0, 50%); } :root.dark-mode { --searchresultsbackground: #0008; --searchresultshighlight: rgba(255, 255, 0, 15%); } .ptx-content .ptx-runestone-container .runestone { margin: unset; border-radius: 0; border-width: 1px; } .multiplechoice_section label > .para { display: inline; } .ptx-content .ptx-runestone-container .ac_question { max-width: var(--base-content-width); margin: 0 auto 10px; } .runestone .runestone_caption { display: none; } .ptx-content .ptx-runestone-container .rsdraggable { font-size: 100%; } .ptx-content .bottom { position: unset; } .ptx-runestone-container .runestone code, .ptx-runestone-container .runestone pre { font-size: 0.93rem; line-height: 1.2; font-family: var(--font-monospace); } .ptx-runestone-container code[class*=language-], .ptx-runestone-container pre[class*=language-] { color: black; background: #fdfdfd; } .runestone.datafile .datafile_caption { background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); display: block; width: fit-content; margin: 0 auto; } .runestone.datafile img { margin: 0 auto; display: block; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); } .runestone.datafile pre, .runestone.datafile textarea { margin: 0 auto; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); background-color: var(--page-color); } .runestone.datafile + .program { margin-top: 0; } ul[data-component=timedAssessment] { margin: 0; padding: 0; } :root.dark-mode .ptx-runestone-container code[class*=language-], :root.dark-mode .ptx-runestone-container pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } @layer spacing { .runestone :is(.exercise-statement, .exercise-content) > *:not(:first-child) { margin-top: 1em; } .ptx-runestone-container + .solutions { margin-top: 0.5em; } } .interactive-iframe-container { max-width: 100%; overflow: auto; } .interactive-iframe-container > iframe { margin-left: auto; margin-right: auto; display: block; } .interactive__instructions { max-width: var(--base-content-width); } .standalone-page .interactive-iframe-container { margin-left: auto; margin-right: auto; } .standalone-page .interactive__instructions { margin: 5px auto 20px; } .interactive-iframe-container__opener { display: block; margin-right: 5px; margin-top: 11px; margin-bottom: 5px; font-size: 0.8rem; } .interactive-iframe-container__opener .icon { font-size: 18px; } .interactive-iframe-container__opener:has(+ figcaption, + .instructions) { float: left; z-index: 1; position: relative; } .interactive-iframe-container__opener + .instructions + figcaption { clear: left; } .interactive-iframe-container__opener + .instructions { margin-top: 0.5em; } .clipboardable { position: relative; display: flow-root; } .clipboardable .code-copy { position: absolute; right: 0; top: 0; opacity: 0.25; border-width: 0; background: none; cursor: pointer; z-index: 1; white-space-collapse: collapse; padding: 1px; scale: 0.85; } .clipboardable .code-copy:hover { opacity: 0.7; } .clipboardable .code-copy .checkmark { display: none; } .clipboardable .code-copy.copied { opacity: 1; color: mediumseagreen; cursor: not-allowed; pointer-events: none; } .clipboardable .code-copy.copied .copyicon { display: none; } .clipboardable .code-copy.copied .checkmark { display: inline; } .clipboardable:has(.code-display) { margin: 0.25em 0; } .clipboardable:has(.code-display) .code-display { margin: 0; padding: 0.25em 0; } .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } label.feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } .exercise-wrapper > *:not(:first-child) { margin-top: 1.5em; } .ptx-content .problem-buttons { display: flex; } .ptx-content .webwork-button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-content .webwork-button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content .webwork-button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-content .webwork-button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-content .webwork-button.hidden { display: none; } .ptx-content .webwork-button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .problem-buttons.hidden-content, .problem-contents.hidden-content { display: none; } .sagecell_sessionOutput pre { font-family: var(--font-monospace); } .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .sage-interact.sagecell { margin: 0; } .sagecell_evalButton { font-family: var(--font-body); font-size: 16px; padding: 0 0.65em; } .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .sagecell_evalButton:focus, .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .sagecell .sagecell_editor { margin-bottom: 8px; } .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .sageanswer .output { display: inline-block; vertical-align: top; } .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } section, article, li, blockquote, figcaption, dt, .exercisegroup, .discussion-like, .solution-like, .para { position: relative; } .autopermalink { position: absolute; display: inline-block; top: 0.5ex; left: -2em; font-size: 85%; opacity: var(--permalink-opacity, 0); transition: opacity 0.2s; margin-top: 0 !important; user-select: none; } li > .autopermalink { left: -3.5em; } .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } .appendix > .autopermalink, .chapter > .autopermalink, .index > .autopermalink, .section > .autopermalink, .subsection > .autopermalink, .references > .autopermalink, .exercises > .autopermalink { top: 1.5ex; } .assemblage-like > .para > .autopermalink, .example-like > .para > .autopermalink, .example-like > .exercise-like > .autopermalink, .project-like > .para > .autopermalink, .project-like > .exercise-like > .autopermalink, .project-like > .exercise-like > .introduction > .para > .autopermalink, .project-like > .exercise-like > .conclusion > .para > .autopermalink, .remark-like > .para > .autopermalink { left: -2.9em; } .axiom-like > .para:first-of-type > .autopermalink, .example-like > .para:first-of-type > .autopermalink, .exercise-like > .para:first-of-type > .autopermalink, .solution-like > .para:first-of-type > .autopermalink, .assemblage-like > .para:first-of-type > .autopermalink, .definition-like > .para:first-of-type > .autopermalink, .remark-like > .para:first-of-type > .autopermalink, .project-like > .para:first-of-type > .autopermalink, .openproblem-like > .para:first-of-type > .autopermalink, .computation-like > .para:first-of-type > .autopermalink, .theorem-like > .para:first-of-type > .autopermalink, .proof > .para:first-of-type > .autopermalink, .case > .para:first-of-type > .autopermalink, li > .para:first-of-type > .autopermalink, dd > .para:first-of-type > .autopermalink { display: none; } .axiom-like > .introduction > .para:first-of-type > .autopermalink, .example-like > .introduction > .para:first-of-type > .autopermalink, .exercise-like > .introduction > .para:first-of-type > .autopermalink, .solution-like > .introduction > .para:first-of-type > .autopermalink, .assemblage-like > .introduction > .para:first-of-type > .autopermalink, .definition-like > .introduction > .para:first-of-type > .autopermalink, .remark-like > .introduction > .para:first-of-type > .autopermalink, .project-like > .introduction > .para:first-of-type > .autopermalink, .openproblem-like > .introduction > .para:first-of-type > .autopermalink, .computation-like > .introduction > .para:first-of-type > .autopermalink, .theorem-like > .introduction > .para:first-of-type > .autopermalink, .proof > .introduction > .para:first-of-type > .autopermalink, .case > .introduction > .para:first-of-type > .autopermalink, li > .introduction > .para:first-of-type > .autopermalink, dd > .introduction > .para:first-of-type > .autopermalink { display: none; } .ptx-content:has(.autopermalink:hover) .autopermalink { opacity: 0.2; } .ptx-content:has(.autopermalink:hover) .autopermalink:hover { opacity: 1; } .autopermalink:has(a:focus-visible) { opacity: 1; } .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: var(--content-background); border: 3px solid var(--page-border-color); z-index: 2001; } :target { scroll-margin-top: 45px; animation: target-fade 10s 1; } @keyframes target-fade { 0% { background-color: var(--activated-content-bg); } 100% { background-color: inherit; opacity: 1; } } :root { --font-body: Open Sans, Helvetica Neue, Helvetica, Arial, sans-serif; } :root { --font-headings: Noto Sans, Helvetica Neue, Helvetica, Arial, sans-serif; } :root { --font-monospace: Inconsolata, Consolas, Monaco, monospace; } :root { --font-print: PT Serif, Times New Roman, Times, serif; } section > .heading { padding-bottom: 3px; border-bottom: 2px solid var(--primary-color-white-30); } section > h2.heading { border-bottom-width: 4px; } section > h3.heading { border-bottom-width: 3px; } :root.dark-mode section > .heading { border-bottom-color: var(--primary-color-black-30); } .hide-type .codenumber:not(:empty)::after { content: " -"; } :is(.chapter, .section, .subsection, .subsubsection) > .tabular-box, :is(.chapter, .section, .subsection, .subsubsection) > .table > .tabular-box { overflow-x: auto; } @container ptx-main (width > 821px) { :is(.chapter, .section, .subsection, .subsubsection) > .tabular-box, :is(.chapter, .section, .subsection, .subsubsection) > .table > .tabular-box { --max-width: calc(min((100cqw - 2 * 48px), 10000px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); margin-left: calc(-0.5 * (100cqw - 821px)); } } figure.table-like { margin-left: 0px; margin-right: 0px; } @container ptx-main (width > 821px) { .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { --max-width: calc(min((100cqw - 2 * 48px), 10000px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); margin-left: calc(-0.5 * (100cqw - 821px)); } } .ptx-runestone-container .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; min-width: 100%; margin-left: auto; } @container ptx-main (width > 821px) { :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { --max-width: calc(min((100cqw - 2 * 48px), 10000px)); min-width: 100%; clear: right; width: var(--max-width); max-width: var(--max-width); margin-left: calc(-0.5 * (100cqw - 821px)); } } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; margin-left: auto; } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content) .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; margin-left: 0; } .runestone.ac_section > div > div > *:not(.ac_code_div):not(.ac_output):not(.codelens):not(.ac_actions) { max-width: 725px; margin-left: auto; margin-right: auto; } .runestone .exercise-statement { max-width: 725px; margin-left: auto; margin-right: auto; } .hparsons_section .hp_question, .hparsons_section .hp_feedback { max-width: 725px; margin-left: auto; margin-right: auto; } .runestone.parsons_section > .parsons { width: 100%; padding-right: 0; } .runestone.parsons_section > .parsons .sortable-code-container { display: flex; flex-flow: wrap; justify-content: center; gap: 15px; margin: 10px auto; } .runestone.parsons_section > .parsons .sortable-code { margin: 0; } .runestone.parsons_section > .parsons .runestone_caption_text { max-width: unset; } .runestone.parsons_section > .parsons > div > *:not(.sortable-code-container) { max-width: 725px; margin-left: auto; margin-right: auto; } @container ptx-main (width < 850px) { .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100cqw; margin-left: calc(-0.5 * (100cqw - 100%)); } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content):has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100cqw; margin-left: calc(-0.5 * (100cqw - 100%)); } :is(.timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content) .ptx-runestone-container:has(.ac_section, .codelens, .parsons_section, .hparsons_section, .datafile) { width: 100%; margin-left: -5px; } } body.pretext { font-size: var(--content-font-size); } :root { --content-font-size: 1.1rem; --auto-collapse-toc: yes; } @media screen and (width < 800px) { body.pretext { font-size: 1rem; } } :root { color-scheme: light; } :root:not(.dark-mode) { --page-color: white; --content-background: white; --page-border-color: #ccc; --doc-title-color: var(--primary-color); --byline-color: #333; --banner-background: #f8f8f8; --navbar-background: var(--primary-color); --footer-background: var(--banner-background); --toc-border-color: #666; --toc-background: var(--content-background); --tocitem-background: var(--toc-background); --toc-text-color: var(--primary-color-black-30); --tocitem-highlight-background: #3a3a3a; --tocitem-highlight-text-color: #fff; --tocitem-highlight-border-color: #3a3a3a; --tocitem-active-background: var(--primary-color-white-15); --tocitem-active-text-color: white; --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--content-background); --toclevel1-text-color: var(--toc-text-color); --toclevel2-background: var(--primary-color-white-98); --toclevel2-text-color: var(--toc-text-color); --toclevel3-background: var(--primary-color-white-96); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #000; --body-title-color: var(--primary-color-black-20); --ptx-image-bg: transparent; --activated-content-bg: rgba(241, 185, 255, 0.3); --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color); --link-background: transparent; --link-active-text-color: var(--primary-color); --link-active-background: var(--primary-color-white-96); --link-alt-text-color: var(--link-text-color); --link-alt-background: transparent; --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--primary-color-white-96); --knowl-link-color: var(--link-text-color); --knowl-background: #f2f5f7; --knowl-border-color: #577390; --knowl-nested-1-background: #e5edf5; --knowl-nested-2-background: #f2f5f7; --knowl-nested-3-background: #e5edf5; --knowl-nested-4-background: #f2f5f7; --block-body-background: #f2f5f7; --block-border-color: #577390; --block-head-color: black; --aside-like-link-color: var(--link-text-color); --button-background: var(--primary-color); --button-text-color: var(--primary-color-white-90); --button-border-color: #3a3a3a; --button-hover-background: #3a3a3a; --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: #fdfdfd; --code-inline-background: #ededed; --assemblage-like-body-background: var(--block-body-background); --assemblage-like-border-color: var(--block-border-color); --definition-like-body-background: #eef7fb; --definition-like-border-color: #0f80b0; --theorem-like-body-background: #eef7fb; --theorem-like-border-color: #0f80b0; --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: #f8f2f2; --remark-like-border-color: #a13838; --computation-like-body-background: #eef7fb; --computation-like-border-color: #0f80b0; --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--block-body-background); --aside-like-border-color: var(--block-border-color); --proof-like-body-background: #eef7fb; --proof-like-border-color: #0f80b0; --example-like-body-background: whitesmoke; --example-like-border-color: hsl(208, 7%, 49%); --project-like-body-background: whitesmoke; --project-like-border-color: hsl(208, 7%, 49%); --goal-like-body-background: #f8f2f2; --goal-like-border-color: #a13838; --solution-like-body-background: whitesmoke; --solution-like-border-color: hsl(208, 7%, 49%); --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); --primary-color: hsl(210, 45%, 27%); --toc-border: var(--primary-color-gray-10); --color-main: hsl(210, 45%, 27%); --color-meta: #a13838; --color-do: hsl(208, 7%, 49%); --color-fact: #0f80b0; --exercise-like-body-background: whitesmoke; --exercise-like-border-color: hsl(208, 7%, 49%); --asside-like-body-background: #f8f2f2; --asside-like-border-color: #a13838; } :root.dark-mode { color-scheme: dark; --page-color: var(--background-color); --content-background: var(--page-color); --page-border-color: var(--background-color-white-25); --doc-title-color: var(--primary-color); --byline-color: var(--background-color-white-50); --banner-background: #23241f; --navbar-background: var(--background-color-gray-15); --footer-background: var(--background-color-black-10); --toc-border-color: #555; --toc-background: var(--content-background); --tocitem-background: var(--toc-background); --toc-text-color: var(--body-text-color); --tocitem-highlight-background: var(--primary-color-gray-5); --tocitem-highlight-text-color: var(--background-color-black-50); --tocitem-highlight-border-color: var(--toc-border-color); --tocitem-active-background: var(--primary-color-gray-5); --tocitem-active-text-color: var(--background-color-black-50); --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--background-color-gray-10); --toclevel1-text-color: var(--primary-color-white-40); --toclevel2-background: var(--toclevel1-background); --toclevel2-text-color: var(--toclevel1-text-color); --toclevel3-background: var(--content-background); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #f2f2f2; --body-title-color: var(--primary-color-white-20); --ptx-image-bg: white; --activated-content-bg: rgba(255, 237, 185, 0.2); --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color-white-10); --link-background: transparent; --link-active-text-color: var(--primary-color-white-40); --link-active-background: var(--background-color-gray-30); --link-alt-text-color: var(--link-text-color); --link-alt-background: transparent; --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--link-active-text-color); --knowl-link-color: var(--doc-title-color); --knowl-background: var(--background-color-black-10); --knowl-border-color: var(--background-color-white-20); --knowl-nested-1-background: var(--background-color-gray-10); --knowl-nested-2-background: var(--background-color-black-10); --knowl-nested-3-background: var(--background-color-gray-10); --knowl-nested-4-background: var(--background-color-black-10); --block-body-background: var(--content-background); --block-border-color: var(--knowl-border-color); --block-head-color: var(--body-text-color); --aside-like-link-color: var(--link-text-color); --button-background: var(--background-color-gray-15); --button-text-color: var(--body-text-color); --button-border-color: var(--background-color-white-25); --button-hover-background: var(--primary-color-black-50); --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: var(--background-color-gray-20); --code-inline-background: var(--background-color-gray-20); --assemblage-like-body-background: var(--block-body-background); --assemblage-like-border-color: var(--block-border-color); --definition-like-body-background: var(--block-body-background); --definition-like-border-color: var(--block-border-color); --theorem-like-body-background: var(--block-body-background); --theorem-like-border-color: var(--block-border-color); --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: var(--block-body-background); --remark-like-border-color: var(--block-border-color); --computation-like-body-background: var(--block-body-background); --computation-like-border-color: var(--block-border-color); --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--block-body-background); --aside-like-border-color: var(--block-border-color); --proof-like-body-background: var(--block-body-background); --proof-like-border-color: var(--block-border-color); --example-like-body-background: var(--block-body-background); --example-like-border-color: var(--block-border-color); --project-like-body-background: var(--block-body-background); --project-like-border-color: var(--block-border-color); --goal-like-body-background: var(--block-body-background); --goal-like-border-color: var(--block-border-color); --solution-like-body-background: var(--block-body-background); --solution-like-border-color: var(--block-border-color); --primary-color: #9db9d3; --background-color: #23241f; --background-color-white-1: color-mix(in oklab, var(--background-color), white 1%); --background-color-white-2: color-mix(in oklab, var(--background-color), white 2%); --background-color-white-3: color-mix(in oklab, var(--background-color), white 3%); --background-color-white-4: color-mix(in oklab, var(--background-color), white 4%); --background-color-white-5: color-mix(in oklab, var(--background-color), white 5%); --background-color-white-10: color-mix(in oklab, var(--background-color), white 10%); --background-color-white-15: color-mix(in oklab, var(--background-color), white 15%); --background-color-white-20: color-mix(in oklab, var(--background-color), white 20%); --background-color-white-25: color-mix(in oklab, var(--background-color), white 25%); --background-color-white-30: color-mix(in oklab, var(--background-color), white 30%); --background-color-white-35: color-mix(in oklab, var(--background-color), white 35%); --background-color-white-40: color-mix(in oklab, var(--background-color), white 40%); --background-color-white-50: color-mix(in oklab, var(--background-color), white 50%); --background-color-white-60: color-mix(in oklab, var(--background-color), white 60%); --background-color-white-65: color-mix(in oklab, var(--background-color), white 65%); --background-color-white-70: color-mix(in oklab, var(--background-color), white 70%); --background-color-white-75: color-mix(in oklab, var(--background-color), white 75%); --background-color-white-80: color-mix(in oklab, var(--background-color), white 80%); --background-color-white-85: color-mix(in oklab, var(--background-color), white 85%); --background-color-white-90: color-mix(in oklab, var(--background-color), white 90%); --background-color-white-95: color-mix(in oklab, var(--background-color), white 95%); --background-color-white-96: color-mix(in oklab, var(--background-color), white 96%); --background-color-white-97: color-mix(in oklab, var(--background-color), white 97%); --background-color-white-98: color-mix(in oklab, var(--background-color), white 98%); --background-color-white-99: color-mix(in oklab, var(--background-color), white 99%); --background-color-black-1: color-mix(in oklab, var(--background-color), black 1%); --background-color-black-2: color-mix(in oklab, var(--background-color), black 2%); --background-color-black-3: color-mix(in oklab, var(--background-color), black 3%); --background-color-black-4: color-mix(in oklab, var(--background-color), black 4%); --background-color-black-5: color-mix(in oklab, var(--background-color), black 5%); --background-color-black-10: color-mix(in oklab, var(--background-color), black 10%); --background-color-black-15: color-mix(in oklab, var(--background-color), black 15%); --background-color-black-20: color-mix(in oklab, var(--background-color), black 20%); --background-color-black-25: color-mix(in oklab, var(--background-color), black 25%); --background-color-black-30: color-mix(in oklab, var(--background-color), black 30%); --background-color-black-35: color-mix(in oklab, var(--background-color), black 35%); --background-color-black-40: color-mix(in oklab, var(--background-color), black 40%); --background-color-black-50: color-mix(in oklab, var(--background-color), black 50%); --background-color-black-60: color-mix(in oklab, var(--background-color), black 60%); --background-color-black-65: color-mix(in oklab, var(--background-color), black 65%); --background-color-black-70: color-mix(in oklab, var(--background-color), black 70%); --background-color-black-75: color-mix(in oklab, var(--background-color), black 75%); --background-color-black-80: color-mix(in oklab, var(--background-color), black 80%); --background-color-black-85: color-mix(in oklab, var(--background-color), black 85%); --background-color-black-90: color-mix(in oklab, var(--background-color), black 90%); --background-color-black-95: color-mix(in oklab, var(--background-color), black 95%); --background-color-black-96: color-mix(in oklab, var(--background-color), black 96%); --background-color-black-97: color-mix(in oklab, var(--background-color), black 97%); --background-color-black-98: color-mix(in oklab, var(--background-color), black 98%); --background-color-black-99: color-mix(in oklab, var(--background-color), black 99%); --background-color-gray-1: color-mix(in oklab, var(--background-color), gray 1%); --background-color-gray-2: color-mix(in oklab, var(--background-color), gray 2%); --background-color-gray-3: color-mix(in oklab, var(--background-color), gray 3%); --background-color-gray-4: color-mix(in oklab, var(--background-color), gray 4%); --background-color-gray-5: color-mix(in oklab, var(--background-color), gray 5%); --background-color-gray-10: color-mix(in oklab, var(--background-color), gray 10%); --background-color-gray-15: color-mix(in oklab, var(--background-color), gray 15%); --background-color-gray-20: color-mix(in oklab, var(--background-color), gray 20%); --background-color-gray-25: color-mix(in oklab, var(--background-color), gray 25%); --background-color-gray-30: color-mix(in oklab, var(--background-color), gray 30%); --background-color-gray-35: color-mix(in oklab, var(--background-color), gray 35%); --background-color-gray-40: color-mix(in oklab, var(--background-color), gray 40%); --background-color-gray-50: color-mix(in oklab, var(--background-color), gray 50%); --background-color-gray-60: color-mix(in oklab, var(--background-color), gray 60%); --background-color-gray-65: color-mix(in oklab, var(--background-color), gray 65%); --background-color-gray-70: color-mix(in oklab, var(--background-color), gray 70%); --background-color-gray-75: color-mix(in oklab, var(--background-color), gray 75%); --background-color-gray-80: color-mix(in oklab, var(--background-color), gray 80%); --background-color-gray-85: color-mix(in oklab, var(--background-color), gray 85%); --background-color-gray-90: color-mix(in oklab, var(--background-color), gray 90%); --background-color-gray-95: color-mix(in oklab, var(--background-color), gray 95%); --background-color-gray-96: color-mix(in oklab, var(--background-color), gray 96%); --background-color-gray-97: color-mix(in oklab, var(--background-color), gray 97%); --background-color-gray-98: color-mix(in oklab, var(--background-color), gray 98%); --background-color-gray-99: color-mix(in oklab, var(--background-color), gray 99%); --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); } /*! Theme: salem */ /*# sourceMappingURL=theme-salem.css.map */ ================================================ FILE: css/dist/theme-soundwriting-legacy.css ================================================ @charset "UTF-8"; /* ../../css/targets/html/legacy/soundwriting/theme-soundwriting.scss */ * { box-sizing: border-box; } body.pretext { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } body.pretext[data-font=OS] { font-family: "Open Sans", sans-serif; } body.pretext[data-font=RS] { font-family: "Roboto Serif", serif; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; } body.pretext { background: #fff; } a { color: inherit; text-decoration: none; } a:hover, a:focus { text-decoration: none; } body.pretext > a.assistive { padding: 6px; position: absolute; top: -40px; left: 0px; color: white; border-right: 1px solid white; border-bottom: 1px solid white; border-bottom-right-radius: 8px; background: transparent; z-index: 10000; } body.pretext > a.assistive:focus { top: 0px; background: #BF1722; outline: 0; transition: top 0.1s ease-in, background 0.5s linear; } nav .ptx-navbar { border-top: none; border-right: none; border-left: none; min-height: unset; } .ptx-navbar .activecode-toggle { padding: 3px 5px; } .pretext #brand-navbar, .pretext .brand-navbar { left: 0; position: fixed; right: 0; z-index: 1030; height: 50px; border-width: 0 0 1px; top: 0; margin-bottom: 0; } .pretext #brand-navbar > .container::before, .pretext .brand-navbar > .container::before, .pretext #brand-navbar > .container::after, .pretext .brand-navbar > .container::after { display: none; } .pretext #brand-navbar + .ptx-masthead, .pretext .brand-navbar + .ptx-masthead { margin-top: 50px; } .pretext #brand-navbar .navbar-collapse.collapse, .pretext .brand-navbar .navbar-collapse.collapse { overflow: hidden !important; } .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: 50px; } @media screen and (max-width: 800px) { .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: auto; } } .ptx-content section, .ptx-content article, .ptx-content figure, .ptx-content figcaption, .ptx-content .exercisegroup, .ptx-content .discussion-like, .ptx-content .para { position: relative; } .ptx-content .para > p:first-child, .ptx-content .para > .para:first-child { display: inline; } .ptx-content pre { margin: 0; padding: 0; border: none; } .ptx-content pre { border-radius: 0; } .ptx-content textarea { padding: 0; } .ptx-content h1, .ptx-content h2, .ptx-content h3, .ptx-content h4, .ptx-content h5, .ptx-content h6 { margin: 0; font-size: unset; } .pretext h1, .pretext h2, .pretext h3, .pretext h4, .pretext h5, .pretext h6 { margin: 0; font-size: unset; } .ptx-content .heading { line-height: 1.1; } .ptx-content .para { margin-top: 1.25em; margin-bottom: 0; line-height: 1.35; } .ptx-content .para.continuation { margin-top: 0; } .ptx-content pre + .para.continuation, .ptx-content pre + form, .ptx-content div + form { margin-top: 1em; } .ptx-content ul + .para.continuation, .ptx-content ol + .para.continuation, .ptx-content dl + .para.continuation { margin-top: 0.75em; } .ptx-content .aside-like > .para:first-child, .ptx-content td > .para:first-child, .ptx-content .solution-like > .para:first-child { margin-top: 0; } .ptx-content .assemblage-like > .para:first-of-type { margin-top: 0; } .ptx-content .assemblage-like > .heading + .para { margin-top: 0.25em; } .ptx-content .assemblage-like + .para { margin-top: 1.75em; } .ptx-content .para.intertext { margin-top: -0.25em; text-indent: 0; } .ptx-content .para + table { margin-top: 1em; } .ptx-content table tr td .para + .para { margin-top: 1em; } .ptx-content table + .para { margin-top: 1.5em; } .ptx-content .para + figure.figure-like > table { margin-top: 1em; } .ptx-content .exercise-like .para + ol { margin-top: 0.5em; } .ptx-content .para + pre.prettyprint, .ptx-content .para + pre.plainprint { margin-top: 1.25em; } .ptx-content .para + .code-box { margin-top: 1.25em; } .ptx-content .code-box > .console { margin-left: 1.5em; } .ptx-content .exercisegroup { padding-top: 1.25em; margin-bottom: 1em; } .ptx-content section .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .ptx-content section .exercisegroup > .heading + .introduction { display: inline; } .ptx-content section .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .ptx-content .exercisegroup article.exercise-like li > .para:first-child { margin-top: 0; } .ptx-content .exercisegroup article.exercise-like .heading { margin: 0; } .ptx-content article.exercise-like .task > .heading + .heading { font-weight: 600; } .ptx-content article.exercise-like .task > .heading + .heading + .para, .ptx-content article.exercise-like .task > .heading + .heading + div { display: block; margin-top: 0; } .ptx-content .exercisegroup .conclusion .heading { margin-top: 0.5em; } .ptx-content .exercisegroup article + article { margin-top: 1em; } .ptx-content .exercisegroup > article, .ptx-content .exercisegroup-exercises > article { margin-left: 2em; } .ptx-content .exercisegroup .cols2 > article { margin-left: 1.25em; } .ptx-content .exercisegroup > .introduction, .ptx-content .exercisegroup > .conclusion { margin-left: 0; } .ptx-content .exercisegroup > .introduction { margin-top: 1.25em; margin-top: 0; } .ptx-content .exercisegroup > .introduction > .para:first-child::before { content: "\25a0\2009"; color: #06a; position: relative; top: -1px; right: 1px; } .ptx-content .exercisegroup > .heading + .introduction > .para:first-child::before { content: "\2003"; } .ptx-content .exercisegroup > .introduction > .para:first-child { margin-top: 0; } .ptx-content section > article, .ptx-content section > section.paragraphs, .ptx-content .paragraphs > article { margin-top: 1.25em; } .ptx-content section article + article, .ptx-content section .introduction + article, .ptx-content section .para + article, .ptx-content section .posterior + article { margin-top: 1.75em; } .ptx-content section article > .introduction + article { margin-top: 1em; } .ptx-content section article > .discussion-like { margin-top: 1em; } .ptx-content section article > .discussion-like .para { margin-top: 1em; } .ptx-content article + .posterior { margin-top: 0.5em; } .ptx-content section .para + .tabular-box { margin-top: 0.75em; } .ptx-content section .tabular-box + .tabular-box { margin-top: 1em; } .ptx-content section .proof { margin-top: 0.75em; } .ptx-content section > pre, .ptx-content .para + pre { margin-top: 1.25em; } .ptx-content ol .para + .para, .ptx-content ul .para + .para { margin-top: 1em; } .ptx-content .introduction + .sidebyside, .ptx-content .para + .sidebyside, .ptx-content ol + .sidebyside, .ptx-content ul + .sidebyside { margin-top: 1em; } .ptx-content section .heading, .ptx-content article .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; } .ptx-content article .exercise-stage { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; font-size: 100%; margin-top: 0.4em; } .ptx-content article > .heading + .para { margin-top: 0; } .ptx-content section .heading + .para, .ptx-content section .title + .para, .ptx-content section .heading + .introduction > .para:first-child, .ptx-content section .blob > .para:first-child { margin-top: 0.25em; } .ptx-content section .heading + article { margin-top: 1em; } .ptx-content section .heading + .sidebyside { margin-top: 1em; } .ptx-content a > .heading { display: inline; } .ptx-content section > .heading { font-size: 1.75em; line-height: 1.25em; margin-top: 1em; margin-bottom: 0.35em; } .ptx-content section section > .heading { font-size: 1.5em; line-height: 1.25em; margin-bottom: 0; } .ptx-content .paragraphs > .heading { font-size: 1.125em; line-height: 1.125em; display: inline; } .ptx-content .paragraphs .heading + .para { display: inline; } .ptx-content .para.logical > .para:first-child { display: inline; } .ptx-content .runestone label > .para { display: inline; } .ptx-content .paragraphs .para .title { font-family: "PT Serif", "Times New Roman", Times, serif; font-size: 1.125em; font-weight: 700; } .ptx-content .paragraphs > .heading { margin-top: 0; } .ptx-content .paragraphs + .paragraphs { margin-top: 3em; } .ptx-content article .paragraphs > .heading { font-size: 1.05em; } .ptx-content section section section > .heading { font-size: 1.4em; line-height: 1.15em; margin-top: 0.75em; } @media screen and (max-width: 480px) { .ptx-content section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } .ptx-content section section > .heading { font-size: 1.3em; line-height: 1.15em; } .ptx-content section section section > .heading { font-size: 1.15em; line-height: 1em; } } .ptx-content .abstract { margin: 4em 2em; } .ptx-content .abstract > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .ptx-content .abstract > .title::after { content: ".\2009\2009\2009"; } .ptx-content .abstract > .title + .para { display: inline; } .ptx-content article > .heading, .ptx-content article > a .heading { font-size: 1.125em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like > .heading { font-size: 1em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like.discussion > .heading .codenumber, .ptx-content .discussion-like.discussion > .heading .space, .ptx-content .discussion-like.discussion > .heading .period { display: none; } .ptx-content .discussion-like.discussion > .heading .type::after { content: ". "; } .ptx-content .discussion-like.status > .heading { display: none; } .ptx-content .discussion-like.status > .heading + .para, .ptx-content .discussion-like.status > .para { font-style: italic; display: block; padding-left: 1em; } .ptx-content article > .heading::after, .ptx-content .discussion-like > .heading::after, .ptx-content .paragraphs > .heading::after, .ptx-content article > a > .heading::after { content: "\2009"; } .ptx-content .posterior .heading { font-weight: normal; font-size: 1.125em; line-height: 1.125em; margin-top: 0; } .ptx-content article > .heading + .para, .ptx-content .discussion-like > .heading + .para, .ptx-content article > .heading + .introduction, .ptx-content article > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article > .heading + ol, .ptx-content article > .heading + ul { padding-left: 1.5em; } .ptx-content article.theorem-like .para, .ptx-content article.theorem-like li { font-style: italic; } .ptx-content article.theorem-like .emphasis { font-weight: 700; } .ptx-content ol, .ptx-content ul { margin-bottom: 0; } .ptx-content li { margin-bottom: 0; } .ptx-content li .title { font-size: 100%; font-weight: normal; font-style: italic; } .ptx-content article.theorem-like li .title { font-weight: 600; font-style: normal; font-size: 96%; } .ptx-content figure { margin-bottom: 0; } .ptx-content .heading { margin-top: 0; margin-bottom: 0; } .ptx-content .conclusion { margin-top: 1em; } .ptx-content .conclusion > .para:first-child { margin-top: 0.5em; } .ptx-content ol, .ptx-content ul { margin-top: 0.75em; } .ptx-content .exercise-like > ol:first-child, .ptx-content .exercise-like > ul:first-child { margin-top: 0; } .ptx-content .heading + ol, .ptx-content .heading + ul { margin-top: 0.45em; } .ptx-content li > .heading + ol, .ptx-content li > .heading + ul { margin-top: 0.25em; } .ptx-content li > .heading + ol > li:nth-child(1), .ptx-content li > .heading + ul > li:nth-child(1) { margin-top: 0; } .ptx-content li > .heading + ol.cols2 > li:nth-child(2), .ptx-content li > .heading + ul.cols2 > li:nth-child(2) { margin-top: 0; } .ptx-content li { margin-top: 0.5em; } .ptx-content li > .para:first-child { margin-top: 0; } .ptx-content article .para:first-child { margin-top: 0; } .ptx-content ol ol, .ptx-content ol ul, .ptx-content ul ol, .ptx-content ul ul { margin-top: 0.5em; } .ptx-content .frontmatter > .heading { display: block; text-align: center; } .ptx-content .frontmatter > .heading .title, .ptx-content .book > .heading .title { font-size: 1.3em; } .ptx-content .frontmatter > .heading .subtitle, .ptx-content .book > .heading .subtitle { display: block; font-weight: normal; color: #666666; font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .ptx-content .frontmatter .author:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .para:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .author, .ptx-content .frontmatter > .credit { margin-top: 2em; text-align: center; } .ptx-content .frontmatter > .author .author-name { font-size: 120%; } .ptx-content .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .ptx-content .frontmatter .credit .title { font-size: 1em; } .ptx-content .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .ptx-content .frontmatter .author-info { font-size: 90%; } .ptx-content a[href^="mailto:"] { white-space: pre; } .ptx-content .colophon .credit { margin-top: 1em; } button { font: inherit; } .print-button { position: relative; right: 2px; top: 66px; background-color: LightGreen; z-index: 1; margin-top: -4em; float: right; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; border: none; } .pretext .ptx-page main.ptx-main { margin-left: 0; left: auto; border: none; box-shadow: none; padding: 0; } .pretext .ptx-page .ptx-main .ptx-content { margin-top: 0; } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section { margin-top: 1em; } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section .heading { margin-top: 0; } .pretext a[href]::after { content: ""; } .print-button { display: none; } } @media print { body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { width: 820px; max-width: 820px; font-size: 12.5px; } body.standalone.worksheet { margin: 0; } body.standalone .ptx-content section.worksheet { border: none; } body.standalone.worksheet .ptx-masthead, body.standalone.worksheet .ptx-page-footer { display: none; } body.standalone.worksheet.has-sidebar-left.mathbook-loaded .ptx-page .ptx-main { margin: 0; } body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { margin: 0; } body.standalone.worksheet .ptx-content section.onepage { max-height: 100%; max-width: 100%; overflow: hidden; page-break-after: always; border: none; page-break-inside: avoid; } body.standalone.worksheet .ptx-content .onepage.lastpage { margin-bottom: -2em; page-break-after: auto; } body.standalone.worksheet.a4 .ptx-content .onepage { } body.standalone.worksheet .ptx-content .onepage div.workspace, body.standalone.worksheet .ptx-content .onepage div.workspace.squashed.tight { border: none; padding: 0; background: none !important; } body.standalone.worksheet a { color: black; } body.standalone.worksheet .ptx-page .ptx-main { padding: 0; } body.standalone.worksheet.mathbook-loaded .ptx-page .ptx-main .ptx-content.ptx-content section.onepage { padding-bottom: 20px; } @page { margin: 0; } } .hidden { display: none; } .ptx-navbar .preferences_menu_holder .active > li { color: #ddd; } .ptx-navbar .preferences_menu_holder > ol > li:focus { background: #eef; border: 2px solid #909; padding: 2px 24px 2px 8px; } .ptx-navbar .preferences_menu_holder > ol > li > ol > li:focus { background: #eef; border: 2px solid #909; padding: 4px 4px 2px 4px; } .ptx-navbar .preferences_menu_holder .active .selected { background: #eef; color: #111; } .ptx-navbar .button.user-preferences-button { overflow: visible; display: none; } .preferences_menu_holder { z-index: 30; background: #fee; color: #222; position: absolute; left: -11em; top: 4em; } .preferences_menu_holder ol { list-style-type: none; padding: 0; margin: 0; } .preferences_menu_holder > ol { width: 12.5em; } .preferences_menu_holder > ol > li { padding: 4px 26px 4px 10px; } .preferences_menu_holder ol li ol { z-index: 40; position: absolute; left: 13em; top: -2em; background: #fee; } .preferences_menu_holder ol li ol li { padding: 6px 6px 4px 6px; display: flex; align-items: center; } .preferences_menu_holder ol.fonts:not(.hidden) { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; } .preferences_menu_holder ol.fonts li:nth-child(8n+1), .preferences_menu_holder ol.fonts li:nth-child(8n+2), .preferences_menu_holder ol.fonts li:nth-child(8n+3), .preferences_menu_holder ol.fonts li:nth-child(8n+4) { background-color: #eff; } .preferences_menu_holder ol.fonts li:nth-child(4n+2) { width: 4em; justify-content: center; text-align: center; align-items: center; } .preferences_menu_holder ol.fonts li:nth-child(4n+1) { padding-left: 14px; } .preferences_menu_holder .wrap_to_submenu { float: right; line-height: 0.95em; margin-right: -7px; } .preferences_menu_holder .to_submenu { position: absolute; } .preferences_menu_holder .avatars li { font-size: 200%; text-align: center; } .preferences_menu_holder .fontfamily .name { margin-right: 2em; } .preferences_menu_holder .fontfamily .sample { margin-left: auto; } .preferences_menu_holder .fonts .byunits { font-size: 80%; margin-bottom: -0.3em; } #choose_topic { background: #eef; } .ffcheck, .atmospherecheck, .avatarcheck, .rulercheck, .motioncheck { width: 1em; margin-left: 0.2em; margin-right: 0.7em; font-size: 11pt; } .preferences_menu_holder .moveQ { padding-top: 0.5em; border-top: 0.3em solid #eef; } .preferences_menu_holder .moveQ, .preferences_menu_holder .moveQ ~ li { background: #efe; } [data-ruler=greybar] .onelineX:hover { padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: #f3f3f3; } [data-atmosphere*=dark][data-ruler=greybar] .onelineX:hover { color: #333; } [data-ruler=lightbox] .onelineX { background-color: #e3e3e3; } [data-ruler=lightbox] .onelineX:hover { padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: inherit; } [data-ruler=sunrise] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler=sunrise] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunrise] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] .onelineX:hover { background-color: inherit; border-bottom: 2px solid black; margin-bottom: -2px; position: relative; z-index: 10; } xxxxxx[data-ruler=sunriseunderline] .onelineX:hover + .onelineX { margin-top: -2px; } [data-ruler=sunriseunderline] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=underline] .onelineX:hover { background-color: inherit; border-bottom: 1px solid black; margin-bottom: -1px; } [data-ruler=lunderline] .onelineX:hover { background-color: inherit; border-bottom: 1px solid black; border-left: 1px solid black; padding-left: 4px; margin-left: -5px; margin-bottom: -1px; } [data-atmosphere*=dark][data-ruler*=underline] .onelineX:hover { border-bottom: 1.5px solid #ddd; margin-bottom: -1.5px; } [data-atmosphere*=dark][data-ruler=lunderline] .onelineX:hover { border-left: 1.5px solid #ddd; padding-left: 3.5px; margin-left: -5px; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } .ptx-footnote { display: inline-block; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number { visibility: hidden; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: 0.6rem; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote__number { display: inline; cursor: pointer; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowlbackground); border-radius: 6px; padding: 0px 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowlborder); } .ptx-content section .para.credit + .para.credit { margin-top: 0.25em; } .ptx-content section .para.credit > .title { font-weight: 700; margin-right: 0.5em; } .ptx-content section .para.copyright { margin-top: 2.5em; } .ptx-content section .para.license { margin-top: 2.5em; } .ptx-content section > .heading + .heading, .ptx-content section section > .heading + .heading { margin-top: 0.5em; } .ptx-content section.solutions > h3.heading, .ptx-content section.solutions section > h3.heading { font-size: 1.6em; } .ptx-content section.solutions > h4.heading, .ptx-content section.solutions section > h4.heading { font-size: 1.45em; } .ptx-content section.solutions > h5.heading, .ptx-content section.solutions section > h5.heading { font-size: 1.35em; } .ptx-content section.solutions > h6.heading, .ptx-content section.solutions section > h6.heading { font-size: 1.25em; } .ptx-content .bibitem + .bibentry { display: inline-block; width: 90%; } .ptx-content .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .ptx-content figcaption { font-weight: normal; } .ptx-content figcaption { margin-top: 0.6em; margin-left: auto; margin-right: auto; } .ptx-content figure.table-like figcaption:first-child { font-style: oblique; margin-top: 0; } .ptx-content figure.table-like figcaption:first-child .type, .ptx-content figure.table-like figcaption:first-child .codenumber { font-style: normal; } .ptx-content section figcaption .codenumber, .ptx-content section figcaption .type { font-weight: 700; font-size: inherit; } .ptx-content figcaption .codenumber:after { content: "\2002"; } .ptx-content figcaption .type:last-of-type::after { content: "\2002"; } .ptx-content figcaption code.code-inline { white-space: pre; } .ptx-content figure.figure > figcaption { margin-top: 1em; } .ptx-content figure.listing > figcaption + * { margin-top: 0.5em; } .ptx-content figcaption + .named-list-content { margin-top: 0.6em; } .ptx-content figcaption + .named-list-content > .introduction > .para:first-child { margin-top: 0; } .ptx-content figcaption + table, .ptx-content figcaption + .tabular-box { margin-top: 0.5em; } .ptx-content .definition-like .para > .emphasis { font-weight: 700; } .ptx-content em.alert { font-weight: bold; } .unprocessed { padding: 8px; background-color: rgb(255, 230, 230); } .unprocessed .unprocessed { margin: 8px; background-color: rgb(255, 200, 255); } .unprocessed .unprocessed .unprocessed { margin: 8px; background-color: rgb(205, 205, 255); } .ptx-content section.introduction + section { margin-top: 2em; } .ptx-content { margin: 0; } .ptx-content .runestone.parsons_section { display: inline-block; max-width: unset; } .ptx-content .runestone.ac_section { width: 60em; max-width: unset; } .ptx-content .runestone.ac_section .ac_section { max-width: unset; } .ptx-content .runestone.ac_section > div { max-width: unset; } .ptx-content .runestone > .parsons { width: 60em; max-width: unset; } .ptx-content .runestone .parsons { margin: 0; } .ptx-content .runestone.parsons_section > .parsons { width: max-content; padding-right: 1em; } .ptx-content .runestone .parsons .sortable-code-container { text-align: unset; } .ptx-content .runestone .parsons .parsons-text, .ptx-content .runestone .parsons .parsons-controls { margin-left: 0; margin-right: 0; } .ptx-content .runestone .parsons .sortable-code + .sortable-code { margin-right: 0; } .ptx-content .runestone .parsons .runestone_caption_text { max-width: 660px; } .runestonebustmenu { position: absolute; right: 0; top: 0; } .runestonebustmenu .dropdown-content { position: absolute; right: 2em; left: unset; top: 1em; } @media screen and (max-width: 800px) { nav .dropdown .dropdown-content { top: unset; bottom: 36px; } .activecode-toggle { display: none; } } .pretext .navbar .dropdown { height: 35px; } .ptx-content section section + section { margin-top: 3em; } .ptx-content .sidebyside > .para, .ptx-content .sidebyside > figure, .ptx-content .sidebyside > img, .ptx-content .sidebyside > table, .ptx-content .sidebyside > tabular, .ptx-content .sidebyside > section, .ptx-content .sidebyside > .paragraphs { display: inline-block; margin: 0; } .ptx-content .sidebyside .sbspanel > table { overflow-x: auto; margin-left: auto; margin-right: auto; } .ptx-content .sidebyside figcaption { padding-left: 1em; padding-right: 0; padding-bottom: 0; margin: 0.75em 0 0 0; } .ptx-content figcaption { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .sidebyside > .para { width: 32%; vertical-align: top; } .ptx-content .sidebyside > .para.left, .ptx-content .sidebyside > .para.middle, .ptx-content .sidebyside > .para.right { vertical-align: middle; } .ptx-content .sidebyside > .para + img { vertical-align: middle; } .ptx-content .sidebyside .sbsrow .sbsheader { margin-top: 0; } .ptx-content .sbsgroup { width: 100%; } .ptx-content .sidebyside { width: 100%; } .ptx-content .sbsrow { display: flex; justify-content: space-between; } .ptx-content .sbsheader { text-align: center; justify-content: center; font-size: 1em; } .ptx-content .sbspanel:empty { height: 10em; background-color: rgb(221, 221, 255); } .ptx-content .sbspanel { display: flex; flex-direction: column; justify-content: flex-start; } .ptx-content .sbspanel.top { justify-content: flex-start; } .ptx-content .sbspanel.middle { justify-content: center; } .ptx-content .sbspanel.bottom { justify-content: flex-end; } .ptx-content .sbspanel > .para:first-child { margin-top: 0; } .ptx-content .fixed-width { align-items: center; } .ptx-content .sbscaption { justify-content: center; } .ptx-content table { border-spacing: 0; } .ptx-content table { border-collapse: collapse; } .ptx-content .image-box + table, .ptx-content .image-box + .sidebyside > .sbsrow:first-child > .sbspanel > table:first-child { margin-top: 1.5em; } .ptx-content table tr td, .ptx-content table tr th { padding-top: 2px; padding-bottom: 2px; padding-left: 5px; padding-right: 5px; } .ptx-content table tr td { font-size: 90%; } .ptx-content table tr td.l { text-align: left; } .ptx-content table tr td.c { text-align: center; } .ptx-content table tr td.r { text-align: right; } .ptx-content table tr td.j { text-align: justify; } .ptx-content table tr td.lines { white-space: nowrap; } .ptx-content table tr td.t { vertical-align: top; } .ptx-content table tr td.b { vertical-align: bottom; } .ptx-content table tr td.m { vertical-align: middle; } .ptx-content table tr td.vv { border-left: 2px solid #000; border-right: 2px solid #000; } .ptx-content table tr td.vcv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.vcvv { border-left: 2px solid #000; border-right: 4px solid #000; text-align: center; } .ptx-content table tr td.vlv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vrv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.rv { border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.vr { border-left: 2px solid #000; text-align: right; } .ptx-content table tr td.lv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vl { border-left: 2px solid #000; text-align: left; } .ptx-content table tr td.cv { border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.Xv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vc { border-left: 2px solid #000; text-align: center; } .ptx-content table tr td.hline { padding: 0; } .ptx-content table tr td.hlinethick { padding-left: 0px; padding-right: 0px; } .ptx-content table tr td.hline hr { margin-top: 0; margin-bottom: 0; margin-left: -1px; margin-right: -1px; border: 1px solid rgb(0, 0, 0); } .ptx-content table tr td.hlinethick hr { margin-top: 0; margin-bottom: 0; margin-left: -1px; margin-right: -1px; border: 2px solid rgb(0, 0, 0); } .center table { text-align: center; margin-left: auto; margin-right: auto; } .ptx-content table tr th.b1, .ptx-content table tr td.b1 { border-bottom: 1px solid #000; } .ptx-content table tr th.b2, .ptx-content table tr td.b2 { border-bottom: 2px solid #000; } .ptx-content table tr th.b3, .ptx-content table tr td.b3 { border-bottom: 3px solid #000; } .ptx-content table tr th.b0, .ptx-content table tr td.b0 { border-bottom: none; } .ptx-content table tr th.t1, .ptx-content table tr td.t1 { border-top: 1px solid #000; } .ptx-content table tr th.t2, .ptx-content table tr td.t2 { border-top: 2px solid #000; } .ptx-content table tr th.t3, .ptx-content table tr td.t3 { border-top: 3px solid #000; } .ptx-content table tr th.t0, .ptx-content table tr td.t0 { border-top: none; } .ptx-content table tr th.r1, .ptx-content table tr td.r1 { border-right: 1px solid #000; } .ptx-content table tr th.r2, .ptx-content table tr td.r2 { border-right: 2px solid #000; } .ptx-content table tr th.r3, .ptx-content table tr td.r3 { border-right: 3px solid #000; } .ptx-content table tr th.r0, .ptx-content table tr td.r0 { border-right: none; } .ptx-content table tr th.l1, .ptx-content table tr td.l1 { border-left: 1px solid #000; } .ptx-content table tr th.l2, .ptx-content table tr td.l2 { border-left: 2px solid #000; } .ptx-content table tr th.l3, .ptx-content table tr td.l3 { border-left: 3px solid #000; } .ptx-content table tr th.l0, .ptx-content table tr td.l0 { border-left: none; } .ptx-content table tr td img { max-width: 200px; margin-right: 30px; } .ptx-content table.notation-list tr th { text-align: left; } .ptx-content table.notation-list tr td { text-align: left; vertical-align: top; } .ptx-content table.notation-list tr th { margin-left: 2em; } .ptx-content table.notation-list tr td { margin-left: 1em; } .ptx-content tr th.r0.l0, .ptx-content tr td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content table tr td span.decimal { float: left; text-align: right; } .ptx-content table tr.header-vertical th { writing-mode: vertical-rl; padding-left: 2em; } .ptx-content table + article { margin-top: 1em; } .ptx-content .hidden-knowl-wrapper .hiddenproof, .ptx-content .blob > article.hiddenproof, .ptx-content section > article.hiddenproof { margin-top: 0.3em; } .ptx-content .hidden-knowl-wrapper article { display: inline; } .apretext-content figure.figure-like { overflow: auto; } .ptx-content figure.figure-like { margin-left: 0; margin-right: 0; } .ptx-content figure.table-like { margin-left: 30px; margin-right: 30px; } .ptx-content figure.table-like.list { margin-right: 0; } .ptx-content a > tt { font-size: 110%; } .ptx-content section .videolink a:link { background-size: 0; } .ptx-content .playvideo { cursor: pointer; } .ptx-content .videobig { padding-right: 0.3em; padding-left: 0.3em; font-size: 85%; background-color: rgba(255, 255, 100, 0.9); display: inline-block; position: relative; top: 100px; cursor: zoom-in; } .ptx-content .videobig.nofigure { } .ptx-content .knowl .videobig { display: none; } .ptx-content .videosmall { padding-right: 0.3em; padding-left: 0.3em; font-size: 80%; background-color: rgba(255, 255, 100, 0.9); display: inline-block; position: absolute; left: -250px; z-index: 1001; cursor: zoom-out; } .ptx-content .exercise-like ol li table { margin-bottom: 0.5em; } .ptx-content .exercise-like > ol li + li { margin-top: 0.5em; } .ptx-content .solution > ol li + li { margin-top: 0.5em; } .ptx-content section.worksheet > .heading > .codenumber { display: inline-block; vertical-align: top; } .ptx-content section.worksheet > .heading > .title { display: inline-block; max-width: 70%; } .ptx-content .heading .print-links { display: inline-block; float: right; vertical-align: top; width: 19%; text-align: right; } .standalone .ptx-content .heading .print-links { display: none; } .standalone.worksheet .previous-button, .standalone.worksheet .up-button, .standalone.worksheet .next-button { display: none; } .standalone.worksheet .ptx-navbar .toc-toggle { display: none; } .standalone.worksheet .ptx-content [data-knowl]:hover, .standalone.worksheet .ptx-content [data-knowl]:active, .standalone.worksheet .ptx-content [data-knowl].active { background: none; color: black; } .standalone.worksheet .ptx-content [data-knowl]::after { border: none; } .standalone.worksheet .ptx-content .knowl-content { padding: 0; } .standalone.worksheet .ptx-content article > .knowl-output.original { margin: 0; } .ptx-content .appendix .heading > .type { display: inline; } .ptx-content .heading.hide-type > .type { display: none; } .ptx-content .heading .print-links > a { font-family: "Open Sans"; font-size: 0.6em; font-weight: bold; padding: 0.1em 0.2em; background: #ffa; border: 2px solid green; } .ptx-content .heading .print-links > a.us { background: #eef; color: #9b1c2c; border-color: #041E42; } .ptx-content .heading .print-links > a + a { margin-left: 0.25em; } .ptx-content .autopermalink { position: absolute; display: inline-block; top: 3px; left: -1.9em; font-size: 85%; color: #a00; opacity: 0.05; margin-top: 0.1em; } .ptx-content li > .para > .autopermalink { left: -3.4em; top: 0; } .ptx-content .autopermalink a { color: #a00; } .ptx-content .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } :target { scroll-margin-top: 45px; } .ptx-content .para > .autopermalink { margin-top: 0.2em; } .ptx-content .exercises > .autopermalink, .ptx-content .introduction > .autopermalink, .ptx-content .glossary > .autopermalink { margin-top: 0.3em; } .ptx-content .appendix > .autopermalink, .ptx-content .chapter > .autopermalink, .ptx-content .index > .autopermalink, .ptx-content .section > .autopermalink { margin-top: 0.3em; } .ptx-content .subsection > .autopermalink, .ptx-content .references > .autopermalink, .ptx-content .exercises > .autopermalink { margin-top: 0.3em; } .ptx-content .figure-like > .autopermalink { margin-top: 1.4em; } .ptx-content .subsubsection > .autopermalink { margin-top: 0; } .ptx-content .exercisegroup > .autopermalink { margin-top: 1.4em; } .ptx-content .autopermalink:hover { opacity: 1; background: #eeddff; } .ptx-content .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: #fff; border: 3px solid blue; z-index: 2001; } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: #eeaaff; } .ptx-content .indexitem { margin-top: 2px; } .ptx-content .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .ptx-content .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .ptx-content .indexknowl { margin-left: 0.11em; } .ptx-content em + .indexknowl { margin-left: -0.25em; } .ptx-content .indexknowl a { margin-left: 2em; } .ptx-content .indexitem .see, .ptx-content .subindexitem .see, .ptx-content .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .seealso, .ptx-content .subindexitem .seealso, .ptx-content .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .see em, .ptx-content .subindexitem .see em, .ptx-content .subsubindexitem .see em, .ptx-content .indexitem .seealso em, .ptx-content .subindexitem .seealso em, .ptx-content .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .ptx-content .indexitem .see + .see, .ptx-content .subindexitem .see + .see, .ptx-content .subsubindexitem .see + .see, .ptx-content .indexitem .seealso + .seealso, .ptx-content .subindexitem .seealso + .seealso, .ptx-content .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .ptx-content .indexitem .indexknowl { font-size: 90%; } .ptx-content .indexitem [data-knowl], .ptx-content .subindexitem [data-knowl], .ptx-content .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .ptx-content .indexknowl [data-knowl]:hover, .ptx-content .indexknowl .active[data-knowl] { margin-left: 2em; } .ptx-content .subindexitem .indexknowl { font-size: 95%; } .ptx-content .subsubindexitem .indexknowl { font-size: 95%; } .ptx-content .indexletter { margin-top: 1.5em; } .ptx-content .hidden-knowl-wrapper .heading { display: inline; } .ptx-content .heading + .hidden-knowl-wrapper { display: inline; } .ptx-content .cols2 .knowl-output, .ptx-content .cols3 .knowl-output, .ptx-content .cols4 .knowl-output, .ptx-content .cols5 .knowl-output, .ptx-content .cols5 .knowl-output { width: 100%; } .ptx-content .cols2 + *, .ptx-content .cols3 + *, .ptx-content .cols4 + *, .ptx-content .cols5 + *, .ptx-content .cols6 + * { clear: both; } .ptx-content .cols2::after, .ptx-content .cols3::after, .ptx-content .cols4::after, .ptx-content .cols5::after, .ptx-content .cols6::after { content: ""; display: block; clear: both; } .ptx-content section > ol:last-child, .ptx-content section > ul:last-child { margin-bottom: 1.5em; } .ptx-content section > ol:last-child > li:last-child, .ptx-content section > ul:last-child > li:last-child { padding-bottom: 0em; } .ptx-content .cols2 > li:nth-child(2n+1), .ptx-content .cols3 > li:nth-child(3n+1), .ptx-content .cols4 > li:nth-child(4n+1), .ptx-content .cols5 > li:nth-child(5n+1), .ptx-content .cols6 > li:nth-child(6n+1) { clear: left; } .ptx-content .exercise-like ol.cols2 li { margin-top: 0.5em; } .ptx-content .cols2 > li, .ptx-content .cols3 > li, .ptx-content .cols4 > li, .ptx-content .cols5 > li, .ptx-content .cols6 > li { float: left; } .ptx-content .incontext { display: block; font-size: 85%; text-align: right; } .ptx-content .terminology { font-style: italic; font-weight: bold; } .ptx-content .emphasis { font-style: italic; } .ptx-content .emphasis .emphasis { font-weight: bold; } :target { animation: target-fade 15s 1; } @-webkit-keyframes target-fade { 0% { background-color: rgba(120, 0, 120, 0.3); } 100% { background-color: inherit; opacity: 1; } } @-moz-keyframes target-fade { 0% { background-color: rgba(120, 0, 120, 0.3); } 100% { background-color: inherit; opacity: 1; } } .ptx-content .autoterm [knowl], .ptx-content .autoterm [knowl]:after { font-weight: inherit; color: inherit; padding: 0; margin-bottom: inherit; border-bottom: inherit; border-bottom-color: inherit; } .ptx-content .autoterm [knowl]:hover { background: #ffddff; border-top: 2px dotted purple; border-bottom: 1px dotted red; border-top-left-radius: 0; border-top-right-radius: 0; } .ptx-content ol li.custom-list-style-type { list-style-type: none; } .ptx-content ol li.custom-list-style-type:before { content: attr(label) "\a0\a0"; } .ptx-content ol.no-marker, .ptx-content ul.no-marker, .ptx-content li.no-marker { list-style-type: none; } .ptx-content ol.decimal { list-style-type: decimal; } .ptx-content ol.lower-alpha { list-style-type: lower-alpha; } .ptx-content ol.upper-alpha { list-style-type: upper-alpha; } .ptx-content ol.lower-roman { list-style-type: lower-roman; } .ptx-content ol.upper-roman { list-style-type: upper-roman; } .ptx-content ul.disc { list-style-type: disc; } .ptx-content ul.square { list-style-type: square; } .ptx-content ul.circle { list-style-type: circle; } .ptx-content ol.no-marker, .ptx-content ul.no-marker { list-style-type: none; } .ptx-content section, .ptx-content article, .ptx-content figure { clear: both; } .ptx-content dl { margin-top: 1em; margin-left: 0; margin-bottom: 0; overflow: hidden; } .ptx-content dl dd { margin-top: 0; } .ptx-content dl dd::after { content: ""; display: block; clear: both; } .ptx-content dl.glossary dt { margin-top: 1.25em; } .ptx-content dl.description-list dt, .ptx-content dl.description-list dd { margin-top: 1em; } .ptx-content dl.description-list.narrow dt { margin-top: 0; } .ptx-content dl.glosary dt:first-of-type, .ptx-content dl.description-list dt:first-of-type, .ptx-content dl.glosary dd:first-of-type, .ptx-content dl.description-list dd:first-of-type { margin-top: 0; } .ptx-content dl dd .para { margin-top: 1em; } .ptx-content dl dt > .para:first-child, .ptx-content dl dd > .para:first-child { margin-top: 0; } .ptx-content dl > dt { font-weight: bold; max-width: 55ex; } .ptx-content dl.description-list dt { float: left; clear: left; text-align: right; width: 18ex; } .ptx-content dl.description-list.narrow dt, .ptx-content dl.glossary dt { text-align: left; } .ptx-content dl.glossary dd { margin-left: 5ex; } .ptx-content dl.description-list dd { margin-left: 22ex; } .ptx-content dl.description-list.narrow dd { margin-left: 12ex; } .ptx-content dl.description-list dt:first-of-type { clear: none; } .ptx-content dl.description-list.narrow dd::after { content: ""; display: block; height: 1em; clear: left; } .ptx-content dl.description-list.narrow dd:last-child::after { height: 0; } .ptx-content dl.description-list dt { float: left; clear: both; margin-right: 1ex; } .ptx-content dl.description-list.narrow dt { width: unset; max-width: 55ex; text-align: left; } .ptx-content dl.description-list.narrow dd { margin-left: 0; margin-top: 0; width: 31em; max-width: calc(100% - 12ex); float: right; clear: right; } .ptx-content dl.description-list + * { clear: both; } @media screen and (max-width: 480px) { .ptx-content dl.description-list dt { float: none; margin-left: 0; text-align: left; } .ptx-content dl.description-list dd, .ptx-content dl.description-list.narrow dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } .ptx-content dl.description-list dl dt { width: 8ex; } .ptx-content dl.description-list dd dd { margin-left: 18ex; } .ptx-content dl.description-list dl dd { margin-left: 12ex; } .ptx-content [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .ptx-content .knowl mjx-mtext > mjx-utext, .ptx-content mjx-mtext > mjx-utext { width: revert !important; } .ptx-content mjx-msup mjx-utext, .ptx-content mjx-msub mjx-utext { display: inline; } a.mjx-svg-href { fill: inherit; stroke: inherit; } .displaymath + .para { margin-top: 0; } @media screen and (max-width: 943px) { .ptx-content .displaymath { position: relative; overflow-x: auto; } .ptx-content .mjx-chtml.MJXc-display { overflow-x: auto; overflow-y: hidden; } .ptx-content .figure-like { overflow-x: auto; } .ptx-content #MathJax_ZoomFrame { position: static; background: white; } .ptx-content #MathJax_Zoom { background-color: inherit; border: 0; padding: 0; position: absolute; overflow-x: auto; overflow-y: visible; left: 10% !important; max-height: none !important; } } .ptx-content dd .displaymath:last-child .MJXc-display { margin-bottom: 0; } .floatnav { margin-top: 8px; margin-left: 50px; } .floatnav a { padding-left: 3px; margin-right: -1px; color: inherit; } .ptx-content a .heading .mjx-chtml { z-index: 1; background: #fff; } .ptx-content .hidden-knowl-wrapper [data-knowl]::after, .ptx-content .hidden-knowl-wrapper [data-knowl]:hover::after, .ptx-content .hidden-knowl-wrapper .active[data-knowl]::after { right: 7px; } .floatnav a:hover { background: #eeaaff; } .ptx-content .unselectable { user-select: none; } .ptx-content .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .ptx-content .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } .ptx-content .fillin { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.underline { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.box { display: inline-block; border: none; margin-left: 0.1em; margin-right: 0.1em; margin-bottom: -0.25em; outline: 1px solid black; height: 1.3em; } .ptx-content .fillin.shade { display: inline-block; border: none; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; background-color: #eee; height: 1.3em; } .ptx-content .hiddenproof > a > .heading { font-style: italic; font-weight: normal; } .ptx-content .MJXc-display, .ptx-content .knowl-output .knowl-output .knowl-output .knowl-output .MJXc-display, .ptx-content pre.prettyprint, .ptx-content pre.plainprint, .ptx-content pre.console, .ptx-content .code-box { background-image: linear-gradient( to right, white, white), linear-gradient( to right, white, white), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 255, 255, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 255, 255, 0)); background-position: left center, right center, left center, right center; background-repeat: no-repeat; background-color: inherit; background-size: 20px 100%, 20px 100%, 10px 100%, 10px 100%; background-attachment: local, local, scroll, scroll; } .ptx-content .runestone .code-box { background-image: none; } .ptx-content .knowl-output .MJXc-display { background-image: linear-gradient( to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient( to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient( to right, rgba(0, 0, 0, 0.25), var(--knowlbackground)), linear-gradient( to left, rgba(0, 0, 0, 0.25), var(--knowlbackground)); } .ptx-content .knowl-output.original .MJXc-display { background: inherit; } .ptx-content .assemblage-like .MJXc-display { background-image: linear-gradient( to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient( to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient( to right, rgba(0, 0, 0, 0.25), var(--assemblagebackground)), linear-gradient( to left, rgba(0, 0, 0, 0.25), var(--assemblagebackground)); } .ptx-content .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient( to right, #fffff5, #fffff5), linear-gradient( to right, #fffff5, #fffff5), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 255, 243, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 255, 243, 0)); } .ptx-content .knowl-output .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient( to right, #fff5fe, #fff5fe), linear-gradient( to right, #fff5fe, #fff5fe), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 243, 254, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 243, 254, 0)); } .ptx-content .knowl-output .knowl-content > *:last-child:not(.incontext) { margin-bottom: 0.5em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like, .ptx-content .knowl-output .knowl .knowl-content > .solution-like:not(.incontext) { margin-bottom: 0.15em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.hint { border-left: 1px solid #0f0; padding-left: 0.35em; background: #efe; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.answer { border-left: 2px solid #00f; padding-left: 0.35em; background: #eef; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.solution { border-left: 3px solid #c0c; padding-left: 0.5em; background: #fef; } .ptx-content .knowl-content > article:first-child, .ptx-content .knowl-content > .solution-like:first-child { padding-top: 0.25em; } .ptx-content .exercisegroup > .conclusion { margin-left: 1.5em; } .ptx-content .exercise-like .introduction { display: inline; } .ptx-content .exercise-like .introduction .heading { display: inline; } .ptx-content .exercise-like .introduction .para:first-child { display: inline; } .ptx-content .exercise-like .introduction::after { content: ""; display: block; } .ptx-content .exercise-like .conclusion::before { content: ""; display: block; margin-top: 0.25em; } .ptx-content .exercisegroup .exercisegroup-exercises.cols2, .ptx-content .exercisegroup .exercisegroup-exercises.cols3, .ptx-content .exercisegroup .exercisegroup-exercises.cols4, .ptx-content .exercisegroup .exercisegroup-exercises.cols5, .ptx-content .exercisegroup .exercisegroup-exercises.cols6 { width: 100%; display: inline-flex; flex-direction: row; flex-wrap: wrap; justify-content: flex-start; align-items: flex-start; align-content: flex-start; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 { display: inline; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 .knowl-output { display: block; } .ptx-content .exercisegroup .cols1 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(33.33% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(25% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(20% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(16.66% - 2em); } .ptx-content .mathword { white-space: nowrap; } .ptx-content .unit, .ptx-content .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .ptx-content .unit sub, .ptx-content .unit sup, .ptx-content .quantity sub, .ptx-content .quantity sup { word-spacing: normal; } .ptx-content .code-inline, .ptx-content .code-block, .ptx-content .console, .ptx-content .program, .ptx-content .program code { font-family: "Inconsolata", monospace; } .ptx-content .code-block, .ptx-content .console, .ptx-content .program { overflow-x: auto; } .ptx-content .code-inline { font-size: 1em; white-space: pre; color: inherit; background: #eeeeee; border: 1px solid #dddddd; padding: 0.0625em 0.25em; margin-left: 0.2em; margin-right: 0.2em; border-radius: 0.2em; } .ptx-content .code-inline:first-child { margin-left: 0; } .ptx-content .title .code-inline { padding-left: 0; padding-right: 0; margin-left: 0; margin-right: 0; } .ptx-content a .code-inline { background: #f6f6f6; } .ptx-content .kbdkey { background: #f1f1f1; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .ptx-content .kbdkey { color: #333; } .ptx-content .sagecell_sessionOutput pre { font-family: "Inconsolata", monospace; } .ptx-content .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .ptx-content .sage-interact.sagecell { margin: 0; } .ptx-content .sagecell_evalButton { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px; padding: 0 0.65em; } .ptx-content .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .ptx-content .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .ptx-content .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .ptx-content .sagecell_evalButton:focus, .ptx-content .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .ptx-content .sagecell .sagecell_editor { margin-bottom: 8px; } .ptx-content .booktitle { font-style: oblique; } .ptx-content .objectives > .heading, .ptx-content .outcomes > .heading { font-size: 1.25em; } .ptx-content a .heading { white-space: normal; } .ptx-content .solutions > a, .ptx-content .solutions > a:hover, .ptx-content .solutions > a.active, .ptx-content .instructions > a, .ptx-content .instructions > a:hover, .ptx-content .instructions > a.active { display: inline-block; margin-right: 1.5em; } .ptx-content .solutions > a::before, .ptx-content .instructions > a::before { content: "\25ba"; font-size: 70%; color: #06a; position: relative; top: -2px; right: 3px; } .ptx-content .solutions > a.active::before, .ptx-content .instructions > a.active::before { content: "\25bc"; animation-name: solutiontriangle; animation-duration: 3s; animation-iteration-count: 1; } .ptx-content .solutions > a[data-knowl]::after, .ptx-content .instructions > a[data-knowl]::after { left: 12px; } @keyframes solutiontriangle { from { content: "\25ba"; } to { content: "\25bc"; } } .ptx-content section.solutions { font-size: 90%; padding-left: 1em; border-left: 1em solid #eeeeee; } .ptx-content.ptx-content > section.solutions:first-child { padding-left: 0; border-left: none; } .ptx-content article.example-like > .solution-like, .ptx-content article.exercise-like > .solution-like { margin-top: 1em; padding-left: 0.7em; } .ptx-content article.example-like > .solution-like > .heading, .ptx-content article.exercise-like > .solution-like > .heading { font-size: 100%; font-weight: 700; margin-right: 0.25em; display: inline; } .ptx-content article.example-like > .solution-like > .heading + .para, .ptx-content article.exercise-like > .solution-like > .heading + .para { display: inline; } .ptx-content article > figure:first-child { margin-top: 0; } .ptx-content figure + figure, .ptx-content figure + .sidebyside, .ptx-content .sidebyside + .sidebyside, .ptx-content article + figure, .ptx-content .sidebyside + figure { padding-top: 1em; } .ptx-content img { display: inline-block; margin-left: auto; margin-right: auto; } .ptx-content img.cs { display: block; margin-top: 20px; margin-bottom: 20px; margin-left: auto; margin-right: auto; } .ptx-content img:not(.cs) { max-width: 650px; } .ptx-content .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } .ptx-content figure img { display: block; margin-left: auto; margin-right: auto; } .ptx-content figure img + img { margin-top: 30px; } .ptx-content div.center img { display: block; margin-left: auto; margin-right: auto; } .ptx-content div.center + div.center > img { margin-top: 60px; } .ptx-content div.center > img + img { margin-top: 60px; } .ptx-content figure table { margin-left: auto; margin-right: auto; } .ptx-content .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .ptx-content figure.wrap img { width: 250px; } .ptx-content figure.wrap { float: right; margin-right: 0; margin-left: 30px; } .ptx-content figure img.wrap { float: right; margin: 0; } .ptx-content figure figcaption.wrap { margin: 10px; font-size: 100%; text-align: center; } .ptx-content figure, .ptx-content .image-box { margin-top: 0.5em; } .ptx-content figure.listing { margin-top: 1em; } .ptx-content figure .image-box { margin-top: 0; } .ptx-content .sidebyside figure { margin-top: 0; } .ptx-content .image-box img, .ptx-content img.contained, .ptx-content .sbspanel img { width: 100%; height: auto; } .ptx-content .image-box > img:not(.draw_on_me):not(.mag_popup) { cursor: zoom-in; } .ptx-content img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; max-width: 600px; } .ptx-content .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .ptx-content .image-box, .ptx-content .audio-box, .ptx-content .video-box, .ptx-content .asymptote-box { position: relative; } .ptx-content .image-box .asymptote-box iframe.asymptote, .ptx-content iframe.asymptote, .ptx-content .video-box .video, .ptx-content .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .ptx-content section > .audio-box, .ptx-content section > .video-box, .ptx-content section > .image-box { margin-top: 0.75em; } .ptx-content .audio { width: 100%; } .caption .heading { font-weight: bold; } .caption .counter { font-weight: bold; } .ptx-content div.quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .minipage + .minipage { display: inline-block; } .ptx-content code.inline { background: none; border: none; } .ptx-content pre.program, .ptx-content pre.program code, .ptx-content pre.code-block, .ptx-content pre.code-block code { line-height: 1.1; } .ptx-content section > .code-box, .ptx-content .para + .code-box, .ptx-content section > .code-block, .ptx-content .para + .code-block { margin-top: 1em; } .ptx-content pre.program, .ptx-content pre.code-block { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.program:before, .ptx-content pre.code-block:before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } .ptx-content pre[data-line].program, .ptx-content pre[data-line].code-block { padding-left: 2.5em; } .ptx-content pre[data-line].program:before, .ptx-content pre[data-line].code-block:before { margin-left: -5em; } .ptx-content pre.program.line-numbers, .ptx-content pre.code-block.line-numbers { padding-left: 3.5em; overflow: visible; } .ptx-content pre.program.line-numbers:before, .ptx-content pre.code-block.line-numbers:before { margin-left: -7em; } .ptx-content pre[data-line].line-numbers code { padding-top: 0em; } .ptx-content pre[data-line].line-numbers .line-highlight { margin-top: 0em; } .ptx-content pre[data-line]:not(.line-numbers) .line-highlight { margin-top: 0.6em; } .ptx-content pre.prettyprint, .ptx-content pre.plainprint { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.prettyprint:before, .ptx-content pre.plainprint:before { content: ""; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 2.5em; } .ptx-content .objectives { margin-bottom: 1.25em; } .ptx-content ol > li { padding-left: 0.25em; } .ptx-content ol.cols2 > li, .ptx-content ul.cols2 > li { width: calc(49% - 1.75em); min-width: 190px; } .ptx-content ol.cols3 > li, .ptx-content ul.cols3 > li { width: calc(33% - 1.25em); min-width: 160px; } .ptx-content ol.cols4 > li, .ptx-content ul.cols4 > li { width: calc(24.5% - 1.25em); min-width: 100px; } .ptx-content ol.cols5 > li, .ptx-content ul.cols5 > li { width: calc(19.5% - 0.75em); min-width: 90px; } .ptx-content ol.cols6 > li, .ptx-content ul.cols6 > li { width: calc(16.3% - 0.5em); min-width: 80px; } .ptx-content ul.cols2 > li:nth-child(odd), .ptx-content ol.cols2 > li:nth-child(odd) { margin-right: 2em; } .ptx-content .cols2 ol, .ptx-content .cols3 ol, .ptx-content .cols4 ol, .ptx-content .cols5 ol, .ptx-content .cols6 ol { padding-left: 0.7em; } .ptx-content .exercisegroup-exercises > article.exercise-like { margin-top: 1em; } .ptx-content .cols2 > li:last-child:nth-child(odd) { float: none !important; padding-top: 0.5em; } .ptx-content .solution ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .solution ol li > .para:first-child, .ptx-content .solution ol li > .displaymath:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .solution ol li > .displaymath:first-child .MJXc-display { margin-top: 0; } .ptx-content .exercise-like ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .exercise-like > .cols2 > li { width: calc(49% - 2.5em); } .ptx-content .exercise-like > .cols3 > li { width: calc(33% - 2.5em); } .ptx-content .exercise-like > .cols4 > li { width: calc(24.5% - 2.5em); } .ptx-content .exercise-like > .cols5 > li { width: calc(19.5% - 2.5em); } .ptx-content .exercise-like > .cols6 > li { width: calc(16.3% - 2.5em); } .ptx-content .knowl .exercise-like > .cols2 > li { width: calc(49% - 2em); } .ptx-content .knowl .exercise-like > .cols3 > li { width: calc(33% - 2em); } .ptx-content .knowl .exercise-like > .cols4 > li { width: calc(24.5% - 2em); } .ptx-content .knowl .exercise-like > .cols5 > li { width: calc(19.5% - 2em); } .ptx-content .knowl .exercise-like > .cols6 > li { width: calc(16.3% - 2em); } .ptx-content .exercise-like ol li > .para:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .contributor .contributor-name { font-variant: small-caps; } .ptx-content .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .ptx-content .contributor { margin-top: 3ex; } .ptx-content .contributor + .contributor { margin-top: 1.5ex; } .ptx-content .contributor + .para { margin-top: 3ex; } .ptx-content .frontmatter .contributors, .ptx-content .book .contributors { text-align: center; font-style: normal; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .searchwrapper .gsc-control-cse { padding: 0; border: none; width: 25ex; } .pretext .searchwrapper .cse .gsc-search-button input.gsc-search-button-v2, .searchwrapper input.gsc-search-button-v2 { padding: 2px 2px; } .pretext .searchwrapper form.gsc-search-box { margin: 0; } .pretext .searchwrapper table.gsc-search-box { margin: 0; } .pretext .searchwrapper .gsc-search-box-tools .gsc-search-box .gsc-input { padding: 0; } .pretext .searchwrapper .gsib_a { padding: 0 0 0 5px; } .pretext .searchwrapper .gsc-input-box { height: 3ex; } .pretext .searchwrapper form.gsc-search-box { font-size: 12px; } .ptx-content div.CodeMirror span.CodeMirror-matchingbracket { color: #090; } .ptx-content .image-archive { margin-left: auto; margin-right: auto; margin-bottom: 0; margin-top: 0.75em; padding-bottom: 0.25em; text-align: center; } .ptx-content .image-archive > a { display: inline-block; padding-left: 0.5em; padding-right: 0.5em; font-family: monospace; } .ptx-content iframe { margin: 0; border: none; box-sizing: border-box; } .ptx-content .times-sign { font-size: larger; vertical-align: -0.15ex; } .ptx-content article.notranslate { margin-top: 0; } .ptx-content article.exercise-like > .exercise-like { margin-left: 40px; } .ptx-content article.exercise-like > .exercise-like.task { margin-left: 20px; } .ptx-content article.exercise-like > .exercise-like > .para { margin-top: 1.25em; } .ptx-content article.example-like > .heading + .introduction { display: inline; } .ptx-content article.example-like > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article.example-like > .exercise-like > .para { margin-top: 1.25em; } .ptx-content .taxon { font-style: italic; } .ptx-content .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .ptx-content .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .ptx-content .sageanswer .output { display: inline-block; vertical-align: top; } .ptx-content .CodeMirror-code pre.CodeMirror-line { padding-bottom: 5px; padding-left: 6px; } .ptx-content .hidden-content, .pretext .hidden-content { display: none; } .ptx-content hr.ptx-pagebreak { width: 30em; text-align: center; margin-left: auto; margin-right: auto; margin-bottom: 2em; margin-top: 0; height: 4em; border: 0; border-bottom: 1px dashed #ccc; } .ptx-content hr.ptx-pagebreak:after { content: "page"; display: inline-block; position: relative; top: 4em; font-size: 80%; padding: 0 0.25em; background: white; } .ptx-content .example-like > .exercise-like > .para:first-of-type { display: inline; } .ptx-content .example-like > .exercise-like > .aside-like { margin-top: -3em; } .ptx-content .example-like > .exercise-like > .aside-like.front { margin-top: 0; } .ptx-content meta { display: none; } .ptx-content .summary-links a { color: #671d12; background: #f0f0f0; text-decoration: none; cursor: pointer; } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: white; background: #671d12; } .ptx-content .summary-links a .codenumber { color: #303030; margin-right: 0.41667em; } .ptx-content .summary-links a:hover .codenumber, .ptx-content .summary-links a:focus .codenumber { color: #f0f0f0; } .ptx-content .summary-links { margin-top: 4em; } .ptx-content section + .summary-links { margin-top: 2em; } .ptx-content .summary-links ul { list-style-type: none; } .ptx-content .summary-links li { margin-top: 0; } .ptx-content section .summary-links li .title { font-style: normal; } .ptx-content .summary-links a { position: relative; display: block; font-size: 1.5em; line-height: 1.25em; padding: 0.41667em 0.83333em; margin-top: 0.20833em; border-radius: 3px; padding-right: 2.06667em; } .ptx-content .summary-links a:after { right: 0.83333em; } .ptx-content .summary-links a:after { content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid #c9c9c9; } .ptx-content .summary-links a, .ptx-content .summary-links a:link, .ptx-content .summary-links a:visited { cursor: pointer; } .ptx-content .summary-links a:hover:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a { font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-content .summary-links a { font-size: 1em; line-height: 1.25em; } } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a:active { position: relative; color: white; background: #932919; text-decoration: none; box-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px 5px inset; } .ptx-content .summary-links a:active:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a:focus { outline: thin dotted #333; outline-offset: -2px; } body.standalone.worksheet .ptx-content .onepage > .heading { margin-top: 0; font-size: 1.3em; } body.standalone.worksheet .ptx-content .onepage > .introduction { margin-top: 0.4em; } body.standalone.worksheet .ptx-content .onepage > .introduction > .heading { font-size: 1.1em; } body.standalone.worksheet .ptx-content .onepage .solutions, body.standalone.worksheet .ptx-content .onepage .instructions { display: none; } body.standalone .ptx-content .worksheet { padding: 40px 0 45px 0; border: 2px solid grey; margin: 0; } body.standalone .ptx-content .onepage { padding: 40px 45px 45px 55px; border-bottom: 2px solid grey; margin: 0; } body.standalone .ptx-content .onepage + .onepage { border-top: 2px solid grey; } body.standalone .ptx-content .onepage.firstpage { padding-top: 0; } body.standalone .ptx-content .onepage.lastpage { padding-bottom: 0; border-bottom: none; } body.standalone .ptx-content .worksheet > *:last-child { padding-bottom: 0 !important; } .ptx-content .onepage + .onepage { margin-top: 2.5em; padding-top: 1.5em; border-top: 1px dashed #aaa; } .ptx-content .onepage + .onepage::before { content: "pagebreak"; text-align: center; margin-left: 40%; padding-left: 1em; padding-right: 1em; position: absolute; top: -0.8em; font-size: 80%; font-style: italic; background: white; } body.standalone .ptx-content .onepage + .onepage { margin-top: 10px; } body.standalone .ptx-content .onepage + .onepage::before { content: none; } body.standalone .ptx-content .onepage article { padding-left: 0; border: none; } body.standalone .ptx-content .onepage article::after { all: unset; } .ptx-content .onepage > .para:first-child, .ptx-content .onepage > article:first-child { margin-top: 0; } .ptx-content section + .onepage.firstpage, .ptx-content article + .onepage.firstpage, .ptx-content .para + .onepage.firstpage { margin-top: 1.25em; } body.worksheet .ptx-content .onepage .sbspanel + .sbspanel > .exercise::before { content: ""; position: absolute; top: 0; bottom: 0; right: 0; left: 0; padding-left: 1.25em; border-left: 1px solid grey; margin-left: -1.25em; z-index: -100; } body.standalone.worksheet .ptx-content section article.task { margin-left: 0; } body.standalone.worksheet .ptx-content section article.task > .heading { font-weight: normal; } body.standalone .autopermalink { display: none; } body.standalone.worksheet .ptx-content .onepage .workspace { border: 2px dotted grey; background: #f3fff3; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed { border: 2px dotted grey; background: #ffe; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed.tight { border: 15px solid; border-image: repeating-linear-gradient( -35deg, #f33, #f33 10px, #000 10px, #000 20px) 20; background: yellow; } body.has-sidebar-left.mathbook-loaded.standalone.worksheet .ptx-page .ptx-main { margin-left: 0; } body.standalone.worksheet .ptx-content .goal-like { border: none; padding: 0; } body.standalone.worksheet .ptx-content .goal-like > .heading { margin-top: -0.5em; padding: 0; margin: 0; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading { display: inline; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading, body.standalone.worksheet .ptx-content section.worksheet > .objectives, body.standalone.worksheet .ptx-content section.worksheet > .introduction, body.standalone.worksheet .ptx-content section.worksheet > .conclusion { margin-left: 55px; margin-right: 40px; } body.standalone.worksheet .ptx-content section.worksheet > .heading + .para { display: inline; } .ui-dialog.ui-widget.ui-widget-content.ui-corner-all.ui-draggable.ui-resizable { left: 0 !important; top: 0 !important; } .ptx-content a.url, .ptx-content a.external { color: #22a; } .ptx-content a.url:hover, .ptx-content a.external:hover { background: #ffd; } .ptx-content .poem { margin-top: 1.5em; } .ptx-content .poem { display: table; margin-top: 1.5em; margin-left: auto; margin-right: auto; margin-bottom: 0; width: auto; max-width: 90%; } .ptx-content .poem > .heading { display: block; text-align: center; } .ptx-content section article.poem > .heading::after { content: ""; } .ptx-content .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .ptx-content .poem .author { font-style: italic; margin-top: 0.75em; } .ptx-content .poem .author.left { text-align: left; } .ptx-content .poem .author.center { text-align: center; } .ptx-content .poem .author.right { text-align: right; } .ptx-content .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .ptx-content .poem .stanza + .stanza { margin-top: 1em; } .ptx-content .poem .heading + .stanza { margin-top: 0.2em; } .ptx-content .poem .heading + .line { margin-top: 0.2em; } .ptx-content .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .ptx-content .poem .line.center { text-align: center; } .ptx-content .poem .line.right { text-align: right; } .ptx-content .poem .tab { margin-left: 2em; } .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } .toolBPanel { overflow: hidden !important; } .toolBPanel:hover { overflow: auto !important; } #aboelkins-ACS .ptx-main .ptx-content > section:first-of-type > section:first-of-type > .project-like:first-of-type li { font-size: 300%; } .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } .ptx-content .marginresource { position: relative; height: 0; left: 40em; top: 1em; } .ptx-content .marginresource a { color: blue; } .ptx-content .marginresource a[knowl] { border-bottom: 1px dotted blue; } .ptx-content .marginresource .icon { font-size: 200%; margin-right: 1em; display: inline-block; } .ptx-content .marginresource .resource_description { display: inline-block; } .ptx-content .marginresource .resource_links { display: block; margin-left: 2em; } .collectedworks .knowl-output { border: 12px solid #D6E3FF; background: none repeat scroll 0% 0% #FAFCFF; border-radius: 4px; margin-bottom: 1.25em; } .collectedworks .subjectwork { max-width: 750px; } .collectedworks .bib { margin-bottom: 1em; } .collectedworks .bibitem + .bibentry { display: inline; } .collectedworks .bibitem { display: inline; font-weight: bold; margin-right: 1em; } .collectedworks .work .title a { text-decoration: none; color: #009; } .iconlegend { position: absolute; margin-top: 0.5em; top: 0; left: 920px; line-height: 1; } .iconlegend .icon_name { font-size: 90%; margin-right: 1em; } .icongroup + .icongroup { margin-left: 1em; } label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } .feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .ptx-content .webwork-button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; background-color: #ffffff; } .ptx-content .webwork-button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .webwork-button:active { cursor: pointer; background-color: #a0a0a0; border: 1px solid #999; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } .ptx-content .exercise-wrapper form button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; color: black; background-color: #ffffff; } .ptx-content .webwork-button.activate { width: 22px; height: 22px; background-image: url(https://raw.githubusercontent.com/openwebwork/webwork2/main/htdocs/images/favicon.ico); background-size: contain; position: absolute; right: -35px; } article.project-like > .heading + div.ptx-runestone-container > div.runestone, article.exercise-like > .heading + div.ptx-runestone-container > div.runestone { margin-top: 0.5em; } .ptx-content .bottom { position: unset; } .ptx-content .rsdraggable { font-size: 100%; } .ptx-content .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .exercise-wrapper form button:active { background-color: #f0f0f0; } .ptx-content .exercise-wrapper form button + button { margin-left: 0.8em; } .ptx-content .exercise-wrapper, .ptx-content .exercise-wrapper form, .ptx-content .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .ptx-content .knowl .exercise-wrapper, .ptx-content .knowl .exercise-wrapper form, .ptx-content .knowl .exercise-wrapper form > div:first-child { width: 100%; } .ptx-content .exercise-wrapper > .para:first-child, .ptx-content .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .ptx-content .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .ptx-content .cols2 .heading + .exercise-wrapper { width: auto; } @media screen and (max-width: 600px) { .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(33.3% - 2em); } .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } @media screen and (max-width: 850px) and (min-width: 786px) { .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(33.3% - 2em); } .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } .APEXlogo { white-space: nowrap; } .APEXlogo .A { margin-right: -0.07em; } .APEXlogo .P { margin-right: -0.33em; position: relative; top: -0.3em; } .APEXlogo .E { position: relative; top: 0.33em; } .runestone-profile .dropdown-content { position: absolute; display: none; right: 0; top: 35px; text-align: left; border: 1px solid; border-color: #600; border-color: var(--tocborder); } .runestone-profile.dropdown:hover { background-color: #ddd; overflow: visible; } .runestone-profile.dropdown:hover .dropdown-content { display: block; } .runestone-profile .dropdown-content { background-color: white; z-index: 1800; min-width: 100px; padding: 5px; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: #662211; padding: 2px 8px; } .runestone-profile.dropdown .dropdown-content a:hover { background-color: #671d12; color: #ffffff; text-decoration: none; background-color: var(--chaptertoc); } .runestone-profile.dropdown .dropdown-content hr { margin-bottom: 4px; margin-top: 4px; border-color: #600; border-color: var(--sectiontoctext); } .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox { } .ptxsearch { height: 35px; flex: 1 1; } .searchbutton .name { display: none; } .searchwidget { text-align: right; } .searchwidget input { } .helpbox { display: none; } .detailed_result { margin-bottom: 10px; } .all_results a:link { text-decoration: none; font-size: large; } .all_results a:hover { background-color: lightgray; } .searchresults a:hover { background-color: #eee; } .searchresults a { text-decoration: none; color: #222; } .searchresults a:hover { text-decoration: underline; color: #33f; } .searchresults ul li { list-style-type: none; } ol.searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; } ol.searchresults > li { list-style-type: none; } .search-result-score { display: none; } .high_result { font-weight: 700; } .medium_result { font-weight: 500; } .low_result { font-weight: 200; } .no_result { font-weight: 200; color: #444; } .detailed_result .no_result { font-size: 90%; } .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; left: 152px; width: 600px; padding: 1em; border: 0.2em solid #009; background: aliceblue; z-index: 5000; display: flex; flex-direction: column; } .search-results-heading { border-bottom: 1px solid rgba(0, 0, 125, 0.5); } .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; } .closesearchresults { display: flex; justify-content: space-between; align-items: center; border: 1px solid black; } .closesearchresults:hover { color: #c00; background-color: #fee; border-color: #f00; } .closesearchresults + h2 { margin-top: -1em; } .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .search-result-bullet { margin-top: 0.3em; } .search-result-clip { font-size: 80%; font-style: italic; color: #444; padding-left: 15px; } .search-results-unshown-count { margin-top: 0.6em; } .search-result-clip-highlight { background: rgba(255, 255, 0, 0.5); } @media screen and (max-width: 800px) { .searchresultsplaceholder { width: 80vw; left: 10vw; bottom: 10vh; } } .pretext .ptx-masthead { position: relative; background: #fafafa; min-height: inherit; border: none; position: relative; } .pretext .ptx-navbar { position: sticky; top: 0; max-width: 904px; height: 36px; } .pretext .ptx-page { position: relative; min-height: 100vh; } .ptx-content { min-height: 60vh; } .pretext .ptx-sidebar { position: sticky; top: 36px; left: 0; float: left; width: 240px; } .pretext .ptx-toc { position: sticky; top: 50px; box-sizing: border-box; overflow-y: scroll; height: calc(100vh - 60px); } .pretext .ptx-page > .ptx-main { display: block; position: relative; overflow-y: hidden; margin: 0 0 0 240px; padding: 1px 0 0 0; background: white; border-left: 1px solid #ccc; } .pretext .ptx-page .ptx-sidebar.hidden + .ptx-main { margin-left: 0; } .pretext .ptx-page > .ptx-main.notoc { margin-left: 0; transition-property: margin-left; transition-duration: 0.3s; } @media screen and (max-width: 800px) { .pretext .ptx-page > .ptx-main { margin-left: 0; left: auto; } .pretext .ptx-page-footer { margin-bottom: 38px; } } .pretext .ptx-page > .ptx-main .ptx-content { max-width: 600px; margin: 32px; } @media screen and (max-width: 663px) { .pretext .ptx-page > .ptx-main .ptx-content { margin: 28px; } } .ptx-content.serif .para .para, .ptx-content[data-font=RS] .para .para { font-size: 100%; } .ptx-content[data-font=RS] .code-inline { background: #f6f6f6; border: 1px solid #eee; padding: 0.01em 0.15em 0.03em 0.15em; margin-left: 0.15em; margin-right: 0.15em; border-radius: 0; } .pretext .ptx-content-footer { margin-top: 2em; display: flex; justify-content: space-around; max-width: 600px; margin-left: 32px; } .pretext .ptx-content-footer .button { min-width: 80px; height: 35px; color: #333333; background-color: #ededed; border: 1px solid #bababa; padding: 0 10px; display: flex; gap: 10px; align-items: center; justify-content: center; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .pretext .ptx-content-footer .button .icon { margin: 0 -7px; } .pretext .ptx-content-footer .button:hover, .pretext .ptx-content-footer .button:active, .pretext .ptx-content-footer .button:focus { background-color: #fafafa; } .pretext .ptx-sidebar.visible { display: block; } .pretext .ptx-page-footer .feedback-link { cursor: pointer; text-align: center; color: #333333; background-color: #ededed; border: 1px solid #bababa; margin: 1.5em 0 0 0; padding: 0 1em 0 1em; height: 2em; display: flex; align-items: center; } .pretext .ptx-page-footer { background: #f4f4f4; margin-top: 2em; padding-top: 0; max-width: 900px; border-top: 2px solid var(--sectiontoctext); border-bottom: 2px solid var(--sectiontoctext); display: flex; flex-direction: row; justify-content: space-around; position: relative; } .pretext .ptx-page-footer > a { margin: 1em 0; } .pretext .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } @media screen and (max-width: 800px) { .pretext .ptx-navbar { position: fixed; top: auto; bottom: 0; z-index: 1100; } .pretext .ptx-sidebar { display: none; position: fixed; top: 10px; z-index: 1000; background: white; } .pretext .ptx-content-footer { display: none; } .pretext .ptx-toc { height: calc(100vh - 50px); } } .ptx-masthead .ptx-banner { border-bottom: 1px solid #d4d4d4; border-top: 1px solid transparent; overflow: hidden; padding-top: 0.625em; padding-bottom: 1.125em; border-bottom: none; } .ptx-masthead { max-width: 904px; border-right: 1px solid #bababa; } .ptx-masthead .title-container { font-size: 1em; padding-left: 9.68px; overflow: hidden; } @media screen and (max-width: 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; margin-top: 0.625em; } } .ptx-masthead .title-container > .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; margin: 0; font-size: 2em; line-height: 1.25em; color: #932919; } @media screen and (max-width: 480px) { .ptx-masthead .title-container > .heading { font-size: 1.5em; line-height: 1.25em; margin: 0; margin-bottom: 0.41667em; } } .ptx-masthead .title-container > .heading a { color: #932919; background: none; text-decoration: none; } .ptx-masthead .title-container > .heading .subtitle { font-weight: normal; } @media screen and (max-width: 800px) { .ptx-masthead .title-container > .heading .subtitle { display: block; font-size: 1.16667em; line-height: 1.42857em; color: #595959; } .ptx-masthead .title-container > .heading .subtitle:before { content: normal; } } .ptx-masthead .logo-link { position: relative; float: left; font-size: 50px; margin-top: 0.1em; margin-left: 9.68px; text-align: center; line-height: 1; } .ptx-masthead .logo-link img { width: auto; height: auto; max-height: 1em; } .ptx-masthead .logo-link:empty:before { font-family: "Open Sans"; font-size: 1em; content: "\2211"; line-height: 1; width: 1em; display: inline-block; vertical-align: top; text-align: center; color: #ccc; } .ptx-masthead .logo-link:empty:hover:before { color: #932919; } .ptx-masthead .logo-link:empty:active:before { color: #3572a0; } .ptx-masthead .logo-link { background: transparent; border: none; text-decoration: none; } @media screen and (max-width: 480px) { .ptx-masthead .logo-link { display: block; float: none; margin: 0; font-size: 50px; } } .ptx-masthead .byline { color: #333333; font-weight: normal; margin: 0; font-size: 1.3125em; line-height: 1.42857em; min-height: inherit; font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-masthead .byline { margin-top: 0; font-size: 1em; line-height: 1.25em; } } .ptx-masthead .byline a { color: #333333; } .ptx-masthead .byline a:hover, .ptx-masthead .byline a:focus { color: #932919; } .ptx-masthead .byline a:active { color: #3572a0; } nav.ptx-navbar { background: #ededed; border: 0; border-top: 1px solid #bababa; border-bottom: 1px solid #bababa; margin: 0; z-index: 100; font-family: "Open Sans"; overflow: visible; display: flex; } .ptx-navbar-contents { display: flex; flex: 1; max-width: 100%; } .ptx-navbar .button { font-size: 1em; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: #333333; background-color: #ededed; border: 0; border-right: 1px solid #bababa; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .ptx-navbar .button:focus { outline: thin dotted #333; outline-offset: -2px; } .ptx-navbar .button:active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-navbar .button:hover { background-color: #fafafa; } .ptx-navbar .button:active { background-color: #e0e0e0; } .ptx-navbar .button.disabled { opacity: 0.4; color: #333333; background: #ededed; box-shadow: none; } .ptx-navbar .toc-toggle { width: 240px; gap: 0.4em; } .ptx-navbar .button .icon { font-size: 1.5em; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls) { display: flex; } .ptx-navbar .treebuttons { flex: 1 1 210px; justify-content: end; } .ptx-navbar .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .pretext .navbar .dropdown { height: 34px; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls) > *:first-child { border-left: 1px solid #bababa; } .ptx-navbar .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .ptx-navbar .treebuttons .icon { margin: 0 -7px; } .ptx-navbar :is(.index-button, .calculator-toggle) .icon { display: none; } .ptx-navbar :is(.runestone-profile, .activecode-toggle, .searchbutton) .name { display: none; } .ptx-navbar .index-button { width: 70px; } .ptx-navbar .calculator-toggle { width: 60px; min-height: 32px; text-align: center; border-radius: 20px; margin-left: 5px; border: 2px solid #66f; line-height: 25px; margin-top: 1px; background-color: #eef; } .ptx-navbar .calculator-toggle.open { background: #fee; border: 2px solid #f66; } @media screen and (max-width: 800px) { .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; background: #ededed; box-shadow: rgba(0, 0, 0, 0.3) 0px -2px 5px; } .ptx-navbar .nav-runestone-controls { flex: 0; } .ptx-navbar .toc-toggle { flex: 2 1 100px; } .ptx-navbar .treebuttons { flex: 3 1 150px; } .ptx-navbar .treebuttons > * { flex: 1 1; min-width: 35px; } .ptx-navbar .index-button { display: none; } .ptx-navbar :is(.treebuttons) > *:first-child { border-left: 0; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button) .name { display: none; } .pretext .ptx-navbar :is(.calculator-toggle, .index-button) .icon { display: inline-block; } .ptx-navbar .nav-runestone-controls > *:first-child { border-left: 0; } .ptx-navbar .calculator-toggle { width: auto; height: 35px; border-radius: 0; margin-left: 0; border: 0; border-right: 1px solid #bababa; line-height: inherit; margin-top: 0; background-color: inherit; } } .ptx-toc { width: 240px; margin: 0; font-size: 14.72px; overflow-y: auto; overflow-x: hidden; } .ptx-toc::after { content: url("data:image/svg+xml; utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='338 3000 8772 6866'%3E%3Cg style='stroke-width:.025in; stroke:black; fill:none'%3E%3Cpolyline points='472,3590 472,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,9448 A 4660 4660 0 0 1 8598 9259 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4488,9685 A 4228 4228 0 0 0 472 9732 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,3590 A 4241 4241 0 0 1 8598 3496 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,3496 A 4241 4241 0 0 1 4724 3590 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,9259 A 4507 4507 0 0 1 4724 9448 '%3E%3C/path%3E%3Cpolyline points='5385,4299 4062,8125 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8598,3496 8598,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='850,3496 850,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='4960,9685 4488,9685 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='3070,4582 1889,6141 3070,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='6418,4582 7600,6141 6418,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8976,3590 8976,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4960,9685 A 4228 4228 0 0 1 8976 9732 '%3E%3C/path%3E%3C/g%3E%3C/svg%3E"); display: block; height: 13em; padding: 2em 1em; background: #fff; } .ptx-toc > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 8px solid #999; } .ptx-toc { --codenumber-pad-left: 0.3rem; --codenumber-pad-right: 0.5rem; --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); } .ptx-toc:is(.depth1, .parts.depth2) { --codenumber-pad-right: 0.5rem; } .ptx-toc .toc-item-list { margin: 0px; padding: 0px; list-style-type: none; } .ptx-toc .toc-item { border-top: 1px solid var(--tocborder, #d1d1d1); } .ptx-toc .toc-title-box { display: flex; } .ptx-toc .toc-title-box > .internal { position: relative; display: flex; flex-grow: 1; padding: 0.2em; font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: bold; } .ptx-toc .toc-item-list .toc-item-list .toc-title-box > .internal { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: normal; } .ptx-toc > .toc-item-list > .toc-item { border-top: 2px solid var(--tocborder, #d1d1d1); } .ptx-toc .toc-item.active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-toc .codenumber { min-width: var(--toc-indent-first); padding-left: var(--codenumber-pad-left); padding-right: var(--codenumber-pad-right); display: inline-block; text-align: left; flex-grow: 0; } .book .ptx-toc .toc-chapter .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .codenumber { font-size: 80%; padding-top: 0.16em; min-width: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber { min-width: var(--toc-indent-third); visibility: hidden; } .ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber { visibility: visible; } .ptx-toc .toc-title-box .title { flex-grow: 1; } .ptx-toc .toc-item .toc-title-box .title { margin-left: var(--toc-indent-first); } .book .ptx-toc .toc-chapter .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .title { margin-left: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { margin-left: var(--toc-indent-third); } .ptx-toc .toc-item > .toc-title-box .codenumber + .title { margin-left: 0 !important; } .ptx-toc ul.structural ul.structural .title:empty::after { content: "empty heading!"; font-weight: bold; } .ptx-toc .toc-chapter .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { font-size: 90%; } .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title { font-style: italic; } .ptx-toc ul.structural li a.has-chevron { padding-right: 2em; } .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth1 ul.structural .toc-item.contains-active { background-color: var(--chaptertocactive); color: var(--chaptertoctextactive); } .ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active { background-color: var(--parttocactive); color: var(--parttoctextactive); } .ptx-toc.focused ul.structural:not(.contains-active) > li { display: none; } .ptx-toc.focused ul.structural li.active > ul > li { display: block; } .ptx-toc.focused ul.structural:not(.contains-active) > li.visible { display: block; } .ptx-toc.focused ul.structural li.active > ul > li.hidden { display: none; } .ptx-toc.focused > ul.structural > li:not(:first-child) { margin-top: 0em; } .ptx-toc.focused ul.structural li ul.structural a:hover { border: 0; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 30px; line-height: 18px; font-variation-settings: "wght" 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--highlighttoc); color: var(--highlighttoctext); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--highlighttoctext); } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); } :root { --parttoc: var(--chaptertoc); --parttoctext: var(--chaptertoctext); --parttocactive: var(--documenttitle); --parttoctextactive: var(--chaptertoctextactive); } @supports (background: color-mix(in srgb, red 50%, blue)) { :root { --parttoc: color-mix(in srgb, var(--chaptertoc), black 15%); } } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowlLinkColor); border-bottom: 1px dotted var(--knowlLinkColor); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--linkbackground); border-bottom-color: transparent; } .knowl__content { margin: 0.2em; border: 6px solid var(--knowlborder); border-radius: 0.4em; padding: 0.8em; background-color: var(--knowlbackground); } .source-view__content { margin: 0.2em 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like, .proof)::after { content: "" !important; border-bottom: none; margin: 0; padding: 0; width: 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like) { padding-left: 0; border-left: none; } .ptx-content .knowl__content > article:is(.proof) { padding-right: 0; border-right: none; } .knowl__content .knowl__content { background-color: var(--knowlNested1Background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested2Background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested3Background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested4Background); } .ptx-content .knowl__content > figure { margin-left: 0; margin-right: 0; } :root { --chaptertitle: var(--documenttitle); --sectiontitle: var(--documenttitle); --subsectiontitle: var(--documenttitle); --bordercolor: var(--documenttitle); --listbackground: #d0ccbd; --insightbackground: #d0c681; --conventionbackground: #b1a77d; --notebackground: #93a396; --examplebackground: #a2bac2; --warningbackground: #b4bd00; --observationbackground: #48848d; } .ptx-content section.chapter h2.heading { color: var(--chaptertitle); } .ptx-content section.chapter h2.heading .title { display: block; font-size: larger; margin-top: 5pt; } .ptx-content section.section h2.heading { color: var(--sectiontitle); border-top: 1pt solid; border-bottom: 1pt solid; margin-bottom: 20pt; width: 100%; } .ptx-content section.subsection h2.heading { color: var(--subsectiontitle); border-bottom: 1pt solid; margin-bottom: 20pt; width: 90%; } .ptx-content section.frontmatter h2.heading { color: var(--chaptertitle); font-size: 2em; } .ptx-content section.preface h2.heading, .ptx-content section.acknowledgement h2.heading, .ptx-content section.colophon h2.heading { color: var(--chaptertitle); margin-bottom: 15pt; font-size: 1.75em; } .ptx-content section.preface h2.heading .title { display: block; font-size: larger; } .ptx-content .list { background-color: var(--listbackground); } .ptx-content .insight { background-color: var(--insightbackground); } .ptx-content .convention { background-color: var(--conventionbackground); } .ptx-content .note { background-color: var(--notebackground); } .ptx-content .example { background-color: var(--examplebackground); } .ptx-content .warning { background-color: var(--warningbackground); } .ptx-content .observation { background-color: var(--observationbackground); } .ptx-content .remark-like, .ptx-content .example-like, .ptx-content .list { padding: 1em; border-radius: 10px; margin-bottom: 1em; border: 2px solid var(--bordercolor); } .ptx-content .example-like .example-like { padding: 0; margin: 0; border: none; background: inherit; } .ptx-content .list { margin-left: 0 !important; margin-right: 0 !important; } .ptx-content .remark-like .heading, .ptx-content .list figcaption { display: block; margin-top: -0.5em !important; padding-bottom: 1em; font-size: large; } :root[data-legacy-colorscheme=blue_green] { --documenttitle: #2a5ea4; --bodytitle: #2b5f82; --bodysubtitle: #a62e1c; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #28803f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } :root[data-legacy-colorscheme=blue_grey] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #525252; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=blue_red] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #932c1c; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=blue_red_dark] { --bodyfontcolor: #eee; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abf; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #316; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #932c1c; --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: #666; --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); body.pretext { background: #222; } .pretext .ptx-page > .ptx-main { background: #444; color: var(--bodyfontcolor); } .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .ptx-navbar { background: #333; } .ptx-navbar .button { background-color: #635; color: #fff; } .ptx-navbar .button:hover { background-color: #fafafa; color: #000; } .ptx-navbar .calculator-toggle { background-color: #336; } .ptx-navbar .calculator-toggle:hover { background-color: #fce; } .pretext .ptx-masthead { background: #555; } .pretext .ptx-masthead .title-container > .pretext .heading, .pretext .ptx-masthead .title-container > .heading a, .pretext .ptx-masthead .logo-link:empty:hover::before, .pretext .ptx-masthead .byline, .pretext .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext .ptx-content .code-inline { color: var(--documenttitledark); } .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext .ptx-content [data-knowl], .pretext .ptx-content [data-knowl]:hover, .pretext .ptx-content [data-knowl]:active, .pretext .ptx-content [data-knowl].active { color: var(--documenttitlelight); } .pretext .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } } :root[data-legacy-colorscheme=bluegreen_grey] { --bluegreen: hsl(192, 98%, 23%); --documenttitle: var(--bluegreen); --bodytitle: var(--bluegreen); --bodysubtitle: var(--bluegreen); --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #ddd; --chaptertoctext: var(--bluegreen); --chaptertocactive: hsl(192, 98%, 19%); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: var(--bluegreen); --sectiontocactive: hsl(192, 98%, 19%); --sectiontoctextactive: white; --tocborder: var(--bluegreen); --highlighttoc: var(--bluegreen); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } :root[data-legacy-colorscheme=brown_gold] { --documenttitle: #472200; --bodytitle: #8e4a0c; --bodysubtitle: #864E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #eaaf0f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #140a00 --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=darkmartiansands] { --documenttitle: #880000; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #b58039; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #550000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=default] { --documenttitle: #932919; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --parttoc: #234b6a; --parttoctext: white; --parttocactive: var(--documenttitle); --parttoctextactive: white; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblagebackground: #F0EAF6; --assemblageborder: #CAAEE0; --assemblagedarkborder: #472664; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=focused_gray_aqua] { --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #1d686e; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #343b48; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --toc-text-dark: #343b48; --toc-text-light: white; --tocborder: var(--toc-text-dark); --active-toc-item: #e5ca34; --parttoc: var(--toc-text-dark); --parttoctext: var(--toc-text-light); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #1d686e; --chaptertoctext: var(--toc-text-light); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fffffd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: var(--active-toc-item); --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } :root[data-legacy-colorscheme=focused_light] { --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --toc-text-dark: #333; --tocborder: var(--toc-text-dark); --active-toc-item: #dbebf1; --parttoc: #e8e8e8; --parttoctext: var(--toc-text-dark); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #f2f2f2; --chaptertoctext: var(--toc-text-dark); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fdfdfd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: #c2e5f2; --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } :root[data-legacy-colorscheme=green_blue] { --documenttitle: #248038; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #2650a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #195827; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=green_plum] { --documenttitle: #28803f; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #822060; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20602f; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=maroon_grey] { --documenttitle: #660000; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6d8899; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #330000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=martiansands] { --documenttitle: #944921; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #d19e69; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #6a3418; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=orange_navy] { --documenttitle: #d64000; --bodytitle: #00408a; --bodysubtitle: #9e2f00; --bodytitlehighlight: #ffcdbd; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #00326b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #00326b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #006deb; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=pastel_blue_orange] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffffff; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } :root[data-legacy-colorscheme=red_blue] { --documenttitle: #932919; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_amethyst] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6f080b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #008099; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_emerald] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d9ffe9; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #16a67d; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_turquoise] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #008099; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } body.pretext { color: var(--bodyfontcolor); } .ptx-masthead .title-container > .heading, .ptx-masthead .title-container > .heading a, .ptx-masthead .logo-link:empty:hover::before, .ptx-masthead .byline a { color: var(--documenttitle, #2a5ea4); } .ptx-masthead .title-container > .heading a:active, .ptx-masthead .logo-link:empty:active::before, .ptx-masthead .byline a:active { color: var(--bodytitle, #932c1c); } .ptx-toc .toc-item { color: var(--sectiontoctext, #404040); background-color: var(--sectiontoc); border-color: var(--tocborder, #afc2e5); } .ptx-toc .toc-item.active { color: var(--sectiontoctextactive); background-color: var(--sectiontocactive); border-color: var(--highlighttocborder); } .ptx-toc:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc > .toc-item-list > .toc-item { color: var(--chaptertoctext); background-color: var(--chaptertoc); } .ptx-toc > .toc-item-list > .toc-item.active { color: var(--chaptertoctextactive); background-color: var(--chaptertocactive); border-color: var(--highlighttocborder); } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--highlighttoctext, #321a0c); background-color: var(--highlighttoc); border-color: var(--highlighttocborder, #ec704b); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter) { background-color: var(--parttoc); color: var(--parttoctext); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter).active { background-color: var(--parttocactive); color: var(--parttoctextactive); } .ptx-toc.focused .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused .toc-chapter.active { background-color: var(--chaptertocactive); color: var(--chaptertoctextactive); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item { background-color: var(--sectiontoc); color: var(--sectiontoctext); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item.active { background-color: var(--sectiontocactive); color: var(--sectiontoctextactive); } .ptx-content .summary-links a { color: var(--sectiontoctext); } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: var(--highlighttoctext); background: var(--highlighttoc); } .ptx-content .para > a.internal { color: var(--bodysubtitle); } .ptx-content .para > a.external { color: var(--bodysubtitle); } .ptx-content .para > a.internal:hover, .ptx-content .para > a.internal:hover *, .ptx-content .para > a.internal:focus, .ptx-content .para > a.internal:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .para > a.external:hover, .ptx-content .para > a.external:hover *, .ptx-content .para > a.external:focus, .ptx-content .para > a.external:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .playvideo { background-color: var(--videoplay); } .ptx-content .goal-like { border-color: var(--goalborder); } .ptx-content .assemblage-like { border-color: var(--assemblageborder); background-color: var(--assemblagebackground); } .ptx-content .knowl-output { border-color: var(--knowlborder); background-color: var(--knowlbackground); } .pretext[data-atmosphere=pastel], .pretext[data-atmosphere=pastel] .ptx-main { background: #dbf5ff; background: #efe; } .pretext[data-atmosphere=pastel] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoc: #dcdcf9; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffeeee; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoc: #fadfa3; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } .pretext[data-atmosphere=pastel] .ptx-toc { scrollbar-color: var(--documenttitlelight) #efe; } .pretext[data-atmosphere=pastel] .ptx-navbar { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere=pastel] .ptx-masthead { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere=pastel] .ptx-sidebar { background: #ffd; } .pretext[data-atmosphere=darktwilight] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abd; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(9, 72%, 30%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 40%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 33%); --navbarbackground: hsl(0, 0%, 33%); --footerbackground: hsl(0, 0%, 30%); --mainbackground: hsl(0, 0%, 27%); --buttonbackground: hsl(225, 80%, 25%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 23%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 20%); } .pretext[data-atmosphere=dark] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(5, 86%, 24%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 27%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 20%); --navbarbackground: hsl(0, 0%, 20%); --footerbackground: hsl(0, 0%, 22%); --mainbackground: hsl(0, 0%, 17%); --buttonbackground: hsl(232, 90%, 19%); --codebackground: hsl(120, 100%, 15%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 19%); } .pretext[data-atmosphere=darkmidnight] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad9; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(0, 100%, 17%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 13%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 16%); --navbarbackground: hsl(0, 0%, 16%); --footerbackground: hsl(0, 0%, 13%); --mainbackground: hsl(0, 0%, 7%); --buttonbackground: hsl(240, 100%, 13%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 17%); } .pretext[data-atmosphere*=dark] { background: var(--mainbackground); } .pretext[data-atmosphere*=dark] .ptx-page > .ptx-main { background: var(--mainbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .pretext[data-atmosphere*=dark] .ptx-navbar { background: var(--navbarbackground); } .pretext[data-atmosphere*=dark] .ptx-page-footer .feedback-link, .pretext[data-atmosphere*=dark] .ptx-content-footer .button, .pretext[data-atmosphere*=dark] .ptx-navbar .button { background-color: var(--buttonbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-page-footer .feedback-link:hover, .pretext[data-atmosphere*=dark] .ptx-content-footer .button:hover, .pretext[data-atmosphere*=dark] .ptx-navbar .button:hover, .pretext[data-atmosphere*=dark] .ptx-content-footer .button:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-navbar .calculator-toggle { background-color: var(--buttonbackground); } .pretext[data-atmosphere*=dark] .ptx-navbar .calculator-toggle:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-masthead { background: var(--bannerbackground); } .pretext[data-atmosphere*=dark] .ptx-page-footer { background: var(--footerbackground); border-top-color: #447; border-bottom-color: #447; } .pretext[data-atmosphere*=dark] .ptx-page-footer .logo { background: #779; border-radius: 0.4em; } .pretext[data-atmosphere*=dark] .ptx-masthead .title-container > .pretext .heading, .pretext[data-atmosphere*=dark] .ptx-masthead .title-container > .heading a, .pretext[data-atmosphere*=dark] .ptx-masthead .logo-link:empty:hover::before, .pretext[data-atmosphere*=dark] .ptx-masthead .byline, .pretext[data-atmosphere*=dark] .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext[data-atmosphere*=dark] .ptx-toc { scrollbar-color: var(--documenttitlelight) var(--footerbackground); } .pretext[data-atmosphere*=dark] .ptx-content .code-inline { background: var(--codebackground); } .pretext[data-atmosphere*=dark] .ptx-content .kbdkey { background: var(--keybackground); } .pretext[data-atmosphere*=dark] .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext[data-atmosphere*=dark] .ptx-content a.url, .pretext[data-atmosphere*=dark] .ptx-content a.internal, .pretext[data-atmosphere*=dark] .ptx-content a.external { background-color: var(--linkbackground); color: var(--bodyfontcolor, #ddc); } .pretext[data-atmosphere*=dark] .ptx-content [data-knowl] { background-color: var(--linkbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-content [data-knowl]:hover, .pretext[data-atmosphere*=dark] .ptx-content [data-knowl]:active, .pretext[data-atmosphere*=dark] .ptx-content [data-knowl].active { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } :root { --knowlLinkColor: var(--documenttitle); --linkColor: var(--bodysubtitle); --linkBackground: var(--bodysubtitlehighlight); --knowlNested1Background: #f5f5ff; --knowlNested2Background: #fffff5; --knowlNested3Background: #f5ffff; --knowlNested4Background: #fff5f5; } /*! Theme: soundwriting-legacy */ /*# sourceMappingURL=theme-soundwriting-legacy.css.map */ ================================================ FILE: css/dist/theme-tacoma.css ================================================ @charset "UTF-8"; @import "https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=swap"; @import "https://fonts.googleapis.com/css2?family=PT Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap"; @import "https://fonts.googleapis.com/css2?family=Inconsolata:ital,wght@0,400..700;1,400..700&display=swap"; /* ../../css/targets/html/tacoma/theme-tacoma.scss */ :root { --base-content-width: 600px; --content-padding: 48px; } body { margin: 0; min-height: 100vh; display: flex; flex-direction: column; align-items: stretch; } body.pretext { color: var(--body-text-color); font-family: var(--font-body); } .ptx-page { position: relative; display: flex; flex-grow: 1; width: 100%; } .ptx-main { flex-grow: 1; position: relative; max-width: 100%; container-name: ptx-main; container-type: inline-size; } .ptx-main .ptx-content { max-width: 696px; padding: 24px 48px 60px; margin-left: auto; margin-right: auto; } .worksheet .ptx-main .ptx-content { max-width: 960px; } .ptx-page { max-width: 1000px; margin-left: auto; margin-right: auto; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; background: var(--page-color, white); } .ptx-content .print-preview-header { display: none; } body.pretext > a.assistive { padding: 6px; position: absolute; top: -40px; left: 0px; color: white; border-right: 1px solid white; border-bottom: 1px solid white; border-bottom-right-radius: 8px; background: #BF1722; z-index: 10000; } body.pretext > a.assistive:focus { top: 0px; outline: 0; transition: top 0.1s ease-in, background 0.5s linear; } .ptx-content-footer { display: flex; justify-content: space-around; max-width: 696px; padding-top: 2em; padding-bottom: 2em; padding-left: 48px; padding-right: 48px; margin-left: auto; margin-right: auto; } .ptx-content-footer .button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-content-footer .button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content-footer .button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-content-footer .button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-content-footer .button.hidden { display: none; } .ptx-content-footer .button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content-footer .button .icon { margin: 0 -7px; } body.standalone-page .ptx-page { max-width: 1600px; } .ptx-masthead { position: relative; background: var(--banner-background); width: 100%; display: flex; justify-content: center; } .ptx-masthead .ptx-banner { border-top: 1px solid transparent; overflow: hidden; padding: 10px 10px; border-bottom: none; display: flex; width: 100%; align-items: center; max-width: 1200px; } .ptx-masthead a { color: var(--doc-title-color, #2a5ea4); } .ptx-masthead a:active { color: var(--link-active-text-color); } .ptx-masthead .title-container { font-family: var(--font-headings); font-size: 2em; padding-left: 9.68px; overflow: hidden; flex: 1; } .ptx-masthead .title-container .heading { font-weight: 700; font-size: 100%; line-height: 1.25em; } .ptx-masthead .title-container .title:has(+ .subtitle)::after { content: ":"; } .ptx-masthead .title-container .subtitle { font-weight: normal; } .ptx-masthead .logo-link { height: 5em; display: flex; } .ptx-masthead .logo-link img { max-height: 100%; } .ptx-masthead .logo-link img[src$=".svg"] { height: 100%; } .ptx-masthead .byline { color: var(--byline-color); font-weight: normal; margin: 0; font-size: 62.5%; min-height: inherit; } @media screen and (max-width: 800px) { .ptx-masthead { border-bottom: 1px solid var(--page-border-color); } .ptx-masthead .ptx-banner { padding: 10px 28px; display: flex; justify-content: center; } .ptx-masthead .logo-link::before { font-size: 1rem; margin-top: 0; } .ptx-masthead .title-container { width: fit-content; flex: unset; } .ptx-masthead .title-container .heading { line-height: 1em; } .ptx-masthead .title-container .heading .subtitle { display: block; font-size: 80%; line-height: 1em; } .ptx-masthead .byline { font-size: 50%; } } @media screen and (width <= 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; font-size: 1em; } .ptx-masthead .logo-link { display: none; } .ptx-masthead .byline { display: none; } } .ptx-navbar { position: sticky; top: 0; height: 36px; width: 100%; background: var(--navbar-background); border: 0; border-top: 1px solid var(--page-border-color); border-bottom: 1px solid var(--page-border-color); margin: 0; z-index: 500; overflow: visible; display: flex; } .ptx-navbar .ptx-navbar-contents { position: relative; display: flex; flex: 1; justify-content: center; align-items: center; max-width: 1000px; margin: 0 auto; } .ptx-navbar .button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-navbar .button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-navbar .button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-navbar .button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-navbar .button.hidden { display: none; } .ptx-navbar .button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-navbar .button { height: 100%; border-width: 0; } .ptx-navbar .toc-toggle { width: 240px; gap: 0.4em; margin-left: 0; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls, .nav-other-controls) { display: flex; } .ptx-navbar .treebuttons { flex: 1 1 210px; justify-content: end; } .ptx-navbar .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .ptx-navbar .pretext .navbar .dropdown { height: 34px; } .ptx-navbar .embed-popup { padding: 10px; background-color: var(--navbar-background); position: absolute; margin-top: 36px; border: 1px solid var(--page-border-color); border-radius: 3px; box-shadow: 0 0 5px var(--primary-color-gray-80); color: var(--button-text-color); } .ptx-navbar .embed-popup .embed-code-container { width: "100%"; padding: 5px; } .ptx-navbar .embed-popup .embed-code-container .embed-code-textbox { width: 100%; padding: 10px; height: 5em; } .ptx-navbar .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .ptx-navbar .treebuttons .icon { margin: 0 -7px; } .ptx-navbar :is(.index-button) .icon { display: none; } .ptx-navbar :is(.runestone-profile, .activecode-toggle, .searchbutton, .calculator-toggle, .light-dark-button, .embed-button) .name { display: none; } .ptx-navbar .index-button { min-width: 70px; } .runestone-profile { position: relative; } .runestone-profile .dropdown-content { display: none; position: absolute; background-color: var(--dropdown-background); min-width: 160px; z-index: 100; border: 1px solid var(--dropdown-border-color); right: 0; top: 35px; text-align: start; padding: 0; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: var(--dropdown-text-color); padding: 2px 8px; } .runestone-profile .dropdown-content a:is(:hover, :focus-visible) { background-color: var(--dropdown-hover-background); color: var(--dropdown-hover-text-color); } .runestone-profile .dropdown-content hr { color: var(--dropdown-border-color); margin: 4px 0; } .runestone-profile:is(:hover, :focus-visible, :focus-within) { overflow: visible; } .runestone-profile:is(:hover, :focus-visible, :focus-within) .dropdown-content { display: block; } @media screen and (max-width: 800px) { .ptx-navbar .button { border-left-width: 1px; border-right-width: 1px; border-color: var(--page-border-color); } .ptx-navbar > *:not(:first-child) { margin-left: -1px; } .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; z-index: 1100; background: var(--button-border-color); max-width: 100vw; } .ptx-navbar .ptx-navbar-contents { max-width: 100vw; } .ptx-navbar .nav-runestone-controls { flex: 0; } .ptx-navbar .toc-toggle { flex: 2 1 100px; } .ptx-navbar .treebuttons { flex: 3 1 150px; } .ptx-navbar .treebuttons > * { flex: 1 1; min-width: 35px; } .ptx-navbar .index-button { display: none; } .ptx-navbar .embed-popup { margin-top: unset; bottom: 36px; } .ptx-navbar .dropdown-content { top: unset; bottom: 36px; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button, .embed-button) .name { display: none; } } .ptx-sidebar { align-self: flex-start; } .ptx-sidebar.visible { display: block; } .ptx-sidebar.hidden { display: none; height: 0; } .ptx-toc { --codenumber-pad-left: 0.3rem; --codenumber-pad-right: 0.5rem; --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); background: var(--toc-background); margin: 0; font-size: 0.9rem; } .ptx-toc:is(.depth1, .parts.depth2) { --codenumber-pad-right: 0.5rem; } .ptx-toc .toc-item-list { margin: 0; padding: 0; list-style: none; background: var(--tocitem-background); } .ptx-toc .toc-item-list .active { list-style: none; } .ptx-toc .toc-item { background-color: var(--tocitem-background); color: var(--toc-text-color); border-color: var(--toc-border-color); } .ptx-toc .toc-item a { color: inherit; } .ptx-toc .toc-item.active:not(:has(.toc-item.active)) { color: var(--tocitem-active-text-color) !important; background-color: var(--tocitem-active-background) !important; border-color: var(--tocitem-active-border-color) !important; } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--tocitem-highlight-text-color); background-color: var(--tocitem-highlight-background); border-color: var(--tocitem-highlight-border-color); } .ptx-toc .toc-title-box { display: flex; } .ptx-toc .toc-title-box > .internal { position: relative; display: flex; flex-grow: 1; padding: 0.2em; font-weight: 500; } .ptx-toc .toc-item-list .toc-item-list .toc-title-box > .internal { font-weight: normal; } .ptx-toc .codenumber { min-width: var(--toc-indent-first); padding-left: var(--codenumber-pad-left); padding-right: var(--codenumber-pad-right); display: inline-block; text-align: left; flex-grow: 0; } .ptx-toc .toc-item { color: var(--toclevel1-text-color); background-color: var(--toclevel1-background); } .ptx-toc .toc-item .toc-item { color: var(--toclevel2-text-color); background-color: var(--toclevel2-background); } .ptx-toc .toc-item .toc-item .toc-item { color: var(--toclevel3-text-color); background-color: var(--toclevel3-background); } .book .ptx-toc .toc-chapter .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .codenumber { font-size: 80%; padding-top: 0.16em; min-width: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber { min-width: var(--toc-indent-third); visibility: hidden; } .ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber { visibility: visible; } .ptx-toc .toc-item .toc-title-box .title { margin-left: var(--toc-indent-first); } .book .ptx-toc .toc-chapter .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .title { margin-left: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { margin-left: var(--toc-indent-third); } .ptx-toc .toc-item > .toc-title-box .codenumber + .title { margin-left: 0 !important; } .ptx-toc .toc-chapter .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { font-size: 90%; } .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title { font-style: italic; } .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth1 ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-backgrounde); color: var(--tocitem-active-text-color); } .ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active { background-color: var(--tocitem-active-background); color: var(--tocitem-active-text-color); } .ptx-toc.focused { } .ptx-toc.focused ul.structural:not(.contains-active) > .toc-item { display: none; } .ptx-toc.focused ul.structural:not(.contains-active) > .toc-item.visible { display: block; } .ptx-toc.focused ul.structural .toc-item.active > ul.structural > .toc-item { display: block; } .ptx-toc.focused ul.structural .toc-item.active > ul.structural > .toc-item.hidden { display: none; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 1.25em; line-height: 18px; font-variation-settings: "wght" 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--tocitem-highlight-background); color: var(--tocitem-highlight-text-color); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--tocitem-highlight-text-color); } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon:before { content: "add"; } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before { content: "remove"; } .ptx-sidebar { position: sticky; width: 0; display: none; z-index: 200; height: 0; top: 35px; } .ptx-toc { border-right: 1px solid var(--toc-border-color); border-bottom: 1px solid var(--toc-border-color); max-height: calc(100vh - 200px); overflow-y: auto; background: var(--page-color); width: 240px; } .ptx-toc > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 3px solid var(--toc-border-color); } @media screen and (max-width: 800px) { .ptx-sidebar { position: fixed; top: unset; height: auto; max-height: 80vh; max-width: 80vw; bottom: 36px; border-right: 2px solid var(--toc-border-color); border-top: 2px solid var(--toc-border-color); } .ptx-toc { border-top: 2px solid var(--toc-border-color); border-bottom: 0; max-height: 80vh; } } .ptx-page-footer { background: var(--footer-background); padding-top: 0; border-top: 2px solid var(--page-border-color); border-bottom: 2px solid var(--page-border-color); display: flex; flex-direction: row; justify-content: center; width: 100%; gap: 90px; position: relative; } .ptx-page-footer > a { margin: 1em 0; color: var(--body-text-color); } .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } .ptx-page-footer .feedback-link { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-page-footer .feedback-link:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-page-footer .feedback-link:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-page-footer .feedback-link.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-page-footer .feedback-link.hidden { display: none; } .ptx-page-footer .feedback-link.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } @media screen and (max-width: 800px) { .ptx-page-footer { gap: 20px; justify-content: center; margin-bottom: 34px; } .ptx-page-footer > a > .logo:first-child { height: 2em; } } @media screen and (width < 1000px) { .ptx-main .ptx-content { margin: 0; } } @container ptx-main (width < 696px) { .ptx-page > .ptx-main .ptx-content { padding-left: 28px; padding-right: 28px; max-width: calc(600px + 2 * 28px); } } .aside-like > .knowl__link { color: var(--aside-like-link-color); border-bottom-color: var(--aside-like-link-color); } .aside-like > .knowl__content { margin-left: 30px; margin-right: 30px; border: 2px solid var(--aside-like-border-color); background-color: var(--aside-like-body-background); } .code-box { overflow-x: auto; } .code-display { overflow-x: auto; font-family: var(--font-monospace); margin: 0.5em 0; } .console, .program { border: 1px solid var(--page-border-color); padding: 5px 15px; overflow-x: auto; margin: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-inline { font-family: var(--font-monospace); white-space: pre; color: var(--body-text-color); background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); border-radius: 0.2em; display: inline-block; overflow-x: auto; max-width: 100%; vertical-align: middle; line-height: normal; padding: 0.0625em 0.15em; } .prompt.unselectable { user-select: none; } .code-block { border-left: 1px solid #aaa; padding: 0 15px 5px; overflow-x: auto; background: var(--code-background); margin-top: 0; margin-bottom: 0; font-family: var(--font-monospace); background: var(--code-background); font-size: 0.93rem; line-height: 1.2; } .code-block::before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } @media print { .code-copy { display: none; } } :is(.cols2, .cols3, .cols4, .cols5, .cols6) { display: flex; flex-wrap: wrap; justify-content: start; } .cols2 > .exercise-like { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > .exercise-like { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > .exercise-like { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > .exercise-like { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > .exercise-like { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .exercise-like > .heading { font-size: inherit; } .exercisegroup .exercise-like { margin-top: 1em; } .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .exercisegroup > .heading + .introduction { display: inline; } .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .exercisegroup .exercisegroup-exercises { margin-top: 1em; padding-left: 40px; } .exercisegroup .conclusion { margin-left: 40px; } .exercisegroup .conclusion .heading { font-size: inherit; } .exercise-like > .exercise-like.task { margin-left: 20px; } .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .exercise-wrapper form button:active { background-color: #f0f0f0; } .exercise-wrapper form button + button { margin-left: 0.8em; } .exercise-wrapper, .exercise-wrapper form, .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .knowl .exercise-wrapper, .knowl .exercise-wrapper form, .knowl .exercise-wrapper form > div:first-child { width: 100%; } .exercise-wrapper > .para:first-child, .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .cols2 .heading + .exercise-wrapper { width: auto; } section.solutions > .heading + .heading { margin-top: 0.5em; } section.solutions > h3.heading, section.solutions section > h3.heading { font-size: 1.6em; } section.solutions > h4.heading, section.solutions section > h4.heading { font-size: 1.45em; } section.solutions > h5.heading, section.solutions section > h5.heading { font-size: 1.35em; } section.solutions > h6.heading, section.solutions section > h6.heading { font-size: 1.25em; } .sbsgroup > *:not(:first-child) { margin-top: 1.5em; } .sbsrow { display: grid; grid-template-rows: auto auto; } .sbspanel { grid-row: 1; } .sbspanel > .table > figcaption { text-align: center; } .sbspanel .tabular { overflow-x: auto; margin-left: auto; margin-right: auto; } .sbspanel--top { align-self: start; } .sbspanel--middle { align-self: center; } .sbspanel--bottom { align-self: end; } .sbspanel:has(.figure-like, .table-like), .sbspanel > :is(.figure-like, .table-like) { display: contents; } .sbspanel > :is(.figure-like, .table-like) > *:first-child { grid-row: 1; align-items: start; align-self: start; } .sbspanel--top > :is(.figure-like, .table-like) > *:first-child { align-items: start; align-self: start; } .sbspanel--middle > :is(.figure-like, .table-like) > *:first-child { align-items: center; align-self: center; } .sbspanel--bottom > :is(.figure-like, .table-like) > *:first-child { align-items: end; align-self: end; } .sbspanel > :is(.figure-like, .table-like) > *:nth-child(2) { margin-top: 0.5em; grid-row: 2; width: 100%; } .sbspanel:nth-of-type(2) * { grid-column: 2; } .sbspanel:nth-of-type(3) * { grid-column: 3; } .sbspanel:nth-of-type(4) * { grid-column: 4; } .sbspanel:nth-of-type(5) * { grid-column: 5; } .sbspanel:nth-of-type(6) * { grid-column: 6; } .sbspanel:nth-of-type(7) * { grid-column: 7; } .sbspanel:nth-of-type(8) * { grid-column: 8; } .sbspanel:nth-of-type(9) * { grid-column: 9; } .sbspanel:nth-of-type(10) * { grid-column: 10; } .discussion-like > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .discussion-like > .heading:first-child:after { content: "\2009"; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .discussion-like > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } .discussion-like > .heading ::after { content: "\2009"; } .discussion-like > .heading + .para { display: inline; } .discussion-like > .heading .space, .discussion-like > .heading .codenumber, .discussion-like > .heading .period { display: none; } .discussion-like > .heading .type::after { content: ". "; } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowl-link-color); border-bottom: 1px dotted var(--knowl-link-color); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--knowl-background); border-bottom-color: transparent; } .source-view__content { margin: 0.2em 0; } .knowl__content { margin: 0.75em 0; border: 3px solid var(--knowl-border-color); border-radius: 0; padding: 12px; background-color: var(--knowl-background); } .knowl__content .incontext { display: block; font-size: 85%; text-align: right; } .knowl__content .knowl__content { background-color: var(--knowl-nested-1-background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-2-background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-3-background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowl-nested-4-background); } .knowl__content > figure { margin-left: 0; margin-right: 0; } .assemblage-like:not(.knowl__content, .born-hidden-knowl), .goal-like:not(.knowl__content, .born-hidden-knowl) { padding: 10px; padding-left: 15px; border-left: 4px solid var(--block-border-color); background-color: var(--goal-body-background); } .assemblage-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child, .goal-like:not(.knowl__content, .born-hidden-knowl) > .heading:first-child { margin-top: 0; } .theorem-like .heading, .definition-like .heading { display: block; font-size: 1.1em; } .theorem-like .para, .definition-like .para { font-style: italic; } .example-like > .heading, .project-like > .heading, .remark-like > .heading, .openproblem-like > .heading, .computation-like > .heading { display: block; font-size: 1.1em; } .proof { padding-bottom: 1.5em; } .proof::after { content: "\25a1"; float: right; } .proof .heading { font-size: unset; font-weight: bold; font-style: italic; } .solution-like .heading { display: inline; font-style: italic; font-size: unset; } .paragraphs > .heading:first-child { display: inline; line-height: initial; border-bottom: 0; } .paragraphs > .heading:first-child:after { content: "\2009"; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction) { display: inline; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction) > .para:first-child { display: inline; } .paragraphs > .heading:first-child + :is(.para, .para.logical, .introduction) > .para.logical:first-child > .para:first-child { display: inline; } * { box-sizing: border-box; } @layer spacing { :is(section, article, .knowl__content) > *:not(:first-child) { margin-top: 1.5em; } :is(section, article, .knowl__content) > .para + .para { margin-top: 1em; } .ptx-content :is(ul, td, li, dd, .blockquote, .sbspanel, .para.logical) > *:not(:first-child) { margin-top: 0.5em; } } ol.no-marker, ul.no-marker, li.no-marker { list-style-type: none; } ol.decimal { list-style-type: decimal; } ol.lower-alpha { list-style-type: lower-alpha; } ol.lower-alpha-level-1 > li::marker { content: "(" counter(list-item, lower-alpha) ") "; } ol.upper-alpha { list-style-type: upper-alpha; } ol.lower-roman { list-style-type: lower-roman; } ol.upper-roman { list-style-type: upper-roman; } ul.disc { list-style-type: disc; } ul.square { list-style-type: square; } ul.circle { list-style-type: circle; } dl:is(.description-list, .glossary) { margin: 0; } dl:is(.description-list, .glossary) dt { font-weight: bold; max-width: 55ex; } dl:is(.description-list, .glossary) dd::after { content: ""; display: block; clear: both; } .para > dl:is(.description-list) { margin-top: 0.5em; margin-bottom: 0.5em; } dl.glossary dt { margin-top: 1.25em; } dl.glossary dt:first-of-type { margin-top: 0; } dl.glossary dd { margin-left: 5ex; } dl.description-list dt, dl.description-list dd { margin-top: 1em; } dl.description-list dt:first-of-type, dl.description-list dd:first-of-type { margin-top: 0; } dl.description-list dt { float: left; clear: both; text-align: right; width: 18ex; margin-right: 1ex; } dl.description-list dd { margin-left: 22ex; } dl.description-list.narrow dt { width: 11ex; } dl.description-list.narrow dd { margin-left: 15ex; } dl.description-list.wide dt { width: 25ex; } dl.description-list.wide dd { margin-left: 29ex; } dl.description-list dt:first-of-type { clear: none; } .description-list + * { clear: both; } dl.description-list dl dt { width: 8ex; } dl.description-list dd dd { margin-left: 18ex; } dl.description-list dl dd { margin-left: 12ex; } @media screen and (max-width: 480px) { dl.description-list dt, dl.description-list.narrow dt { float: none; margin-left: 0; text-align: left; width: 25ex; } dl.description-list dd, dl.description-list.narrow dd, dl.description-list.wide dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } .cols2 > li { min-width: calc(50% - 2em); width: min-content; margin-right: 2em; } .cols3 > li { min-width: calc(33.3333333333% - 2em); width: min-content; margin-right: 2em; } .cols4 > li { min-width: calc(25% - 2em); width: min-content; margin-right: 2em; } .cols5 > li { min-width: calc(20% - 2em); width: min-content; margin-right: 2em; } .cols6 > li { min-width: calc(16.6666666667% - 2em); width: min-content; margin-right: 2em; } .ptx-content li { margin-top: 0.5em; } .ptx-content li .li--heading-title { font-size: 100%; font-weight: normal; font-style: italic; } .para > :is(ol, ul) { margin-top: 0.5em; margin-bottom: 0.5em; } ol > li { padding-left: 0.25em; } .fillin { display: inline-block; border: none; border-width: 1px; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; } .fillin.underline { border-bottom-style: solid; border-width: 1px; } .fillin.box { outline: 1px solid var(--body-text-color); height: 1.3em; } .fillin.shade { background-color: var(--fillin-background-color, #eee); height: 1.3em; } :root.dark-mode { --fillin-background-color: #444; } .heading:is(h1, h2, h3, h4, h5, h6) { margin: 0; font-size: unset; } .heading { line-height: 1.1; font-family: var(--font-headings); font-weight: 700; margin-top: 0; margin-bottom: 0; } section > .heading { font-size: 1.75em; color: var(--body-title-color); line-height: 1.25em; margin-top: 2.5em; margin-bottom: 0.5em; } section > .heading + * { margin-top: 0.5em; } .ptx-content > section > .heading { margin-top: 0.5em; } section section > .heading { font-size: 1.5em; margin-top: 2em; } section section section > .heading { font-size: 1.4em; margin-top: 2em; } article > .heading { font-size: 1.25em; margin-top: 1.5em; } article > .heading + * { margin-top: 0.5em; } .paragraphs > .heading { font-size: 1.125em; } :is(section, article) > .heading + :is(section, article) > .heading { margin-top: 0.5em; } @media screen and (max-width: 480px) { section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } section section > .heading { font-size: 1.3em; line-height: 1.15em; } section section section > .heading { font-size: 1.15em; line-height: 1em; } } .heading.hide-type > .type { display: none; } a { color: var(--link-text-color); text-decoration: none; } a:hover, a:focus { text-decoration: none; } a[href^="mailto:"] { white-space: pre; } .ptx-content a.internal { color: var(--link-text-color); font-weight: bold; } .ptx-content a.external { color: var(--link-alt-text-color); font-weight: bold; } .ptx-content a.internal:hover, .ptx-content a.internal:hover *, .ptx-content a.internal:focus, .ptx-content a.internal:focus * { color: var(--link-active-text-color); background-color: var(--link-active-background); font-weight: bold; } .ptx-content a.external:hover, .ptx-content a.external:hover *, .ptx-content a.external:focus, .ptx-content a.external:focus * { color: var(--link-alt-active-text-color); background-color: var(--link-alt-active-background); font-weight: bold; } .ptx-content table { border-spacing: 0; border-collapse: collapse; } .ptx-content td { padding: 2px 5px; font-size: 90%; } .ptx-content td img { max-width: 200px; margin-right: 30px; } .ptx-content th { padding: 2px 5px; } .ptx-content th .lines { white-space: nowrap; } .ptx-content th.l { text-align: left; } .ptx-content th.c { text-align: center; } .ptx-content th.r { text-align: right; } .ptx-content th.j { text-align: justify; } .ptx-content th.t { vertical-align: top; } .ptx-content th.b { vertical-align: bottom; } .ptx-content th.m { vertical-align: middle; } .ptx-content th.l0 { border-left: none; } .ptx-content th.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content th.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content th.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content th.r0 { border-right: none; } .ptx-content th.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content th.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content th.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content th.t0 { border-top: none; } .ptx-content th.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content th.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content th.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content th.b0 { border-bottom: none; } .ptx-content th.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content th.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content th.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content td .lines { white-space: nowrap; } .ptx-content td.l { text-align: left; } .ptx-content td.c { text-align: center; } .ptx-content td.r { text-align: right; } .ptx-content td.j { text-align: justify; } .ptx-content td.t { vertical-align: top; } .ptx-content td.b { vertical-align: bottom; } .ptx-content td.m { vertical-align: middle; } .ptx-content td.l0 { border-left: none; } .ptx-content td.l1 { border-left: 1px solid var(--body-text-color); } .ptx-content td.l2 { border-left: 2px solid var(--body-text-color); } .ptx-content td.l3 { border-left: 3px solid var(--body-text-color); } .ptx-content td.r0 { border-right: none; } .ptx-content td.r1 { border-right: 1px solid var(--body-text-color); } .ptx-content td.r2 { border-right: 2px solid var(--body-text-color); } .ptx-content td.r3 { border-right: 3px solid var(--body-text-color); } .ptx-content td.t0 { border-top: none; } .ptx-content td.t1 { border-top: 1px solid var(--body-text-color); } .ptx-content td.t2 { border-top: 2px solid var(--body-text-color); } .ptx-content td.t3 { border-top: 3px solid var(--body-text-color); } .ptx-content td.b0 { border-bottom: none; } .ptx-content td.b1 { border-bottom: 1px solid var(--body-text-color); } .ptx-content td.b2 { border-bottom: 2px solid var(--body-text-color); } .ptx-content td.b3 { border-bottom: 3px solid var(--body-text-color); } .ptx-content th.r0.l0, .ptx-content td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content tr.header-vertical th { writing-mode: vertical-rl; transform: rotate(180deg); padding-top: 5px; } .ptx-content .center table { text-align: center; margin-left: auto; margin-right: auto; } .tabular-box { margin-top: 0.5em; overflow-x: auto; } .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } table.notation-list tr th { text-align: left; margin-left: 1em; } table.notation-list tr td { text-align: left; vertical-align: top; } .frontmatter > .heading { display: block; text-align: center; } .frontmatter > .heading .title, .frontmatter .book > .heading .title { font-size: 1.3em; } .frontmatter > .heading .subtitle, .frontmatter .book > .heading .subtitle { display: block; font-weight: normal; color: var(--byline-color); font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .frontmatter > .para:first-of-type { margin-top: 4em; } .frontmatter > .author, .frontmatter > .credit { margin-top: 2em; text-align: center; } .frontmatter .author:first-of-type { margin-top: 4em; } .frontmatter > .author .author-name { font-size: 120%; } .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .frontmatter .credit .title { font-size: 1em; } .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .frontmatter .author-info { font-size: 90%; } .frontmatter .summary-links { margin-top: 4em; } .frontmatter .abstract { margin: 4em 2em; } .frontmatter .keywords, .frontmatter .support { margin-top: 2em; } .frontmatter .abstract > .title, .frontmatter .keywords > .title, .frontmatter .support > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .frontmatter .abstract > .title::after, .frontmatter .keywords > .title::after, .frontmatter .support > .title::after { content: ".\2009\2009\2009"; } .frontmatter .abstract > .title + .para, .frontmatter .keywords > .title + .para, .frontmatter .support > .title + .para { display: inline; } .frontmatter .colophon .copyright { margin-top: 2.5em; } .frontmatter .colophon .license { margin-top: 2.5em; } .ptx-content .summary-links { font-family: var(--font-headings); display: block; margin-top: 1em; } .ptx-content .summary-links a { color: var(--summary-link-text-color); background: var(--summary-link-background); font-size: 1.5em; line-height: 1.25em; padding: 10px 20px; padding-right: 60px; border-radius: 3px; position: relative; display: block; font-weight: unset; } .ptx-content .summary-links a .title { font-style: normal; } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a::after { right: 0.83333em; content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid var(--summary-link-text-color); } .ptx-content .summary-links a:hover { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover * { color: var(--summary-link-hover-text-color); background: var(--summary-link-hover-background); } .ptx-content .summary-links a:hover .title { font-weight: normal; } .ptx-content .summary-links a:hover::after { border-left: 0.4em solid var(--summary-link-hover-text-color); } .ptx-content .summary-links ul { list-style-type: none; padding: 0; margin-top: 0; } .ptx-content .summary-links li { margin-top: 5px; } @media screen and (width <= 480px) { .ptx-content .summary-links a { font-size: 100%; line-height: 1.25em; } } .ptx-footnote { display: inline-block; position: relative; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: smaller; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote[open] .ptx-footnote__number sup { display: none; } .ptx-footnote__number { display: inline-block; cursor: pointer; min-width: 1em; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowl-background); border-radius: 0px; padding: 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowl-border-color); color: var(--body-text-color); font-weight: normal; font-size: var(1rem); } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: var(--activated-content-bg); } .indexitem { margin-top: 4px; } .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .indexknowl { margin-left: 0.11em; } em + .indexknowl { margin-left: -0.25em; } .indexknowl a { margin-left: 2em; } .indexitem .see, .subindexitem .see, .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .indexitem .seealso, .subindexitem .seealso, .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .indexitem .see em, .subindexitem .see em, .subsubindexitem .see em, .indexitem .seealso em, .subindexitem .seealso em, .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .indexitem .see + .see, .subindexitem .see + .see, .subsubindexitem .see + .see, .indexitem .seealso + .seealso, .subindexitem .seealso + .seealso, .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .indexitem .indexknowl { font-size: 90%; } .indexitem [data-knowl], .subindexitem [data-knowl], .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .indexknowl [data-knowl]:hover, .indexknowl .active[data-knowl] { margin-left: 2em; } .subindexitem .indexknowl { font-size: 95%; } .subsubindexitem .indexknowl { font-size: 95%; } .indexletter { margin-top: 1.5em; } .image-box, .audio-box, .video-box, .asymptote-box { position: relative; } .image-box .asymptote-box iframe.asymptote, iframe.asymptote, .video-box .video, .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .image-box img, img.contained { width: 100%; } .asymptote-fullsize-link { text-align: center; font-size: 0.9em; } .ptx-content img, .ptx-content svg { background: var(--ptx-image-bg); } .mermaid > svg { background: none; } .image-description summary { list-style: none; cursor: pointer; } .image-archive { margin: 0.75em auto 0; font-family: var(--font-monospace); justify-content: center; display: flex; gap: 0.5em; } .image-box > img:not(.mag_popup) { cursor: zoom-in; } img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; } .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .audio { width: 100%; } .video-poster { cursor: pointer; } figure { clear: both; position: relative; margin-left: 0; margin-right: 0; } figcaption { margin-left: auto; margin-right: auto; margin-top: 0.5em; } figcaption code.code-inline { white-space: pre; } figcaption .codenumber, figcaption .type { font-weight: 700; } figcaption .codenumber::after, figcaption .type:last-of-type::after { content: "\2002"; } figcaption .para:first-of-type { display: inline; } figure.table-like { margin-left: 30px; margin-right: 30px; } figure.table-like .list { margin-right: 0; } @media (max-width <= 943px) { .figure-like { overflow-x: auto; } } .poem { display: table; margin: 0 auto; width: auto; max-width: 90%; } .poem > .heading { display: block; text-align: center; } section article.poem > .heading::after { content: ""; } .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .poem .author { font-style: italic; margin-top: 0.75em; } .poem .author.left { text-align: left; } .poem .author.center { text-align: center; } .poem .author.right { text-align: right; } .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .poem .stanza + .stanza { margin-top: 1em; } .poem .heading + .stanza { margin-top: 0.2em; } .poem .heading + .line { margin-top: 0.2em; } .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .poem .line.center { text-align: center; } .poem .line.right { text-align: right; } .poem .tab { margin-left: 2em; } pre[class*=language-] { margin: 0; overflow: auto; border: 1px solid #e1e1e1; } :not(pre) > code[class*=language-] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } code[class*=language-], pre[class*=language-] { color: black; background: #fdfdfd; text-shadow: none; font-family: var(--font-monospace); text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.2; tab-size: 4; hyphens: none; } code[class*=language-].code-inline, pre[class*=language-].code-inline { line-height: normal; padding: 0.0625em 0.15em; } code[class*=language-]::selection, code[class*=language-] ::selection, pre[class*=language-]::selection, pre[class*=language-] ::selection { background: #b3d4fc; } code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #2a9716; } code[class*=language-] .token.punctuation, pre[class*=language-] .token.punctuation { color: #000; } code[class*=language-] .token.namespace, pre[class*=language-] .token.namespace { opacity: 0.9; } code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: rgb(41, 120, 15); } code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #a11; } code[class*=language-] .token:is(.operator, .entity, .url), pre[class*=language-] .token:is(.operator, .entity, .url) { color: #000; background: none; } code[class*=language-] .token:is(.atrule, .attr-value, .keyword), pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #0679B7; } code[class*=language-] .token.function, code[class*=language-] .token.class-name, pre[class*=language-] .token.function, pre[class*=language-] .token.class-name { color: #30a; } code[class*=language-] .token.important, code[class*=language-] .token.variable, pre[class*=language-] .token.important, pre[class*=language-] .token.variable { color: rgb(0, 0, 0); } code[class*=language-] .token.important, code[class*=language-] .token.bold, pre[class*=language-] .token.important, pre[class*=language-] .token.bold { font-weight: bold; } code[class*=language-] .token.italic, pre[class*=language-] .token.italic { font-style: italic; } code[class*=language-] .token.entity, pre[class*=language-] .token.entity { cursor: help; } code[class*=language-].line-numbers, pre[class*=language-].line-numbers { position: relative; padding-left: 3.8em; counter-reset: linenumber; overflow: auto; } code[class*=language-].line-numbers > code, pre[class*=language-].line-numbers > code { position: relative; white-space: inherit; } code[class*=language-].line-numbers .line-numbers-rows, pre[class*=language-].line-numbers .line-numbers-rows { position: absolute; pointer-events: none; top: 0; font-size: 100%; left: -3.8em; width: 3em; letter-spacing: -1px; border-right: 1px solid #999; user-select: none; } code[class*=language-].line-numbers .line-numbers-rows > span, pre[class*=language-].line-numbers .line-numbers-rows > span { display: block; counter-increment: linenumber; } code[class*=language-].line-numbers .line-numbers-rows > span::before, pre[class*=language-].line-numbers .line-numbers-rows > span::before { content: counter(linenumber); color: #999; display: block; padding-right: 0.8em; text-align: right; } code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { position: absolute; margin-top: 4px; left: 0; right: 0; padding: inherit 0; font-size: inherit; background: hsla(24, 20%, 50%, 0.08); pointer-events: none; line-height: inherit; white-space: pre; } :root.dark-mode { } :root.dark-mode pre[class*=language-] { border: 1px solid #3d3d3d; } :root.dark-mode code[class*=language-], :root.dark-mode pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } :root.dark-mode code[class*=language-]::selection, :root.dark-mode code[class*=language-] ::selection, :root.dark-mode pre[class*=language-]::selection, :root.dark-mode pre[class*=language-] ::selection { background: hsl(200, 4%, 16%); } :root.dark-mode code[class*=language-] .token, :root.dark-mode pre[class*=language-] .token { position: relative; z-index: 1; } :root.dark-mode code[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata), :root.dark-mode pre[class*=language-] .token:is(.comment, .prolog, .doctype, .cdata) { color: #68a950; } :root.dark-mode code[class*=language-] .token.punctuation, :root.dark-mode pre[class*=language-] .token.punctuation { color: white; opacity: 1; } :root.dark-mode code[class*=language-] .token.namespace, :root.dark-mode pre[class*=language-] .token.namespace { opacity: 0.9; } :root.dark-mode code[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted), :root.dark-mode pre[class*=language-] .token:is(.property, .tag, .boolean, .number, .constant, .symbol, .deleted) { color: #abc792; } :root.dark-mode code[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted), :root.dark-mode pre[class*=language-] .token:is(.selector, .attr-name, .string, .char, .builtin, .regex, .inserted) { color: #ca9147; } :root.dark-mode code[class*=language-] .token:is(.operator, .entity, .url), :root.dark-mode pre[class*=language-] .token:is(.operator, .entity, .url) { color: white; } :root.dark-mode code[class*=language-] .token:is(.atrule, .attr-value, .keyword), :root.dark-mode pre[class*=language-] .token:is(.atrule, .attr-value, .keyword) { color: #2d94fb; } :root.dark-mode code[class*=language-] .token.function, :root.dark-mode code[class*=language-] .token.class-name, :root.dark-mode pre[class*=language-] .token.function, :root.dark-mode pre[class*=language-] .token.class-name { color: #e3e1c2; } :root.dark-mode code[class*=language-] .token.important, :root.dark-mode code[class*=language-] .token.bold, :root.dark-mode pre[class*=language-] .token.important, :root.dark-mode pre[class*=language-] .token.bold { font-weight: bold; } :root.dark-mode code[class*=language-] .token.italic, :root.dark-mode pre[class*=language-] .token.italic { font-style: italic; } :root.dark-mode code[class*=language-] .token.entity, :root.dark-mode pre[class*=language-] .token.entity { cursor: help; } :root.dark-mode .line-highlight { background: hsla(0, 0%, 33%, 0.1); border-bottom: 1px dashed hsl(0, 0%, 33%); border-top: 1px dashed hsl(0, 0%, 33%); z-index: 0; } @media print { code[class*=language-] .line-highlight, pre[class*=language-] .line-highlight { color-adjust: exact; } } .displaymath { overflow-x: auto; overflow-y: hidden; } .displaymath mjx-container[jax=CHTML][display=true] { margin: 0 0 0 0; padding-top: 0.3em; } .process-math mjx-container svg { background: none; } [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .knowl mjx-mtext > mjx-utext, mjx-mtext > mjx-utext { width: revert !important; } mjx-msup mjx-utext, mjx-msub mjx-utext { display: inline; } em.alert { font-weight: bold; } .bib { margin-top: 0.25em; } .bib .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .bib .bibitem + .bibentry { display: inline-block; width: 90%; margin-top: 0; } .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .contributor { margin-top: 1.5ex; } .contributor:first-child { margin-top: 0em; } .contributor + .para { margin-top: 3ex; } .contributor .contributor-name { font-variant: small-caps; } .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } iframe { margin: 0; border: none; } .kbdkey { background: #f1f1f1; color: #333; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .unit, .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .unit sub, .unit sup, .quantity sub, .quantity sup { word-spacing: normal; } .terminology { font-style: italic; font-weight: bold; } .times-sign { font-size: larger; vertical-align: -0.15ex; } .emphasis { font-style: italic; } .emphasis .emphasis { font-weight: bold; } .definition-like .emphasis { font-weight: 700; } article.theorem-like .emphasis { font-weight: 700; } .para { line-height: 1.35; } .hidden { display: none !important; } .taxon { font-style: italic; } .quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .booktitle { font-style: oblique; } .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; } .ptx-page, .ptx-main, .ptx-main .ptx-content { all: unset !important; width: 100%; border: none; padding: 0; margin: 0; } .ptx-sagecell, .tabular, .table-like, .figure-like, .exercise-like { break-inside: avoid; } .heading { break-after: avoid; } .code-inline { border: unset; background: unset; } @page { margin: 0.75in 0.75in 0.75in 0.75in; } } .heading .print-links { float: right; position: relative; z-index: 100; vertical-align: bottom; } .heading .print-links .print-link { font-family: var(--font-body); padding: 0.1em 0.2em; } .heading .print-links .material-symbols-outlined { margin-top: 5pt; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .pretext .searchwrapper .cse .gsc-control-cse input, .searchwrapper .gsc-control-cse { padding: 5px; } .searchbox .searchwidget { height: 100%; } .searchbox .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; padding: 1em; left: max(10vw, (100vw - 800px) / 2); width: 80vw; max-width: 800px; border: 2px solid var(--body-text-color); background: var(--knowl-background, #eaf0f6); z-index: 5000; display: flex; flex-direction: column; } .searchbox .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; height: 35px; } .searchbox .ptxsearch { flex: 1 1; } .searchbox .closesearchresults { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .searchbox .closesearchresults:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .searchbox .closesearchresults:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .searchbox .closesearchresults.disabled { opacity: 0.4; cursor: not-allowed; } .searchbox .closesearchresults.hidden { display: none; } .searchbox .closesearchresults.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .searchbox .detailed_result { margin-bottom: 10px; } .searchbox .searchresults a:hover { text-decoration: underline; background: var(--link-active-background); } .searchbox .searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; background: var(--content-background, white); border: 1px solid var(--page-border-color, #ccc); } .searchbox .searchresults:empty { display: none; } .searchbox .search-result-bullet { list-style-type: none; } .searchbox .search-result-score { display: none; } .searchbox .no_result { font-size: 90%; font-weight: 200; } .searchbox .low_result { font-weight: 200; } .searchbox .medium_result { font-weight: 500; } .searchbox .high_result { font-weight: 700; } .searchbox .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .searchbox .search-results-unshown-count { margin-top: 0.6em; } .searchbox .search-result-clip-highlight { background: var(--searchresultshighlight); } .searchbox .searchresultsbackground { position: fixed; top: 0; background: var(--searchresultsbackground, white); width: 100vw; height: 100%; left: 0; z-index: 4999; } @media screen and (max-width: 800px) { .searchbox .searchresultsplaceholder { bottom: 10vh; } } :root { --searchresultsbackground: #fff8; --searchresultshighlight: rgba(255, 255, 0, 50%); } :root.dark-mode { --searchresultsbackground: #0008; --searchresultshighlight: rgba(255, 255, 0, 15%); } .ptx-content .ptx-runestone-container .runestone { margin: unset; border-radius: 0; border-width: 1px; } .multiplechoice_section label > .para { display: inline; } .ptx-content .ptx-runestone-container .ac_question { max-width: var(--base-content-width); margin: 0 auto 10px; } .runestone .runestone_caption { display: none; } .ptx-content .ptx-runestone-container .rsdraggable { font-size: 100%; } .ptx-content .bottom { position: unset; } .ptx-runestone-container .runestone code, .ptx-runestone-container .runestone pre { font-size: 0.93rem; line-height: 1.2; font-family: var(--font-monospace); } .ptx-runestone-container code[class*=language-], .ptx-runestone-container pre[class*=language-] { color: black; background: #fdfdfd; } .runestone.datafile .datafile_caption { background: var(--code-inline-background); border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); display: block; width: fit-content; margin: 0 auto; } .runestone.datafile img { margin: 0 auto; display: block; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); } .runestone.datafile pre, .runestone.datafile textarea { margin: 0 auto; border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888); background-color: var(--page-color); } .runestone.datafile + .program { margin-top: 0; } ul[data-component=timedAssessment] { margin: 0; padding: 0; } :root.dark-mode .ptx-runestone-container code[class*=language-], :root.dark-mode .ptx-runestone-container pre[class*=language-] { color: white; background: hsl(0, 0%, 8%); } @layer spacing { .runestone :is(.exercise-statement, .exercise-content) > *:not(:first-child) { margin-top: 1em; } .ptx-runestone-container + .solutions { margin-top: 0.5em; } } .interactive-iframe-container { max-width: 100%; overflow: auto; } .interactive-iframe-container > iframe { margin-left: auto; margin-right: auto; display: block; } .interactive__instructions { max-width: var(--base-content-width); } .standalone-page .interactive-iframe-container { margin-left: auto; margin-right: auto; } .standalone-page .interactive__instructions { margin: 5px auto 20px; } .interactive-iframe-container__opener { display: block; margin-right: 5px; margin-top: 11px; margin-bottom: 5px; font-size: 0.8rem; } .interactive-iframe-container__opener .icon { font-size: 18px; } .interactive-iframe-container__opener:has(+ figcaption, + .instructions) { float: left; z-index: 1; position: relative; } .interactive-iframe-container__opener + .instructions + figcaption { clear: left; } .interactive-iframe-container__opener + .instructions { margin-top: 0.5em; } .clipboardable { position: relative; display: flow-root; } .clipboardable .code-copy { position: absolute; right: 0; top: 0; opacity: 0.25; border-width: 0; background: none; cursor: pointer; z-index: 1; white-space-collapse: collapse; padding: 1px; scale: 0.85; } .clipboardable .code-copy:hover { opacity: 0.7; } .clipboardable .code-copy .checkmark { display: none; } .clipboardable .code-copy.copied { opacity: 1; color: mediumseagreen; cursor: not-allowed; pointer-events: none; } .clipboardable .code-copy.copied .copyicon { display: none; } .clipboardable .code-copy.copied .checkmark { display: inline; } .clipboardable:has(.code-display) { margin: 0.25em 0; } .clipboardable:has(.code-display) .code-display { margin: 0; padding: 0.25em 0; } .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } label.feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } .exercise-wrapper > *:not(:first-child) { margin-top: 1.5em; } .ptx-content .problem-buttons { display: flex; } .ptx-content .webwork-button { font: inherit; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: var(--button-text-color); background-color: var(--button-background); border-width: 1px; border-color: var(--button-border-color); border-style: solid; border-radius: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; user-select: none; } .ptx-content .webwork-button:hover:not(.disabled) { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .ptx-content .webwork-button:focus-visible { outline: 2px solid var(--button-text-color); outline-offset: -2px; } .ptx-content .webwork-button.disabled { opacity: 0.4; cursor: not-allowed; } .ptx-content .webwork-button.hidden { display: none; } .ptx-content .webwork-button.open { color: var(--button-hover-text-color); background-color: var(--button-hover-background); } .problem-buttons.hidden-content, .problem-contents.hidden-content { display: none; } .sagecell_sessionOutput pre { font-family: var(--font-monospace); } .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .sage-interact.sagecell { margin: 0; } .sagecell_evalButton { font-family: var(--font-body); font-size: 16px; padding: 0 0.65em; } .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .sagecell_evalButton:focus, .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .sagecell .sagecell_editor { margin-bottom: 8px; } .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .sageanswer .output { display: inline-block; vertical-align: top; } .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } section, article, li, blockquote, figcaption, dt, .exercisegroup, .discussion-like, .solution-like, .para { position: relative; } .autopermalink { position: absolute; display: inline-block; top: 0.5ex; left: -2em; font-size: 85%; opacity: var(--permalink-opacity, 0); transition: opacity 0.2s; margin-top: 0 !important; user-select: none; } li > .autopermalink { left: -3.5em; } .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } .appendix > .autopermalink, .chapter > .autopermalink, .index > .autopermalink, .section > .autopermalink, .subsection > .autopermalink, .references > .autopermalink, .exercises > .autopermalink { top: 1.5ex; } .assemblage-like > .para > .autopermalink, .example-like > .para > .autopermalink, .example-like > .exercise-like > .autopermalink, .project-like > .para > .autopermalink, .project-like > .exercise-like > .autopermalink, .project-like > .exercise-like > .introduction > .para > .autopermalink, .project-like > .exercise-like > .conclusion > .para > .autopermalink, .remark-like > .para > .autopermalink { left: -2.9em; } .axiom-like > .para:first-of-type > .autopermalink, .example-like > .para:first-of-type > .autopermalink, .exercise-like > .para:first-of-type > .autopermalink, .solution-like > .para:first-of-type > .autopermalink, .assemblage-like > .para:first-of-type > .autopermalink, .definition-like > .para:first-of-type > .autopermalink, .remark-like > .para:first-of-type > .autopermalink, .project-like > .para:first-of-type > .autopermalink, .openproblem-like > .para:first-of-type > .autopermalink, .computation-like > .para:first-of-type > .autopermalink, .theorem-like > .para:first-of-type > .autopermalink, .proof > .para:first-of-type > .autopermalink, .case > .para:first-of-type > .autopermalink, li > .para:first-of-type > .autopermalink, dd > .para:first-of-type > .autopermalink { display: none; } .axiom-like > .introduction > .para:first-of-type > .autopermalink, .example-like > .introduction > .para:first-of-type > .autopermalink, .exercise-like > .introduction > .para:first-of-type > .autopermalink, .solution-like > .introduction > .para:first-of-type > .autopermalink, .assemblage-like > .introduction > .para:first-of-type > .autopermalink, .definition-like > .introduction > .para:first-of-type > .autopermalink, .remark-like > .introduction > .para:first-of-type > .autopermalink, .project-like > .introduction > .para:first-of-type > .autopermalink, .openproblem-like > .introduction > .para:first-of-type > .autopermalink, .computation-like > .introduction > .para:first-of-type > .autopermalink, .theorem-like > .introduction > .para:first-of-type > .autopermalink, .proof > .introduction > .para:first-of-type > .autopermalink, .case > .introduction > .para:first-of-type > .autopermalink, li > .introduction > .para:first-of-type > .autopermalink, dd > .introduction > .para:first-of-type > .autopermalink { display: none; } .ptx-content:has(.autopermalink:hover) .autopermalink { opacity: 0.2; } .ptx-content:has(.autopermalink:hover) .autopermalink:hover { opacity: 1; } .autopermalink:has(a:focus-visible) { opacity: 1; } .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: var(--content-background); border: 3px solid var(--page-border-color); z-index: 2001; } :target { scroll-margin-top: 45px; animation: target-fade 10s 1; } @keyframes target-fade { 0% { background-color: var(--activated-content-bg); } 100% { background-color: inherit; opacity: 1; } } :root { --font-body: Open Sans, Helvetica Neue, Helvetica, Arial, sans-serif; } :root { --font-headings: PT Serif, Times New Roman, Times, serif; } :root { --font-monospace: Inconsolata, Consolas, Monaco, monospace; } :root { --font-print: PT Serif, Times New Roman, Times, serif; } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon { font-size: 30px; } .ptx-toc.focused .toc-item > .toc-title-box > .toc-expander > .icon:before { content: "chevron_left"; } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before { content: "chevron_left"; } section > *:not(:first-child) { margin-top: 1.5em; } article > *:not(:first-child):has(.heading) { margin-top: 1.5em; } .displaymath { overflow-x: auto; } @container ptx-main (width > 696px) { .displaymath { --max-width: calc(min((100cqw - 2 * 48px), 900px)); min-width: 100%; clear: right; width: fit-content; max-width: var(--max-width); } } .code-display { overflow-x: auto; } @container ptx-main (width > 696px) { .code-display { --max-width: calc(min((100cqw - 2 * 48px), 900px)); min-width: 100%; clear: right; width: fit-content; max-width: var(--max-width); } } .tabular-box { overflow-x: auto; } @container ptx-main (width > 696px) { .tabular-box { --max-width: calc(min((100cqw - 2 * 48px), 900px)); min-width: 100%; clear: right; width: fit-content; max-width: var(--max-width); } } :root { color-scheme: light; } :root:not(.dark-mode) { --page-color: white; --content-background: white; --page-border-color: #ccc; --doc-title-color: var(--primary-color); --byline-color: #333; --banner-background: #fafafa; --navbar-background: #ededed; --footer-background: var(--banner-background); --toc-border-color: #c9c9c9; --toc-background: var(--content-background); --tocitem-background: #f2f2f2; --toc-text-color: var(--primary-color-black-30); --tocitem-highlight-background: var(--primary-color-white-10); --tocitem-highlight-text-color: white; --tocitem-highlight-border-color: var(--toc-border-color); --tocitem-active-background: var(--primary-color); --tocitem-active-text-color: white; --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--content-background); --toclevel1-text-color: var(--toc-text-color); --toclevel2-background: var(--primary-color-white-98); --toclevel2-text-color: var(--toc-text-color); --toclevel3-background: var(--primary-color-white-95); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #000; --body-title-color: black; --ptx-image-bg: transparent; --activated-content-bg: rgba(241, 185, 255, 0.3); --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color); --link-background: transparent; --link-active-text-color: var(--primary-color-white-40); --link-active-background: var(--background-color-gray-30); --link-alt-text-color: var(--link-text-color); --link-alt-background: transparent; --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--link-active-text-color); --knowl-link-color: var(--link-text-color); --knowl-background: #f8f8f8; --knowl-border-color: var(--primary-color-gray-80); --knowl-nested-1-background: var(--knowl-background); --knowl-nested-2-background: var(--knowl-background); --knowl-nested-3-background: var(--knowl-background); --knowl-nested-4-background: var(--knowl-background); --block-body-background: var(--content-background); --block-border-color: black; --block-head-color: var(--body-text-color); --aside-like-link-color: var(--link-text-color); --button-background: #ededed; --button-text-color: #333333; --button-border-color: #ccc; --button-hover-background: #c7c7c7; --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: #fdfdfd; --code-inline-background: #ededed; --assemblage-like-body-background: var(--block-body-background); --assemblage-like-border-color: var(--block-border-color); --definition-like-body-background: var(--block-body-background); --definition-like-border-color: var(--block-border-color); --theorem-like-body-background: var(--block-body-background); --theorem-like-border-color: var(--block-border-color); --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: var(--block-body-background); --remark-like-border-color: var(--block-border-color); --computation-like-body-background: var(--block-body-background); --computation-like-border-color: var(--block-border-color); --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--block-body-background); --aside-like-border-color: var(--block-border-color); --proof-like-body-background: var(--block-body-background); --proof-like-border-color: var(--block-border-color); --example-like-body-background: var(--block-body-background); --example-like-border-color: var(--block-border-color); --project-like-body-background: var(--block-body-background); --project-like-border-color: var(--block-border-color); --goal-like-body-background: var(--block-body-background); --goal-like-border-color: var(--block-border-color); --solution-like-body-background: var(--block-body-background); --solution-like-border-color: var(--block-border-color); --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); --primary-color: #2a5ea4; --goal-border-color: var(--primary-color-white-20); } :root.dark-mode { color-scheme: dark; --page-color: var(--background-color); --content-background: var(--page-color); --page-border-color: var(--background-color-white-25); --doc-title-color: var(--primary-color); --byline-color: var(--background-color-white-50); --banner-background: #23241f; --navbar-background: var(--background-color-gray-15); --footer-background: var(--background-color-black-10); --toc-border-color: #555; --toc-background: var(--content-background); --tocitem-background: var(--toc-background); --toc-text-color: var(--body-text-color); --tocitem-highlight-background: var(--primary-color-gray-5); --tocitem-highlight-text-color: var(--background-color-black-50); --tocitem-highlight-border-color: var(--toc-border-color); --tocitem-active-background: var(--primary-color-gray-5); --tocitem-active-text-color: var(--background-color-black-50); --tocitem-active-border-color: var(--toc-border-color); --toclevel1-background: var(--background-color-gray-10); --toclevel1-text-color: var(--primary-color-white-40); --toclevel2-background: var(--toclevel1-background); --toclevel2-text-color: var(--toclevel1-text-color); --toclevel3-background: var(--content-background); --toclevel3-text-color: var(--toc-text-color); --body-text-color: #f2f2f2; --body-title-color: var(--primary-color-white-20); --ptx-image-bg: white; --activated-content-bg: rgba(255, 237, 185, 0.2); --summary-link-background: var(--button-background); --summary-link-text-color: var(--button-text-color); --summary-link-hover-background: var(--button-hover-background); --summary-link-hover-text-color: var(--button-hover-text-color); --link-text-color: var(--primary-color-white-10); --link-background: transparent; --link-active-text-color: var(--primary-color-white-40); --link-active-background: var(--background-color-gray-30); --link-alt-text-color: var(--link-text-color); --link-alt-background: transparent; --link-alt-active-text-color: var(--link-alt-text-color); --link-alt-active-background: var(--link-active-text-color); --knowl-link-color: var(--doc-title-color); --knowl-background: var(--background-color-black-10); --knowl-border-color: var(--background-color-white-20); --knowl-nested-1-background: var(--background-color-gray-10); --knowl-nested-2-background: var(--background-color-black-10); --knowl-nested-3-background: var(--background-color-gray-10); --knowl-nested-4-background: var(--background-color-black-10); --block-body-background: var(--content-background); --block-border-color: var(--knowl-border-color); --block-head-color: var(--body-text-color); --aside-like-link-color: var(--link-text-color); --button-background: var(--background-color-gray-15); --button-text-color: var(--body-text-color); --button-border-color: var(--background-color-white-25); --button-hover-background: var(--primary-color-black-50); --button-hover-text-color: var(--button-text-color); --dropdown-background: var(--content-background); --dropdown-border-color: var(--toc-border-color); --dropdown-text-color: var(--toc-text-color); --dropdown-hover-background: var(--tocitem-active-background); --dropdown-hover-text-color: var(--tocitem-active-text-color); --code-background: var(--background-color-gray-20); --code-inline-background: var(--background-color-gray-20); --assemblage-like-body-background: var(--block-body-background); --assemblage-like-border-color: var(--block-border-color); --definition-like-body-background: var(--block-body-background); --definition-like-border-color: var(--block-border-color); --theorem-like-body-background: var(--block-body-background); --theorem-like-border-color: var(--block-border-color); --axiom-like-body-background: var(--block-body-background); --axiom-like-border-color: var(--block-border-color); --remark-like-body-background: var(--block-body-background); --remark-like-border-color: var(--block-border-color); --computation-like-body-background: var(--block-body-background); --computation-like-border-color: var(--block-border-color); --openproblem-like-body-background: var(--block-body-background); --openproblem-like-border-color: var(--block-border-color); --aside-like-body-background: var(--block-body-background); --aside-like-border-color: var(--block-border-color); --proof-like-body-background: var(--block-body-background); --proof-like-border-color: var(--block-border-color); --example-like-body-background: var(--block-body-background); --example-like-border-color: var(--block-border-color); --project-like-body-background: var(--block-body-background); --project-like-border-color: var(--block-border-color); --goal-like-body-background: var(--block-body-background); --goal-like-border-color: var(--block-border-color); --solution-like-body-background: var(--block-body-background); --solution-like-border-color: var(--block-border-color); --primary-color: #829ab1; --background-color: #23241f; --background-color-white-1: color-mix(in oklab, var(--background-color), white 1%); --background-color-white-2: color-mix(in oklab, var(--background-color), white 2%); --background-color-white-3: color-mix(in oklab, var(--background-color), white 3%); --background-color-white-4: color-mix(in oklab, var(--background-color), white 4%); --background-color-white-5: color-mix(in oklab, var(--background-color), white 5%); --background-color-white-10: color-mix(in oklab, var(--background-color), white 10%); --background-color-white-15: color-mix(in oklab, var(--background-color), white 15%); --background-color-white-20: color-mix(in oklab, var(--background-color), white 20%); --background-color-white-25: color-mix(in oklab, var(--background-color), white 25%); --background-color-white-30: color-mix(in oklab, var(--background-color), white 30%); --background-color-white-35: color-mix(in oklab, var(--background-color), white 35%); --background-color-white-40: color-mix(in oklab, var(--background-color), white 40%); --background-color-white-50: color-mix(in oklab, var(--background-color), white 50%); --background-color-white-60: color-mix(in oklab, var(--background-color), white 60%); --background-color-white-65: color-mix(in oklab, var(--background-color), white 65%); --background-color-white-70: color-mix(in oklab, var(--background-color), white 70%); --background-color-white-75: color-mix(in oklab, var(--background-color), white 75%); --background-color-white-80: color-mix(in oklab, var(--background-color), white 80%); --background-color-white-85: color-mix(in oklab, var(--background-color), white 85%); --background-color-white-90: color-mix(in oklab, var(--background-color), white 90%); --background-color-white-95: color-mix(in oklab, var(--background-color), white 95%); --background-color-white-96: color-mix(in oklab, var(--background-color), white 96%); --background-color-white-97: color-mix(in oklab, var(--background-color), white 97%); --background-color-white-98: color-mix(in oklab, var(--background-color), white 98%); --background-color-white-99: color-mix(in oklab, var(--background-color), white 99%); --background-color-black-1: color-mix(in oklab, var(--background-color), black 1%); --background-color-black-2: color-mix(in oklab, var(--background-color), black 2%); --background-color-black-3: color-mix(in oklab, var(--background-color), black 3%); --background-color-black-4: color-mix(in oklab, var(--background-color), black 4%); --background-color-black-5: color-mix(in oklab, var(--background-color), black 5%); --background-color-black-10: color-mix(in oklab, var(--background-color), black 10%); --background-color-black-15: color-mix(in oklab, var(--background-color), black 15%); --background-color-black-20: color-mix(in oklab, var(--background-color), black 20%); --background-color-black-25: color-mix(in oklab, var(--background-color), black 25%); --background-color-black-30: color-mix(in oklab, var(--background-color), black 30%); --background-color-black-35: color-mix(in oklab, var(--background-color), black 35%); --background-color-black-40: color-mix(in oklab, var(--background-color), black 40%); --background-color-black-50: color-mix(in oklab, var(--background-color), black 50%); --background-color-black-60: color-mix(in oklab, var(--background-color), black 60%); --background-color-black-65: color-mix(in oklab, var(--background-color), black 65%); --background-color-black-70: color-mix(in oklab, var(--background-color), black 70%); --background-color-black-75: color-mix(in oklab, var(--background-color), black 75%); --background-color-black-80: color-mix(in oklab, var(--background-color), black 80%); --background-color-black-85: color-mix(in oklab, var(--background-color), black 85%); --background-color-black-90: color-mix(in oklab, var(--background-color), black 90%); --background-color-black-95: color-mix(in oklab, var(--background-color), black 95%); --background-color-black-96: color-mix(in oklab, var(--background-color), black 96%); --background-color-black-97: color-mix(in oklab, var(--background-color), black 97%); --background-color-black-98: color-mix(in oklab, var(--background-color), black 98%); --background-color-black-99: color-mix(in oklab, var(--background-color), black 99%); --background-color-gray-1: color-mix(in oklab, var(--background-color), gray 1%); --background-color-gray-2: color-mix(in oklab, var(--background-color), gray 2%); --background-color-gray-3: color-mix(in oklab, var(--background-color), gray 3%); --background-color-gray-4: color-mix(in oklab, var(--background-color), gray 4%); --background-color-gray-5: color-mix(in oklab, var(--background-color), gray 5%); --background-color-gray-10: color-mix(in oklab, var(--background-color), gray 10%); --background-color-gray-15: color-mix(in oklab, var(--background-color), gray 15%); --background-color-gray-20: color-mix(in oklab, var(--background-color), gray 20%); --background-color-gray-25: color-mix(in oklab, var(--background-color), gray 25%); --background-color-gray-30: color-mix(in oklab, var(--background-color), gray 30%); --background-color-gray-35: color-mix(in oklab, var(--background-color), gray 35%); --background-color-gray-40: color-mix(in oklab, var(--background-color), gray 40%); --background-color-gray-50: color-mix(in oklab, var(--background-color), gray 50%); --background-color-gray-60: color-mix(in oklab, var(--background-color), gray 60%); --background-color-gray-65: color-mix(in oklab, var(--background-color), gray 65%); --background-color-gray-70: color-mix(in oklab, var(--background-color), gray 70%); --background-color-gray-75: color-mix(in oklab, var(--background-color), gray 75%); --background-color-gray-80: color-mix(in oklab, var(--background-color), gray 80%); --background-color-gray-85: color-mix(in oklab, var(--background-color), gray 85%); --background-color-gray-90: color-mix(in oklab, var(--background-color), gray 90%); --background-color-gray-95: color-mix(in oklab, var(--background-color), gray 95%); --background-color-gray-96: color-mix(in oklab, var(--background-color), gray 96%); --background-color-gray-97: color-mix(in oklab, var(--background-color), gray 97%); --background-color-gray-98: color-mix(in oklab, var(--background-color), gray 98%); --background-color-gray-99: color-mix(in oklab, var(--background-color), gray 99%); --primary-color-white-1: color-mix(in oklab, var(--primary-color), white 1%); --primary-color-white-2: color-mix(in oklab, var(--primary-color), white 2%); --primary-color-white-3: color-mix(in oklab, var(--primary-color), white 3%); --primary-color-white-4: color-mix(in oklab, var(--primary-color), white 4%); --primary-color-white-5: color-mix(in oklab, var(--primary-color), white 5%); --primary-color-white-10: color-mix(in oklab, var(--primary-color), white 10%); --primary-color-white-15: color-mix(in oklab, var(--primary-color), white 15%); --primary-color-white-20: color-mix(in oklab, var(--primary-color), white 20%); --primary-color-white-25: color-mix(in oklab, var(--primary-color), white 25%); --primary-color-white-30: color-mix(in oklab, var(--primary-color), white 30%); --primary-color-white-35: color-mix(in oklab, var(--primary-color), white 35%); --primary-color-white-40: color-mix(in oklab, var(--primary-color), white 40%); --primary-color-white-50: color-mix(in oklab, var(--primary-color), white 50%); --primary-color-white-60: color-mix(in oklab, var(--primary-color), white 60%); --primary-color-white-65: color-mix(in oklab, var(--primary-color), white 65%); --primary-color-white-70: color-mix(in oklab, var(--primary-color), white 70%); --primary-color-white-75: color-mix(in oklab, var(--primary-color), white 75%); --primary-color-white-80: color-mix(in oklab, var(--primary-color), white 80%); --primary-color-white-85: color-mix(in oklab, var(--primary-color), white 85%); --primary-color-white-90: color-mix(in oklab, var(--primary-color), white 90%); --primary-color-white-95: color-mix(in oklab, var(--primary-color), white 95%); --primary-color-white-96: color-mix(in oklab, var(--primary-color), white 96%); --primary-color-white-97: color-mix(in oklab, var(--primary-color), white 97%); --primary-color-white-98: color-mix(in oklab, var(--primary-color), white 98%); --primary-color-white-99: color-mix(in oklab, var(--primary-color), white 99%); --primary-color-black-1: color-mix(in oklab, var(--primary-color), black 1%); --primary-color-black-2: color-mix(in oklab, var(--primary-color), black 2%); --primary-color-black-3: color-mix(in oklab, var(--primary-color), black 3%); --primary-color-black-4: color-mix(in oklab, var(--primary-color), black 4%); --primary-color-black-5: color-mix(in oklab, var(--primary-color), black 5%); --primary-color-black-10: color-mix(in oklab, var(--primary-color), black 10%); --primary-color-black-15: color-mix(in oklab, var(--primary-color), black 15%); --primary-color-black-20: color-mix(in oklab, var(--primary-color), black 20%); --primary-color-black-25: color-mix(in oklab, var(--primary-color), black 25%); --primary-color-black-30: color-mix(in oklab, var(--primary-color), black 30%); --primary-color-black-35: color-mix(in oklab, var(--primary-color), black 35%); --primary-color-black-40: color-mix(in oklab, var(--primary-color), black 40%); --primary-color-black-50: color-mix(in oklab, var(--primary-color), black 50%); --primary-color-black-60: color-mix(in oklab, var(--primary-color), black 60%); --primary-color-black-65: color-mix(in oklab, var(--primary-color), black 65%); --primary-color-black-70: color-mix(in oklab, var(--primary-color), black 70%); --primary-color-black-75: color-mix(in oklab, var(--primary-color), black 75%); --primary-color-black-80: color-mix(in oklab, var(--primary-color), black 80%); --primary-color-black-85: color-mix(in oklab, var(--primary-color), black 85%); --primary-color-black-90: color-mix(in oklab, var(--primary-color), black 90%); --primary-color-black-95: color-mix(in oklab, var(--primary-color), black 95%); --primary-color-black-96: color-mix(in oklab, var(--primary-color), black 96%); --primary-color-black-97: color-mix(in oklab, var(--primary-color), black 97%); --primary-color-black-98: color-mix(in oklab, var(--primary-color), black 98%); --primary-color-black-99: color-mix(in oklab, var(--primary-color), black 99%); --primary-color-gray-1: color-mix(in oklab, var(--primary-color), gray 1%); --primary-color-gray-2: color-mix(in oklab, var(--primary-color), gray 2%); --primary-color-gray-3: color-mix(in oklab, var(--primary-color), gray 3%); --primary-color-gray-4: color-mix(in oklab, var(--primary-color), gray 4%); --primary-color-gray-5: color-mix(in oklab, var(--primary-color), gray 5%); --primary-color-gray-10: color-mix(in oklab, var(--primary-color), gray 10%); --primary-color-gray-15: color-mix(in oklab, var(--primary-color), gray 15%); --primary-color-gray-20: color-mix(in oklab, var(--primary-color), gray 20%); --primary-color-gray-25: color-mix(in oklab, var(--primary-color), gray 25%); --primary-color-gray-30: color-mix(in oklab, var(--primary-color), gray 30%); --primary-color-gray-35: color-mix(in oklab, var(--primary-color), gray 35%); --primary-color-gray-40: color-mix(in oklab, var(--primary-color), gray 40%); --primary-color-gray-50: color-mix(in oklab, var(--primary-color), gray 50%); --primary-color-gray-60: color-mix(in oklab, var(--primary-color), gray 60%); --primary-color-gray-65: color-mix(in oklab, var(--primary-color), gray 65%); --primary-color-gray-70: color-mix(in oklab, var(--primary-color), gray 70%); --primary-color-gray-75: color-mix(in oklab, var(--primary-color), gray 75%); --primary-color-gray-80: color-mix(in oklab, var(--primary-color), gray 80%); --primary-color-gray-85: color-mix(in oklab, var(--primary-color), gray 85%); --primary-color-gray-90: color-mix(in oklab, var(--primary-color), gray 90%); --primary-color-gray-95: color-mix(in oklab, var(--primary-color), gray 95%); --primary-color-gray-96: color-mix(in oklab, var(--primary-color), gray 96%); --primary-color-gray-97: color-mix(in oklab, var(--primary-color), gray 97%); --primary-color-gray-98: color-mix(in oklab, var(--primary-color), gray 98%); --primary-color-gray-99: color-mix(in oklab, var(--primary-color), gray 99%); } /*! Theme: tacoma */ /*# sourceMappingURL=theme-tacoma.css.map */ ================================================ FILE: css/dist/theme-wide-legacy.css ================================================ @charset "UTF-8"; /* ../../css/targets/html/legacy/wide/theme-wide.scss */ * { box-sizing: border-box; } body.pretext { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } body.pretext[data-font=OS] { font-family: "Open Sans", sans-serif; } body.pretext[data-font=RS] { font-family: "Roboto Serif", serif; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; } body.pretext { background: #fff; } a { color: inherit; text-decoration: none; } a:hover, a:focus { text-decoration: none; } body.pretext > a.assistive { padding: 6px; position: absolute; top: -40px; left: 0px; color: white; border-right: 1px solid white; border-bottom: 1px solid white; border-bottom-right-radius: 8px; background: transparent; z-index: 10000; } body.pretext > a.assistive:focus { top: 0px; background: #BF1722; outline: 0; transition: top 0.1s ease-in, background 0.5s linear; } nav .ptx-navbar { border-top: none; border-right: none; border-left: none; min-height: unset; } .ptx-navbar .activecode-toggle { padding: 3px 5px; } .pretext #brand-navbar, .pretext .brand-navbar { left: 0; position: fixed; right: 0; z-index: 1030; height: 50px; border-width: 0 0 1px; top: 0; margin-bottom: 0; } .pretext #brand-navbar > .container::before, .pretext .brand-navbar > .container::before, .pretext #brand-navbar > .container::after, .pretext .brand-navbar > .container::after { display: none; } .pretext #brand-navbar + .ptx-masthead, .pretext .brand-navbar + .ptx-masthead { margin-top: 50px; } .pretext #brand-navbar .navbar-collapse.collapse, .pretext .brand-navbar .navbar-collapse.collapse { overflow: hidden !important; } .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: 50px; } @media screen and (max-width: 800px) { .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: auto; } } .ptx-content section, .ptx-content article, .ptx-content figure, .ptx-content figcaption, .ptx-content .exercisegroup, .ptx-content .discussion-like, .ptx-content .para { position: relative; } .ptx-content .para > p:first-child, .ptx-content .para > .para:first-child { display: inline; } .ptx-content pre { margin: 0; padding: 0; border: none; } .ptx-content pre { border-radius: 0; } .ptx-content textarea { padding: 0; } .ptx-content h1, .ptx-content h2, .ptx-content h3, .ptx-content h4, .ptx-content h5, .ptx-content h6 { margin: 0; font-size: unset; } .pretext h1, .pretext h2, .pretext h3, .pretext h4, .pretext h5, .pretext h6 { margin: 0; font-size: unset; } .ptx-content .heading { line-height: 1.1; } .ptx-content .para { margin-top: 1.25em; margin-bottom: 0; line-height: 1.35; } .ptx-content .para.continuation { margin-top: 0; } .ptx-content pre + .para.continuation, .ptx-content pre + form, .ptx-content div + form { margin-top: 1em; } .ptx-content ul + .para.continuation, .ptx-content ol + .para.continuation, .ptx-content dl + .para.continuation { margin-top: 0.75em; } .ptx-content .aside-like > .para:first-child, .ptx-content td > .para:first-child, .ptx-content .solution-like > .para:first-child { margin-top: 0; } .ptx-content .assemblage-like > .para:first-of-type { margin-top: 0; } .ptx-content .assemblage-like > .heading + .para { margin-top: 0.25em; } .ptx-content .assemblage-like + .para { margin-top: 1.75em; } .ptx-content .para.intertext { margin-top: -0.25em; text-indent: 0; } .ptx-content .para + table { margin-top: 1em; } .ptx-content table tr td .para + .para { margin-top: 1em; } .ptx-content table + .para { margin-top: 1.5em; } .ptx-content .para + figure.figure-like > table { margin-top: 1em; } .ptx-content .exercise-like .para + ol { margin-top: 0.5em; } .ptx-content .para + pre.prettyprint, .ptx-content .para + pre.plainprint { margin-top: 1.25em; } .ptx-content .para + .code-box { margin-top: 1.25em; } .ptx-content .code-box > .console { margin-left: 1.5em; } .ptx-content .exercisegroup { padding-top: 1.25em; margin-bottom: 1em; } .ptx-content section .exercisegroup > .heading { font-size: 1.1em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .ptx-content section .exercisegroup > .heading + .introduction { display: inline; } .ptx-content section .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .ptx-content .exercisegroup article.exercise-like li > .para:first-child { margin-top: 0; } .ptx-content .exercisegroup article.exercise-like .heading { margin: 0; } .ptx-content article.exercise-like .task > .heading + .heading { font-weight: 600; } .ptx-content article.exercise-like .task > .heading + .heading + .para, .ptx-content article.exercise-like .task > .heading + .heading + div { display: block; margin-top: 0; } .ptx-content .exercisegroup .conclusion .heading { margin-top: 0.5em; } .ptx-content .exercisegroup article + article { margin-top: 1em; } .ptx-content .exercisegroup > article, .ptx-content .exercisegroup-exercises > article { margin-left: 2em; } .ptx-content .exercisegroup .cols2 > article { margin-left: 1.25em; } .ptx-content .exercisegroup > .introduction, .ptx-content .exercisegroup > .conclusion { margin-left: 0; } .ptx-content .exercisegroup > .introduction { margin-top: 1.25em; margin-top: 0; } .ptx-content .exercisegroup > .introduction > .para:first-child::before { content: "\25a0\2009"; color: #06a; position: relative; top: -1px; right: 1px; } .ptx-content .exercisegroup > .heading + .introduction > .para:first-child::before { content: "\2003"; } .ptx-content .exercisegroup > .introduction > .para:first-child { margin-top: 0; } .ptx-content section > article, .ptx-content section > section.paragraphs, .ptx-content .paragraphs > article { margin-top: 1.25em; } .ptx-content section article + article, .ptx-content section .introduction + article, .ptx-content section .para + article, .ptx-content section .posterior + article { margin-top: 1.75em; } .ptx-content section article > .introduction + article { margin-top: 1em; } .ptx-content section article > .discussion-like { margin-top: 1em; } .ptx-content section article > .discussion-like .para { margin-top: 1em; } .ptx-content article + .posterior { margin-top: 0.5em; } .ptx-content section .para + .tabular-box { margin-top: 0.75em; } .ptx-content section .tabular-box + .tabular-box { margin-top: 1em; } .ptx-content section .proof { margin-top: 0.75em; } .ptx-content section > pre, .ptx-content .para + pre { margin-top: 1.25em; } .ptx-content ol .para + .para, .ptx-content ul .para + .para { margin-top: 1em; } .ptx-content .introduction + .sidebyside, .ptx-content .para + .sidebyside, .ptx-content ol + .sidebyside, .ptx-content ul + .sidebyside { margin-top: 1em; } .ptx-content section .heading, .ptx-content article .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; } .ptx-content article .exercise-stage { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; font-size: 100%; margin-top: 0.4em; } .ptx-content article > .heading + .para { margin-top: 0; } .ptx-content section .heading + .para, .ptx-content section .title + .para, .ptx-content section .heading + .introduction > .para:first-child, .ptx-content section .blob > .para:first-child { margin-top: 0.25em; } .ptx-content section .heading + article { margin-top: 1em; } .ptx-content section .heading + .sidebyside { margin-top: 1em; } .ptx-content a > .heading { display: inline; } .ptx-content section > .heading { font-size: 1.75em; line-height: 1.25em; margin-top: 1em; margin-bottom: 0.35em; } .ptx-content section section > .heading { font-size: 1.5em; line-height: 1.25em; margin-bottom: 0; } .ptx-content .paragraphs > .heading { font-size: 1.125em; line-height: 1.125em; display: inline; } .ptx-content .paragraphs .heading + .para { display: inline; } .ptx-content .para.logical > .para:first-child { display: inline; } .ptx-content .runestone label > .para { display: inline; } .ptx-content .paragraphs .para .title { font-family: "PT Serif", "Times New Roman", Times, serif; font-size: 1.125em; font-weight: 700; } .ptx-content .paragraphs > .heading { margin-top: 0; } .ptx-content .paragraphs + .paragraphs { margin-top: 3em; } .ptx-content article .paragraphs > .heading { font-size: 1.05em; } .ptx-content section section section > .heading { font-size: 1.4em; line-height: 1.15em; margin-top: 0.75em; } @media screen and (max-width: 480px) { .ptx-content section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } .ptx-content section section > .heading { font-size: 1.3em; line-height: 1.15em; } .ptx-content section section section > .heading { font-size: 1.15em; line-height: 1em; } } .ptx-content .abstract { margin: 4em 2em; } .ptx-content .abstract > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .ptx-content .abstract > .title::after { content: ".\2009\2009\2009"; } .ptx-content .abstract > .title + .para { display: inline; } .ptx-content article > .heading, .ptx-content article > a .heading { font-size: 1.125em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like > .heading { font-size: 1em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like.discussion > .heading .codenumber, .ptx-content .discussion-like.discussion > .heading .space, .ptx-content .discussion-like.discussion > .heading .period { display: none; } .ptx-content .discussion-like.discussion > .heading .type::after { content: ". "; } .ptx-content .discussion-like.status > .heading { display: none; } .ptx-content .discussion-like.status > .heading + .para, .ptx-content .discussion-like.status > .para { font-style: italic; display: block; padding-left: 1em; } .ptx-content article > .heading::after, .ptx-content .discussion-like > .heading::after, .ptx-content .paragraphs > .heading::after, .ptx-content article > a > .heading::after { content: "\2009"; } .ptx-content .posterior .heading { font-weight: normal; font-size: 1.125em; line-height: 1.125em; margin-top: 0; } .ptx-content article > .heading + .para, .ptx-content .discussion-like > .heading + .para, .ptx-content article > .heading + .introduction, .ptx-content article > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article > .heading + ol, .ptx-content article > .heading + ul { padding-left: 1.5em; } .ptx-content article.theorem-like .para, .ptx-content article.theorem-like li { font-style: italic; } .ptx-content article.theorem-like .emphasis { font-weight: 700; } .ptx-content ol, .ptx-content ul { margin-bottom: 0; } .ptx-content li { margin-bottom: 0; } .ptx-content li .title { font-size: 100%; font-weight: normal; font-style: italic; } .ptx-content article.theorem-like li .title { font-weight: 600; font-style: normal; font-size: 96%; } .ptx-content figure { margin-bottom: 0; } .ptx-content .heading { margin-top: 0; margin-bottom: 0; } .ptx-content .conclusion { margin-top: 1em; } .ptx-content .conclusion > .para:first-child { margin-top: 0.5em; } .ptx-content ol, .ptx-content ul { margin-top: 0.75em; } .ptx-content .exercise-like > ol:first-child, .ptx-content .exercise-like > ul:first-child { margin-top: 0; } .ptx-content .heading + ol, .ptx-content .heading + ul { margin-top: 0.45em; } .ptx-content li > .heading + ol, .ptx-content li > .heading + ul { margin-top: 0.25em; } .ptx-content li > .heading + ol > li:nth-child(1), .ptx-content li > .heading + ul > li:nth-child(1) { margin-top: 0; } .ptx-content li > .heading + ol.cols2 > li:nth-child(2), .ptx-content li > .heading + ul.cols2 > li:nth-child(2) { margin-top: 0; } .ptx-content li { margin-top: 0.5em; } .ptx-content li > .para:first-child { margin-top: 0; } .ptx-content article .para:first-child { margin-top: 0; } .ptx-content ol ol, .ptx-content ol ul, .ptx-content ul ol, .ptx-content ul ul { margin-top: 0.5em; } .ptx-content .frontmatter > .heading { display: block; text-align: center; } .ptx-content .frontmatter > .heading .title, .ptx-content .book > .heading .title { font-size: 1.3em; } .ptx-content .frontmatter > .heading .subtitle, .ptx-content .book > .heading .subtitle { display: block; font-weight: normal; color: #666666; font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .ptx-content .frontmatter .author:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .para:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .author, .ptx-content .frontmatter > .credit { margin-top: 2em; text-align: center; } .ptx-content .frontmatter > .author .author-name { font-size: 120%; } .ptx-content .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .ptx-content .frontmatter .credit .title { font-size: 1em; } .ptx-content .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .ptx-content .frontmatter .author-info { font-size: 90%; } .ptx-content a[href^="mailto:"] { white-space: pre; } .ptx-content .colophon .credit { margin-top: 1em; } button { font: inherit; } .print-button { position: relative; right: 2px; top: 66px; background-color: LightGreen; z-index: 1; margin-top: -4em; float: right; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display: none; border: none; } .pretext .ptx-page main.ptx-main { margin-left: 0; left: auto; border: none; box-shadow: none; padding: 0; } .pretext .ptx-page .ptx-main .ptx-content { margin-top: 0; } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section { margin-top: 1em; } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section .heading { margin-top: 0; } .pretext a[href]::after { content: ""; } .print-button { display: none; } } @media print { body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { width: 820px; max-width: 820px; font-size: 12.5px; } body.standalone.worksheet { margin: 0; } body.standalone .ptx-content section.worksheet { border: none; } body.standalone.worksheet .ptx-masthead, body.standalone.worksheet .ptx-page-footer { display: none; } body.standalone.worksheet.has-sidebar-left.mathbook-loaded .ptx-page .ptx-main { margin: 0; } body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { margin: 0; } body.standalone.worksheet .ptx-content section.onepage { max-height: 100%; max-width: 100%; overflow: hidden; page-break-after: always; border: none; page-break-inside: avoid; } body.standalone.worksheet .ptx-content .onepage.lastpage { margin-bottom: -2em; page-break-after: auto; } body.standalone.worksheet.a4 .ptx-content .onepage { } body.standalone.worksheet .ptx-content .onepage div.workspace, body.standalone.worksheet .ptx-content .onepage div.workspace.squashed.tight { border: none; padding: 0; background: none !important; } body.standalone.worksheet a { color: black; } body.standalone.worksheet .ptx-page .ptx-main { padding: 0; } body.standalone.worksheet.mathbook-loaded .ptx-page .ptx-main .ptx-content.ptx-content section.onepage { padding-bottom: 20px; } @page { margin: 0; } } .hidden { display: none; } .ptx-navbar .preferences_menu_holder .active > li { color: #ddd; } .ptx-navbar .preferences_menu_holder > ol > li:focus { background: #eef; border: 2px solid #909; padding: 2px 24px 2px 8px; } .ptx-navbar .preferences_menu_holder > ol > li > ol > li:focus { background: #eef; border: 2px solid #909; padding: 4px 4px 2px 4px; } .ptx-navbar .preferences_menu_holder .active .selected { background: #eef; color: #111; } .ptx-navbar .button.user-preferences-button { overflow: visible; display: none; } .preferences_menu_holder { z-index: 30; background: #fee; color: #222; position: absolute; left: -11em; top: 4em; } .preferences_menu_holder ol { list-style-type: none; padding: 0; margin: 0; } .preferences_menu_holder > ol { width: 12.5em; } .preferences_menu_holder > ol > li { padding: 4px 26px 4px 10px; } .preferences_menu_holder ol li ol { z-index: 40; position: absolute; left: 13em; top: -2em; background: #fee; } .preferences_menu_holder ol li ol li { padding: 6px 6px 4px 6px; display: flex; align-items: center; } .preferences_menu_holder ol.fonts:not(.hidden) { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; } .preferences_menu_holder ol.fonts li:nth-child(8n+1), .preferences_menu_holder ol.fonts li:nth-child(8n+2), .preferences_menu_holder ol.fonts li:nth-child(8n+3), .preferences_menu_holder ol.fonts li:nth-child(8n+4) { background-color: #eff; } .preferences_menu_holder ol.fonts li:nth-child(4n+2) { width: 4em; justify-content: center; text-align: center; align-items: center; } .preferences_menu_holder ol.fonts li:nth-child(4n+1) { padding-left: 14px; } .preferences_menu_holder .wrap_to_submenu { float: right; line-height: 0.95em; margin-right: -7px; } .preferences_menu_holder .to_submenu { position: absolute; } .preferences_menu_holder .avatars li { font-size: 200%; text-align: center; } .preferences_menu_holder .fontfamily .name { margin-right: 2em; } .preferences_menu_holder .fontfamily .sample { margin-left: auto; } .preferences_menu_holder .fonts .byunits { font-size: 80%; margin-bottom: -0.3em; } #choose_topic { background: #eef; } .ffcheck, .atmospherecheck, .avatarcheck, .rulercheck, .motioncheck { width: 1em; margin-left: 0.2em; margin-right: 0.7em; font-size: 11pt; } .preferences_menu_holder .moveQ { padding-top: 0.5em; border-top: 0.3em solid #eef; } .preferences_menu_holder .moveQ, .preferences_menu_holder .moveQ ~ li { background: #efe; } [data-ruler=greybar] .onelineX:hover { padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: #f3f3f3; } [data-atmosphere*=dark][data-ruler=greybar] .onelineX:hover { color: #333; } [data-ruler=lightbox] .onelineX { background-color: #e3e3e3; } [data-ruler=lightbox] .onelineX:hover { padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: inherit; } [data-ruler=sunrise] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler=sunrise] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunrise] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] .onelineX:hover { background-color: inherit; border-bottom: 2px solid black; margin-bottom: -2px; position: relative; z-index: 10; } xxxxxx[data-ruler=sunriseunderline] .onelineX:hover + .onelineX { margin-top: -2px; } [data-ruler=sunriseunderline] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=sunriseunderline] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler=underline] .onelineX:hover { background-color: inherit; border-bottom: 1px solid black; margin-bottom: -1px; } [data-ruler=lunderline] .onelineX:hover { background-color: inherit; border-bottom: 1px solid black; border-left: 1px solid black; padding-left: 4px; margin-left: -5px; margin-bottom: -1px; } [data-atmosphere*=dark][data-ruler*=underline] .onelineX:hover { border-bottom: 1.5px solid #ddd; margin-bottom: -1.5px; } [data-atmosphere*=dark][data-ruler=lunderline] .onelineX:hover { border-left: 1.5px solid #ddd; padding-left: 3.5px; margin-left: -5px; } .material-symbols-outlined { font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24; } .ptx-footnote { display: inline-block; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number { visibility: hidden; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: 0.6rem; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote__number { display: inline; cursor: pointer; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowlbackground); border-radius: 6px; padding: 0px 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowlborder); } .ptx-content section .para.credit + .para.credit { margin-top: 0.25em; } .ptx-content section .para.credit > .title { font-weight: 700; margin-right: 0.5em; } .ptx-content section .para.copyright { margin-top: 2.5em; } .ptx-content section .para.license { margin-top: 2.5em; } .ptx-content section > .heading + .heading, .ptx-content section section > .heading + .heading { margin-top: 0.5em; } .ptx-content section.solutions > h3.heading, .ptx-content section.solutions section > h3.heading { font-size: 1.6em; } .ptx-content section.solutions > h4.heading, .ptx-content section.solutions section > h4.heading { font-size: 1.45em; } .ptx-content section.solutions > h5.heading, .ptx-content section.solutions section > h5.heading { font-size: 1.35em; } .ptx-content section.solutions > h6.heading, .ptx-content section.solutions section > h6.heading { font-size: 1.25em; } .ptx-content .bibitem + .bibentry { display: inline-block; width: 90%; } .ptx-content .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .ptx-content figcaption { font-weight: normal; } .ptx-content figcaption { margin-top: 0.6em; margin-left: auto; margin-right: auto; } .ptx-content figure.table-like figcaption:first-child { font-style: oblique; margin-top: 0; } .ptx-content figure.table-like figcaption:first-child .type, .ptx-content figure.table-like figcaption:first-child .codenumber { font-style: normal; } .ptx-content section figcaption .codenumber, .ptx-content section figcaption .type { font-weight: 700; font-size: inherit; } .ptx-content figcaption .codenumber:after { content: "\2002"; } .ptx-content figcaption .type:last-of-type::after { content: "\2002"; } .ptx-content figcaption code.code-inline { white-space: pre; } .ptx-content figure.figure > figcaption { margin-top: 1em; } .ptx-content figure.listing > figcaption + * { margin-top: 0.5em; } .ptx-content figcaption + .named-list-content { margin-top: 0.6em; } .ptx-content figcaption + .named-list-content > .introduction > .para:first-child { margin-top: 0; } .ptx-content figcaption + table, .ptx-content figcaption + .tabular-box { margin-top: 0.5em; } .ptx-content .definition-like .para > .emphasis { font-weight: 700; } .ptx-content em.alert { font-weight: bold; } .unprocessed { padding: 8px; background-color: rgb(255, 230, 230); } .unprocessed .unprocessed { margin: 8px; background-color: rgb(255, 200, 255); } .unprocessed .unprocessed .unprocessed { margin: 8px; background-color: rgb(205, 205, 255); } .ptx-content section.introduction + section { margin-top: 2em; } .ptx-content { margin: 0; } .ptx-content .runestone.parsons_section { display: inline-block; max-width: unset; } .ptx-content .runestone.ac_section { width: 60em; max-width: unset; } .ptx-content .runestone.ac_section .ac_section { max-width: unset; } .ptx-content .runestone.ac_section > div { max-width: unset; } .ptx-content .runestone > .parsons { width: 60em; max-width: unset; } .ptx-content .runestone .parsons { margin: 0; } .ptx-content .runestone.parsons_section > .parsons { width: max-content; padding-right: 1em; } .ptx-content .runestone .parsons .sortable-code-container { text-align: unset; } .ptx-content .runestone .parsons .parsons-text, .ptx-content .runestone .parsons .parsons-controls { margin-left: 0; margin-right: 0; } .ptx-content .runestone .parsons .sortable-code + .sortable-code { margin-right: 0; } .ptx-content .runestone .parsons .runestone_caption_text { max-width: 660px; } .runestonebustmenu { position: absolute; right: 0; top: 0; } .runestonebustmenu .dropdown-content { position: absolute; right: 2em; left: unset; top: 1em; } @media screen and (max-width: 800px) { nav .dropdown .dropdown-content { top: unset; bottom: 36px; } .activecode-toggle { display: none; } } .pretext .navbar .dropdown { height: 35px; } .ptx-content section section + section { margin-top: 3em; } .ptx-content .sidebyside > .para, .ptx-content .sidebyside > figure, .ptx-content .sidebyside > img, .ptx-content .sidebyside > table, .ptx-content .sidebyside > tabular, .ptx-content .sidebyside > section, .ptx-content .sidebyside > .paragraphs { display: inline-block; margin: 0; } .ptx-content .sidebyside .sbspanel > table { overflow-x: auto; margin-left: auto; margin-right: auto; } .ptx-content .sidebyside figcaption { padding-left: 1em; padding-right: 0; padding-bottom: 0; margin: 0.75em 0 0 0; } .ptx-content figcaption { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .sidebyside > .para { width: 32%; vertical-align: top; } .ptx-content .sidebyside > .para.left, .ptx-content .sidebyside > .para.middle, .ptx-content .sidebyside > .para.right { vertical-align: middle; } .ptx-content .sidebyside > .para + img { vertical-align: middle; } .ptx-content .sidebyside .sbsrow .sbsheader { margin-top: 0; } .ptx-content .sbsgroup { width: 100%; } .ptx-content .sidebyside { width: 100%; } .ptx-content .sbsrow { display: flex; justify-content: space-between; } .ptx-content .sbsheader { text-align: center; justify-content: center; font-size: 1em; } .ptx-content .sbspanel:empty { height: 10em; background-color: rgb(221, 221, 255); } .ptx-content .sbspanel { display: flex; flex-direction: column; justify-content: flex-start; } .ptx-content .sbspanel.top { justify-content: flex-start; } .ptx-content .sbspanel.middle { justify-content: center; } .ptx-content .sbspanel.bottom { justify-content: flex-end; } .ptx-content .sbspanel > .para:first-child { margin-top: 0; } .ptx-content .fixed-width { align-items: center; } .ptx-content .sbscaption { justify-content: center; } .ptx-content table { border-spacing: 0; } .ptx-content table { border-collapse: collapse; } .ptx-content .image-box + table, .ptx-content .image-box + .sidebyside > .sbsrow:first-child > .sbspanel > table:first-child { margin-top: 1.5em; } .ptx-content table tr td, .ptx-content table tr th { padding-top: 2px; padding-bottom: 2px; padding-left: 5px; padding-right: 5px; } .ptx-content table tr td { font-size: 90%; } .ptx-content table tr td.l { text-align: left; } .ptx-content table tr td.c { text-align: center; } .ptx-content table tr td.r { text-align: right; } .ptx-content table tr td.j { text-align: justify; } .ptx-content table tr td.lines { white-space: nowrap; } .ptx-content table tr td.t { vertical-align: top; } .ptx-content table tr td.b { vertical-align: bottom; } .ptx-content table tr td.m { vertical-align: middle; } .ptx-content table tr td.vv { border-left: 2px solid #000; border-right: 2px solid #000; } .ptx-content table tr td.vcv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.vcvv { border-left: 2px solid #000; border-right: 4px solid #000; text-align: center; } .ptx-content table tr td.vlv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vrv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.rv { border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.vr { border-left: 2px solid #000; text-align: right; } .ptx-content table tr td.lv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vl { border-left: 2px solid #000; text-align: left; } .ptx-content table tr td.cv { border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.Xv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vc { border-left: 2px solid #000; text-align: center; } .ptx-content table tr td.hline { padding: 0; } .ptx-content table tr td.hlinethick { padding-left: 0px; padding-right: 0px; } .ptx-content table tr td.hline hr { margin-top: 0; margin-bottom: 0; margin-left: -1px; margin-right: -1px; border: 1px solid rgb(0, 0, 0); } .ptx-content table tr td.hlinethick hr { margin-top: 0; margin-bottom: 0; margin-left: -1px; margin-right: -1px; border: 2px solid rgb(0, 0, 0); } .center table { text-align: center; margin-left: auto; margin-right: auto; } .ptx-content table tr th.b1, .ptx-content table tr td.b1 { border-bottom: 1px solid #000; } .ptx-content table tr th.b2, .ptx-content table tr td.b2 { border-bottom: 2px solid #000; } .ptx-content table tr th.b3, .ptx-content table tr td.b3 { border-bottom: 3px solid #000; } .ptx-content table tr th.b0, .ptx-content table tr td.b0 { border-bottom: none; } .ptx-content table tr th.t1, .ptx-content table tr td.t1 { border-top: 1px solid #000; } .ptx-content table tr th.t2, .ptx-content table tr td.t2 { border-top: 2px solid #000; } .ptx-content table tr th.t3, .ptx-content table tr td.t3 { border-top: 3px solid #000; } .ptx-content table tr th.t0, .ptx-content table tr td.t0 { border-top: none; } .ptx-content table tr th.r1, .ptx-content table tr td.r1 { border-right: 1px solid #000; } .ptx-content table tr th.r2, .ptx-content table tr td.r2 { border-right: 2px solid #000; } .ptx-content table tr th.r3, .ptx-content table tr td.r3 { border-right: 3px solid #000; } .ptx-content table tr th.r0, .ptx-content table tr td.r0 { border-right: none; } .ptx-content table tr th.l1, .ptx-content table tr td.l1 { border-left: 1px solid #000; } .ptx-content table tr th.l2, .ptx-content table tr td.l2 { border-left: 2px solid #000; } .ptx-content table tr th.l3, .ptx-content table tr td.l3 { border-left: 3px solid #000; } .ptx-content table tr th.l0, .ptx-content table tr td.l0 { border-left: none; } .ptx-content table tr td img { max-width: 200px; margin-right: 30px; } .ptx-content table.notation-list tr th { text-align: left; } .ptx-content table.notation-list tr td { text-align: left; vertical-align: top; } .ptx-content table.notation-list tr th { margin-left: 2em; } .ptx-content table.notation-list tr td { margin-left: 1em; } .ptx-content tr th.r0.l0, .ptx-content tr td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content table tr td span.decimal { float: left; text-align: right; } .ptx-content table tr.header-vertical th { writing-mode: vertical-rl; padding-left: 2em; } .ptx-content table + article { margin-top: 1em; } .ptx-content .hidden-knowl-wrapper .hiddenproof, .ptx-content .blob > article.hiddenproof, .ptx-content section > article.hiddenproof { margin-top: 0.3em; } .ptx-content .hidden-knowl-wrapper article { display: inline; } .apretext-content figure.figure-like { overflow: auto; } .ptx-content figure.figure-like { margin-left: 0; margin-right: 0; } .ptx-content figure.table-like { margin-left: 30px; margin-right: 30px; } .ptx-content figure.table-like.list { margin-right: 0; } .ptx-content a > tt { font-size: 110%; } .ptx-content section .videolink a:link { background-size: 0; } .ptx-content .playvideo { cursor: pointer; } .ptx-content .videobig { padding-right: 0.3em; padding-left: 0.3em; font-size: 85%; background-color: rgba(255, 255, 100, 0.9); display: inline-block; position: relative; top: 100px; cursor: zoom-in; } .ptx-content .videobig.nofigure { } .ptx-content .knowl .videobig { display: none; } .ptx-content .videosmall { padding-right: 0.3em; padding-left: 0.3em; font-size: 80%; background-color: rgba(255, 255, 100, 0.9); display: inline-block; position: absolute; left: -250px; z-index: 1001; cursor: zoom-out; } .ptx-content .exercise-like ol li table { margin-bottom: 0.5em; } .ptx-content .exercise-like > ol li + li { margin-top: 0.5em; } .ptx-content .solution > ol li + li { margin-top: 0.5em; } .ptx-content section.worksheet > .heading > .codenumber { display: inline-block; vertical-align: top; } .ptx-content section.worksheet > .heading > .title { display: inline-block; max-width: 70%; } .ptx-content .heading .print-links { display: inline-block; float: right; vertical-align: top; width: 19%; text-align: right; } .standalone .ptx-content .heading .print-links { display: none; } .standalone.worksheet .previous-button, .standalone.worksheet .up-button, .standalone.worksheet .next-button { display: none; } .standalone.worksheet .ptx-navbar .toc-toggle { display: none; } .standalone.worksheet .ptx-content [data-knowl]:hover, .standalone.worksheet .ptx-content [data-knowl]:active, .standalone.worksheet .ptx-content [data-knowl].active { background: none; color: black; } .standalone.worksheet .ptx-content [data-knowl]::after { border: none; } .standalone.worksheet .ptx-content .knowl-content { padding: 0; } .standalone.worksheet .ptx-content article > .knowl-output.original { margin: 0; } .ptx-content .appendix .heading > .type { display: inline; } .ptx-content .heading.hide-type > .type { display: none; } .ptx-content .heading .print-links > a { font-family: "Open Sans"; font-size: 0.6em; font-weight: bold; padding: 0.1em 0.2em; background: #ffa; border: 2px solid green; } .ptx-content .heading .print-links > a.us { background: #eef; color: #9b1c2c; border-color: #041E42; } .ptx-content .heading .print-links > a + a { margin-left: 0.25em; } .ptx-content .autopermalink { position: absolute; display: inline-block; top: 3px; left: -1.9em; font-size: 85%; color: #a00; opacity: 0.05; margin-top: 0.1em; } .ptx-content li > .para > .autopermalink { left: -3.4em; top: 0; } .ptx-content .autopermalink a { color: #a00; } .ptx-content .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } :target { scroll-margin-top: 45px; } .ptx-content .para > .autopermalink { margin-top: 0.2em; } .ptx-content .exercises > .autopermalink, .ptx-content .introduction > .autopermalink, .ptx-content .glossary > .autopermalink { margin-top: 0.3em; } .ptx-content .appendix > .autopermalink, .ptx-content .chapter > .autopermalink, .ptx-content .index > .autopermalink, .ptx-content .section > .autopermalink { margin-top: 0.3em; } .ptx-content .subsection > .autopermalink, .ptx-content .references > .autopermalink, .ptx-content .exercises > .autopermalink { margin-top: 0.3em; } .ptx-content .figure-like > .autopermalink { margin-top: 1.4em; } .ptx-content .subsubsection > .autopermalink { margin-top: 0; } .ptx-content .exercisegroup > .autopermalink { margin-top: 1.4em; } .ptx-content .autopermalink:hover { opacity: 1; background: #eeddff; } .ptx-content .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: #fff; border: 3px solid blue; z-index: 2001; } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after { content: ""; display: inline-block; } .indexjump a:nth-of-type(14) { padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: #eeaaff; } .ptx-content .indexitem { margin-top: 2px; } .ptx-content .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .ptx-content .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .ptx-content .indexknowl { margin-left: 0.11em; } .ptx-content em + .indexknowl { margin-left: -0.25em; } .ptx-content .indexknowl a { margin-left: 2em; } .ptx-content .indexitem .see, .ptx-content .subindexitem .see, .ptx-content .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .seealso, .ptx-content .subindexitem .seealso, .ptx-content .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .see em, .ptx-content .subindexitem .see em, .ptx-content .subsubindexitem .see em, .ptx-content .indexitem .seealso em, .ptx-content .subindexitem .seealso em, .ptx-content .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } .ptx-content .indexitem .see + .see, .ptx-content .subindexitem .see + .see, .ptx-content .subsubindexitem .see + .see, .ptx-content .indexitem .seealso + .seealso, .ptx-content .subindexitem .seealso + .seealso, .ptx-content .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .ptx-content .indexitem .indexknowl { font-size: 90%; } .ptx-content .indexitem [data-knowl], .ptx-content .subindexitem [data-knowl], .ptx-content .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .ptx-content .indexknowl [data-knowl]:hover, .ptx-content .indexknowl .active[data-knowl] { margin-left: 2em; } .ptx-content .subindexitem .indexknowl { font-size: 95%; } .ptx-content .subsubindexitem .indexknowl { font-size: 95%; } .ptx-content .indexletter { margin-top: 1.5em; } .ptx-content .hidden-knowl-wrapper .heading { display: inline; } .ptx-content .heading + .hidden-knowl-wrapper { display: inline; } .ptx-content .cols2 .knowl-output, .ptx-content .cols3 .knowl-output, .ptx-content .cols4 .knowl-output, .ptx-content .cols5 .knowl-output, .ptx-content .cols5 .knowl-output { width: 100%; } .ptx-content .cols2 + *, .ptx-content .cols3 + *, .ptx-content .cols4 + *, .ptx-content .cols5 + *, .ptx-content .cols6 + * { clear: both; } .ptx-content .cols2::after, .ptx-content .cols3::after, .ptx-content .cols4::after, .ptx-content .cols5::after, .ptx-content .cols6::after { content: ""; display: block; clear: both; } .ptx-content section > ol:last-child, .ptx-content section > ul:last-child { margin-bottom: 1.5em; } .ptx-content section > ol:last-child > li:last-child, .ptx-content section > ul:last-child > li:last-child { padding-bottom: 0em; } .ptx-content .cols2 > li:nth-child(2n+1), .ptx-content .cols3 > li:nth-child(3n+1), .ptx-content .cols4 > li:nth-child(4n+1), .ptx-content .cols5 > li:nth-child(5n+1), .ptx-content .cols6 > li:nth-child(6n+1) { clear: left; } .ptx-content .exercise-like ol.cols2 li { margin-top: 0.5em; } .ptx-content .cols2 > li, .ptx-content .cols3 > li, .ptx-content .cols4 > li, .ptx-content .cols5 > li, .ptx-content .cols6 > li { float: left; } .ptx-content .incontext { display: block; font-size: 85%; text-align: right; } .ptx-content .terminology { font-style: italic; font-weight: bold; } .ptx-content .emphasis { font-style: italic; } .ptx-content .emphasis .emphasis { font-weight: bold; } :target { animation: target-fade 15s 1; } @-webkit-keyframes target-fade { 0% { background-color: rgba(120, 0, 120, 0.3); } 100% { background-color: inherit; opacity: 1; } } @-moz-keyframes target-fade { 0% { background-color: rgba(120, 0, 120, 0.3); } 100% { background-color: inherit; opacity: 1; } } .ptx-content .autoterm [knowl], .ptx-content .autoterm [knowl]:after { font-weight: inherit; color: inherit; padding: 0; margin-bottom: inherit; border-bottom: inherit; border-bottom-color: inherit; } .ptx-content .autoterm [knowl]:hover { background: #ffddff; border-top: 2px dotted purple; border-bottom: 1px dotted red; border-top-left-radius: 0; border-top-right-radius: 0; } .ptx-content ol li.custom-list-style-type { list-style-type: none; } .ptx-content ol li.custom-list-style-type:before { content: attr(label) "\a0\a0"; } .ptx-content ol.no-marker, .ptx-content ul.no-marker, .ptx-content li.no-marker { list-style-type: none; } .ptx-content ol.decimal { list-style-type: decimal; } .ptx-content ol.lower-alpha { list-style-type: lower-alpha; } .ptx-content ol.upper-alpha { list-style-type: upper-alpha; } .ptx-content ol.lower-roman { list-style-type: lower-roman; } .ptx-content ol.upper-roman { list-style-type: upper-roman; } .ptx-content ul.disc { list-style-type: disc; } .ptx-content ul.square { list-style-type: square; } .ptx-content ul.circle { list-style-type: circle; } .ptx-content ol.no-marker, .ptx-content ul.no-marker { list-style-type: none; } .ptx-content section, .ptx-content article, .ptx-content figure { clear: both; } .ptx-content dl { margin-top: 1em; margin-left: 0; margin-bottom: 0; overflow: hidden; } .ptx-content dl dd { margin-top: 0; } .ptx-content dl dd::after { content: ""; display: block; clear: both; } .ptx-content dl.glossary dt { margin-top: 1.25em; } .ptx-content dl.description-list dt, .ptx-content dl.description-list dd { margin-top: 1em; } .ptx-content dl.description-list.narrow dt { margin-top: 0; } .ptx-content dl.glosary dt:first-of-type, .ptx-content dl.description-list dt:first-of-type, .ptx-content dl.glosary dd:first-of-type, .ptx-content dl.description-list dd:first-of-type { margin-top: 0; } .ptx-content dl dd .para { margin-top: 1em; } .ptx-content dl dt > .para:first-child, .ptx-content dl dd > .para:first-child { margin-top: 0; } .ptx-content dl > dt { font-weight: bold; max-width: 55ex; } .ptx-content dl.description-list dt { float: left; clear: left; text-align: right; width: 18ex; } .ptx-content dl.description-list.narrow dt, .ptx-content dl.glossary dt { text-align: left; } .ptx-content dl.glossary dd { margin-left: 5ex; } .ptx-content dl.description-list dd { margin-left: 22ex; } .ptx-content dl.description-list.narrow dd { margin-left: 12ex; } .ptx-content dl.description-list dt:first-of-type { clear: none; } .ptx-content dl.description-list.narrow dd::after { content: ""; display: block; height: 1em; clear: left; } .ptx-content dl.description-list.narrow dd:last-child::after { height: 0; } .ptx-content dl.description-list dt { float: left; clear: both; margin-right: 1ex; } .ptx-content dl.description-list.narrow dt { width: unset; max-width: 55ex; text-align: left; } .ptx-content dl.description-list.narrow dd { margin-left: 0; margin-top: 0; width: 31em; max-width: calc(100% - 12ex); float: right; clear: right; } .ptx-content dl.description-list + * { clear: both; } @media screen and (max-width: 480px) { .ptx-content dl.description-list dt { float: none; margin-left: 0; text-align: left; } .ptx-content dl.description-list dd, .ptx-content dl.description-list.narrow dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } .ptx-content dl.description-list dl dt { width: 8ex; } .ptx-content dl.description-list dd dd { margin-left: 18ex; } .ptx-content dl.description-list dl dd { margin-left: 12ex; } .ptx-content [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } .ptx-content .knowl mjx-mtext > mjx-utext, .ptx-content mjx-mtext > mjx-utext { width: revert !important; } .ptx-content mjx-msup mjx-utext, .ptx-content mjx-msub mjx-utext { display: inline; } a.mjx-svg-href { fill: inherit; stroke: inherit; } .displaymath + .para { margin-top: 0; } @media screen and (max-width: 943px) { .ptx-content .displaymath { position: relative; overflow-x: auto; } .ptx-content .mjx-chtml.MJXc-display { overflow-x: auto; overflow-y: hidden; } .ptx-content .figure-like { overflow-x: auto; } .ptx-content #MathJax_ZoomFrame { position: static; background: white; } .ptx-content #MathJax_Zoom { background-color: inherit; border: 0; padding: 0; position: absolute; overflow-x: auto; overflow-y: visible; left: 10% !important; max-height: none !important; } } .ptx-content dd .displaymath:last-child .MJXc-display { margin-bottom: 0; } .floatnav { margin-top: 8px; margin-left: 50px; } .floatnav a { padding-left: 3px; margin-right: -1px; color: inherit; } .ptx-content a .heading .mjx-chtml { z-index: 1; background: #fff; } .ptx-content .hidden-knowl-wrapper [data-knowl]::after, .ptx-content .hidden-knowl-wrapper [data-knowl]:hover::after, .ptx-content .hidden-knowl-wrapper .active[data-knowl]::after { right: 7px; } .floatnav a:hover { background: #eeaaff; } .ptx-content .unselectable { user-select: none; } .ptx-content .latex-logo { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .latex-logo .A { font-size: 75%; text-transform: uppercase; vertical-align: 0.5ex; margin-left: -0.48em; margin-right: -0.2em; } .ptx-content .latex-logo .E { vertical-align: -0.5ex; text-transform: uppercase; margin-left: -0.18em; margin-right: -0.12em; } .ptx-content .fillin { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.underline { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.box { display: inline-block; border: none; margin-left: 0.1em; margin-right: 0.1em; margin-bottom: -0.25em; outline: 1px solid black; height: 1.3em; } .ptx-content .fillin.shade { display: inline-block; border: none; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; background-color: #eee; height: 1.3em; } .ptx-content .hiddenproof > a > .heading { font-style: italic; font-weight: normal; } .ptx-content .MJXc-display, .ptx-content .knowl-output .knowl-output .knowl-output .knowl-output .MJXc-display, .ptx-content pre.prettyprint, .ptx-content pre.plainprint, .ptx-content pre.console, .ptx-content .code-box { background-image: linear-gradient( to right, white, white), linear-gradient( to right, white, white), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 255, 255, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 255, 255, 0)); background-position: left center, right center, left center, right center; background-repeat: no-repeat; background-color: inherit; background-size: 20px 100%, 20px 100%, 10px 100%, 10px 100%; background-attachment: local, local, scroll, scroll; } .ptx-content .runestone .code-box { background-image: none; } .ptx-content .knowl-output .MJXc-display { background-image: linear-gradient( to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient( to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient( to right, rgba(0, 0, 0, 0.25), var(--knowlbackground)), linear-gradient( to left, rgba(0, 0, 0, 0.25), var(--knowlbackground)); } .ptx-content .knowl-output.original .MJXc-display { background: inherit; } .ptx-content .assemblage-like .MJXc-display { background-image: linear-gradient( to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient( to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient( to right, rgba(0, 0, 0, 0.25), var(--assemblagebackground)), linear-gradient( to left, rgba(0, 0, 0, 0.25), var(--assemblagebackground)); } .ptx-content .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient( to right, #fffff5, #fffff5), linear-gradient( to right, #fffff5, #fffff5), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 255, 243, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 255, 243, 0)); } .ptx-content .knowl-output .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient( to right, #fff5fe, #fff5fe), linear-gradient( to right, #fff5fe, #fff5fe), linear-gradient( to right, rgba(0, 0, 0, 0.25), rgba(255, 243, 254, 0)), linear-gradient( to left, rgba(0, 0, 0, 0.25), rgba(255, 243, 254, 0)); } .ptx-content .knowl-output .knowl-content > *:last-child:not(.incontext) { margin-bottom: 0.5em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like, .ptx-content .knowl-output .knowl .knowl-content > .solution-like:not(.incontext) { margin-bottom: 0.15em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.hint { border-left: 1px solid #0f0; padding-left: 0.35em; background: #efe; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.answer { border-left: 2px solid #00f; padding-left: 0.35em; background: #eef; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.solution { border-left: 3px solid #c0c; padding-left: 0.5em; background: #fef; } .ptx-content .knowl-content > article:first-child, .ptx-content .knowl-content > .solution-like:first-child { padding-top: 0.25em; } .ptx-content .exercisegroup > .conclusion { margin-left: 1.5em; } .ptx-content .exercise-like .introduction { display: inline; } .ptx-content .exercise-like .introduction .heading { display: inline; } .ptx-content .exercise-like .introduction .para:first-child { display: inline; } .ptx-content .exercise-like .introduction::after { content: ""; display: block; } .ptx-content .exercise-like .conclusion::before { content: ""; display: block; margin-top: 0.25em; } .ptx-content .exercisegroup .exercisegroup-exercises.cols2, .ptx-content .exercisegroup .exercisegroup-exercises.cols3, .ptx-content .exercisegroup .exercisegroup-exercises.cols4, .ptx-content .exercisegroup .exercisegroup-exercises.cols5, .ptx-content .exercisegroup .exercisegroup-exercises.cols6 { width: 100%; display: inline-flex; flex-direction: row; flex-wrap: wrap; justify-content: flex-start; align-items: flex-start; align-content: flex-start; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 { display: inline; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 .knowl-output { display: block; } .ptx-content .exercisegroup .cols1 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(33.33% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(25% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(20% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(16.66% - 2em); } .ptx-content .mathword { white-space: nowrap; } .ptx-content .unit, .ptx-content .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .ptx-content .unit sub, .ptx-content .unit sup, .ptx-content .quantity sub, .ptx-content .quantity sup { word-spacing: normal; } .ptx-content .code-inline, .ptx-content .code-block, .ptx-content .console, .ptx-content .program, .ptx-content .program code { font-family: "Inconsolata", monospace; } .ptx-content .code-block, .ptx-content .console, .ptx-content .program { overflow-x: auto; } .ptx-content .code-inline { font-size: 1em; white-space: pre; color: inherit; background: #eeeeee; border: 1px solid #dddddd; padding: 0.0625em 0.25em; margin-left: 0.2em; margin-right: 0.2em; border-radius: 0.2em; } .ptx-content .code-inline:first-child { margin-left: 0; } .ptx-content .title .code-inline { padding-left: 0; padding-right: 0; margin-left: 0; margin-right: 0; } .ptx-content a .code-inline { background: #f6f6f6; } .ptx-content .kbdkey { background: #f1f1f1; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .ptx-content .kbdkey { color: #333; } .ptx-content .sagecell_sessionOutput pre { font-family: "Inconsolata", monospace; } .ptx-content .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .ptx-content .sage-interact.sagecell { margin: 0; } .ptx-content .sagecell_evalButton { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px; padding: 0 0.65em; } .ptx-content .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .ptx-content .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .ptx-content .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .ptx-content .sagecell_evalButton:focus, .ptx-content .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .ptx-content .sagecell .sagecell_editor { margin-bottom: 8px; } .ptx-content .booktitle { font-style: oblique; } .ptx-content .objectives > .heading, .ptx-content .outcomes > .heading { font-size: 1.25em; } .ptx-content a .heading { white-space: normal; } .ptx-content .solutions > a, .ptx-content .solutions > a:hover, .ptx-content .solutions > a.active, .ptx-content .instructions > a, .ptx-content .instructions > a:hover, .ptx-content .instructions > a.active { display: inline-block; margin-right: 1.5em; } .ptx-content .solutions > a::before, .ptx-content .instructions > a::before { content: "\25ba"; font-size: 70%; color: #06a; position: relative; top: -2px; right: 3px; } .ptx-content .solutions > a.active::before, .ptx-content .instructions > a.active::before { content: "\25bc"; animation-name: solutiontriangle; animation-duration: 3s; animation-iteration-count: 1; } .ptx-content .solutions > a[data-knowl]::after, .ptx-content .instructions > a[data-knowl]::after { left: 12px; } @keyframes solutiontriangle { from { content: "\25ba"; } to { content: "\25bc"; } } .ptx-content section.solutions { font-size: 90%; padding-left: 1em; border-left: 1em solid #eeeeee; } .ptx-content.ptx-content > section.solutions:first-child { padding-left: 0; border-left: none; } .ptx-content article.example-like > .solution-like, .ptx-content article.exercise-like > .solution-like { margin-top: 1em; padding-left: 0.7em; } .ptx-content article.example-like > .solution-like > .heading, .ptx-content article.exercise-like > .solution-like > .heading { font-size: 100%; font-weight: 700; margin-right: 0.25em; display: inline; } .ptx-content article.example-like > .solution-like > .heading + .para, .ptx-content article.exercise-like > .solution-like > .heading + .para { display: inline; } .ptx-content article > figure:first-child { margin-top: 0; } .ptx-content figure + figure, .ptx-content figure + .sidebyside, .ptx-content .sidebyside + .sidebyside, .ptx-content article + figure, .ptx-content .sidebyside + figure { padding-top: 1em; } .ptx-content img { display: inline-block; margin-left: auto; margin-right: auto; } .ptx-content img.cs { display: block; margin-top: 20px; margin-bottom: 20px; margin-left: auto; margin-right: auto; } .ptx-content img:not(.cs) { max-width: 650px; } .ptx-content .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } .ptx-content figure img { display: block; margin-left: auto; margin-right: auto; } .ptx-content figure img + img { margin-top: 30px; } .ptx-content div.center img { display: block; margin-left: auto; margin-right: auto; } .ptx-content div.center + div.center > img { margin-top: 60px; } .ptx-content div.center > img + img { margin-top: 60px; } .ptx-content figure table { margin-left: auto; margin-right: auto; } .ptx-content .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .ptx-content figure.wrap img { width: 250px; } .ptx-content figure.wrap { float: right; margin-right: 0; margin-left: 30px; } .ptx-content figure img.wrap { float: right; margin: 0; } .ptx-content figure figcaption.wrap { margin: 10px; font-size: 100%; text-align: center; } .ptx-content figure, .ptx-content .image-box { margin-top: 0.5em; } .ptx-content figure.listing { margin-top: 1em; } .ptx-content figure .image-box { margin-top: 0; } .ptx-content .sidebyside figure { margin-top: 0; } .ptx-content .image-box img, .ptx-content img.contained, .ptx-content .sbspanel img { width: 100%; height: auto; } .ptx-content .image-box > img:not(.draw_on_me):not(.mag_popup) { cursor: zoom-in; } .ptx-content img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; max-width: 600px; } .ptx-content .mag_popup_container { width: 100%; position: absolute; z-index: 1001; overflow-x: visible; } .ptx-content .image-box, .ptx-content .audio-box, .ptx-content .video-box, .ptx-content .asymptote-box { position: relative; } .ptx-content .image-box .asymptote-box iframe.asymptote, .ptx-content iframe.asymptote, .ptx-content .video-box .video, .ptx-content .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .ptx-content section > .audio-box, .ptx-content section > .video-box, .ptx-content section > .image-box { margin-top: 0.75em; } .ptx-content .audio { width: 100%; } .caption .heading { font-weight: bold; } .caption .counter { font-weight: bold; } .ptx-content div.quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .minipage + .minipage { display: inline-block; } .ptx-content code.inline { background: none; border: none; } .ptx-content pre.program, .ptx-content pre.program code, .ptx-content pre.code-block, .ptx-content pre.code-block code { line-height: 1.1; } .ptx-content section > .code-box, .ptx-content .para + .code-box, .ptx-content section > .code-block, .ptx-content .para + .code-block { margin-top: 1em; } .ptx-content pre.program, .ptx-content pre.code-block { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.program:before, .ptx-content pre.code-block:before { content: " "; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3em; } .ptx-content pre[data-line].program, .ptx-content pre[data-line].code-block { padding-left: 2.5em; } .ptx-content pre[data-line].program:before, .ptx-content pre[data-line].code-block:before { margin-left: -5em; } .ptx-content pre.program.line-numbers, .ptx-content pre.code-block.line-numbers { padding-left: 3.5em; overflow: visible; } .ptx-content pre.program.line-numbers:before, .ptx-content pre.code-block.line-numbers:before { margin-left: -7em; } .ptx-content pre[data-line].line-numbers code { padding-top: 0em; } .ptx-content pre[data-line].line-numbers .line-highlight { margin-top: 0em; } .ptx-content pre[data-line]:not(.line-numbers) .line-highlight { margin-top: 0.6em; } .ptx-content pre.prettyprint, .ptx-content pre.plainprint { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.prettyprint:before, .ptx-content pre.plainprint:before { content: ""; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 2.5em; } .ptx-content .objectives { margin-bottom: 1.25em; } .ptx-content ol > li { padding-left: 0.25em; } .ptx-content ol.cols2 > li, .ptx-content ul.cols2 > li { width: calc(49% - 1.75em); min-width: 190px; } .ptx-content ol.cols3 > li, .ptx-content ul.cols3 > li { width: calc(33% - 1.25em); min-width: 160px; } .ptx-content ol.cols4 > li, .ptx-content ul.cols4 > li { width: calc(24.5% - 1.25em); min-width: 100px; } .ptx-content ol.cols5 > li, .ptx-content ul.cols5 > li { width: calc(19.5% - 0.75em); min-width: 90px; } .ptx-content ol.cols6 > li, .ptx-content ul.cols6 > li { width: calc(16.3% - 0.5em); min-width: 80px; } .ptx-content ul.cols2 > li:nth-child(odd), .ptx-content ol.cols2 > li:nth-child(odd) { margin-right: 2em; } .ptx-content .cols2 ol, .ptx-content .cols3 ol, .ptx-content .cols4 ol, .ptx-content .cols5 ol, .ptx-content .cols6 ol { padding-left: 0.7em; } .ptx-content .exercisegroup-exercises > article.exercise-like { margin-top: 1em; } .ptx-content .cols2 > li:last-child:nth-child(odd) { float: none !important; padding-top: 0.5em; } .ptx-content .solution ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .solution ol li > .para:first-child, .ptx-content .solution ol li > .displaymath:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .solution ol li > .displaymath:first-child .MJXc-display { margin-top: 0; } .ptx-content .exercise-like ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .exercise-like > .cols2 > li { width: calc(49% - 2.5em); } .ptx-content .exercise-like > .cols3 > li { width: calc(33% - 2.5em); } .ptx-content .exercise-like > .cols4 > li { width: calc(24.5% - 2.5em); } .ptx-content .exercise-like > .cols5 > li { width: calc(19.5% - 2.5em); } .ptx-content .exercise-like > .cols6 > li { width: calc(16.3% - 2.5em); } .ptx-content .knowl .exercise-like > .cols2 > li { width: calc(49% - 2em); } .ptx-content .knowl .exercise-like > .cols3 > li { width: calc(33% - 2em); } .ptx-content .knowl .exercise-like > .cols4 > li { width: calc(24.5% - 2em); } .ptx-content .knowl .exercise-like > .cols5 > li { width: calc(19.5% - 2em); } .ptx-content .knowl .exercise-like > .cols6 > li { width: calc(16.3% - 2em); } .ptx-content .exercise-like ol li > .para:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .contributor .contributor-name { font-variant: small-caps; } .ptx-content .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .ptx-content .contributor { margin-top: 3ex; } .ptx-content .contributor + .contributor { margin-top: 1.5ex; } .ptx-content .contributor + .para { margin-top: 3ex; } .ptx-content .frontmatter .contributors, .ptx-content .book .contributors { text-align: center; font-style: normal; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .searchwrapper .gsc-control-cse { padding: 0; border: none; width: 25ex; } .pretext .searchwrapper .cse .gsc-search-button input.gsc-search-button-v2, .searchwrapper input.gsc-search-button-v2 { padding: 2px 2px; } .pretext .searchwrapper form.gsc-search-box { margin: 0; } .pretext .searchwrapper table.gsc-search-box { margin: 0; } .pretext .searchwrapper .gsc-search-box-tools .gsc-search-box .gsc-input { padding: 0; } .pretext .searchwrapper .gsib_a { padding: 0 0 0 5px; } .pretext .searchwrapper .gsc-input-box { height: 3ex; } .pretext .searchwrapper form.gsc-search-box { font-size: 12px; } .ptx-content div.CodeMirror span.CodeMirror-matchingbracket { color: #090; } .ptx-content .image-archive { margin-left: auto; margin-right: auto; margin-bottom: 0; margin-top: 0.75em; padding-bottom: 0.25em; text-align: center; } .ptx-content .image-archive > a { display: inline-block; padding-left: 0.5em; padding-right: 0.5em; font-family: monospace; } .ptx-content iframe { margin: 0; border: none; box-sizing: border-box; } .ptx-content .times-sign { font-size: larger; vertical-align: -0.15ex; } .ptx-content article.notranslate { margin-top: 0; } .ptx-content article.exercise-like > .exercise-like { margin-left: 40px; } .ptx-content article.exercise-like > .exercise-like.task { margin-left: 20px; } .ptx-content article.exercise-like > .exercise-like > .para { margin-top: 1.25em; } .ptx-content article.example-like > .heading + .introduction { display: inline; } .ptx-content article.example-like > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article.example-like > .exercise-like > .para { margin-top: 1.25em; } .ptx-content .taxon { font-style: italic; } .ptx-content .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .ptx-content .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .ptx-content .sageanswer .output { display: inline-block; vertical-align: top; } .ptx-content .CodeMirror-code pre.CodeMirror-line { padding-bottom: 5px; padding-left: 6px; } .ptx-content .hidden-content, .pretext .hidden-content { display: none; } .ptx-content hr.ptx-pagebreak { width: 30em; text-align: center; margin-left: auto; margin-right: auto; margin-bottom: 2em; margin-top: 0; height: 4em; border: 0; border-bottom: 1px dashed #ccc; } .ptx-content hr.ptx-pagebreak:after { content: "page"; display: inline-block; position: relative; top: 4em; font-size: 80%; padding: 0 0.25em; background: white; } .ptx-content .example-like > .exercise-like > .para:first-of-type { display: inline; } .ptx-content .example-like > .exercise-like > .aside-like { margin-top: -3em; } .ptx-content .example-like > .exercise-like > .aside-like.front { margin-top: 0; } .ptx-content meta { display: none; } .ptx-content .summary-links a { color: #671d12; background: #f0f0f0; text-decoration: none; cursor: pointer; } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: white; background: #671d12; } .ptx-content .summary-links a .codenumber { color: #303030; margin-right: 0.41667em; } .ptx-content .summary-links a:hover .codenumber, .ptx-content .summary-links a:focus .codenumber { color: #f0f0f0; } .ptx-content .summary-links { margin-top: 4em; } .ptx-content section + .summary-links { margin-top: 2em; } .ptx-content .summary-links ul { list-style-type: none; } .ptx-content .summary-links li { margin-top: 0; } .ptx-content section .summary-links li .title { font-style: normal; } .ptx-content .summary-links a { position: relative; display: block; font-size: 1.5em; line-height: 1.25em; padding: 0.41667em 0.83333em; margin-top: 0.20833em; border-radius: 3px; padding-right: 2.06667em; } .ptx-content .summary-links a:after { right: 0.83333em; } .ptx-content .summary-links a:after { content: ""; position: absolute; top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid #c9c9c9; } .ptx-content .summary-links a, .ptx-content .summary-links a:link, .ptx-content .summary-links a:visited { cursor: pointer; } .ptx-content .summary-links a:hover:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a { font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-content .summary-links a { font-size: 1em; line-height: 1.25em; } } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a:active { position: relative; color: white; background: #932919; text-decoration: none; box-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px 5px inset; } .ptx-content .summary-links a:active:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a:focus { outline: thin dotted #333; outline-offset: -2px; } body.standalone.worksheet .ptx-content .onepage > .heading { margin-top: 0; font-size: 1.3em; } body.standalone.worksheet .ptx-content .onepage > .introduction { margin-top: 0.4em; } body.standalone.worksheet .ptx-content .onepage > .introduction > .heading { font-size: 1.1em; } body.standalone.worksheet .ptx-content .onepage .solutions, body.standalone.worksheet .ptx-content .onepage .instructions { display: none; } body.standalone .ptx-content .worksheet { padding: 40px 0 45px 0; border: 2px solid grey; margin: 0; } body.standalone .ptx-content .onepage { padding: 40px 45px 45px 55px; border-bottom: 2px solid grey; margin: 0; } body.standalone .ptx-content .onepage + .onepage { border-top: 2px solid grey; } body.standalone .ptx-content .onepage.firstpage { padding-top: 0; } body.standalone .ptx-content .onepage.lastpage { padding-bottom: 0; border-bottom: none; } body.standalone .ptx-content .worksheet > *:last-child { padding-bottom: 0 !important; } .ptx-content .onepage + .onepage { margin-top: 2.5em; padding-top: 1.5em; border-top: 1px dashed #aaa; } .ptx-content .onepage + .onepage::before { content: "pagebreak"; text-align: center; margin-left: 40%; padding-left: 1em; padding-right: 1em; position: absolute; top: -0.8em; font-size: 80%; font-style: italic; background: white; } body.standalone .ptx-content .onepage + .onepage { margin-top: 10px; } body.standalone .ptx-content .onepage + .onepage::before { content: none; } body.standalone .ptx-content .onepage article { padding-left: 0; border: none; } body.standalone .ptx-content .onepage article::after { all: unset; } .ptx-content .onepage > .para:first-child, .ptx-content .onepage > article:first-child { margin-top: 0; } .ptx-content section + .onepage.firstpage, .ptx-content article + .onepage.firstpage, .ptx-content .para + .onepage.firstpage { margin-top: 1.25em; } body.worksheet .ptx-content .onepage .sbspanel + .sbspanel > .exercise::before { content: ""; position: absolute; top: 0; bottom: 0; right: 0; left: 0; padding-left: 1.25em; border-left: 1px solid grey; margin-left: -1.25em; z-index: -100; } body.standalone.worksheet .ptx-content section article.task { margin-left: 0; } body.standalone.worksheet .ptx-content section article.task > .heading { font-weight: normal; } body.standalone .autopermalink { display: none; } body.standalone.worksheet .ptx-content .onepage .workspace { border: 2px dotted grey; background: #f3fff3; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed { border: 2px dotted grey; background: #ffe; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed.tight { border: 15px solid; border-image: repeating-linear-gradient( -35deg, #f33, #f33 10px, #000 10px, #000 20px) 20; background: yellow; } body.has-sidebar-left.mathbook-loaded.standalone.worksheet .ptx-page .ptx-main { margin-left: 0; } body.standalone.worksheet .ptx-content .goal-like { border: none; padding: 0; } body.standalone.worksheet .ptx-content .goal-like > .heading { margin-top: -0.5em; padding: 0; margin: 0; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading { display: inline; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading, body.standalone.worksheet .ptx-content section.worksheet > .objectives, body.standalone.worksheet .ptx-content section.worksheet > .introduction, body.standalone.worksheet .ptx-content section.worksheet > .conclusion { margin-left: 55px; margin-right: 40px; } body.standalone.worksheet .ptx-content section.worksheet > .heading + .para { display: inline; } .ui-dialog.ui-widget.ui-widget-content.ui-corner-all.ui-draggable.ui-resizable { left: 0 !important; top: 0 !important; } .ptx-content a.url, .ptx-content a.external { color: #22a; } .ptx-content a.url:hover, .ptx-content a.external:hover { background: #ffd; } .ptx-content .poem { margin-top: 1.5em; } .ptx-content .poem { display: table; margin-top: 1.5em; margin-left: auto; margin-right: auto; margin-bottom: 0; width: auto; max-width: 90%; } .ptx-content .poem > .heading { display: block; text-align: center; } .ptx-content section article.poem > .heading::after { content: ""; } .ptx-content .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .ptx-content .poem .author { font-style: italic; margin-top: 0.75em; } .ptx-content .poem .author.left { text-align: left; } .ptx-content .poem .author.center { text-align: center; } .ptx-content .poem .author.right { text-align: right; } .ptx-content .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .ptx-content .poem .stanza + .stanza { margin-top: 1em; } .ptx-content .poem .heading + .stanza { margin-top: 0.2em; } .ptx-content .poem .heading + .line { margin-top: 0.2em; } .ptx-content .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .ptx-content .poem .line.center { text-align: center; } .ptx-content .poem .line.right { text-align: right; } .ptx-content .poem .tab { margin-left: 2em; } .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; width: 253px; height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } .toolBPanel { overflow: hidden !important; } .toolBPanel:hover { overflow: auto !important; } #aboelkins-ACS .ptx-main .ptx-content > section:first-of-type > section:first-of-type > .project-like:first-of-type li { font-size: 300%; } .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } .ptx-content .marginresource { position: relative; height: 0; left: 40em; top: 1em; } .ptx-content .marginresource a { color: blue; } .ptx-content .marginresource a[knowl] { border-bottom: 1px dotted blue; } .ptx-content .marginresource .icon { font-size: 200%; margin-right: 1em; display: inline-block; } .ptx-content .marginresource .resource_description { display: inline-block; } .ptx-content .marginresource .resource_links { display: block; margin-left: 2em; } .collectedworks .knowl-output { border: 12px solid #D6E3FF; background: none repeat scroll 0% 0% #FAFCFF; border-radius: 4px; margin-bottom: 1.25em; } .collectedworks .subjectwork { max-width: 750px; } .collectedworks .bib { margin-bottom: 1em; } .collectedworks .bibitem + .bibentry { display: inline; } .collectedworks .bibitem { display: inline; font-weight: bold; margin-right: 1em; } .collectedworks .work .title a { text-decoration: none; color: #009; } .iconlegend { position: absolute; margin-top: 0.5em; top: 0; left: 920px; line-height: 1; } .iconlegend .icon_name { font-size: 90%; margin-right: 1em; } .icongroup + .icongroup { margin-left: 1em; } label.webwork { display: inline-flex; flex-direction: column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } .feedback { word-wrap: break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .ptx-content .webwork-button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; background-color: #ffffff; } .ptx-content .webwork-button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .webwork-button:active { cursor: pointer; background-color: #a0a0a0; border: 1px solid #999; } .webwork img, .webwork + .knowl-output img { max-width: 100%; } .ptx-content .exercise-wrapper form button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; color: black; background-color: #ffffff; } .ptx-content .webwork-button.activate { width: 22px; height: 22px; background-image: url(https://raw.githubusercontent.com/openwebwork/webwork2/main/htdocs/images/favicon.ico); background-size: contain; position: absolute; right: -35px; } article.project-like > .heading + div.ptx-runestone-container > div.runestone, article.exercise-like > .heading + div.ptx-runestone-container > div.runestone { margin-top: 0.5em; } .ptx-content .bottom { position: unset; } .ptx-content .rsdraggable { font-size: 100%; } .ptx-content .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .exercise-wrapper form button:active { background-color: #f0f0f0; } .ptx-content .exercise-wrapper form button + button { margin-left: 0.8em; } .ptx-content .exercise-wrapper, .ptx-content .exercise-wrapper form, .ptx-content .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; } .ptx-content .knowl .exercise-wrapper, .ptx-content .knowl .exercise-wrapper form, .ptx-content .knowl .exercise-wrapper form > div:first-child { width: 100%; } .ptx-content .exercise-wrapper > .para:first-child, .ptx-content .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } .ptx-content .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } .ptx-content .cols2 .heading + .exercise-wrapper { width: auto; } @media screen and (max-width: 600px) { .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(33.3% - 2em); } .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } @media screen and (max-width: 850px) and (min-width: 786px) { .ptx-content .exercisegroup .cols2 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols3 > article.exercise-like { flex-basis: calc(100% - 2em); } .ptx-content .exercisegroup .cols4 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols5 > article.exercise-like { flex-basis: calc(50% - 2em); } .ptx-content .exercisegroup .cols6 > article.exercise-like { flex-basis: calc(33.3% - 2em); } .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } .APEXlogo { white-space: nowrap; } .APEXlogo .A { margin-right: -0.07em; } .APEXlogo .P { margin-right: -0.33em; position: relative; top: -0.3em; } .APEXlogo .E { position: relative; top: 0.33em; } .runestone-profile .dropdown-content { position: absolute; display: none; right: 0; top: 35px; text-align: left; border: 1px solid; border-color: #600; border-color: var(--tocborder); } .runestone-profile.dropdown:hover { background-color: #ddd; overflow: visible; } .runestone-profile.dropdown:hover .dropdown-content { display: block; } .runestone-profile .dropdown-content { background-color: white; z-index: 1800; min-width: 100px; padding: 5px; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: #662211; padding: 2px 8px; } .runestone-profile.dropdown .dropdown-content a:hover { background-color: #671d12; color: #ffffff; text-decoration: none; background-color: var(--chaptertoc); } .runestone-profile.dropdown .dropdown-content hr { margin-bottom: 4px; margin-top: 4px; border-color: #600; border-color: var(--sectiontoctext); } .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox { } .ptxsearch { height: 35px; flex: 1 1; } .searchbutton .name { display: none; } .searchwidget { text-align: right; } .searchwidget input { } .helpbox { display: none; } .detailed_result { margin-bottom: 10px; } .all_results a:link { text-decoration: none; font-size: large; } .all_results a:hover { background-color: lightgray; } .searchresults a:hover { background-color: #eee; } .searchresults a { text-decoration: none; color: #222; } .searchresults a:hover { text-decoration: underline; color: #33f; } .searchresults ul li { list-style-type: none; } ol.searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; } ol.searchresults > li { list-style-type: none; } .search-result-score { display: none; } .high_result { font-weight: 700; } .medium_result { font-weight: 500; } .low_result { font-weight: 200; } .no_result { font-weight: 200; color: #444; } .detailed_result .no_result { font-size: 90%; } .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; left: 152px; width: 600px; padding: 1em; border: 0.2em solid #009; background: aliceblue; z-index: 5000; display: flex; flex-direction: column; } .search-results-heading { border-bottom: 1px solid rgba(0, 0, 125, 0.5); } .search-results-controls { display: flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; } .closesearchresults { display: flex; justify-content: space-between; align-items: center; border: 1px solid black; } .closesearchresults:hover { color: #c00; background-color: #fee; border-color: #f00; } .closesearchresults + h2 { margin-top: -1em; } .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .search-result-bullet { margin-top: 0.3em; } .search-result-clip { font-size: 80%; font-style: italic; color: #444; padding-left: 15px; } .search-results-unshown-count { margin-top: 0.6em; } .search-result-clip-highlight { background: rgba(255, 255, 0, 0.5); } @media screen and (max-width: 800px) { .searchresultsplaceholder { width: 80vw; left: 10vw; bottom: 10vh; } } .pretext .ptx-masthead { position: relative; background: #fafafa; min-height: inherit; border: none; position: relative; } .pretext .ptx-navbar { position: sticky; top: 0; max-width: 904px; height: 36px; } .pretext .ptx-page { position: relative; min-height: 100vh; } .ptx-content { min-height: 60vh; } .pretext .ptx-sidebar { position: sticky; top: 36px; left: 0; float: left; width: 240px; } .pretext .ptx-toc { position: sticky; top: 50px; box-sizing: border-box; overflow-y: scroll; height: calc(100vh - 60px); } .pretext .ptx-page > .ptx-main { display: block; position: relative; overflow-y: hidden; margin: 0 0 0 240px; padding: 1px 0 0 0; background: white; border-left: 1px solid #ccc; } .pretext .ptx-page .ptx-sidebar.hidden + .ptx-main { margin-left: 0; } .pretext .ptx-page > .ptx-main.notoc { margin-left: 0; transition-property: margin-left; transition-duration: 0.3s; } @media screen and (max-width: 800px) { .pretext .ptx-page > .ptx-main { margin-left: 0; left: auto; } .pretext .ptx-page-footer { margin-bottom: 38px; } } .pretext .ptx-page > .ptx-main .ptx-content { max-width: 600px; margin: 32px; } @media screen and (max-width: 663px) { .pretext .ptx-page > .ptx-main .ptx-content { margin: 28px; } } .ptx-content.serif .para .para, .ptx-content[data-font=RS] .para .para { font-size: 100%; } .ptx-content[data-font=RS] .code-inline { background: #f6f6f6; border: 1px solid #eee; padding: 0.01em 0.15em 0.03em 0.15em; margin-left: 0.15em; margin-right: 0.15em; border-radius: 0; } .pretext .ptx-content-footer { margin-top: 2em; display: flex; justify-content: space-around; max-width: 600px; margin-left: 32px; } .pretext .ptx-content-footer .button { min-width: 80px; height: 35px; color: #333333; background-color: #ededed; border: 1px solid #bababa; padding: 0 10px; display: flex; gap: 10px; align-items: center; justify-content: center; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .pretext .ptx-content-footer .button .icon { margin: 0 -7px; } .pretext .ptx-content-footer .button:hover, .pretext .ptx-content-footer .button:active, .pretext .ptx-content-footer .button:focus { background-color: #fafafa; } .pretext .ptx-sidebar.visible { display: block; } .pretext .ptx-page-footer .feedback-link { cursor: pointer; text-align: center; color: #333333; background-color: #ededed; border: 1px solid #bababa; margin: 1.5em 0 0 0; padding: 0 1em 0 1em; height: 2em; display: flex; align-items: center; } .pretext .ptx-page-footer { background: #f4f4f4; margin-top: 2em; padding-top: 0; max-width: 900px; border-top: 2px solid var(--sectiontoctext); border-bottom: 2px solid var(--sectiontoctext); display: flex; flex-direction: row; justify-content: space-around; position: relative; } .pretext .ptx-page-footer > a { margin: 1em 0; } .pretext .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } @media screen and (max-width: 800px) { .pretext .ptx-navbar { position: fixed; top: auto; bottom: 0; z-index: 1100; } .pretext .ptx-sidebar { display: none; position: fixed; top: 10px; z-index: 1000; background: white; } .pretext .ptx-content-footer { display: none; } .pretext .ptx-toc { height: calc(100vh - 50px); } } :root { --content-margin: 32px; --content-width: 750px; --content-width-wide: 1050px; --page-width: 1100px; --xl-margin: calc((var(--content-width) - var(--content-width-wide)) / 2 - var(--content-margin)); --content-font-size: 1.2rem; } html { font-size: 16px !important; } :root { --questionBgColor: var(--componentBgColor) !important; } :root { --component-border-color: #bababa; --page-gutter-color: #c5c4c4; --page-border-color: #444; --page-color: white; } .pretext .ptx-masthead { border-bottom: 1px solid var(--component-border-color); } body.pretext { background-color: var(--page-gutter-color); } .pretext .ptx-page { position: relative; min-height: 100vh; max-width: var(--page-width); margin: 0 auto; background: var(--page-color); box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); } .searchresultsplaceholder { left: calc(50vw - 300px); } .pretext .ptx-page .ptx-main { max-width: var(--content-width); margin: 0 auto; padding-bottom: 2em; border: 0; overflow: visible; } .pretext .ptx-page .ptx-sidebar.hidden + .ptx-main { margin: 0 auto; } .pretext .ptx-page > .ptx-main .ptx-content { max-width: var(--content-width); font-size: var(--content-font-size); } .pretext .ptx-page-footer { max-width: var(--page-width); justify-content: center; margin: 0 auto; gap: 90px; box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); border-bottom: 0; } .pretext .ptx-content-footer { max-width: 100%; margin: 2em auto 0; padding-bottom: 2em; justify-content: space-evenly; } .pretext .ptx-page-footer a { --margin: 15px 45px; } .ptx-content .runestone:is(.ac_section, .codelens, .parsons_section, .hparsons_section), .ptx-content .runestone.datafile, .ptx-content .contains-wide { width: var(--content-width-wide); max-width: unset; margin-left: var(--xl-margin); max-width: unset; border-width: 1px; border-radius: 3px; } .ptx-content .runestone .runestone:is(.ac_section, .codelens, .parsons_section, .hparsons_section), .ptx-content .runestone .runestone.datafile { width: 100%; margin-left: auto; } .ptx-content .runestone { border-width: 1px; border-radius: 3px; } .pretext .ptx-page > .ptx-main .ptx-content pre, .pretext .ptx-page > .ptx-main .ptx-content .ptx-runestone-container :is(.ac_code_div), .ptx-runestone-container .parsons .sortable-code-container, .ptx-runestone-container .hparsons_section .hparsons-input { font-size: 1rem; } .ptx-content .runestone.ac_section > div > div > *:not(.ac_code_div):not(.ac_output):not(.codelens):not(.ac_actions) { max-width: calc(var(--content-width) - 2 * var(--content-margin)); margin-left: auto; margin-right: auto; } .ptx-content .runestone.contains-wide .tab-content { max-width: var(--content-width); margin-left: auto; margin-right: auto; } .ptx-content .runestone.contains-wide .tab-content .runestone:is(.ac_section, .codelens, .parsons_section, .hparsons_section) { width: calc(var(--content-width-wide) - 20px); margin-left: calc(var(--xl-margin) + 8px); } .ptx-content .runestone.parsons_section > .parsons { width: 100%; padding-right: 0; } .ptx-content .runestone.parsons_section > .parsons > div > *:not(.sortable-code-container) { max-width: calc(var(--content-width) - 2 * var(--content-margin)); margin-left: auto; margin-right: auto; } .ptx-content .runestone .parsons .sortable-code-container { display: flex; flex-flow: wrap; justify-content: center; gap: 15px; margin: 10px auto; } .ptx-content .ptx-runestone-container .parsons .sortable-code { margin: 0; } .ptx-content .runestone .parsons .runestone_caption_text { max-width: unset; } .ptx-content .runestone .parsons .lines code { white-space: nowrap; } .ptx-content .runestone .parsons .lines code .token { background: none; } .ptx-runestone-container .runestone.parsons_section { padding-top: 15px; } @media screen and (max-width: 1100px) { :root { --page-width: 100%; } } @media screen and (max-width: 1100px) { :root { --content-width-wide: 1000px; } } @media screen and (max-width: 1050px) { :root { --content-width-wide: 950px; } } @media screen and (max-width: 1000px) { :root { --content-width-wide: 900px; } } @media screen and (max-width: 950px) { :root { --content-width-wide: 850px; } } @media screen and (max-width: 900px) { :root { --content-width-wide: 800px; } } @media screen and (max-width: 943px) { .ptx-content .figure-like { overflow-x: inherit; } } @media screen and (max-width: 850px) { :root { --content-width: 100%; --content-width-wide: calc(100% + 2 * var(--content-margin)); --xl-margin: calc(-1 * var(--content-margin)); } .ptx-content article:is(.theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like) > .ptx-runestone-container > .runestone:is(.ac_section, .codelens, .parsons_section, .hparsons_section), .ptx-content article:is(.theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like) > .ptx-runestone-container > .runestone.datafile, .ptx-content article:is(.theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like) > .ptx-runestone-container > .runestone.contains-wide { width: calc(var(--content-width-wide) + 10px); } .ptx-content .runestone:is(.ac_section, .codelens, .parsons_section, .hparsons_section, .contains-wide) { border-left: 0; border-right: 0; border-top: 1px solid #aaa; border-bottom: 1px solid #aaa; border-radius: 0; } .ptx-content .code-inline { white-space: pre-wrap; } .ptx-runestone-container .cd_section, .ptx-content .ptx-runestone-container .parsons .sortable-code { overflow-x: auto; } .ptx-content .ptx-runestone-container .parsons .sortable-code:first-of-type { padding: 0 25px; } .searchresultsplaceholder { width: 80vw; left: 10vw; bottom: 10vh; } } @media screen and (max-width: 663px) { :root { --content-margin: 28px; } } .ptx-masthead .ptx-banner { border-bottom: 1px solid #d4d4d4; border-top: 1px solid transparent; overflow: hidden; padding-top: 0.625em; padding-bottom: 1.125em; border-bottom: none; } .ptx-masthead { max-width: 904px; border-right: 1px solid #bababa; } .ptx-masthead .title-container { font-size: 1em; padding-left: 9.68px; overflow: hidden; } @media screen and (max-width: 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; margin-top: 0.625em; } } .ptx-masthead .title-container > .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; margin: 0; font-size: 2em; line-height: 1.25em; color: #932919; } @media screen and (max-width: 480px) { .ptx-masthead .title-container > .heading { font-size: 1.5em; line-height: 1.25em; margin: 0; margin-bottom: 0.41667em; } } .ptx-masthead .title-container > .heading a { color: #932919; background: none; text-decoration: none; } .ptx-masthead .title-container > .heading .subtitle { font-weight: normal; } @media screen and (max-width: 800px) { .ptx-masthead .title-container > .heading .subtitle { display: block; font-size: 1.16667em; line-height: 1.42857em; color: #595959; } .ptx-masthead .title-container > .heading .subtitle:before { content: normal; } } .ptx-masthead .logo-link { position: relative; float: left; font-size: 50px; margin-top: 0.1em; margin-left: 9.68px; text-align: center; line-height: 1; } .ptx-masthead .logo-link img { width: auto; height: auto; max-height: 1em; } .ptx-masthead .logo-link:empty:before { font-family: "Open Sans"; font-size: 1em; content: "\2211"; line-height: 1; width: 1em; display: inline-block; vertical-align: top; text-align: center; color: #ccc; } .ptx-masthead .logo-link:empty:hover:before { color: #932919; } .ptx-masthead .logo-link:empty:active:before { color: #3572a0; } .ptx-masthead .logo-link { background: transparent; border: none; text-decoration: none; } @media screen and (max-width: 480px) { .ptx-masthead .logo-link { display: block; float: none; margin: 0; font-size: 50px; } } .ptx-masthead .byline { color: #333333; font-weight: normal; margin: 0; font-size: 1.3125em; line-height: 1.42857em; min-height: inherit; font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-masthead .byline { margin-top: 0; font-size: 1em; line-height: 1.25em; } } .ptx-masthead .byline a { color: #333333; } .ptx-masthead .byline a:hover, .ptx-masthead .byline a:focus { color: #932919; } .ptx-masthead .byline a:active { color: #3572a0; } :root { --banner-background-color: #ffffff; } .pretext .ptx-masthead { max-width: var(--page-width); background-color: var(--banner-background-color); margin: 0 auto; } .pretext .ptx-masthead .ptx-banner { margin: 0 auto; display: flex; align-items: center; justify-content: center; max-width: var(--page-width); padding: 8px 0; } nav.ptx-navbar { background: #ededed; border: 0; border-top: 1px solid #bababa; border-bottom: 1px solid #bababa; margin: 0; z-index: 100; font-family: "Open Sans"; overflow: visible; display: flex; } .ptx-navbar-contents { display: flex; flex: 1; max-width: 100%; } .ptx-navbar .button { font-size: 1em; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: #333333; background-color: #ededed; border: 0; border-right: 1px solid #bababa; user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .ptx-navbar .button:focus { outline: thin dotted #333; outline-offset: -2px; } .ptx-navbar .button:active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-navbar .button:hover { background-color: #fafafa; } .ptx-navbar .button:active { background-color: #e0e0e0; } .ptx-navbar .button.disabled { opacity: 0.4; color: #333333; background: #ededed; box-shadow: none; } .ptx-navbar .toc-toggle { width: 240px; gap: 0.4em; } .ptx-navbar .button .icon { font-size: 1.5em; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls) { display: flex; } .ptx-navbar .treebuttons { flex: 1 1 210px; justify-content: end; } .ptx-navbar .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .pretext .navbar .dropdown { height: 34px; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls) > *:first-child { border-left: 1px solid #bababa; } .ptx-navbar .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .ptx-navbar .treebuttons .icon { margin: 0 -7px; } .ptx-navbar :is(.index-button, .calculator-toggle) .icon { display: none; } .ptx-navbar :is(.runestone-profile, .activecode-toggle, .searchbutton) .name { display: none; } .ptx-navbar .index-button { width: 70px; } .ptx-navbar .calculator-toggle { width: 60px; min-height: 32px; text-align: center; border-radius: 20px; margin-left: 5px; border: 2px solid #66f; line-height: 25px; margin-top: 1px; background-color: #eef; } .ptx-navbar .calculator-toggle.open { background: #fee; border: 2px solid #f66; } @media screen and (max-width: 800px) { .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; background: #ededed; box-shadow: rgba(0, 0, 0, 0.3) 0px -2px 5px; } .ptx-navbar .nav-runestone-controls { flex: 0; } .ptx-navbar .toc-toggle { flex: 2 1 100px; } .ptx-navbar .treebuttons { flex: 3 1 150px; } .ptx-navbar .treebuttons > * { flex: 1 1; min-width: 35px; } .ptx-navbar .index-button { display: none; } .ptx-navbar :is(.treebuttons) > *:first-child { border-left: 0; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button) .name { display: none; } .pretext .ptx-navbar :is(.calculator-toggle, .index-button) .icon { display: inline-block; } .ptx-navbar .nav-runestone-controls > *:first-child { border-left: 0; } .ptx-navbar .calculator-toggle { width: auto; height: 35px; border-radius: 0; margin-left: 0; border: 0; border-right: 1px solid #bababa; line-height: inherit; margin-top: 0; background-color: inherit; } } :root { --nav-background-color: #ededed; } .pretext .ptx-navbar { max-width: 100%; margin: 0 auto; display: flex; width: var(--page-width); background: var(--nav-background-color); border-top: 0; box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); } .ptx-navbar-contents { display: flex; flex: 1; max-width: 100%; } .pretext .ptx-navbar .toc-toggle { border-left: 0; } .ptx-navbar .calculator-toggle { width: auto; height: 35px; text-align: center; border-radius: 0; margin-left: 0; border: 0; border-right: 1px solid #bababa; line-height: inherit; margin-top: 0; background-color: #ededed; padding: 0 15px; } .ptx-navbar > :last-child > :last-child { border-right: none; } .ptx-toc { width: 240px; margin: 0; font-size: 14.72px; overflow-y: auto; overflow-x: hidden; } .ptx-toc::after { content: url("data:image/svg+xml; utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='338 3000 8772 6866'%3E%3Cg style='stroke-width:.025in; stroke:black; fill:none'%3E%3Cpolyline points='472,3590 472,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,9448 A 4660 4660 0 0 1 8598 9259 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4488,9685 A 4228 4228 0 0 0 472 9732 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,3590 A 4241 4241 0 0 1 8598 3496 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,3496 A 4241 4241 0 0 1 4724 3590 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,9259 A 4507 4507 0 0 1 4724 9448 '%3E%3C/path%3E%3Cpolyline points='5385,4299 4062,8125 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8598,3496 8598,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='850,3496 850,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='4960,9685 4488,9685 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='3070,4582 1889,6141 3070,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='6418,4582 7600,6141 6418,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8976,3590 8976,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4960,9685 A 4228 4228 0 0 1 8976 9732 '%3E%3C/path%3E%3C/g%3E%3C/svg%3E"); display: block; height: 13em; padding: 2em 1em; background: #fff; } .ptx-toc > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 8px solid #999; } .ptx-toc { --codenumber-pad-left: 0.3rem; --codenumber-pad-right: 0.5rem; --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); } .ptx-toc:is(.depth1, .parts.depth2) { --codenumber-pad-right: 0.5rem; } .ptx-toc .toc-item-list { margin: 0px; padding: 0px; list-style-type: none; } .ptx-toc .toc-item { border-top: 1px solid var(--tocborder, #d1d1d1); } .ptx-toc .toc-title-box { display: flex; } .ptx-toc .toc-title-box > .internal { position: relative; display: flex; flex-grow: 1; padding: 0.2em; font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: bold; } .ptx-toc .toc-item-list .toc-item-list .toc-title-box > .internal { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: normal; } .ptx-toc > .toc-item-list > .toc-item { border-top: 2px solid var(--tocborder, #d1d1d1); } .ptx-toc .toc-item.active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-toc .codenumber { min-width: var(--toc-indent-first); padding-left: var(--codenumber-pad-left); padding-right: var(--codenumber-pad-right); display: inline-block; text-align: left; flex-grow: 0; } .book .ptx-toc .toc-chapter .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .codenumber { font-size: 80%; padding-top: 0.16em; min-width: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber { min-width: var(--toc-indent-third); visibility: hidden; } .ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber { visibility: visible; } .ptx-toc .toc-title-box .title { flex-grow: 1; } .ptx-toc .toc-item .toc-title-box .title { margin-left: var(--toc-indent-first); } .book .ptx-toc .toc-chapter .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .title { margin-left: var(--toc-indent-second); } .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { margin-left: var(--toc-indent-third); } .ptx-toc .toc-item > .toc-title-box .codenumber + .title { margin-left: 0 !important; } .ptx-toc ul.structural ul.structural .title:empty::after { content: "empty heading!"; font-weight: bold; } .ptx-toc .toc-chapter .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { font-size: 90%; } .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title { font-style: italic; } .ptx-toc ul.structural li a.has-chevron { padding-right: 2em; } .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth1 ul.structural .toc-item.contains-active { background-color: var(--chaptertocactive); color: var(--chaptertoctextactive); } .ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active { background-color: var(--parttocactive); color: var(--parttoctextactive); } .ptx-toc.focused ul.structural:not(.contains-active) > li { display: none; } .ptx-toc.focused ul.structural li.active > ul > li { display: block; } .ptx-toc.focused ul.structural:not(.contains-active) > li.visible { display: block; } .ptx-toc.focused ul.structural li.active > ul > li.hidden { display: none; } .ptx-toc.focused > ul.structural > li:not(:first-child) { margin-top: 0em; } .ptx-toc.focused ul.structural li ul.structural a:hover { border: 0; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 30px; line-height: 18px; font-variation-settings: "wght" 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--highlighttoc); color: var(--highlighttoctext); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--highlighttoctext); } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); } :root { --parttoc: var(--chaptertoc); --parttoctext: var(--chaptertoctext); --parttocactive: var(--documenttitle); --parttoctextactive: var(--chaptertoctextactive); } @supports (background: color-mix(in srgb, red 50%, blue)) { :root { --parttoc: color-mix(in srgb, var(--chaptertoc), black 15%); } } .pretext .ptx-sidebar { display: none; width: 200px; position: sticky; top: 36px; z-index: 10; height: 0; } .pretext .ptx-sidebar.visible { position: sticky; top: 36px; z-index: 10; height: 0; } .pretext .ptx-sidebar .ptx-toc { width: 360px; background-color: var(--page-color); border: 1px solid var(--tocborder); } .pretext .ptx-page .ptx-main { margin-left: inherit; } .ptx-toc::after { height: auto; max-width: 100px; margin: 0 auto; } .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowlLinkColor); border-bottom: 1px dotted var(--knowlLinkColor); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--linkbackground); border-bottom-color: transparent; } .knowl__content { margin: 0.2em; border: 6px solid var(--knowlborder); border-radius: 0.4em; padding: 0.8em; background-color: var(--knowlbackground); } .source-view__content { margin: 0.2em 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like, .proof)::after { content: "" !important; border-bottom: none; margin: 0; padding: 0; width: 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like) { padding-left: 0; border-left: none; } .ptx-content .knowl__content > article:is(.proof) { padding-right: 0; border-right: none; } .knowl__content .knowl__content { background-color: var(--knowlNested1Background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested2Background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested3Background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested4Background); } .ptx-content .knowl__content > figure { margin-left: 0; margin-right: 0; } .ptx-content .proof { border-right: 1px solid #666; padding-right: 0.625em; margin-right: -0.725em; } .ptx-content .proof:after { content: ""; border-bottom: 1px solid #666; display: block; margin-left: auto; margin-right: -0.625em; width: 1.5em; padding-bottom: 0.25em; } .ptx-content.epub .proof { margin-right: 1px; } .ptx-content .proof .proof { margin-right: -0.2em; border-right: 1.5px solid #ddd; } .ptx-content .proof .proof:after { border-bottom: 1.5px solid #ddd; width: 1em; } .ptx-content article.theorem-like, .ptx-content article.definition-like, .ptx-content article.example-like, .ptx-content article.project-like, .ptx-content article.remark-like, .ptx-content article.openproblem-like, .ptx-content article.openproblems-like, .ptx-content article.computation-like { padding-left: 0.4em; border-left: 1px solid #569; } .ptx-content.epub article.theorem-like, .ptx-content.epub article.definition-like, .ptx-content.epub article.example-like, .ptx-content.epub article.project-like, .ptx-content.epub article.remark-like, .ptx-content article.openproblem-like, .ptx-content article.openproblems-like, .ptx-content.epub article.computation-like { margin-left: 1px; } .ptx-content article.theorem-like::after, .ptx-content article.definition-like::after, .ptx-content article.example-like::after, .ptx-content article.project-like::after, .ptx-content article.remark-like::after, .ptx-content article.openproblem-like::after, .ptx-content article.openproblems-like::after, .ptx-content article.computation-like::after { content: ""; border-bottom: 1px solid #569; display: block; margin-right: auto; margin-left: -0.5em; padding-top: 0.25em; width: 1.5em; } .ptx-content article.project-like { border-left: 1px dotted #569; } .ptx-content article.project-like::after { border-bottom: 1px dotted #569; } .ptx-content article.commentary { padding-left: 0.6em; border-left: 3px solid #c33; } .ptx-content article.commentary::after { content: ""; border-bottom: 3px solid #c33; display: block; margin-right: auto; margin-left: -0.6em; padding-top: 0.25em; width: 1.5em; } .ptx-content .assemblage-like { border: solid 2px #1100AA; border-radius: 12px; padding: 10px; background-color: #f4f4fe; } .ptx-content .assemblage-like .heading { margin-top: 0; } .ptx-content .assemblage-like + .sidebyside { margin-top: 1.25em; } .ptx-content section article.assemblage-like .heading + .para { display: block; } .ptx-content .goal-like { border: solid 3px #999999; padding: 0.7em; margin-bottom: 1em; } .ptx-content .goal-like > .heading { margin-top: -1.5em; background-color: white; display: table; padding: 5px 1em; margin-left: 5px; font-style: italic; font-size: 120%; } .ptx-content .goal-like > .heading .codenumber { display: none; } .ptx-content .goal-like > .heading::after { display: none; } .ptx-content .aside-like { position: absolute; margin-left: 45%; overflow-x: hidden; max-width: 495px; max-height: 7em; overflow-y: hidden; border: none; padding: 4px 10px 0 10px; color: #888; z-index: 100; } .ptx-content .example-like .aside-like { margin-top: 0; position: absolute; } .ptx-content .aside-like { font-size: 90%; } .ptx-content .aside-like { margin-bottom: 5px; background-color: #f5faff; box-shadow: 0 0 1em 0.2em #fff inset; } .ptx-content .aside-like .para { overflow-x: auto; } .ptx-content .aside-like:first-child { margin-top: -2.25em; } .ptx-content .aside-like:after { content: ""; position: absolute; z-index: 1; top: 0em; bottom: 0; left: 0; pointer-events: none; background-image: linear-gradient( to bottom, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 1) 90%); width: 550px; height: 8em; } .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { position: relative; z-index: 0; padding: 8px 15px 10px 15px; padding: 2px 10px; margin: 5px 0px 5px 10px; border: 2px solid #dcebfa; max-height: none; max-width: 550px; color: inherit; font-size: 100%; box-shadow: none; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .example-like .aside-like.front { margin-top: 1.25em; } .ptx-content .aside-like.front + p { margin-top: 1.25em !important; padding-top: 0; } .ptx-content .aside-like .aside-like { background-color: #fafff5; border: 1px dotted #aaa; } .ptx-content article.aside-like > p:first-child { margin-top: 0; } .ptx-content .aside-like > .heading { font-size: 95%; } .ptx-content .aside-like + * { margin-top: 3em; margin-right: 3em; } @media screen and (min-width: 943px) { .ptx-content .aside-like + * { margin-right: 0; } } @media screen and (min-width: 1100px) { .ptx-content .aside-like, .ptx-content .aside-like.front, .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { position: absolute; margin-top: -2em; margin-left: 660px; max-width: 200px; width: 200px; color: inherit; } .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { max-height: none; max-width: 223px; border: 2px solid #dcebfa; } .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { margin-left: 654px; } .ptx-content .aside-like + * { margin-top: 1.25em; margin-right: 0; } .ptx-content .aside-like + .solutions, .ptx-content .aside-like + .instructions { margin-top: 0; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .aside-like:nth-of-type(3n+1) { margin-left: 660px; } .ptx-content .aside-like:nth-of-type(3n) { margin-left: 680px; } .ptx-content .aside-like:nth-of-type(3n+2) { margin-left: 640px; } } .ptx-content .aside-like:hover:after, .ptx-content .aside-like:focus:after { top: 3em; height: auto; background-image: none; } .ptx-content .aside-like:hover, .ptx-content .aside-like:focus { color: inherit; padding: 2px 8px 0 8px; border: 2px solid #dcebfa; height: auto; max-height: none; } .ptx-content .aside-like.front:hover, .ptx-content .aside-like.front:focus { padding: 4px 10px; } .ptx-content section dl dd .aside-like { margin-top: 0 !important; margin-left: 100px !important; } .ptx-content section dl dd .aside-like.front { margin-left: -300px !important; } @media screen and (max-width: 1099px) { .ptx-content .aside-like { position: relative; float: right; z-index: 0; overflow-x: hidden; margin-left: 1em; margin-top: 1em; max-width: 195px; max-height: 4em; margin-right: -8em; } .ptx-content li > .aside-like:last-child { position: absolute; } } .searchbox .searchresultsplaceholder { background: #eaf0f6; } .ptx-content article:is(.theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like) { padding-left: 10px; } .ptx-content article:is(.theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like) > .ptx-runestone-container > .runestone:is(.ac_section, .codelens, .parsons_section, .hparsons_section), .ptx-content article:is(.theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like) > .ptx-runestone-container > .runestone.datafile, .ptx-content article:is(.theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like) .contains-wide { margin-left: calc(var(--xl-margin) - 10px); } .ptx-content .datafile pre { border: 1px solid #616160; border-radius: 3px; padding: 10px; } .ptx-content .runestone.datafile { margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; align-items: center; gap: 10px; } .ptx-content .datafile_caption { background: transparent; border: 0; margin: 0; padding: 0; } .ac_actions { font-size: 1rem; margin-bottom: 5px; } .ptx-content .ptx-runestone-container .ac_output { margin-bottom: 10px; } .ptx-content .ptx-runestone-container .codelens { margin-bottom: 10px; } .ptx-content .ptx-runestone-container .ac_output pre { width: 100%; max-width: var(--content-width); margin: 10px auto; } .ptx-runestone-container .ac-canvas { margin-left: calc(50% - 202px); } .ptx-runestone-container .ac-canvas:empty { display: none; } .runestone_caption { font-size: 1rem; } .ptx-runestone-container .unittest-results table { background: white; } .ptx-content .ptx-runestone-container div.ExecutionVisualizer table.visualizer { width: 100%; } .ptx-content table tr td { font-size: 1rem; } .pretext .ptx-content-footer { align-items: stretch; } .ptx-content article:is(.theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like)::after { margin-left: -10px; } .video-box { margin: 0.75em auto !important; } .ac_code_div { margin-top: 10px; } .pretext .ptx-runestone-container .ac_actions { max-width: var(--content-width); margin: 0 auto; flex-wrap: nowrap; align-items: center; gap: 10px; padding-left: 10px; padding-right: 10px; } .pretext .ptx-runestone-container .ac_actions > * { flex: 0 1; margin: 0 !important; } .pretext .ptx-runestone-container .ac_actions > div:first-of-type { display: flex !important; flex-direction: column; align-items: stretch; text-align: center; flex-grow: 1; } .ptx-runestone-container .unittest-results { display: flex; flex-direction: column; align-items: center; } .ptx-content pre.program.line-numbers, .ptx-content pre.code-block.line-numbers { overflow-x: auto; } .hparsons_section { max-width: unset !important; } .hparsons_section > :not(.hparsons_section, .hp_question) { max-width: unset !important; } .ptx-runestone-container .hparsons_section .hp_question { max-width: var(--content-width); } .codepart_section > div > div { font-size: 1rem; clear: both; } .codepart_section > div > div:first-of-type { font-size: var(--content-font-size); } @media screen and (max-width: 600px) { .pretext .ptx-runestone-container .ac_actions > * { white-space: break-spaces; flex-grow: 1; } } :root[data-legacy-colorscheme=blue_green] { --documenttitle: #2a5ea4; --bodytitle: #2b5f82; --bodysubtitle: #a62e1c; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #28803f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } :root[data-legacy-colorscheme=blue_grey] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #525252; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=blue_red] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #932c1c; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=blue_red_dark] { --bodyfontcolor: #eee; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abf; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #316; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #932c1c; --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: #666; --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); body.pretext { background: #222; } .pretext .ptx-page > .ptx-main { background: #444; color: var(--bodyfontcolor); } .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .ptx-navbar { background: #333; } .ptx-navbar .button { background-color: #635; color: #fff; } .ptx-navbar .button:hover { background-color: #fafafa; color: #000; } .ptx-navbar .calculator-toggle { background-color: #336; } .ptx-navbar .calculator-toggle:hover { background-color: #fce; } .pretext .ptx-masthead { background: #555; } .pretext .ptx-masthead .title-container > .pretext .heading, .pretext .ptx-masthead .title-container > .heading a, .pretext .ptx-masthead .logo-link:empty:hover::before, .pretext .ptx-masthead .byline, .pretext .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext .ptx-content .code-inline { color: var(--documenttitledark); } .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext .ptx-content [data-knowl], .pretext .ptx-content [data-knowl]:hover, .pretext .ptx-content [data-knowl]:active, .pretext .ptx-content [data-knowl].active { color: var(--documenttitlelight); } .pretext .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } } :root[data-legacy-colorscheme=bluegreen_grey] { --bluegreen: hsl(192, 98%, 23%); --documenttitle: var(--bluegreen); --bodytitle: var(--bluegreen); --bodysubtitle: var(--bluegreen); --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #ddd; --chaptertoctext: var(--bluegreen); --chaptertocactive: hsl(192, 98%, 19%); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: var(--bluegreen); --sectiontocactive: hsl(192, 98%, 19%); --sectiontoctextactive: white; --tocborder: var(--bluegreen); --highlighttoc: var(--bluegreen); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } :root[data-legacy-colorscheme=brown_gold] { --documenttitle: #472200; --bodytitle: #8e4a0c; --bodysubtitle: #864E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #eaaf0f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #140a00 --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=darkmartiansands] { --documenttitle: #880000; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #b58039; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #550000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=default] { --documenttitle: #932919; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --parttoc: #234b6a; --parttoctext: white; --parttocactive: var(--documenttitle); --parttoctextactive: white; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblagebackground: #F0EAF6; --assemblageborder: #CAAEE0; --assemblagedarkborder: #472664; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=focused_gray_aqua] { --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #1d686e; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #343b48; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --toc-text-dark: #343b48; --toc-text-light: white; --tocborder: var(--toc-text-dark); --active-toc-item: #e5ca34; --parttoc: var(--toc-text-dark); --parttoctext: var(--toc-text-light); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #1d686e; --chaptertoctext: var(--toc-text-light); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fffffd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: var(--active-toc-item); --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } :root[data-legacy-colorscheme=focused_light] { --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --toc-text-dark: #333; --tocborder: var(--toc-text-dark); --active-toc-item: #dbebf1; --parttoc: #e8e8e8; --parttoctext: var(--toc-text-dark); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #f2f2f2; --chaptertoctext: var(--toc-text-dark); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fdfdfd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: #c2e5f2; --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } :root[data-legacy-colorscheme=green_blue] { --documenttitle: #248038; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #2650a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #195827; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=green_plum] { --documenttitle: #28803f; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #822060; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20602f; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=maroon_grey] { --documenttitle: #660000; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6d8899; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #330000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=martiansands] { --documenttitle: #944921; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #d19e69; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #6a3418; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=orange_navy] { --documenttitle: #d64000; --bodytitle: #00408a; --bodysubtitle: #9e2f00; --bodytitlehighlight: #ffcdbd; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #00326b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #00326b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #006deb; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=pastel_blue_orange] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffffff; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } :root[data-legacy-colorscheme=red_blue] { --documenttitle: #932919; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_amethyst] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6f080b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #008099; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_emerald] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d9ffe9; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #16a67d; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } :root[data-legacy-colorscheme=ruby_turquoise] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #008099; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } body.pretext { color: var(--bodyfontcolor); } .ptx-masthead .title-container > .heading, .ptx-masthead .title-container > .heading a, .ptx-masthead .logo-link:empty:hover::before, .ptx-masthead .byline a { color: var(--documenttitle, #2a5ea4); } .ptx-masthead .title-container > .heading a:active, .ptx-masthead .logo-link:empty:active::before, .ptx-masthead .byline a:active { color: var(--bodytitle, #932c1c); } .ptx-toc .toc-item { color: var(--sectiontoctext, #404040); background-color: var(--sectiontoc); border-color: var(--tocborder, #afc2e5); } .ptx-toc .toc-item.active { color: var(--sectiontoctextactive); background-color: var(--sectiontocactive); border-color: var(--highlighttocborder); } .ptx-toc:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc > .toc-item-list > .toc-item { color: var(--chaptertoctext); background-color: var(--chaptertoc); } .ptx-toc > .toc-item-list > .toc-item.active { color: var(--chaptertoctextactive); background-color: var(--chaptertocactive); border-color: var(--highlighttocborder); } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--highlighttoctext, #321a0c); background-color: var(--highlighttoc); border-color: var(--highlighttocborder, #ec704b); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter) { background-color: var(--parttoc); color: var(--parttoctext); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter).active { background-color: var(--parttocactive); color: var(--parttoctextactive); } .ptx-toc.focused .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused .toc-chapter.active { background-color: var(--chaptertocactive); color: var(--chaptertoctextactive); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item { background-color: var(--sectiontoc); color: var(--sectiontoctext); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item.active { background-color: var(--sectiontocactive); color: var(--sectiontoctextactive); } .ptx-content .summary-links a { color: var(--sectiontoctext); } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: var(--highlighttoctext); background: var(--highlighttoc); } .ptx-content .para > a.internal { color: var(--bodysubtitle); } .ptx-content .para > a.external { color: var(--bodysubtitle); } .ptx-content .para > a.internal:hover, .ptx-content .para > a.internal:hover *, .ptx-content .para > a.internal:focus, .ptx-content .para > a.internal:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .para > a.external:hover, .ptx-content .para > a.external:hover *, .ptx-content .para > a.external:focus, .ptx-content .para > a.external:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .playvideo { background-color: var(--videoplay); } .ptx-content .goal-like { border-color: var(--goalborder); } .ptx-content .assemblage-like { border-color: var(--assemblageborder); background-color: var(--assemblagebackground); } .ptx-content .knowl-output { border-color: var(--knowlborder); background-color: var(--knowlbackground); } .pretext[data-atmosphere=pastel], .pretext[data-atmosphere=pastel] .ptx-main { background: #dbf5ff; background: #efe; } .pretext[data-atmosphere=pastel] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoc: #dcdcf9; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffeeee; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoc: #fadfa3; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } .pretext[data-atmosphere=pastel] .ptx-toc { scrollbar-color: var(--documenttitlelight) #efe; } .pretext[data-atmosphere=pastel] .ptx-navbar { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere=pastel] .ptx-masthead { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere=pastel] .ptx-sidebar { background: #ffd; } .pretext[data-atmosphere=darktwilight] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abd; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(9, 72%, 30%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 40%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 33%); --navbarbackground: hsl(0, 0%, 33%); --footerbackground: hsl(0, 0%, 30%); --mainbackground: hsl(0, 0%, 27%); --buttonbackground: hsl(225, 80%, 25%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 23%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 20%); } .pretext[data-atmosphere=dark] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(5, 86%, 24%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 27%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 20%); --navbarbackground: hsl(0, 0%, 20%); --footerbackground: hsl(0, 0%, 22%); --mainbackground: hsl(0, 0%, 17%); --buttonbackground: hsl(232, 90%, 19%); --codebackground: hsl(120, 100%, 15%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 19%); } .pretext[data-atmosphere=darkmidnight] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad9; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; --chaptertoc: hsl(0, 100%, 17%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 13%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 16%); --navbarbackground: hsl(0, 0%, 16%); --footerbackground: hsl(0, 0%, 13%); --mainbackground: hsl(0, 0%, 7%); --buttonbackground: hsl(240, 100%, 13%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 17%); } .pretext[data-atmosphere*=dark] { background: var(--mainbackground); } .pretext[data-atmosphere*=dark] .ptx-page > .ptx-main { background: var(--mainbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .pretext[data-atmosphere*=dark] .ptx-navbar { background: var(--navbarbackground); } .pretext[data-atmosphere*=dark] .ptx-page-footer .feedback-link, .pretext[data-atmosphere*=dark] .ptx-content-footer .button, .pretext[data-atmosphere*=dark] .ptx-navbar .button { background-color: var(--buttonbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-page-footer .feedback-link:hover, .pretext[data-atmosphere*=dark] .ptx-content-footer .button:hover, .pretext[data-atmosphere*=dark] .ptx-navbar .button:hover, .pretext[data-atmosphere*=dark] .ptx-content-footer .button:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-navbar .calculator-toggle { background-color: var(--buttonbackground); } .pretext[data-atmosphere*=dark] .ptx-navbar .calculator-toggle:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-masthead { background: var(--bannerbackground); } .pretext[data-atmosphere*=dark] .ptx-page-footer { background: var(--footerbackground); border-top-color: #447; border-bottom-color: #447; } .pretext[data-atmosphere*=dark] .ptx-page-footer .logo { background: #779; border-radius: 0.4em; } .pretext[data-atmosphere*=dark] .ptx-masthead .title-container > .pretext .heading, .pretext[data-atmosphere*=dark] .ptx-masthead .title-container > .heading a, .pretext[data-atmosphere*=dark] .ptx-masthead .logo-link:empty:hover::before, .pretext[data-atmosphere*=dark] .ptx-masthead .byline, .pretext[data-atmosphere*=dark] .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext[data-atmosphere*=dark] .ptx-toc { scrollbar-color: var(--documenttitlelight) var(--footerbackground); } .pretext[data-atmosphere*=dark] .ptx-content .code-inline { background: var(--codebackground); } .pretext[data-atmosphere*=dark] .ptx-content .kbdkey { background: var(--keybackground); } .pretext[data-atmosphere*=dark] .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext[data-atmosphere*=dark] .ptx-content a.url, .pretext[data-atmosphere*=dark] .ptx-content a.internal, .pretext[data-atmosphere*=dark] .ptx-content a.external { background-color: var(--linkbackground); color: var(--bodyfontcolor, #ddc); } .pretext[data-atmosphere*=dark] .ptx-content [data-knowl] { background-color: var(--linkbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*=dark] .ptx-content [data-knowl]:hover, .pretext[data-atmosphere*=dark] .ptx-content [data-knowl]:active, .pretext[data-atmosphere*=dark] .ptx-content [data-knowl].active { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*=dark] .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } :root { --knowlLinkColor: var(--documenttitle); --linkColor: var(--bodysubtitle); --linkBackground: var(--bodysubtitlehighlight); --knowlNested1Background: #f5f5ff; --knowlNested2Background: #fffff5; --knowlNested3Background: #f5ffff; --knowlNested4Background: #fff5f5; } /*! Theme: wide-legacy */ /*# sourceMappingURL=theme-wide-legacy.css.map */ ================================================ FILE: css/fonts/_fonts-google.scss ================================================ @use "sass:map"; @use "sass:string"; @use "sass:list"; // Fonts to use $body: 'Open Sans, Helvetica Neue, Helvetica, Arial, sans-serif' !default; $heading: 'PT Serif, Times New Roman, Times, serif' !default; $monospace: 'Inconsolata, Consolas, Monaco, monospace;' !default; $print: 'PT Serif, Times New Roman, Times, serif' !default; @function is-variable-font($font-name) { $static-fonts: ('PT Serif'); // list of known static fonts used by themes @if list.index($font-name, $static-fonts) { @return false; } @return true; } @function generate-import($font-name) { @if is-variable-font($font-name) { @return 'https://fonts.googleapis.com/css2?family=' + $font-name + ':ital,wght@0,400..700;1,400..700&display=swap'; } @else { @return 'https://fonts.googleapis.com/css2?family=' + $font-name + ':ital,wght@0,400;0,700;1,400;1,700&display=swap'; } } // For now, only try to fetch the first name in the list and assume // the rest are system defined fallbacks. // lists are 1-indexed $body-font: list.nth(string.split($body, ','), 1); // @debug "----------------" $body-font; @import url( generate-import($body-font) ); $heading-font: list.nth(string.split($heading, ','), 1); // generate-import($heading-font); @import url( generate-import($heading-font) ); $monospace-font: list.nth(string.split($monospace, ','), 1); // generate-import($monospace-font); @import url( generate-import($monospace-font) ); :root { --font-body: #{$body}; } :root { --font-headings: #{$heading}; } :root { --font-monospace: #{$monospace}; } :root { --font-print: #{$print}; } // 9/5/24 ... TODO controlled list of fonts ... wait and explore later // // Available fonts // $serif-options: ('Alegreya', 'Merriweather', 'Noto Serif', 'PT Serif', 'Source Serif 4'); // $sans-options: ('Alegreya Sans', 'Barlow', 'Lato', 'Open Sans', 'Roboto', 'Source Sans 3'); // $code-options: ('Inconsolata'); // // Backup lists // $sans-backups: ', Helvetica Neue, Helvetica, Arial, sans-serif'; // $serif-backups: ', Times New Roman, Times, serif'; // // --------------------------------------------------------- // @function add-fonts($list, $backups, $fonts: ()) { // @each $font in $list { // $fonts: map.set($fonts, $font, ( // url: '"https://fonts.googleapis.com/css2?family=#{$font}:wdth,wght@75..100,300..800&display=swap"', // fontlist: $font + $backups, // )); // } // @return $fonts; // } // $fonts: add-fonts($sans-options, $sans-backups); // $fonts: add-fonts($serif-options, $sans-backups, $fonts); // $bodyfont: map.get($fonts, $body); // @if not $bodyfont { // @error "Unknown body font: #{$body}"; // } @else { // @import url(#{map.get($bodyfont, "url")}); // :root { // --font-body: #{map.get($bodyfont, "fontlist")}; // } // } // $headingfont: map.get($fonts, $heading); // @if not $headingfont { // @error "Unknown heading font: #{$heading}"; // } @else { // @import url(#{map.get($headingfont, "url")}); // :root { // --font-headings: #{map.get($headingfont, "fontlist")}; // } // } ================================================ FILE: css/legacy/colors/all_colors.scss ================================================ // Entrypoint to get all legacy color schemes @use 'colors_blue_green.css'; @use 'colors_blue_grey.css'; @use 'colors_blue_red.css'; @use 'colors_blue_red_dark.css'; @use 'colors_bluegreen_grey.css'; @use 'colors_brown_gold.css'; @use 'colors_darkmartiansands.css'; @use 'colors_default.css'; @use 'colors_focused_gray_aqua.css'; @use 'colors_focused_light.css'; @use 'colors_green_blue.css'; @use 'colors_green_plum.css'; @use 'colors_maroon_grey.css'; @use 'colors_martiansands.css'; @use 'colors_orange_navy.css'; @use 'colors_pastel_blue_orange.css'; @use 'colors_red_blue.css'; @use 'colors_ruby_amethyst.css'; @use 'colors_ruby_emerald.css'; @use 'colors_ruby_turquoise.css'; @use 'setcolors.css'; ================================================ FILE: css/legacy/colors/colors_blue_green.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ :root[data-legacy-colorscheme="blue_green"] { --documenttitle: #2a5ea4; --bodytitle: #2b5f82; --bodysubtitle: #a62e1c; --bodytitlehighlight: #e0e9ff; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #28803f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); /* Colors for block envirornments: */ /* We specify 6 color families (hues), each with 5 hue/lightness options, to be used by style files if they wish. The hues should roughly corrspond to red, orange, yellow, green, blue, violet, but should be consistent with the colors specified for titles and toc defined above. Each color has *light, *dark variants (adjusting the lightness of hsl) and *rich, *dull variants (adjusting the saturation). *light and *dull should work for a main background. The standard and *riche should work for borders. For a bold title background, the *dark could be used. The *dark should always contrast correctly with white text (we could later specify a *dark-text to be the correct contrast with *dark). All other variants should contrast correctly with black text. */ --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } ================================================ FILE: css/legacy/colors/colors_blue_grey.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ /* Colors formerly in mathbook-4.css */ :root[data-legacy-colorscheme="blue_grey"] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #525252; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_blue_red.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ :root[data-legacy-colorscheme="blue_red"] { --documenttitle: #2a5ea4; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #932c1c; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20477b; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_blue_red_dark.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ :root[data-legacy-colorscheme="blue_red_dark"] { --bodyfontcolor: #eee; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abf; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #316; /* DARKER, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #932c1c; --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: #666; --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); body.pretext { background: #222; } .pretext .ptx-page > .ptx-main { background: #444; color: var(--bodyfontcolor); } .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .ptx-navbar { background: #333; } .ptx-navbar .button{ background-color: #635; color: #fff; } .ptx-navbar .button:hover { background-color: #fafafa; color: #000; } .ptx-navbar .calculator-toggle { background-color: #336; } .ptx-navbar .calculator-toggle:hover { background-color: #fce; } .pretext .ptx-masthead { background: #555; } .pretext .ptx-masthead .title-container > .pretext .heading, .pretext .ptx-masthead .title-container > .heading a, .pretext .ptx-masthead .logo-link:empty:hover::before, .pretext .ptx-masthead .byline, .pretext .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext .ptx-content .code-inline { color: var(--documenttitledark); } .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext .ptx-content [data-knowl], .pretext .ptx-content [data-knowl]:hover, .pretext .ptx-content [data-knowl]:active, .pretext .ptx-content [data-knowl].active { color: var(--documenttitlelight); } .pretext .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } } ================================================ FILE: css/legacy/colors/colors_bluegreen_grey.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ :root[data-legacy-colorscheme="bluegreen_grey"] { --bluegreen: hsl(192, 98%, 23%); --documenttitle: var(--bluegreen); --bodytitle: var(--bluegreen); --bodysubtitle: var(--bluegreen); --bodytitlehighlight: #e0e9ff; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #ddd; /* #28803f; */ --chaptertoctext: var(--bluegreen); /* white; */ --chaptertocactive: hsl(192, 98%, 19%); --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: var(--bluegreen); /* #20477b; */ --sectiontocactive: hsl(192, 98%, 19%); --sectiontoctextactive: white; --tocborder: var(--bluegreen); /* #152f53; */ --highlighttoc: var(--bluegreen); /* #20477b; */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); /* Colors for block envirornments: */ /* We specify 6 color families (hues), each with 5 hue/lightness options, to be used by style files if they wish. The hues should roughly corrspond to red, orange, yellow, green, blue, violet, but should be consistent with the colors specified for titles and toc defined above. Each color has *light, *dark variants (adjusting the lightness of hsl) and *rich, *dull variants (adjusting the saturation). *light and *dull should work for a main background. The standard and *riche should work for borders. For a bold title background, the *dark could be used. The *dark should always contrast correctly with white text (we could later specify a *dark-text to be the correct contrast with *dark). All other variants should contrast correctly with black text. */ --red: hsl(345, 60%, 60%); --redlight: hsl(345, 60%, 80%); --reddark: hsl(345, 60%, 15%); --redrich: hsl(345, 100%, 60%); --reddull: hsl(345, 20%, 60%); --orange: hsl(30, 70%, 60%); --orangelight: hsl(30, 60%, 80%); --orangedark: hsl(30, 60%, 15%); --orangerich: hsl(30, 100%, 60%); --orangedull: hsl(30, 30%, 60%); --yellow: hsl(58, 60%, 60%); --yellowlight: hsl(58, 60%, 80%); --yellowdark: hsl(58, 60%, 15%); --yellowrich: hsl(58, 100%, 60%); --yellowdull: hsl(58, 30%, 60%); --green: hsl(136, 52%, 33%); --greenlight: hsl(136, 52%, 80%); --greendark: hsl(136, 52%, 15%); --greenrich: hsl(136, 100%, 60%); --greendull: hsl(136, 20%, 60%); --blue: hsl(214, 59%, 60%); --bluelight: hsl(214, 59%, 80%); --bluedark: hsl(214, 59%, 15%); --bluerich: hsl(214, 100%, 50%); --bluedull: hsl(214, 20%, 50%); --violet: hsl(259, 60%, 60%); --violetlight: hsl(259, 60%, 80%); --violetdark: hsl(259, 60%, 15%); --violetrich: hsl(259, 100%, 60%); --violetdull: hsl(259, 20%, 60%); } ================================================ FILE: css/legacy/colors/colors_brown_gold.css ================================================ /* Colors for Manitoba */ :root[data-legacy-colorscheme="brown_gold"] { --documenttitle: #472200; --bodytitle: #8e4a0c; --bodysubtitle: #864E1C; --bodytitlehighlight: #eeeff3; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #eaaf0f; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #140a00 /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_darkmartiansands.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ /* Martian sands color scheme by Alex Jordan */ :root[data-legacy-colorscheme="darkmartiansands"] { --documenttitle: #880000; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #b58039; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #550000; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_default.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 4) A dark color for each chapter background 5) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 4') A light color for each chapter background 5') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 4) and 5) you need white letters to go on the dark background, and with 4') and 5') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ :root[data-legacy-colorscheme="default"] { --documenttitle: #932919; --bodytitle: #A62E1C; /* often a darker version of documenttitle */ --bodysubtitle: #2B5F82; /* can be the same as bodytitle */ --bodytitlehighlight: #e0e9ff; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ /* Part colors are not used in non-focused TOC */ --parttoc: #234b6a; --parttoctext: white; --parttocactive: var(--documenttitle); --parttoctextactive: white; --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblagebackground: #F0EAF6; --assemblageborder: #CAAEE0; --assemblagedarkborder: #472664; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_focused_gray_aqua.css ================================================ /* Sample bolder focused TOC color scheme See colors_default for general color tips */ :root[data-legacy-colorscheme="focused_gray_aqua"] { /* -------- general -------- */ --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #1d686e; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #343b48; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); /* -------- TOC -------- */ --toc-text-dark: #343b48; --toc-text-light: white; --tocborder: var(--toc-text-dark); --active-toc-item: #e5ca34; --parttoc: var(--toc-text-dark); --parttoctext: var(--toc-text-light); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #1d686e; --chaptertoctext: var(--toc-text-light); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fffffd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: var(--active-toc-item); --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } ================================================ FILE: css/legacy/colors/colors_focused_light.css ================================================ /* Sample light, non-distracting focused TOC color scheme See colors_default for general color tips */ :root[data-legacy-colorscheme="focused_light"] { /* -------- general -------- */ --documenttitle: #343b48; --bodytitle: #2B5F82; --bodysubtitle: #A62E1C; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #fce5e4; --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); /* -------- TOC -------- */ --toc-text-dark: #333; --tocborder: var(--toc-text-dark); --active-toc-item: #dbebf1; --parttoc: #e8e8e8; --parttoctext: var(--toc-text-dark); --parttocactive: var(--active-toc-item); --parttoctextactive: var(--toc-text-dark); --chaptertoc: #f2f2f2; --chaptertoctext: var(--toc-text-dark); --chaptertocactive: var(--active-toc-item); --chaptertoctextactive: var(--toc-text-dark); --sectiontoc: #fdfdfd; --sectiontoctext: var(--toc-text-dark); --sectiontocactive: var(--active-toc-item); --sectiontoctextactive: var(--toc-text-dark); --highlighttoc: #c2e5f2; --highlighttoctext: var(--toc-text-dark); --highlighttocborder: var(--chaptertoc); } ================================================ FILE: css/legacy/colors/colors_green_blue.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ :root[data-legacy-colorscheme="green_blue"] { --documenttitle: #248038; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #2650a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #195827; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_green_plum.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ :root[data-legacy-colorscheme="green_plum"] { --documenttitle: #28803f; --bodytitle: #20602f; --bodysubtitle: #822060; --bodytitlehighlight: #e0e9ff; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #822060; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #20602f; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #20602f; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_maroon_grey.css ================================================ /* Colors for UPS */ :root[data-legacy-colorscheme="maroon_grey"] { --documenttitle: #660000; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #eeeff3; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #6d8899; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #330000; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_martiansands.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ /* Martian sands color scheme by Alex Jordan */ :root[data-legacy-colorscheme="martiansands"] { --documenttitle: #944921; --bodytitle: #932c10; --bodysubtitle: #A62E1C; --bodytitlehighlight: #dcd3f0; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #d19e69; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #20477b; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #d1d1d1; --highlighttoc: #6a3418; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_orange_navy.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ :root[data-legacy-colorscheme="orange_navy"] { --documenttitle: #d64000; --bodytitle: #00408a; --bodysubtitle: #9e2f00; --bodytitlehighlight: #ffcdbd; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #00326b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #00326b; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #006deb; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_pastel_blue_orange.css ================================================ /* Pastel color scheme by Nathan Wintersgill */ :root[data-legacy-colorscheme="pastel_blue_orange"] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffffff; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } ================================================ FILE: css/legacy/colors/colors_red_blue.css ================================================ :root[data-legacy-colorscheme="red_blue"] { --documenttitle: #932919; --bodytitle: #A62E1C; /* often a darker version of documenttitle */ --bodysubtitle: #2B5F82; /* can be the same as bodytitle */ --bodytitlehighlight: #e0e9ff; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #3572a0; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #662211; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #185f65; --highlighttoc: #671d12; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #5B2F82; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_ruby_amethyst.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ :root[data-legacy-colorscheme="ruby_amethyst"] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #6f080b; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #008099; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_ruby_emerald.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ :root[data-legacy-colorscheme="ruby_emerald"] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d9ffe9; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #16a67d; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/colors_ruby_turquoise.css ================================================ /* There are five main choices that define a color scheme in the HTML output of PreTeXt: 1) A dark color for the title on each page 2) A dark color for highlighted words in the body 3) A dark color for other highlighted words in the body In the CSS those are called 'documenttitle', 'bodytitle', and 'bodysubtitle'. The other two choices appear in the ToC. Either: 3) A dark color for each chapter background 4) A dark color for the current section background (Often the ToC section background equals documenttitle. Or: 3') A light color for each chapter background 4') A light color for the current section background In the CSS those are called 'chaptertoc' and 'sectiontoc', respectively. With 3) and 4) you need white letters to go on the dark background, and with 3') and 4') you need dark letters on the light background. Set the color of those letters with 'chaptertoctext'. In addition to the above four choices, you need to choose a contrasting shade of each color, to be used for highlighting, borders, etc. In the future you will be able to choose colors for assemblages and for knowl output */ :root[data-legacy-colorscheme="ruby_turquoise"] { --documenttitle: #9e0c0f; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #d0f9ff; /* light, and contrasting to bodytitle */ --bodysubtitlehighlight: #fce5e4; /* light, and contrasting to bodysubtitle */ /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: #008099; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: white; /* can also write it as #ffffff */ --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #6f080b; /* often a dark version of documenttitle */ --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } ================================================ FILE: css/legacy/colors/setcolors.css ================================================ /* This file assigns the main colors, using variables that have been set previously. */ body.pretext { color: var(--bodyfontcolor); } .ptx-masthead .title-container > .heading, .ptx-masthead .title-container > .heading a, .ptx-masthead .logo-link:empty:hover::before, .ptx-masthead .byline a { color: var(--documenttitle, #2a5ea4); } .ptx-masthead .title-container > .heading a:active, .ptx-masthead .logo-link:empty:active::before, .ptx-masthead .byline a:active { color: var(--bodytitle, #932c1c); } /* Start by assuming any TOC item is a section, change others as appropriate */ .ptx-toc .toc-item { color: var(--sectiontoctext, #404040); background-color: var(--sectiontoc); border-color: var(--tocborder, #afc2e5); } .ptx-toc .toc-item.active { color: var(--sectiontoctextactive); background-color: var(--sectiontocactive); border-color: var(--highlighttocborder); } /* this looks weird but it matches previous ways the colors were applied */ .ptx-toc:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } /* override for focused view */ .ptx-toc.focused:not(.depth2) .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } /* All top level items styled like chapters to match old styling */ .ptx-toc > .toc-item-list > .toc-item { color: var(--chaptertoctext); background-color: var(--chaptertoc); } .ptx-toc > .toc-item-list > .toc-item.active { color: var(--chaptertoctextactive); background-color: var(--chaptertocactive); border-color: var(--highlighttocborder); } .ptx-toc .toc-item > .toc-title-box > a:is(:hover, :focus) { color: var(--highlighttoctext, #321a0c); background-color: var(--highlighttoc); border-color: var(--highlighttocborder, #ec704b); } /* top level parts/front/backmatter styled as parts */ .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter) { background-color: var(--parttoc); color: var(--parttoctext); } .ptx-toc > .toc-item-list > :is(.toc-frontmatter, .toc-part, .toc-backmatter).active { background-color: var(--parttocactive); color: var(--parttoctextactive); } .ptx-toc.focused .toc-chapter { background-color: var(--chaptertoc); color: var(--chaptertoctext); } .ptx-toc.focused .toc-chapter.active { background-color: var(--chaptertocactive); color: var(--chaptertoctextactive); } /* Anything under a chapter, front matter, back matter styled as section */ .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item { background-color: var(--sectiontoc); color: var(--sectiontoctext); } .ptx-toc.focused :is(.toc-chapter, .toc-frontmatter, .toc-backmatter) > ul > .toc-item.active { background-color: var(--sectiontocactive); color: var(--sectiontoctextactive); } .ptx-content .summary-links a { color: var(--sectiontoctext); } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: var(--highlighttoctext); background: var(--highlighttoc); } /* next two groups concern accessibility, so check when making changes */ .ptx-content .para > a.internal { color: var(--bodysubtitle); } .ptx-content .para > a.external { color: var(--bodysubtitle); } .ptx-content .para > a.internal:hover, .ptx-content .para > a.internal:hover *, .ptx-content .para > a.internal:focus, .ptx-content .para > a.internal:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .para > a.external:hover, .ptx-content .para > a.external:hover *, .ptx-content .para > a.external:focus, .ptx-content .para > a.external:focus * { color: var(--bodyfontcolorhighlight); background-color: var(--bodysubtitlehighlight); } .ptx-content .playvideo { background-color: var(--videoplay); } .ptx-content .goal-like { border-color: var(--goalborder); } .ptx-content .assemblage-like { border-color: var(--assemblageborder); background-color: var(--assemblagebackground); } .ptx-content .knowl-output { border-color: var(--knowlborder); background-color: var(--knowlbackground); } /* pastel */ .pretext[data-atmosphere="pastel"], .pretext[data-atmosphere="pastel"] .ptx-main { background: #dbf5ff; background: #efe; } .pretext[data-atmosphere="pastel"] { --documenttitle: #2a5ea4; --bodytitle: #A62E1C; --bodysubtitle: #2B5F82; --bodytitlehighlight: #e0e9ff; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #FCE5E4; --chaptertoc: #dbf5ff; --chaptertoc: #dcdcf9; --chaptertoctext: #444444; --chaptertocactive: #fae5b6; --chaptertoctextactive: #303030; --sectiontoc: #ffeeee; --sectiontoctext: #404040; --sectiontocactive: #fae5b6; --sectiontoctextactive: #202020; --tocborder: #afc2e5; --highlighttoc: #fac793; --highlighttoc: #fadfa3; --highlighttoctext: #321a0c; --highlighttocborder: #ec704b; --assemblageborder: #1100aa; --assemblagebackground: #f4f4fe; --knowlborder: #e0e9ff; --knowlbackground: #f5f8ff; } .pretext[data-atmosphere="pastel"] .ptx-toc { scrollbar-color: var(--documenttitlelight) #efe; } .pretext[data-atmosphere="pastel"] .ptx-navbar { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere="pastel"] .ptx-masthead { background: #efe; background: #dbf5ff; } .pretext[data-atmosphere="pastel"] .ptx-sidebar { background: #ffd; } /* twilight */ .pretext[data-atmosphere="darktwilight"] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #abd; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: hsl(9, 72%, 30%); /* #832615; */ --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 40%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 33%); --navbarbackground: hsl(0, 0%, 33%); --footerbackground: hsl(0, 0%, 30%); --mainbackground: hsl(0, 0%, 27%); --buttonbackground: hsl(225, 80%, 25%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 23%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 20%); } /* dark */ .pretext[data-atmosphere="dark"] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad6; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: hsl(5, 86%, 24%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 27%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 20%); --navbarbackground: hsl(0, 0%, 20%); --footerbackground: hsl(0, 0%, 22%); --mainbackground: hsl(0, 0%, 17%); --buttonbackground: hsl(232, 90%, 19%); --codebackground: hsl(120, 100%, 15%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 19%); } /* midnight */ .pretext[data-atmosphere="darkmidnight"] { --bodyfontcolor: #ddd; --bodyfontcolorhighlight: #222; --documenttitle: #2a5ea4; --documenttitledark: #20477b; --documenttitlelight: #8ab; --bodytitle: #abd; --bodysubtitle: #dcb; --bodytitlehighlight: #ad9; --bodyfonttitlehighlight: #306; --bodysubtitlehighlight: #363; /* The bodytitle and bodysubtitle colors must have at least a 3:1 contrast ratio with black, and at least 5:1 ratio with with the corresponding highlight. (The second condition will guarantee an adequate contrast with white.) */ --chaptertoc: hsl(0, 100%, 17%); --chaptertoctext: #dee; --chaptertocactive: var(--documenttitle); /* often the same as documenttitle */ --chaptertoctextactive: white; --sectiontoc: hsl(0, 0%, 13%); --sectiontoctext: #eed; --sectiontocactive: var(--documenttitle); /* often the same as documenttitle */ --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: var(--documenttitledark); --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --assemblagebackground: #003; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); --bannerbackground: hsl(0, 0%, 16%); --navbarbackground: hsl(0, 0%, 16%); --footerbackground: hsl(0, 0%, 13%); --mainbackground: hsl(0, 0%, 7%); --buttonbackground: hsl(240, 100%, 13%); --codebackground: hsl(120, 100%, 17%); --linkbackground: hsl(120, 90%, 20%); --linkbackgroundhighlight: hsl(0, 0%, 70%); --keybackground: hsl(0, 100%, 17%); } .pretext[data-atmosphere*="dark"] { background: var(--mainbackground); } .pretext[data-atmosphere*="dark"] .ptx-page > .ptx-main { background: var(--mainbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*="dark"] .ptx-content .summary-links a { background: var(--documenttitledark); background: var(--chaptertoc); } .pretext[data-atmosphere*="dark"] .ptx-navbar { background: var(--navbarbackground); } .pretext[data-atmosphere*="dark"] .ptx-page-footer .feedback-link, .pretext[data-atmosphere*="dark"] .ptx-content-footer .button, .pretext[data-atmosphere*="dark"] .ptx-navbar .button { background-color: var(--buttonbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*="dark"] .ptx-page-footer .feedback-link:hover, .pretext[data-atmosphere*="dark"] .ptx-content-footer .button:hover, .pretext[data-atmosphere*="dark"] .ptx-navbar .button:hover, .pretext[data-atmosphere*="dark"] .ptx-content-footer .button:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*="dark"] .ptx-navbar .calculator-toggle { background-color: var(--buttonbackground); } .pretext[data-atmosphere*="dark"] .ptx-navbar .calculator-toggle:hover { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*="dark"] .ptx-masthead { background: var(--bannerbackground); } .pretext[data-atmosphere*="dark"] .ptx-page-footer { background: var(--footerbackground); border-top-color: #447; border-bottom-color: #447; } .pretext[data-atmosphere*="dark"] .ptx-page-footer .logo { background: #779; border-radius: 0.4em; } .pretext[data-atmosphere*="dark"] .ptx-masthead .title-container > .pretext .heading, .pretext[data-atmosphere*="dark"] .ptx-masthead .title-container > .heading a, .pretext[data-atmosphere*="dark"] .ptx-masthead .logo-link:empty:hover::before, .pretext[data-atmosphere*="dark"] .ptx-masthead .byline, .pretext[data-atmosphere*="dark"] .ptx-masthead .byline a { color: var(--documenttitlelight); } .pretext[data-atmosphere*="dark"] .ptx-toc { scrollbar-color: var(--documenttitlelight) var(--footerbackground); } .pretext[data-atmosphere*="dark"] .ptx-content .code-inline { /* color: var(--documenttitledark); */ background: var(--codebackground); } .pretext[data-atmosphere*="dark"] .ptx-content .kbdkey { /* color: var(--documenttitledark); */ background: var(--keybackground); } .pretext[data-atmosphere*="dark"] .ptx-content .goal-like > .heading { background: var(--chaptertoc); } .pretext[data-atmosphere*="dark"] .ptx-content a.url, .pretext[data-atmosphere*="dark"] .ptx-content a.internal, .pretext[data-atmosphere*="dark"] .ptx-content a.external { background-color: var(--linkbackground); color: var(--bodyfontcolor, #ddc); } .pretext[data-atmosphere*="dark"] .ptx-content [data-knowl] { background-color: var(--linkbackground); color: var(--bodyfontcolor); } .pretext[data-atmosphere*="dark"] .ptx-content [data-knowl]:hover, .pretext[data-atmosphere*="dark"] .ptx-content [data-knowl]:active, .pretext[data-atmosphere*="dark"] .ptx-content [data-knowl].active { background-color: var(--linkbackgroundhighlight); color: var(--bodyfontcolorhighlight); } .pretext[data-atmosphere*="dark"] .ptx-page .ptx-main .ptx-content .knowl-content > .solution-like { background: #606; } /* link/knowl coloring */ :root { --knowlLinkColor: var(--documenttitle); --linkColor: var(--bodysubtitle); --linkBackground: var(--bodysubtitlehighlight); --knowlNested1Background: #f5f5ff; --knowlNested2Background: #fffff5; --knowlNested3Background: #f5ffff; --knowlNested4Background: #fff5f5; } ================================================ FILE: css/legacy/pretext.css ================================================ /******************************************************************************* * pretext.css handles structure which (should be) common to all styles ******************************************************************************* * * Authors: David Farmer, Rob Beezer * ******************************************************************************* */ * { box-sizing: border-box; } body.pretext { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } body.pretext[data-font="OS"] { font-family: "Open Sans", sans-serif; } body.pretext[data-font="RS"] { font-family: "Roboto Serif", serif; } body.pretext, body.standalone { margin: 0; padding: 0; font-size: 16px; } body.pretext { background: #fff; } a { color: inherit; text-decoration: none; } a:hover, a:focus { text-decoration: none; } body.pretext > a.assistive { padding:6px; position: absolute; top:-40px; left:0px; color:white; border-right:1px solid white; border-bottom:1px solid white; border-bottom-right-radius:8px; background:transparent; z-index: 10000; } body.pretext > a.assistive:focus { top:0px; background:#BF1722; outline:0; transition: top .1s ease-in, background .5s linear; } /* over-write bootstrap (in Runestone, for example) */ nav .ptx-navbar { border-top: none; border-right: none; border-left: none; min-height: unset; } /* next for the Activecode popup */ /* .modal-backdrop.fade.in { display: none; } */ .ptx-navbar .activecode-toggle { padding: 3px 5px; } /* Runestone nav for Runestone-wide features */ .pretext #brand-navbar, .pretext .brand-navbar { left: 0; position: fixed; right: 0; z-index: 1030; height: 50px; border-width: 0 0 1px; top: 0; margin-bottom: 0; } .pretext #brand-navbar > .container::before, .pretext .brand-navbar > .container::before, .pretext #brand-navbar > .container::after, .pretext .brand-navbar > .container::after { display: none; } .pretext #brand-navbar + .ptx-masthead, .pretext .brand-navbar + .ptx-masthead { margin-top: 50px; } .pretext #brand-navbar .navbar-collapse.collapse, .pretext .brand-navbar .navbar-collapse.collapse { overflow: hidden !important; } .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: 50px; } @media screen and (max-width: 800px) { .pretext #brand-navbar ~ .ptx-navbar, .pretext .brand-navbar ~ .ptx-navbar { top: auto; } } /* so that we can position things (like .autopermalink) absolutely wrt these items */ .ptx-content section, .ptx-content article, .ptx-content figure, .ptx-content figcaption, .ptx-content .exercisegroup, .ptx-content .discussion-like, .ptx-content .para { position: relative; } /* we use .para as a wrapper around some "compound" p, so the first p in .para is block-like because of the .pare */ .ptx-content .para > p:first-child, .ptx-content .para > .para:first-child { display: inline; } /* CSS defult values: https://www.w3schools.com/cssref/css_default_values.asp */ /* the default margin for pre is "1em 0", so we over-ride so that we can set our own later */ .ptx-content pre { margin: 0; padding: 0; border: none; } /* these are to over-ride "pre" styling in code.less */ .ptx-content pre { border-radius: 0; } .ptx-content textarea { padding: 0; } /* .para and other block-level elements should have space at the top, and not the bottom */ .ptx-content h1, .ptx-content h2, .ptx-content h3, .ptx-content h4, .ptx-content h5, .ptx-content h6 { margin: 0; font-size: unset; } .pretext h1, .pretext h2, .pretext h3, .pretext h4, .pretext h5, .pretext h6 { margin: 0; font-size: unset; } .ptx-content .heading { line-height: 1.1; } /* spacing around and after .para, and around and after article */ .ptx-content .para { margin-top: 1.25em; margin-bottom: 0; line-height: 1.35; } .ptx-content .para.continuation { margin-top: 0; } .ptx-content pre + .para.continuation, .ptx-content pre + form, .ptx-content div + form { margin-top: 1em; } .ptx-content ul + .para.continuation, .ptx-content ol + .para.continuation, .ptx-content dl + .para.continuation { margin-top: 0.75em; } .ptx-content .aside-like > .para:first-child, .ptx-content td > .para:first-child, .ptx-content .solution-like > .para:first-child { margin-top: 0; } /* for assemblages without a title */ .ptx-content .assemblage-like > .para:first-of-type { margin-top: 0; } .ptx-content .assemblage-like > .heading + .para { margin-top: 0.25em; } .ptx-content .assemblage-like + .para { margin-top: 1.75em; } .ptx-content .para.intertext { margin-top: -0.25em; text-indent: 0; } .ptx-content .para + table { margin-top: 1em; } .ptx-content table tr td .para + .para { margin-top: 1em; } .ptx-content table + .para { margin-top: 1.5em; } .ptx-content .para + figure.figure-like > table { margin-top: 1em; } /* 1.25 = ol top + li top ? looked too big with 0.75 below */ .ptx-content .exercise-like .para + ol { margin-top: 0.5em; } .ptx-content .para + pre.prettyprint, .ptx-content .para + pre.plainprint { margin-top: 1.25em; } .ptx-content .para + .code-box { margin-top: 1.25em; } .ptx-content .code-box > .console { margin-left: 1.5em; } .ptx-content .exercisegroup { padding-top: 1.25em; margin-bottom: 1.0em; } .ptx-content section .exercisegroup > .heading { font-size: 1.10em; line-height: 1.05em; margin-top: 0.75em; display: inline; } .ptx-content section .exercisegroup > .heading + .introduction { display: inline; } .ptx-content section .exercisegroup > .heading + .introduction > .para:first-child { display: inline; } .ptx-content .exercisegroup article.exercise-like li > .para:first-child { margin-top: 0; } .ptx-content .exercisegroup article.exercise-like .heading { margin: 0; } .ptx-content article.exercise-like .task > .heading + .heading { font-weight: 600; /* should be slightly less bold, but some browsers make it bold */ } .ptx-content article.exercise-like .task > .heading + .heading + .para, .ptx-content article.exercise-like .task > .heading + .heading + div { display: block; margin-top: 0; } .ptx-content .exercisegroup .conclusion .heading { margin-top: 0.5em; } .ptx-content .exercisegroup article + article { margin-top: 1em; } /* http://spot.pcc.edu/math/APEXCalculus/sec_interp_deriv.html */ .ptx-content .exercisegroup > article, .ptx-content .exercisegroup-exercises > article { margin-left: 2em; } .ptx-content .exercisegroup .cols2 > article { margin-left: 1.25em; } .ptx-content .exercisegroup > .introduction, .ptx-content .exercisegroup > .conclusion { margin-left: 0; } .ptx-content .exercisegroup > .introduction { margin-top: 1.25em; margin-top: 0; } .ptx-content .exercisegroup > .introduction > .para:first-child::before { content: '\25a0\2009'; /* font-size: 70%; */ color: #06a; position: relative; top: -1px; right: 1px; } .ptx-content .exercisegroup > .heading + .introduction > .para:first-child::before { content: '\2003'; } .ptx-content .exercisegroup > .introduction > .para:first-child { margin-top: 0; } /* this > may be too restrictive. The purpose is to not put a top margin on an article at the top of a knowl */ .ptx-content section > article, .ptx-content section > section.paragraphs, .ptx-content .paragraphs > article { margin-top: 1.25em; } .ptx-content section article + article, .ptx-content section .introduction + article, .ptx-content section .para + article, .ptx-content section .posterior + article { margin-top: 1.75em; } .ptx-content section article > .introduction + article { margin-top: 1em; } .ptx-content section article > .discussion-like { margin-top: 1em; } .ptx-content section article > .discussion-like .para { margin-top: 1em; } .ptx-content article + .posterior { margin-top: 0.5em; } .ptx-content section .para + .tabular-box { margin-top: 0.75em; } .ptx-content section .tabular-box + .tabular-box { margin-top: 1.0em; } .ptx-content section .proof { margin-top: 0.75em; } .ptx-content section > pre, .ptx-content .para + pre { margin-top: 1.25em; } .ptx-content ol .para + .para, .ptx-content ul .para + .para { margin-top: 1em; } /* see Ex 29 https://yoshiwarabooks.org/linear-functions.html and ex 2.91 in https://yoshiwarabooks.org/mfg/MathModels.html */ .ptx-content .introduction + .sidebyside, .ptx-content .para + .sidebyside, .ptx-content ol + .sidebyside, .ptx-content ul + .sidebyside { margin-top: 1em; } .ptx-content section .heading, .ptx-content article .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; } .ptx-content article .exercise-stage { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; color: inherit; font-size: 100%; margin-top: 0.4em; } .ptx-content article > .heading + .para { margin-top: 0; } .ptx-content section .heading + .para, .ptx-content section .title + .para, /* list items have bare .title, not in a .heading */ .ptx-content section .heading + .introduction > .para:first-child, .ptx-content section .blob > .para:first-child { margin-top: 0.25em; } .ptx-content section .heading + article { /* , .ptx-content section header + article { */ margin-top: 1em; } .ptx-content section .heading + .sidebyside { margin-top: 1em; } .ptx-content a > .heading { display: inline;} .ptx-content section > .heading { font-size: 1.75em; line-height: 1.25em; margin-top: 1em; margin-bottom: 0.35em; } .ptx-content section section > .heading { font-size: 1.5em; line-height: 1.25em; margin-bottom: 0; } .ptx-content .paragraphs > .heading { font-size: 1.125em; line-height: 1.125em; display: inline; } /* .ptx-content .paragraphs .heading { display: inline; } */ .ptx-content .paragraphs .heading + .para { display: inline; } .ptx-content .para.logical > .para:first-child { display: inline; } /* next is for runestone multiple choice */ .ptx-content .runestone label > .para { display: inline; } /* the next are to avoid stlping a .para as inline, because * inline styling messes up the meaning of line-height. * */ .ptx-content .paragraphs .para .title { font-family: "PT Serif", "Times New Roman", Times, serif; font-size: 1.125em; font-weight: 700; } .ptx-content .paragraphs > .heading { margin-top: 0; } .ptx-content .paragraphs + .paragraphs { margin-top: 3em; } .ptx-content article .paragraphs > .heading { font-size: 1.05em; } .ptx-content section section section > .heading { font-size: 1.40em; line-height: 1.15em; margin-top: 0.75em; } @media screen and (max-width: 480px) { .ptx-content section > .heading { font-size: 1.5em; line-height: 1.33em; margin-top: 1em; } .ptx-content section section > .heading { font-size: 1.3em; line-height: 1.15em; } .ptx-content section section section > .heading { font-size: 1.15em; line-height: 1em; } } .ptx-content .abstract { margin: 4em 2em; } .ptx-content .abstract > .title { font-size: 1.125em; font-weight: 600; line-height: 1.125em; display: inline; } .ptx-content .abstract > .title::after { content: ".\2009\2009\2009"; } .ptx-content .abstract > .title + .para { display: inline; } /* ----- */ .ptx-content article > .heading, .ptx-content article > a .heading { font-size: 1.125em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like > .heading { font-size: 1.0em; line-height: 1.125em; margin-top: 0; display: inline; } .ptx-content .discussion-like.discussion > .heading .codenumber, .ptx-content .discussion-like.discussion > .heading .space, .ptx-content .discussion-like.discussion > .heading .period { display: none; } .ptx-content .discussion-like.discussion > .heading .type::after { content: ". "; } .ptx-content .discussion-like.status > .heading { display: none; } .ptx-content .discussion-like.status > .heading + .para, .ptx-content .discussion-like.status > .para { font-style: italic; display: block; padding-left: 1em; } .ptx-content article > .heading::after, .ptx-content .discussion-like > .heading::after, .ptx-content .paragraphs > .heading::after, .ptx-content article > a > .heading::after { content: "\2009"; } /* Currently only for Solution to example */ .ptx-content .posterior .heading { font-weight: normal; font-size: 1.125em; line-height: 1.125em; margin-top: 0; } /* * Contents of articles */ .ptx-content article > .heading + .para, .ptx-content .discussion-like > .heading + .para, .ptx-content article > .heading + .introduction, .ptx-content article > .heading + .introduction > .para:first-child { display: inline; } /* when a list is the only thing in an environment with a border, there is too much space to the left */ .ptx-content article > .heading + ol, .ptx-content article > .heading + ul { padding-left: 1.5em; } .ptx-content article.theorem-like .para, .ptx-content article.theorem-like li { font-style: italic; } .ptx-content article.theorem-like .emphasis { font-weight: 700; } .ptx-content ol, .ptx-content ul { margin-bottom: 0; } .ptx-content li { margin-bottom: 0; } .ptx-content li .title { font-size: 100%; font-weight: normal; font-style: italic; } .ptx-content article.theorem-like li .title { font-weight: 600; font-style: normal; font-size: 96%; } .ptx-content figure { margin-bottom: 0; } .ptx-content .heading { margin-top: 0; margin-bottom: 0; } .ptx-content .conclusion { margin-top: 1em; } .ptx-content .conclusion > .para:first-child { margin-top: 0.5em; } .ptx-content ol, .ptx-content ul { margin-top: 0.75em; } .ptx-content .exercise-like > ol:first-child, .ptx-content .exercise-like > ul:first-child { margin-top: 0; } .ptx-content .heading + ol, .ptx-content .heading + ul { margin-top: 0.45em; } .ptx-content li > .heading + ol, .ptx-content li > .heading + ul { margin-top: 0.25em; } .ptx-content li > .heading + ol > li:nth-child(1), .ptx-content li > .heading + ul > li:nth-child(1) { margin-top: 0; } .ptx-content li > .heading + ol.cols2 > li:nth-child(2), .ptx-content li > .heading + ul.cols2 > li:nth-child(2) { margin-top: 0; } .ptx-content li { margin-top: 0.5em; } .ptx-content li > .para:first-child { margin-top: 0; } .ptx-content article .para:first-child { margin-top: 0; } .ptx-content ol ol, .ptx-content ol ul, .ptx-content ul ol, .ptx-content ul ul { margin-top: 0.5em; } .ptx-content .frontmatter > .heading { display: block; text-align: center; } .ptx-content .frontmatter > .heading .title, .ptx-content .book > .heading .title { font-size: 1.3em; } .ptx-content .frontmatter > .heading .subtitle, .ptx-content .book > .heading .subtitle { display: block; font-weight: normal; color: #666666; font-size: 0.875em; line-height: 1.42857em; margin-top: 0.35714em; } .ptx-content .frontmatter .author:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .para:first-of-type { margin-top: 4em; } .ptx-content .frontmatter > .author, .ptx-content .frontmatter > .credit { margin-top: 2em; text-align: center; } .ptx-content .frontmatter > .author .author-name { font-size: 120%; } .ptx-content .frontmatter .date { display: block; margin-top: 2em; text-align: center; } .ptx-content .frontmatter .credit .title { font-size: 1em; } .ptx-content .frontmatter .credit .author { font-size: 0.9em; margin-top: 0.75em; } .ptx-content .frontmatter .author-info { font-size: 90%; } .ptx-content a[href^="mailto:"] { white-space: pre; } .ptx-content .colophon .credit { margin-top: 1em; } button { font: inherit; } .print-button { position: relative; right: 2px; top: 66px; background-color: LightGreen; z-index: 1; margin-top: -4em; float: right; } @media print { .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display:none; border:none; } .pretext .ptx-page main.ptx-main { margin-left:0; left:auto; border:none; box-shadow:none; padding: 0; } .pretext .ptx-page .ptx-main .ptx-content { margin-top:0 } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section { margin-top:1em } .pretext .ptx-page .ptx-main .ptx-content.ptx-content section .heading { margin-top:0 } /* over-ride print.less */ .pretext a[href]::after { content: ""; } /* don't print the print-button */ .print-button { display: none; } } /* printing for one-page worksheets */ @media print { body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { width: 820px; max-width: 820px; font-size: 12.5px; } body.standalone.worksheet { margin: 0; } body.standalone .ptx-content section.worksheet { border: none; } body.standalone.worksheet .ptx-masthead, body.standalone.worksheet .ptx-page-footer { display: none; } body.standalone.worksheet.has-sidebar-left.mathbook-loaded .ptx-page .ptx-main { margin: 0; } body.standalone.worksheet .ptx-page > .ptx-main .ptx-content { margin: 0; } body.standalone.worksheet .ptx-content section.onepage { max-height: 100%; max-width: 100%; overflow: hidden; page-break-after: always; /* height: 1243px; */ border: none; page-break-inside: avoid; } body.standalone.worksheet .ptx-content .onepage.lastpage { margin-bottom: -2em; /* to avoid blank space overflow causing an extra blank page */ page-break-after: auto; } body.standalone.worksheet.a4 .ptx-content .onepage { /* height: 1320px; */ } body.standalone.worksheet .ptx-content .onepage div.workspace, body.standalone.worksheet .ptx-content .onepage div.workspace.squashed.tight { border: none; padding: 0; background: none !important; } body.standalone.worksheet a { color: black; } body.standalone.worksheet .ptx-page .ptx-main { padding: 0; } body.standalone.worksheet.mathbook-loaded .ptx-page .ptx-main .ptx-content.ptx-content section.onepage { padding-bottom: 20px; /* to help prevent flow onto the next page, particularly in Safari */ /* the page is not full length, but what is missing was blank anyway */ /* margin: 0; */ } @page { margin: 0 } } .hidden { display: none; } .ptx-navbar .preferences_menu_holder .active > li { color: #ddd; } .ptx-navbar .preferences_menu_holder > ol > li:focus { background: #eef; border: 2px solid #909; padding: 2px 24px 2px 8px; } .ptx-navbar .preferences_menu_holder > ol > li > ol > li:focus { background: #eef; border: 2px solid #909; padding: 4px 4px 2px 4px; } .ptx-navbar .preferences_menu_holder .active .selected { background: #eef; color: #111; } .ptx-navbar .button.user-preferences-button { overflow: visible; display: none; } .preferences_menu_holder { z-index: 30; background: #fee; color: #222; position: absolute; left: -11em; top: 4em; } .preferences_menu_holder ol { list-style-type: none; padding: 0; margin: 0; } .preferences_menu_holder > ol { width: 12.5em; } .preferences_menu_holder > ol > li { padding: 4px 26px 4px 10px; } .preferences_menu_holder ol li ol { z-index: 40; position: absolute; left: 13em; top: -2em; background: #fee; } .preferences_menu_holder ol li ol li { padding: 6px 6px 4px 6px; display: flex; align-items: center; } .preferences_menu_holder ol.fonts:not(.hidden) { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; } .preferences_menu_holder ol.fonts li:nth-child(8n+1), .preferences_menu_holder ol.fonts li:nth-child(8n+2), .preferences_menu_holder ol.fonts li:nth-child(8n+3), .preferences_menu_holder ol.fonts li:nth-child(8n+4) { background-color: #eff; } .preferences_menu_holder ol.fonts li:nth-child(4n+2) { width: 4em; justify-content: center; text-align: center; align-items: center; } .preferences_menu_holder ol.fonts li:nth-child(4n+1) { padding-left: 14px; } .preferences_menu_holder .wrap_to_submenu { float: right; line-height: 0.95em; margin-right: -7px; } .preferences_menu_holder .to_submenu { position: absolute; } .preferences_menu_holder .avatars li { font-size: 200%; text-align: center; } .preferences_menu_holder .fontfamily .name { margin-right: 2em; } .preferences_menu_holder .fontfamily .sample { margin-left: auto; } .preferences_menu_holder .fonts .byunits { font-size: 80%; margin-bottom: -0.3em; } #choose_topic { background: #eef; } .ffcheck, .atmospherecheck, .avatarcheck, .rulercheck, .motioncheck { width: 1em; margin-left: 0.2em; margin-right: 0.7em; font-size: 11pt; } .preferences_menu_holder .moveQ { padding-top: 0.5em; border-top: 0.3em solid #eef; } .preferences_menu_holder .moveQ, .preferences_menu_holder .moveQ ~ li { background: #efe; } [data-ruler="greybar"] .onelineX:hover{ padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: #f3f3f3; } [data-atmosphere*="dark"][data-ruler="greybar"] .onelineX:hover{ color: #333; } [data-ruler="lightbox"] .onelineX { background-color: #e3e3e3; } [data-ruler="lightbox"] .onelineX:hover{ padding-top: 2px; margin-top: -2px; padding-bottom: 2px; margin-bottom: -2px; background-color: inherit; } [data-ruler="sunrise"] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler="sunrise"] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler="sunrise"] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler="sunriseunderline"] .onelineX:hover{ background-color: inherit; border-bottom: 2px solid black; margin-bottom: -2px; position: relative; z-index: 10; } xxxxxx[data-ruler="sunriseunderline"] .onelineX:hover + .onelineX { margin-top: -2px; } [data-ruler="sunriseunderline"] .onelineX:hover ~ .onelineX { background-color: #e3e3e3; } [data-ruler="sunriseunderline"] .para:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler="sunriseunderline"] section:hover ~ * .onelineX { background-color: #e3e3e3; } [data-ruler="underline"] .onelineX:hover{ background-color: inherit; border-bottom: 1px solid black; margin-bottom: -1px; } [data-ruler="lunderline"] .onelineX:hover{ background-color: inherit; border-bottom: 1px solid black; border-left: 1px solid black; padding-left: 4px; margin-left: -5px; margin-bottom: -1px; } [data-atmosphere*="dark"][data-ruler*="underline"] .onelineX:hover{ border-bottom: 1.5px solid #ddd; margin-bottom: -1.5px; } [data-atmosphere*="dark"][data-ruler="lunderline"] .onelineX:hover{ border-left: 1.5px solid #ddd; padding-left: 3.5px; margin-left: -5px; } .material-symbols-outlined { font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 } .ptx-footnote { display: inline-block; } .ptx-footnote[open] { display: contents; } .ptx-footnote[open] .ptx-footnote__number { visibility: hidden; } .ptx-footnote[open] .ptx-footnote__number::before { font-size: 0.6rem; content: "[x]"; visibility: visible; vertical-align: super; } .ptx-footnote__number { display: inline; cursor: pointer; } .ptx-footnote__number::marker { content: ""; } .ptx-footnote__contents { display: block; font-style: italic; background: var(--knowlbackground); border-radius: 6px; padding: 0px 8px; margin: 4px auto; width: fit-content; max-width: calc(100% - 60px); border: 2px solid var(--knowlborder); } /******************************************************************************* * * Authors: David Farmer, Rob Beezer * ******************************************************************************* */ ================================================ FILE: css/legacy/pretext_add_on.css ================================================ .ptx-content section .para.credit + .para.credit { margin-top: 0.25em; } .ptx-content section .para.credit > .title { font-weight: 700; margin-right: 0.5em; } /* .ptx-content section .para.credit > .title::after { content: ": "; } */ .ptx-content section .para.copyright { margin-top: 2.5em; } .ptx-content section .para.license { margin-top: 2.5em; } /* stacked headings in the solutions backmatter */ .ptx-content section > .heading + .heading, .ptx-content section section > .heading + .heading { margin-top: 0.5em; } .ptx-content section.solutions > h3.heading, .ptx-content section.solutions section > h3.heading { font-size: 1.6em; } .ptx-content section.solutions > h4.heading, .ptx-content section.solutions section > h4.heading { font-size: 1.45em; } .ptx-content section.solutions > h5.heading, .ptx-content section.solutions section > h5.heading { font-size: 1.35em; } .ptx-content section.solutions > h6.heading, .ptx-content section.solutions section > h6.heading { font-size: 1.25em; } .ptx-content .bibitem + .bibentry { display: inline-block; width: 90%; } .ptx-content .bibitem { display: inline-block; vertical-align: top; width: 7%; margin-right: 0; } .ptx-content figcaption { font-weight: normal; } .ptx-content figcaption { margin-top: 0.6em; margin-left: auto; margin-right: auto; /* Commenting this out because the initial letter of some captions were cut off text-indent: -30px; */ } .ptx-content figure.table-like figcaption:first-child { font-style: oblique; margin-top: 0; } .ptx-content figure.table-like figcaption:first-child .type, .ptx-content figure.table-like figcaption:first-child .codenumber { font-style: normal; } .ptx-content section figcaption .codenumber, .ptx-content section figcaption .type { font-weight: 700; font-size: inherit; } .ptx-content figcaption .codenumber:after { content: "\2002"; } .ptx-content figcaption .type:last-of-type::after { /* so, not followed by a span.codenumber */ /* not sure where this is used */ content: "\2002"; } .ptx-content figcaption code.code-inline { white-space: pre; } .ptx-content figure.figure > figcaption{ margin-top: 1em; } .ptx-content figure.listing > figcaption + * { margin-top: 0.5em; } .ptx-content figcaption + .named-list-content { margin-top: 0.6em; } .ptx-content figcaption + .named-list-content > .introduction > .para:first-child { margin-top: 0; } .ptx-content figcaption + table, .ptx-content figcaption + .tabular-box { margin-top: 0.5em; } .ptx-content .definition-like .para > .emphasis { font-weight: 700; } .ptx-content em.alert { font-weight: bold; } .unprocessed { padding: 8px; background-color: rgb(255,230,230) } .unprocessed .unprocessed { margin: 8px; background-color: rgb(255,200,255) } .unprocessed .unprocessed .unprocessed { margin: 8px; background-color: rgb(205,205,255) } .ptx-content section.introduction + section { margin-top: 2em; } .ptx-content { margin: 0; } .ptx-content .runestone.parsons_section { display: inline-block; max-width: unset; } .ptx-content .runestone.ac_section { width: 60em; max-width: unset; } .ptx-content .runestone.ac_section .ac_section { max-width: unset; } .ptx-content .runestone.ac_section > div { max-width: unset; } .ptx-content .runestone > .parsons { width: 60em; max-width: unset; } .ptx-content .runestone .parsons { margin: 0; } .ptx-content .runestone.parsons_section > .parsons { width: max-content; padding-right: 1em; } .ptx-content .runestone .parsons .sortable-code-container { text-align: unset; } .ptx-content .runestone .parsons .parsons-text, .ptx-content .runestone .parsons .parsons-controls { margin-left: 0; margin-right: 0; } .ptx-content .runestone .parsons .sortable-code + .sortable-code { margin-right: 0; } .ptx-content .runestone .parsons .runestone_caption_text { max-width: 660px; } .runestonebustmenu { position: absolute; right: 0; top: 0; } .runestonebustmenu .dropdown-content { position: absolute; right: 2em; left: unset; top: 1em; } @media screen and (max-width: 800px) { /* .runestonebustmenu { display: none } */ nav .dropdown .dropdown-content { top: unset; bottom: 36px; } .activecode-toggle { display: none } } /* above may be obsolete because we do not have the runestonebustmenu class in overhaul? */ .pretext .navbar .dropdown { height: 35px; } .ptx-content section section + section { margin-top: 3em; } .ptx-content .sidebyside > .para, .ptx-content .sidebyside > figure, .ptx-content .sidebyside > img, .ptx-content .sidebyside > table, .ptx-content .sidebyside > tabular, .ptx-content .sidebyside > section, .ptx-content .sidebyside > .paragraphs { display: inline-block; margin: 0; } .ptx-content .sidebyside .sbspanel > table { /* see Sec 23.12 of sample article */ overflow-x: auto; margin-left: auto; margin-right: auto; } .ptx-content .sidebyside figcaption { padding-left: 1em; padding-right: 0; padding-bottom: 0; margin: 0.75em 0 0 0; } .ptx-content figcaption { font-family: "PT Serif", "Times New Roman", Times, serif; } .ptx-content .sidebyside > .para { /* what about sbspanel? */ width: 32%; vertical-align: top; } .ptx-content .sidebyside > .para.left, .ptx-content .sidebyside > .para.middle, .ptx-content .sidebyside > .para.right { vertical-align: middle; } .ptx-content .sidebyside > .para + img { vertical-align: middle; } .ptx-content .sidebyside .sbsrow .sbsheader { margin-top: 0; } .ptx-content .sbsgroup { width: 100%; } .ptx-content .sidebyside { width: 100%; } .ptx-content .sbsrow { display: flex; justify-content: space-between; } /* Components of three types of "sbsrow" */ /* titles, totally centered text */ .ptx-content .sbsheader { text-align: center; justify-content: center; font-size: 1em; } .ptx-content .sbspanel:empty { /* can only happen when partially created */ height: 10em; background-color: rgb(221, 221, 255); } /* containers of desired width for actual content */ .ptx-content .sbspanel { display: flex; flex-direction: column; justify-content: flex-start; } .ptx-content .sbspanel.top { /* also the default */ justify-content: flex-start; } .ptx-content .sbspanel.middle { justify-content: center; /* should that be space-between? */ } .ptx-content .sbspanel.bottom { justify-content: flex-end; } .ptx-content .sbspanel > .para:first-child { margin-top: 0; } /* fixed-width items are centered horizontally in their panel */ /* always used in conjunction with sbspanel */ .ptx-content .fixed-width { align-items: center; } /* captions, centered until word-wrapped */ .ptx-content .sbscaption { justify-content: center; } /* good for table, bad for image .ptx-content .sidebyside { overflow-x: scroll; } */ .ptx-content table { border-spacing: 0; } .ptx-content table { border-collapse: collapse; } .ptx-content .image-box + table, .ptx-content .image-box + .sidebyside > .sbsrow:first-child > .sbspanel > table:first-child { margin-top: 1.5em; } .ptx-content table tr td, .ptx-content table tr th { padding-top: 2px; padding-bottom: 2px; padding-left: 5px; padding-right: 5px; } .ptx-content table tr td { font-size: 90%; } .ptx-content table tr td.l { text-align: left; } .ptx-content table tr td.c { text-align: center; } .ptx-content table tr td.r { text-align: right; } .ptx-content table tr td.j { text-align: justify; } .ptx-content table tr td.lines { white-space: nowrap; } .ptx-content table tr td.t { vertical-align: top; } .ptx-content table tr td.b { vertical-align: bottom; } .ptx-content table tr td.m { vertical-align: middle; } .ptx-content table tr td.vv { border-left: 2px solid #000; border-right: 2px solid #000; } .ptx-content table tr td.vcv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.vcvv { border-left: 2px solid #000; border-right: 4px solid #000; text-align: center; } .ptx-content table tr td.vlv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vrv { border-left: 2px solid #000; border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.rv { border-right: 2px solid #000; text-align: right; } .ptx-content table tr td.vr { border-left: 2px solid #000; text-align: right; } .ptx-content table tr td.lv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vl { border-left: 2px solid #000; text-align: left; } .ptx-content table tr td.cv { border-right: 2px solid #000; text-align: center; } .ptx-content table tr td.Xv { border-right: 2px solid #000; text-align: left; } .ptx-content table tr td.vc { border-left: 2px solid #000; text-align: center; } .ptx-content table tr td.hline { padding: 0; } .ptx-content table tr td.hlinethick { padding-left: 0px; padding-right: 0px; } .ptx-content table tr td.hline hr { margin-top:0; margin-bottom:0; margin-left: -1px; margin-right: -1px; border: 1px solid rgb(0,0,0); } .ptx-content table tr td.hlinethick hr { margin-top:0; margin-bottom:0; margin-left: -1px; margin-right: -1px; border: 2px solid rgb(0,0,0); } .center table { text-align: center; margin-left: auto; margin-right: auto; } .ptx-content table tr th.b1, .ptx-content table tr td.b1 { border-bottom: 1px solid #000; } .ptx-content table tr th.b2, .ptx-content table tr td.b2 { border-bottom: 2px solid #000; } .ptx-content table tr th.b3, .ptx-content table tr td.b3 { border-bottom: 3px solid #000; } .ptx-content table tr th.b0, .ptx-content table tr td.b0 { border-bottom: none; } .ptx-content table tr th.t1, .ptx-content table tr td.t1 { border-top: 1px solid #000; } .ptx-content table tr th.t2, .ptx-content table tr td.t2 { border-top: 2px solid #000; } .ptx-content table tr th.t3, .ptx-content table tr td.t3 { border-top: 3px solid #000; } .ptx-content table tr th.t0, .ptx-content table tr td.t0 { border-top: none; } .ptx-content table tr th.r1, .ptx-content table tr td.r1 { border-right: 1px solid #000; } .ptx-content table tr th.r2, .ptx-content table tr td.r2 { border-right: 2px solid #000; } .ptx-content table tr th.r3, .ptx-content table tr td.r3 { border-right: 3px solid #000; } .ptx-content table tr th.r0, .ptx-content table tr td.r0 { border-right: none; } .ptx-content table tr th.l1, .ptx-content table tr td.l1 { border-left: 1px solid #000; } .ptx-content table tr th.l2, .ptx-content table tr td.l2 { border-left: 2px solid #000; } .ptx-content table tr th.l3, .ptx-content table tr td.l3 { border-left: 3px solid #000; } .ptx-content table tr th.l0, .ptx-content table tr td.l0 { border-left: none; } .ptx-content table tr td img { max-width: 200px; margin-right: 30px; } .ptx-content table.notation-list tr th { text-align: left; } .ptx-content table.notation-list tr td { text-align:left; vertical-align:top; } .ptx-content table.notation-list tr th { margin-left: 2em; } .ptx-content table.notation-list tr td { margin-left: 1em; } .ptx-content tr th.r0.l0, .ptx-content tr td.r0.l0 { padding-left: 0.8em; padding-right: 0.8em; } .ptx-content table tr td span.decimal { float: left; text-align: right; } .ptx-content table tr.header-vertical th { writing-mode: vertical-rl; padding-left: 2em; /* transform: rotate(180deg); */ } .ptx-content table + article { margin-top: 1em; } .ptx-content .hidden-knowl-wrapper .hiddenproof, .ptx-content .blob > article.hiddenproof, .ptx-content section > article.hiddenproof { margin-top: 0.3em; } .ptx-content .hidden-knowl-wrapper article { display: inline; } /* next disabled accidentally or on purpose? */ .apretext-content figure.figure-like { overflow: auto; } .ptx-content figure.figure-like { margin-left: 0; margin-right: 0; } .ptx-content figure.table-like { margin-left: 30px; margin-right: 30px; } .ptx-content figure.table-like.list { margin-right: 0; } /* why was this ever added ? .ptx-content figure.figure-like figcaption { overflow: hidden; } */ .ptx-content a > tt { font-size: 110%; } .ptx-content section .videolink a:link { background-size: 0; } .ptx-content .playvideo { cursor: pointer; } .ptx-content .videobig { padding-right: 0.3em; padding-left: 0.3em; font-size: 85%; /* background: #ffff66; */ background-color: rgba(255,255,100,0.9); display: inline-block; position: relative; top: 100px; cursor: zoom-in; } .ptx-content .videobig.nofigure { /* not actually used */ } .ptx-content .knowl .videobig { display: none; } .ptx-content .videosmall { padding-right: 0.3em; padding-left: 0.3em; font-size: 80%; background-color: rgba(255,255,100,0.9); display: inline-block; position: absolute; left: -250px; z-index: 1001; cursor: zoom-out; } .ptx-content .exercise-like ol li table { margin-bottom: 0.5em; } .ptx-content .exercise-like > ol li + li { margin-top: 0.5em; } .ptx-content .solution > ol li + li { margin-top: 0.5em; } /* should be the default .ptx-content section.worksheet > .heading, .ptx-content section section.worksheet > .heading, .ptx-content section section section.worksheet > .heading { display: block; } */ .ptx-content section.worksheet > .heading > .codenumber { display: inline-block; vertical-align: top; } .ptx-content section.worksheet > .heading > .title { display: inline-block; max-width: 70%; } .ptx-content .heading .print-links { display: inline-block; float: right; vertical-align: top; width: 19%; text-align: right; } .standalone .ptx-content .heading .print-links { display: none; } .standalone.worksheet .previous-button, .standalone.worksheet .up-button, .standalone.worksheet .next-button { display: none; } .standalone.worksheet .ptx-navbar .toc-toggle { display: none; } .standalone.worksheet .ptx-content [data-knowl]:hover, .standalone.worksheet .ptx-content [data-knowl]:active, .standalone.worksheet .ptx-content [data-knowl].active { background: none; color: black; } .standalone.worksheet .ptx-content [data-knowl]::after { border: none; } .standalone.worksheet .ptx-content .knowl-content { padding: 0; } .standalone.worksheet .ptx-content article > .knowl-output.original { margin: 0; } .ptx-content .appendix .heading > .type { display: inline; } .ptx-content .heading.hide-type > .type { display: none; } .ptx-content .heading .print-links > a { font-family: "Open Sans"; font-size: 0.6em; font-weight: bold; padding: 0.1em 0.2em; background: #ffa; border: 2px solid green; } .ptx-content .heading .print-links > a.us { background: #eef; color: #9b1c2c; border-color: #041E42; } .ptx-content .heading .print-links > a + a { margin-left: 0.25em; } .ptx-content .autopermalink { position: absolute; display: inline-block; top: 3px; left: -1.9em; font-size: 85%; color: #a00; opacity: 0.05; margin-top: 0.1em; } .ptx-content li > .para > .autopermalink { left: -3.4em; top: 0; } .ptx-content .autopermalink a { color: #a00; } .ptx-content .autopermalink > * { padding-left: 0.2em; padding-right: 0.2em; } /* when jumping to a permalink, push down so sticky navbar does not cover */ :target { /* scroll-snap-margin-top: 45px; for safari, except it doesn't work */ scroll-margin-top: 45px; } .ptx-content .para > .autopermalink { margin-top: 0.2em; } .ptx-content .exercises > .autopermalink, .ptx-content .introduction > .autopermalink, .ptx-content .glossary > .autopermalink { margin-top: 0.3em; /* margin-top: 1em; */ } .ptx-content .appendix > .autopermalink, .ptx-content .chapter > .autopermalink, .ptx-content .index > .autopermalink, .ptx-content .section > .autopermalink { margin-top: 0.3em; /* margin-top: 2.7em; */ } .ptx-content .subsection > .autopermalink, .ptx-content .references > .autopermalink, .ptx-content .exercises > .autopermalink { margin-top: 0.3em; /* margin-top: 2.0em; */ } .ptx-content .figure-like > .autopermalink { margin-top: 1.4em; } .ptx-content .subsubsection > .autopermalink { margin-top: 0; } .ptx-content .exercisegroup > .autopermalink { /* margin-top: 0.3em; */ margin-top: 1.4em; } .ptx-content .autopermalink:hover { opacity: 1; background: #eeddff; } .ptx-content .permalink-alert { position: absolute; top: -3em; left: 5em; padding: 1.5em 2em; background: #fff; border: 3px solid blue; z-index: 2001; } .navbar .indexnav { position: absolute; top: 46px; right: 0; } .mininav { float: left; padding-top: 0.7ex; padding-left: 1ex; } /* the index at the back of the book */ .indexjump { margin-left: 1.5ex; margin-top: 0.2ex; padding-top: 0; float: left; line-height: 0.95; } .indexjump a { padding-left: 2.5px; padding-right: 0.5px; width: 2.5ex; /* * * omitted, because we put a space in the source * padding-right: 3px; * */ margin-right: -1px; color: inherit; font-size: 80%; text-align: center; } .indexjump a::after{ content: ""; display: inline-block; } .indexjump a:nth-of-type(14){ padding-left: 1.8ex; } .indexjump a:last-child { padding-right: 10px; } .indexjump a:hover { background: #eeaaff; } .ptx-content .indexitem { margin-top: 2px; } .ptx-content .subindexitem { margin-left: 2em; font-size: 95%; margin-top: -1px; } .ptx-content .subsubindexitem { margin-left: 3.5em; font-size: 95%; margin-top: -1px; } .ptx-content .indexknowl { margin-left: 0.11em; } .ptx-content em + .indexknowl { margin-left: -0.25em; } .ptx-content .indexknowl a { margin-left: 2em; } .ptx-content .indexitem .see, .ptx-content .subindexitem .see, .ptx-content .subsubindexitem .see { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .seealso, .ptx-content .subindexitem .seealso, .ptx-content .subsubindexitem .seealso { margin-left: 1em; margin-right: 0; } .ptx-content .indexitem .see em, .ptx-content .subindexitem .see em, .ptx-content .subsubindexitem .see em, .ptx-content .indexitem .seealso em, .ptx-content .subindexitem .seealso em, .ptx-content .subsubindexitem .seealso em { margin-right: 0.25em; font-style: italic; } /* note that multiple things after "see" are in separate spans */ .ptx-content .indexitem .see + .see, .ptx-content .subindexitem .see + .see, .ptx-content .subsubindexitem .see + .see, .ptx-content .indexitem .seealso + .seealso, .ptx-content .subindexitem .seealso + .seealso, .ptx-content .subsubindexitem .seealso + .seealso { margin-left: 0; margin-right: 0; } .ptx-content .indexitem .indexknowl { font-size: 90%; } .ptx-content .indexitem [data-knowl], .ptx-content .subindexitem [data-knowl], .ptx-content .indexitem [data-knowl]:hover { padding-right: 2px; padding-left: 2px; } .ptx-content .indexknowl [data-knowl]:hover, .ptx-content .indexknowl .active[data-knowl] { margin-left: 2em; } .ptx-content .subindexitem .indexknowl { font-size: 95%; } .ptx-content .subsubindexitem .indexknowl { font-size: 95%; } .ptx-content .indexletter { margin-top: 1.5em; } /* end index */ .ptx-content .hidden-knowl-wrapper .heading { display: inline; } .ptx-content .heading + .hidden-knowl-wrapper { display: inline; } .ptx-content .cols2 .knowl-output, .ptx-content .cols3 .knowl-output, .ptx-content .cols4 .knowl-output, .ptx-content .cols5 .knowl-output, .ptx-content .cols5 .knowl-output { width: 100%; } .ptx-content .cols2 + *, .ptx-content .cols3 + *, .ptx-content .cols4 + *, .ptx-content .cols5 + *, .ptx-content .cols6 + * { clear: both; } /* does the next line eliminate the need for the previous line? */ .ptx-content .cols2::after, .ptx-content .cols3::after, .ptx-content .cols4::after, .ptx-content .cols5::after, .ptx-content .cols6::after { content: ""; display: block; clear: both; } .ptx-content section > ol:last-child, .ptx-content section > ul:last-child { margin-bottom: 1.5em; } /* because of */ /* .ptx-content .colsN > li:last-child { padding-bottom: 1em; } */ .ptx-content section > ol:last-child > li:last-child, .ptx-content section > ul:last-child > li:last-child { padding-bottom: 0em; } /* does this do anything which is not accomplished by the colsN::after above? */ /* seems not .ptx-content .cols2:last-child::after, .ptx-content .cols3:last-child::after, .ptx-content .cols4:last-child::after, .ptx-content .cols5:last-child::after, .ptx-content .cols6:last-child::after { content: ""; display: block; clear: both; } */ .ptx-content .cols2 > li:nth-child(2n+1), .ptx-content .cols3 > li:nth-child(3n+1), .ptx-content .cols4 > li:nth-child(4n+1), .ptx-content .cols5 > li:nth-child(5n+1), .ptx-content .cols6 > li:nth-child(6n+1) { clear: left; } /* need to repeat for .colsN */ .ptx-content .exercise-like ol.cols2 li { margin-top: 0.5em; } .ptx-content .cols2 > li, .ptx-content .cols3 > li, .ptx-content .cols4 > li, .ptx-content .cols5 > li, .ptx-content .cols6 > li { float: left; } .ptx-content .incontext { display: block; font-size: 85%; text-align: right; } .ptx-content .terminology { font-style: italic; font-weight: bold; } .ptx-content .emphasis { font-style: italic; } .ptx-content .emphasis .emphasis { font-weight: bold; } /* the "pink flash" when navigating to a target */ :target { animation: target-fade 15s 1; } @-webkit-keyframes target-fade { 0% { background-color: rgba(120,0,120,.3); } 100% { background-color: inherit; opacity: 1; } } @-moz-keyframes target-fade { 0% { background-color: rgba(120,0,120,.3); } 100% { background-color: inherit; opacity: 1; } } .ptx-content .autoterm [knowl], .ptx-content .autoterm [knowl]:after { font-weight: inherit; color: inherit; padding: 0; margin-bottom: inherit; border-bottom: inherit; border-bottom-color: inherit; } .ptx-content .autoterm [knowl]:hover { background: #ffddff; border-top: 2px dotted purple; border-bottom: 1px dotted red; border-top-left-radius: 0; border-top-right-radius: 0; } .ptx-content ol li.custom-list-style-type { list-style-type: none; } .ptx-content ol li.custom-list-style-type:before { content: attr(label) "\00A0\00A0 "; } .ptx-content ol.no-marker, .ptx-content ul.no-marker, .ptx-content li.no-marker { list-style-type: none; } .ptx-content ol.decimal { list-style-type: decimal; } .ptx-content ol.lower-alpha { list-style-type: lower-alpha; } .ptx-content ol.upper-alpha { list-style-type: upper-alpha; } .ptx-content ol.lower-roman { list-style-type: lower-roman; } .ptx-content ol.upper-roman { list-style-type: upper-roman; } .ptx-content ul.disc { list-style-type: disc; } .ptx-content ul.square { list-style-type: square; } .ptx-content ul.circle { list-style-type: circle; } .ptx-content ol.no-marker, .ptx-content ul.no-marker { list-style-type: none; } /* needed for dl, but probably won't cause harm elsewhere */ .ptx-content section, .ptx-content article, .ptx-content figure { clear: both; } /* dl is used for glossaries and descriptions lists. Glossaries are simple: bold word by itself on a line. Definition indented on the next line. Vertical space before the next term. Description lists are more complicated. The wider version (refering to the horizontal indentation of the definition; this is the default) has the (wrapped) term inline with the definition. The narrow version is complicated because the term is inline with its definition if it fits, otherwise it is on the line above. That means the vertical space between entries can't be handled by a top margin on the dt. Instead we have an ::after on the dd . */ .ptx-content dl { margin-top: 1em; margin-left: 0; margin-bottom: 0; overflow: hidden; } .ptx-content dl dd { margin-top: 0; } .ptx-content dl dd::after { content: ""; display: block; clear: both; } .ptx-content dl.glossary dt { margin-top: 1.25em; } .ptx-content dl.description-list dt, .ptx-content dl.description-list dd { margin-top: 1em; } .ptx-content dl.description-list.narrow dt { margin-top: 0; } .ptx-content dl.glosary dt:first-of-type, .ptx-content dl.description-list dt:first-of-type, .ptx-content dl.glosary dd:first-of-type, .ptx-content dl.description-list dd:first-of-type { margin-top: 0; } .ptx-content dl dd .para { margin-top: 1em; } .ptx-content dl dt > .para:first-child, .ptx-content dl dd > .para:first-child { margin-top: 0; } .ptx-content dl > dt { font-weight: bold; max-width: 55ex; } .ptx-content dl.description-list dt { float: left; clear: left; text-align: right; width: 18ex; } .ptx-content dl.description-list.narrow dt, .ptx-content dl.glossary dt { text-align: left; } .ptx-content dl.glossary dd { margin-left: 5ex; } .ptx-content dl.description-list dd { margin-left: 22ex; } .ptx-content dl.description-list.narrow dd { margin-left: 12ex; } .ptx-content dl.description-list dt:first-of-type { clear: none; } .ptx-content dl.description-list.narrow dd::after { content: ""; display: block; height: 1em; clear: left; } .ptx-content dl.description-list.narrow dd:last-child::after { height: 0; } .ptx-content dl.description-list dt { float: left; clear: both; margin-right: 1ex; } .ptx-content dl.description-list.narrow dt { width: unset; max-width: 55ex; text-align: left; } .ptx-content dl.description-list.narrow dd { margin-left: 0; margin-top: 0; width: 31em; max-width: calc(100% - 12ex); float: right; clear: right; } .ptx-content dl.description-list + * { clear: both; } @media screen and (max-width: 480px) { .ptx-content dl.description-list dt { float: none; margin-left: 0; text-align: left; } .ptx-content dl.description-list dd, .ptx-content dl.description-list.narrow dd { margin-top: 0.5em; margin-left: 3em; max-width: calc(100% - 3em); } } /* where do we have nested dl? */ .ptx-content dl.description-list dl dt { width: 8ex; } .ptx-content dl.description-list dd dd { margin-left: 18ex; } .ptx-content dl.description-list dl dd { margin-left: 12ex; } .ptx-content [data-knowl] > mjx-mrow .TEX-I { font-family: MJXZERO !important; font-style: normal !important; } /* remove this when MathJax fixes the bug that was setting the width to 0 */ /* as in $x=0$. becomes $x=0\text{.}$ */ .ptx-content .knowl mjx-mtext > mjx-utext, .ptx-content mjx-mtext > mjx-utext { width: revert !important; } .ptx-content mjx-msup mjx-utext, .ptx-content mjx-msub mjx-utext { display: inline; } /* to stop things being blue when rendering MathJax with SVG */ a.mjx-svg-href { fill: inherit; stroke: inherit; } .displaymath + .para { margin-top: 0 } /* for long math formulas and tables to scroll on small screens */ @media screen and (max-width: 943px) { .ptx-content .displaymath { position: relative; overflow-x: auto; } /* maybe the remainder of this case is subsumed by the above, and also does not apply to MJ3 */ .ptx-content .mjx-chtml.MJXc-display { /*Allow users on smaller screens to scroll equations*/ /*horizontally when they don't fit on the screen*/ overflow-x: auto; overflow-y: hidden; } .ptx-content .figure-like { overflow-x: auto; } .ptx-content #MathJax_ZoomFrame { position: static; background: white; } .ptx-content #MathJax_Zoom { background-color: inherit; border: 0; padding: 0; position: absolute; overflow-x: auto; overflow-y: visible; left: 10% !important; max-height: none !important; } } /* http://sites.wcsu.edu/mbxml/OER_Linear_Alg/glossary.html to fix the extra margin on top of the next term when the previous definition ends in display math May need to make less specific */ .ptx-content dd .displaymath:last-child .MJXc-display { margin-bottom: 0; } .floatnav { margin-top: 8px; margin-left: 50px; } .floatnav a { padding-left: 3px; /* * omitted, because we put a space in the source padding-right: 3px; */ margin-right: -1px; color: inherit; } /* Example 4.8 of sample article (compare main page of sample book (4^{th} edition)`*/ .ptx-content a .heading .mjx-chtml { z-index: 1; background: #fff; } .ptx-content .hidden-knowl-wrapper [data-knowl]::after, .ptx-content .hidden-knowl-wrapper [data-knowl]:hover::after, .ptx-content .hidden-knowl-wrapper .active[data-knowl]::after { right: 7px; } .floatnav a:hover { background: #eeaaff; } .ptx-content .unselectable { /* from Alex Jordan */ user-select: none; /* Non-prefixed version, currently not supported by any browser */ } /* Adapted from William Hammond (attributed to David Carlisle) */ /* "mathjax-users" Google Group, 2015-12-27 */ .ptx-content .latex-logo {font-family: "PT Serif", "Times New Roman", Times, serif;} .ptx-content .latex-logo .A {font-size: 75%; text-transform: uppercase; vertical-align: .5ex; margin-left: -.48em; margin-right: -.2em;} .ptx-content .latex-logo .E {vertical-align:-.5ex; text-transform: uppercase; margin-left: -.18em; margin-right: -.12em; } .ptx-content .fillin { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.underline { display: inline-block; border-bottom-style: solid; border-width: 1px; margin-right: 0.1em; margin-bottom: -0.25em; } .ptx-content .fillin.box { display: inline-block; border: none; margin-left: 0.1em; margin-right: 0.1em; margin-bottom: -0.25em; outline: 1px solid black; height: 1.3em; } .ptx-content .fillin.shade { display: inline-block; border: none; margin-right: 0.1em; margin-left: 0.1em; margin-bottom: -0.25em; background-color: #eee; height: 1.3em; } /* * .hiddenproof */ /* knowlified proofs are in an article.hiddenproof */ /* .ptx-content .hiddenproof .heading, ???? can't happen, because the a does the hiding? */ .ptx-content .hiddenproof > a > .heading { font-style: italic; font-weight: normal; } /* show wide equation overflow even when no scroll bars, from Jiří Lebl */ .ptx-content .MJXc-display, .ptx-content .knowl-output .knowl-output .knowl-output .knowl-output .MJXc-display , .ptx-content pre.prettyprint, .ptx-content pre.plainprint, .ptx-content pre.console, .ptx-content .code-box { background-image: linear-gradient(to right, white, white), linear-gradient(to right, white, white), linear-gradient(to right, rgba(0,0,0,.25), rgba(255,255,255,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(255,255,255,0)); background-position: left center, right center, left center, right center; background-repeat: no-repeat; background-color: inherit; background-size: 20px 100%, 20px 100%, 10px 100%, 10px 100%; background-attachment: local, local, scroll, scroll; } .ptx-content .runestone .code-box { background-image: none; } .ptx-content .knowl-output .MJXc-display { background-image: linear-gradient(to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient(to right, var(--knowlbackground), var(--knowlbackground)), linear-gradient(to right, rgba(0,0,0,.25), var(--knowlbackground)), linear-gradient(to left, rgba(0,0,0,.25), var(--knowlbackground)); } /* this should have a variable name, maybe? */ .ptx-content .knowl-output.original .MJXc-display { background: inherit; } .ptx-content .assemblage-like .MJXc-display { /* background-image: none; background-image: linear-gradient(to right, #f4f4fe, #f4f4fe), linear-gradient(to right, #f4f4fe, #f4f4fe), linear-gradient(to right, rgba(0,0,0,.25), rgba(242,242,254,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(242,242,254,0)); */ background-image: linear-gradient(to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient(to right, var(--assemblagebackground), var(--assemblagebackground)), linear-gradient(to right, rgba(0,0,0,.25), var(--assemblagebackground)), linear-gradient(to left, rgba(0,0,0,.25), var(--assemblagebackground)); } .ptx-content .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient(to right, #fffff5, #fffff5), linear-gradient(to right, #fffff5, #fffff5), linear-gradient(to right, rgba(0,0,0,.25), rgba(255,255,243,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(255,255,243,0)); } .ptx-content .knowl-output .knowl-output .knowl-output .MJXc-display { background-image: none; background-image: linear-gradient(to right, #fff5fe, #fff5fe), linear-gradient(to right, #fff5fe, #fff5fe), linear-gradient(to right, rgba(0,0,0,.25), rgba(255,243,254,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(255,243,254,0)); } /* not sure where this was being used, but it made short knowls * look bad, like the hint here: * SAFurtherReading.html */ .ptx-content .knowl-output .knowl-content > *:last-child:not(.incontext) { margin-bottom: 0.5em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like, .ptx-content .knowl-output .knowl .knowl-content > .solution-like:not(.incontext) { margin-bottom: 0.15em; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.hint { border-left: 1px solid #0f0; padding-left: 0.35em; background: #efe; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.answer { border-left: 2px solid #00f; padding-left: 0.35em; background: #eef; } .ptx-content .knowl-output .knowl .knowl-content > .solution-like.solution { border-left: 3px solid #c0c; padding-left: 0.5em; background: #fef; } .ptx-content .knowl-content > article:first-child, .ptx-content .knowl-content > .solution-like:first-child { /* padding, not margin, to get colored background (and not be absorbed) */ padding-top: 0.25em; } .ptx-content .exercisegroup > .conclusion { margin-left: 1.5em; } .ptx-content .exercise-like .introduction { display: inline; } .ptx-content .exercise-like .introduction .heading { display: inline; } .ptx-content .exercise-like .introduction .para:first-child { display: inline; } .ptx-content .exercise-like .introduction::after { content: ""; display: block; } .ptx-content .exercise-like .conclusion::before { content: ""; display: block; margin-top: 0.25em; } .ptx-content .exercisegroup .exercisegroup-exercises.cols2, .ptx-content .exercisegroup .exercisegroup-exercises.cols3, .ptx-content .exercisegroup .exercisegroup-exercises.cols4, .ptx-content .exercisegroup .exercisegroup-exercises.cols5, .ptx-content .exercisegroup .exercisegroup-exercises.cols6 { width: 100%; display:inline-flex; flex-direction:row; flex-wrap:wrap; justify-content:flex-start; align-items:flex-start; align-content:flex-start; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 { display:inline; } .ptx-content .exercisegroup .exercisegroup-exercises.cols1 .knowl-output { display: block; } .ptx-content .exercisegroup .cols1 > article.exercise-like {flex-basis: calc(100% - 2em);} .ptx-content .exercisegroup .cols2 > article.exercise-like {flex-basis: calc(50% - 2em);} .ptx-content .exercisegroup .cols3 > article.exercise-like {flex-basis: calc(33.33% - 2em);} .ptx-content .exercisegroup .cols4 > article.exercise-like {flex-basis: calc(25% - 2em);} .ptx-content .exercisegroup .cols5 > article.exercise-like {flex-basis: calc(20% - 2em);} .ptx-content .exercisegroup .cols6 > article.exercise-like {flex-basis: calc(16.66% - 2em);} /* math directly adajacent to words is wrapped to avoid bad line breaks */ .ptx-content .mathword { white-space: nowrap; } .ptx-content .unit, .ptx-content .quantity { white-space: nowrap; word-spacing: -0.25ex; margin-right: 0.125em; } .ptx-content .unit sub, .ptx-content .unit sup, .ptx-content .quantity sub, .ptx-content .quantity sup { word-spacing: normal; } .ptx-content .code-inline, .ptx-content .code-block, .ptx-content .console, .ptx-content .program, .ptx-content .program code { font-family: "Inconsolata", monospace; } .ptx-content .code-block, .ptx-content .console, .ptx-content .program { overflow-x: auto; } .ptx-content .code-inline { font-size: 1em; white-space: pre; color: inherit; background: #eeeeee; border: 1px solid #dddddd; padding: 0.0625em 0.25em; margin-left: 0.2em; margin-right: 0.2em; border-radius: 0.2em; } .ptx-content .code-inline:first-child { margin-left: 0; } .ptx-content .title .code-inline { padding-left: 0; padding-right: 0; margin-left: 0; margin-right: 0; } .ptx-content a .code-inline { background: #f6f6f6; } .ptx-content .kbdkey { background: #f1f1f1; border: 1px solid #dddddd; border-radius: 3px; padding: 1px 2px 0 2px; vertical-align: 0.1em; font-size: 110%; line-height: 1; box-shadow: 2px 2px grey; display: inline-block; margin-right: 3px; } .ptx-content .kbdkey { color: #333; } .ptx-content .sagecell_sessionOutput pre { font-family: 'Inconsolata', monospace; } .ptx-content .sagecell { white-space: normal; margin-top: 1.25em; margin-bottom: 1.25em; } .ptx-content .sage-interact.sagecell { margin: 0; } .ptx-content .sagecell_evalButton { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px; padding: 0 0.65em; } .ptx-content .sagecell_evalButton { cursor: pointer; display: inline-block; vertical-align: middle; /* Disable accidental text-selection */ user-select: none; /* Truncate overflowing text with ellipsis */ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-width: 1px; border-style: solid; font-weight: bold; border-radius: 3px; } .ptx-content .sagecell_evalButton { color: #383838; background-image: linear-gradient(#f7f7f7, #bbbbbb); border-color: #c4c4c4; } .ptx-content .sagecell_evalButton:hover { color: #181868; background-image: linear-gradient(#bbbbbb, #f7f7f7); } .ptx-content .sagecell_evalButton:focus, .ptx-content .sagecell_evalButton:active { color: #20160b; background-image: linear-gradient(#ff6852, #ffd7d1); border-color: #ff2822; } .ptx-content .sagecell .sagecell_editor { margin-bottom: 8px; } .ptx-content .booktitle { font-style: oblique; } .ptx-content .objectives > .heading, .ptx-content .outcomes > .heading { font-size: 1.25em; } /* Born-hidden example with a very long title */ /* http://physics.thomasmore.edu/ConnectedPhysics/sss-netforce.html */ .ptx-content a .heading { white-space: normal; } .ptx-content .solutions > a, .ptx-content .solutions > a:hover, .ptx-content .solutions > a.active, .ptx-content .instructions > a, .ptx-content .instructions > a:hover, .ptx-content .instructions > a.active { display: inline-block; margin-right: 1.5em; } /* When the knowl is a Hint, Answer, or Solution, put a little triangle in front of it */ .ptx-content .solutions > a::before, .ptx-content .instructions > a::before { content: '\25ba'; font-size: 70%; color: #06a; position: relative; top: -2px; right: 3px; } .ptx-content .solutions > a.active::before, .ptx-content .instructions > a.active::before { content: '\25bc'; animation-name: solutiontriangle; animation-duration: 3s; animation-iteration-count: 1; } .ptx-content .solutions > a[data-knowl]::after, .ptx-content .instructions > a[data-knowl]::after { left: 12px; } @keyframes solutiontriangle { from {content: '\25ba';} to {content: '\25bc';} } .ptx-content section.solutions { font-size: 90%; padding-left: 1em; border-left: 1em solid #eeeeee; } .ptx-content.ptx-content > section.solutions:first-child { padding-left: 0; border-left: none; } .ptx-content article.example-like > .solution-like, .ptx-content article.exercise-like > .solution-like { margin-top: 1.0em; padding-left: 0.7em; } .ptx-content article.example-like > .solution-like > .heading, .ptx-content article.exercise-like > .solution-like > .heading { font-size: 100%; font-weight: 700; margin-right: 0.25em; display: inline; } .ptx-content article.example-like > .solution-like > .heading + .para, .ptx-content article.exercise-like > .solution-like > .heading + .para { display: inline; } /* these were taken from the local add-on.css. * need to check if the are needed. */ .ptx-content article > figure:first-child { margin-top: 0; } .ptx-content figure + figure, .ptx-content figure + .sidebyside, .ptx-content .sidebyside + .sidebyside, .ptx-content article + figure, .ptx-content .sidebyside + figure { padding-top: 1.0em; } .ptx-content img { display: inline-block; margin-left: auto; margin-right: auto; } /* is .cs for commutative diagrams? */ .ptx-content img.cs { display: block; margin-top: 20px; margin-bottom: 20px; margin-left: auto; margin-right: auto; } .ptx-content img:not(.cs) { max-width: 650px; } .ptx-content .tabular-box.natural-width table { margin-left: auto; margin-right: auto; } .ptx-content figure img { display: block; margin-left: auto; margin-right: auto; } .ptx-content figure img + img { margin-top: 30px; } .ptx-content div.center img { display: block; margin-left: auto; margin-right: auto; } .ptx-content div.center + div.center > img { margin-top: 60px; } .ptx-content div.center > img + img { margin-top: 60px; } .ptx-content figure table { margin-left: auto; margin-right: auto; } .ptx-content .caption { margin-top: 10px; margin-left: auto; margin-right: auto; font-size: 100%; text-align: center; } .ptx-content figure.wrap img { width: 250px; } .ptx-content figure.wrap { float: right; margin-right: 0; margin-left: 30px; } .ptx-content figure img.wrap { float: right; margin: 0; } .ptx-content figure figcaption.wrap { margin: 10px; font-size: 100%; text-align: center; } .ptx-content figure, .ptx-content .image-box { margin-top: 0.5em; } .ptx-content figure.listing { margin-top: 1em; } .ptx-content figure .image-box { margin-top: 0; } .ptx-content .sidebyside figure { margin-top: 0; } .ptx-content .image-box img, /* See sample article Graphics section */ .ptx-content img.contained, /* See sample article Graphics section */ .ptx-content .sbspanel img { /* previously these were hard-coded in the HTML */ width: 100%; height: auto; } /* these seem to be obsolete because an img has to be in a .image-box . Check on that. .ptx-content .sbspanel > img:not(.draw_on_me):not(.mag_popup), .ptx-content figure > img:not(.draw_on_me):not(.mag_popup), .ptx-content figure > div > img:not(.draw_on_me):not(.mag_popup), */ .ptx-content .image-box > img:not(.draw_on_me):not(.mag_popup) { cursor: zoom-in; } .ptx-content img.mag_popup { border: 1px solid #666; box-shadow: 4px 6px 4px #999; cursor: zoom-out; max-width: 600px; } .ptx-content .mag_popup_container { width:100%; position:absolute; z-index:1001; overflow-x: visible; } .ptx-content .image-box, .ptx-content .audio-box, .ptx-content .video-box, .ptx-content .asymptote-box { position: relative; } .ptx-content .image-box .asymptote-box iframe.asymptote, .ptx-content iframe.asymptote, .ptx-content .video-box .video, .ptx-content .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .ptx-content section > .audio-box, .ptx-content section > .video-box, .ptx-content section > .image-box { margin-top: 0.75em; } .ptx-content .audio { width: 100%; } .caption .heading { font-weight: bold; } .caption .counter { font-weight: bold; } .ptx-content div.quote { padding-left: 40px; padding-right: 10px; margin-bottom: 1em; } .minipage + .minipage { display: inline-block; } .ptx-content code.inline { background: none; border: none; } /* These next are for Prism */ .ptx-content pre.program, .ptx-content pre.program code, .ptx-content pre.code-block, .ptx-content pre.code-block code { line-height: 1.1; } .ptx-content section > .code-box, .ptx-content .para + .code-box, .ptx-content section > .code-block, .ptx-content .para + .code-block { margin-top: 1em; } .ptx-content pre.program, .ptx-content pre.code-block { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; } .ptx-content pre.program:before, .ptx-content pre.code-block:before { content:' '; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 3.0em; } .ptx-content pre[data-line].program, .ptx-content pre[data-line].code-block { padding-left: 2.5em; } .ptx-content pre[data-line].program:before, .ptx-content pre[data-line].code-block:before { margin-left: -5em; } .ptx-content pre.program.line-numbers, .ptx-content pre.code-block.line-numbers { padding-left: 3.5em; overflow: visible; } .ptx-content pre.program.line-numbers:before, .ptx-content pre.code-block.line-numbers:before { margin-left: -7em; } /* fine tune next 3 based on line-height of surrounding pre */ .ptx-content pre[data-line].line-numbers code { padding-top: 0em; /* increase with line-height */ } .ptx-content pre[data-line].line-numbers .line-highlight { margin-top: 0em; /* decreases as line-height increases */ } .ptx-content pre[data-line]:not(.line-numbers) .line-highlight { margin-top: 0.6em; /* decreases as line-height increases */ } /* next is for the old code formatting js */ .ptx-content pre.prettyprint, .ptx-content pre.plainprint { margin-top: 0; padding-left: 15px; border-left: 1px solid #aaa; font-size: 93%; overflow: auto; /* preveiously turned off the border and padding from pretty.css */ } .ptx-content pre.prettyprint:before, .ptx-content pre.plainprint:before { content:''; font-size: 50%; border-top: 1px solid #aaa; display: block; margin-right: auto; margin-left: -15px; width: 2.5em; } .ptx-content .objectives { margin-bottom: 1.25em; } .ptx-content ol > li { padding-left: 0.25em; } .ptx-content ol.cols2 > li, .ptx-content ul.cols2 > li { width: calc(49% - 1.75em); min-width: 190px} /* .ptx-content ol.cols2 > li, .ptx-content ul.cols2 > li { width: 50%; min-width: 240px} */ .ptx-content ol.cols3 > li, .ptx-content ul.cols3 > li { width: calc(33% - 1.25em); min-width: 160px} /* .ptx-content ol.cols3 > li, .ptx-content ul.cols3 > li { width: 31%; min-width: 160px} */ .ptx-content ol.cols4 > li, .ptx-content ul.cols4 > li { width: calc(24.5% - 1.25em); min-width: 100px} .ptx-content ol.cols5 > li, .ptx-content ul.cols5 > li { width: calc(19.5% - 0.75em); min-width: 90px} .ptx-content ol.cols6 > li, .ptx-content ul.cols6 > li { width: calc(16.3% - 0.5em); min-width: 80px} /* sample-article sec 5 */ .ptx-content ul.cols2 > li:nth-child(odd), .ptx-content ol.cols2 > li:nth-child(odd) { margin-right: 2em; } /* .ptx-content .cols2 > li:first-child, .ptx-content .cols3 > li:first-child, .ptx-content .cols4 > li:first-child, .ptx-content .cols5 > li:first-child, .ptx-content .cols6 > li:first-child { margin-top: 0.5em; } */ .ptx-content .cols2 ol, .ptx-content .cols3 ol, .ptx-content .cols4 ol, .ptx-content .cols5 ol, .ptx-content .cols6 ol { padding-left: 0.7em; } .ptx-content .exercisegroup-exercises > article.exercise-like { margin-top: 1em; } /* see http://bob.cs.sonoma.edu/IntroCompOrg-RPi/exercises-10.html for examples of an odd number of items in a cols2, followed by a hint */ .ptx-content .cols2 > li:last-child:nth-child(odd) { float: none !important; padding-top: 0.5em; } /* http://spot.pcc.edu/math/APEXCalculus/sec_prod_quot_rules.html * solution to Example 2.4.14 */ .ptx-content .solution ol li { margin-top: 1em; padding-left: 0.5em; } /* solution to Example 4.2.12 in http://spot.pcc.edu/math/orcca-draft/orcca/section-radical-expressions-and-rational-exponents.html */ .ptx-content .solution ol li > .para:first-child, .ptx-content .solution ol li > .displaymath:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .solution ol li > .displaymath:first-child .MJXc-display { margin-top: 0; } .ptx-content .exercise-like ol li { margin-top: 1em; padding-left: 0.5em; } .ptx-content .exercise-like > .cols2 > li { width: calc(49% - 2.5em)} .ptx-content .exercise-like > .cols3 > li { width: calc(33% - 2.5em)} .ptx-content .exercise-like > .cols4 > li { width: calc(24.5% - 2.5em)} .ptx-content .exercise-like > .cols5 > li { width: calc(19.5% - 2.5em)} .ptx-content .exercise-like > .cols6 > li { width: calc(16.3% - 2.5em)} /* A colsN in a knowl needs to be narrower because of the margin/padding of the knowl */ .ptx-content .knowl .exercise-like > .cols2 > li { width: calc(49% - 2em)} /* next 4 not actually checked: just copied from cols2 */ .ptx-content .knowl .exercise-like > .cols3 > li { width: calc(33% - 2em)} .ptx-content .knowl .exercise-like > .cols4 > li { width: calc(24.5% - 2em)} .ptx-content .knowl .exercise-like > .cols5 > li { width: calc(19.5% - 2em)} .ptx-content .knowl .exercise-like > .cols6 > li { width: calc(16.3% - 2em)} .ptx-content .exercise-like ol li > .para:first-child { vertical-align: top; display: inline-block; margin-top: 0; } .ptx-content .contributor .contributor-name { font-variant: small-caps; } .ptx-content .contributor .contributor-info { font-size: 88%; font-style: italic; margin-left: 3ex; } .ptx-content .contributor { margin-top: 3ex; } .ptx-content .contributor + .contributor { margin-top: 1.5ex; } .ptx-content .contributor + .para { margin-top: 3ex; } .ptx-content .frontmatter .contributors, .ptx-content .book .contributors { text-align: center; font-style: normal; } .pretext .searchwrapper { max-width: 900px; position: absolute; right: 0; bottom: 0; margin-bottom: 39px; } .pretext .searchwrapper .cse .gsc-control-cse, .searchwrapper .gsc-control-cse { padding: 0; border: none; width: 25ex; } .pretext .searchwrapper .cse .gsc-search-button input.gsc-search-button-v2, .searchwrapper input.gsc-search-button-v2 { padding: 2px 2px; } .pretext .searchwrapper form.gsc-search-box { margin: 0; } .pretext .searchwrapper table.gsc-search-box { margin: 0; } .pretext .searchwrapper .gsc-search-box-tools .gsc-search-box .gsc-input { padding: 0; } .pretext .searchwrapper .gsib_a { padding: 0 0 0 5px; } .pretext .searchwrapper .gsc-input-box { height: 3.0ex; } .pretext .searchwrapper form.gsc-search-box { font-size: 12px; } /* turn off the green parentheses Alex does not like */ .ptx-content div.CodeMirror span.CodeMirror-matchingbracket {color: #090;} .ptx-content .image-archive { margin-left: auto; margin-right: auto; margin-bottom: 0; /* was auto */ margin-top: 0.75em; padding-bottom: 0.25em; text-align: center; } .ptx-content .image-archive > a { display: inline-block; padding-left: 0.5em; padding-right: 0.5em; font-family: monospace; } .ptx-content iframe { margin: 0; border: none; box-sizing: border-box; } .ptx-content .times-sign { font-size: larger; vertical-align: -0.15ex; } /* temporary for Geogebra development: replace with a more restrictive selector for articles */ .ptx-content article.notranslate { margin-top: 0; } /* nested tasks. see https://pretextbook.org/examples/sample-article/html/interesting-corollary.html#aBc */ /* 9/27/23 added "article" because of details.exercise-like */ .ptx-content article.exercise-like > .exercise-like { margin-left: 40px; } .ptx-content article.exercise-like > .exercise-like.task { margin-left: 20px; } .ptx-content article.exercise-like > .exercise-like > .para { margin-top: 1.25em; /* margin-bottom: 0.25em; */ } .ptx-content article.example-like > .heading + .introduction { display: inline; } .ptx-content article.example-like > .heading + .introduction > .para:first-child { display: inline; } .ptx-content article.example-like > .exercise-like > .para { margin-top: 1.25em; } /* end of nested tasks */ /* genus and species in italics */ .ptx-content .taxon { font-style: italic; } /* Sage stuff */ .ptx-content .sageanswer { font-family: monospace; white-space: pre; margin-left: 3em; margin-bottom: 2em; } .ptx-content .sageanswer .key { display: inline-block; vertical-align: top; margin-right: 1em; } .ptx-content .sageanswer .output { display: inline-block; vertical-align: top; } .ptx-content .CodeMirror-code pre.CodeMirror-line { padding-bottom: 5px; /* the next item is the CodeMirror default, which was previously over-ridden */ padding-left: 6px; } /* used when knowl content is hidden in the page */ .ptx-content .hidden-content, .pretext .hidden-content { /* things will be different after 2022 overhaul */ display: none; } .ptx-content hr.ptx-pagebreak { width: 30em; text-align: center; margin-left: auto; margin-right: auto; margin-bottom: 2.0em; margin-top: 0; height: 4em; border: 0; border-bottom: 1px dashed #ccc; } .ptx-content hr.ptx-pagebreak:after { content: "page"; display: inline-block; position: relative; top: 4.0em; font-size: 80%; padding: 0 0.25em; background: white; } /* See 10.1.8c in http://faculty.valpo.edu/calculus3ibl/ch10_01_gradient.html and condider having this replace line 3338 of the general code (which uses .heading + p) */ .ptx-content .example-like > .exercise-like > .para:first-of-type { display: inline; } .ptx-content .example-like > .exercise-like > .aside-like { margin-top: -3em; } .ptx-content .example-like > .exercise-like > .aside-like.front { margin-top: 0; } .ptx-content meta { display: none; } .ptx-content .summary-links a { color: #671d12; background: #f0f0f0; text-decoration: none; cursor: pointer; } .ptx-content .summary-links a:hover, .ptx-content .summary-links a:focus { color: white; background: #671d12; } .ptx-content .summary-links a .codenumber { color: #303030; margin-right: 0.41667em; } .ptx-content .summary-links a:hover .codenumber, .ptx-content .summary-links a:focus .codenumber { color: #f0f0f0; } .ptx-content .summary-links { margin-top: 4em; } .ptx-content section + .summary-links { margin-top: 2em; } .ptx-content .summary-links ul { list-style-type:none; } .ptx-content .summary-links li { margin-top: 0; } .ptx-content section .summary-links li .title { font-style: normal; } .ptx-content .summary-links a { position: relative; display: block; font-size: 1.5em; line-height: 1.25em; padding: 0.41667em 0.83333em; margin-top: 0.20833em; border-radius: 3px; padding-right: 2.06667em; } .ptx-content .summary-links a:after { right: 0.83333em; } .ptx-content .summary-links a:after { content: ""; position: absolute; /* center vertically */ top: 50%; margin-top: -0.4em; width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid #c9c9c9; } .ptx-content .summary-links a, .ptx-content .summary-links a:link, .ptx-content .summary-links a:visited { cursor: pointer; } .ptx-content .summary-links a:hover:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a { font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-content .summary-links a { font-size: 1em; line-height: 1.25em; } } .ptx-content .summary-links a .codenumber { margin-right: 0.41667em; } .ptx-content .summary-links a:active { position: relative; color: white; background: #932919; text-decoration: none; box-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px 5px inset; } .ptx-content .summary-links a:active:after { width: 0; height: 0; border-top: 0.4em solid transparent; border-bottom: 0.4em solid transparent; border-left: 0.4em solid white; } .ptx-content .summary-links a:focus { outline: thin dotted #333; outline-offset: -2px; /** * Remove stupid inner dotted border applied by Firefox on focus * See http://stackoverflow.com/a/199319/1599617 */ } /* also see section > heading for worksheets, maybe around line 1200 */ /* one-page documents in the browser */ body.standalone.worksheet .ptx-content .onepage > .heading { margin-top: 0; font-size: 1.3em; } body.standalone.worksheet .ptx-content .onepage > .introduction { margin-top: 0.4em; } body.standalone.worksheet .ptx-content .onepage > .introduction > .heading { font-size: 1.1em; } body.standalone.worksheet .ptx-content .onepage .solutions, body.standalone.worksheet .ptx-content .onepage .instructions { display: none; } body.standalone .ptx-content .worksheet { /* padding: 40px 45px 45px 55px; */ padding: 40px 0 45px 0; border: 2px solid grey; margin: 0; /* height: 1243px; */ } body.standalone .ptx-content .onepage { /* padding: 40px 45px 45px 55px; padding: 0 0 45px 0; */ padding: 40px 45px 45px 55px; border-bottom: 2px solid grey; margin: 0; /* height: 1243px; */ } body.standalone .ptx-content .onepage + .onepage { /* padding-top: 40px; */ border-top: 2px solid grey; } /* there may be worksheet content before the first page or after the last page */ body.standalone .ptx-content .onepage.firstpage { padding-top: 0 } body.standalone .ptx-content .onepage.lastpage { padding-bottom: 0; border-bottom: none; } body.standalone .ptx-content .worksheet > *:last-child { padding-bottom: 0 !important } .ptx-content .onepage + .onepage { margin-top: 2.5em; padding-top: 1.5em; border-top: 1px dashed #aaa; } .ptx-content .onepage + .onepage::before { content: "pagebreak"; text-align: center; margin-left: 40%; padding-left: 1em; padding-right: 1em; position: absolute; top: -0.8em; font-size: 80%; font-style: italic; background: white; } body.standalone .ptx-content .onepage + .onepage { margin-top: 10px; } body.standalone .ptx-content .onepage + .onepage::before { content: none; } body.standalone .ptx-content .onepage article { padding-left: 0; border: none; } body.standalone .ptx-content .onepage article::after { all: unset; } .ptx-content .onepage > .para:first-child, .ptx-content .onepage > article:first-child { margin-top: 0; } .ptx-content section + .onepage.firstpage, .ptx-content article + .onepage.firstpage, .ptx-content .para + .onepage.firstpage { margin-top: 1.25em; } /* not good, because of image next to image .ptx-content .onepage .sbspanel + .sbspanel { padding-left: 1.25em; border-left: 1px solid grey; margin-left: -1.25em; } */ body.worksheet .ptx-content .onepage .sbspanel + .sbspanel > .exercise::before { content: ""; position: absolute; top: 0; bottom: 0; right: 0; left: 0; padding-left: 1.25em; border-left: 1px solid grey; margin-left: -1.25em; z-index: -100; /* to not block editable content */ } body.standalone.worksheet .ptx-content section article.task { margin-left: 0; } body.standalone.worksheet .ptx-content section article.task > .heading { font-weight: normal; } body.standalone .autopermalink { display: none; } body.standalone.worksheet .ptx-content .onepage .workspace { border: 2px dotted grey; background: #f3fff3; /* Sally suggests light and dark blue background: linear-gradient( #eef 0px, #eef 200px, #eef 200px, #99f 205px, #99f 205px, #99f 100%) */ } body.standalone.worksheet .ptx-content .onepage .workspace.squashed { border: 2px dotted grey; background: #ffe; } body.standalone.worksheet .ptx-content .onepage .workspace.squashed.tight { border: 15px solid; border-image: repeating-linear-gradient( -35deg, #f33, #f33 10px, #000 10px, #000 20px ) 20; /* background: linear-gradient( #ff0 0%, #ff0 8%, #000 8%, #000 9%, #ff6 9%, #ff6 17%, #555 17%, #555 19%, #ff8 19%, #ff8 26%, #777 26%, #777 29%, #ffa 29%, #ffa 37%, #aaa 37%, #aaa 41%, #ffd 41%, #ffd 48%, #ccc 48%, #ccc 52%, #ffd 52%, #ffd 59%, #aaa 59%, #aaa 63%, #ffa 63%, #ffa 71%, #777 71%, #777 74%, #ff8 74%, #ff8 81%, #555 81%, #555 83%, #ff6 83%, #ff6 91%, #000 91%, #000 92%, #ff0 92%, #ff0 100% ); */ background: yellow; } body.has-sidebar-left.mathbook-loaded.standalone.worksheet .ptx-page .ptx-main { margin-left: 0; } body.standalone.worksheet .ptx-content .goal-like { border: none; padding: 0; } body.standalone.worksheet .ptx-content .goal-like > .heading { margin-top: -0.5em; padding: 0; margin: 0; font-size: 1.1em; } body.standalone.worksheet .ptx-content section.worksheet > .heading { display: inline; font-size: 1.1em; } /* becaues the worksheet has no side margins but the .onepage does */ body.standalone.worksheet .ptx-content section.worksheet > .heading, body.standalone.worksheet .ptx-content section.worksheet > .objectives, body.standalone.worksheet .ptx-content section.worksheet > .introduction, body.standalone.worksheet .ptx-content section.worksheet > .conclusion { margin-left: 55px; margin-right: 40px; } body.standalone.worksheet .ptx-content section.worksheet > .heading + .para { display: inline; } /* printing for one-page worksheets */ .ui-dialog.ui-widget.ui-widget-content.ui-corner-all.ui-draggable.ui-resizable { left: 0 !important; top: 0 !important; } /* move to the color file(s) and figure out next comment */ /* .ptx-content a.internal { color: #900; } .ptx-content a.internal:hover { background-color: #ddf; } */ /* check whether class="url" under Endnotes in pretext-epub.xsl can be changed to class = "external"*/ .ptx-content a.url, .ptx-content a.external { color: #22a; } .ptx-content a.url:hover, .ptx-content a.external:hover { background: #ffd; } /* .ptx-content a.internal:hover, .ptx-content a.external:hover, .ptx-content a.internal:focus, .ptx-content a.external:focus { text-decoration: underline; } */ /* style for poems */ .ptx-content .poem { margin-top: 1.5em; } .ptx-content .poem { display: table; margin-top: 1.5em; margin-left: auto; margin-right: auto; margin-bottom: 0; width: auto; max-width: 90%; } .ptx-content .poem > .heading { display: block; text-align: center; } .ptx-content section article.poem > .heading::after { content: ""; } .ptx-content .poem > .heading > .title { font-weight: bold; font-size: 1.2em; line-height: 1.2em; } .ptx-content .poem .author { font-style: italic; margin-top: 0.75em; } .ptx-content .poem .author.left { text-align: left; } .ptx-content .poem .author.center { text-align: center; } .ptx-content .poem .author.right { text-align: right; } .ptx-content .poem .stanza > .heading { text-align: center; font-weight: bold; font-size: 1em; line-height: 1em; } .ptx-content .poem .stanza + .stanza { margin-top: 1em; } .ptx-content .poem .heading + .stanza { margin-top: 0.2em; } .ptx-content .poem .heading + .line { margin-top: 0.2em; } .ptx-content .poem .line.left { text-align: left; margin-left: 4em; text-indent: -4em; } .ptx-content .poem .line.center { text-align: center; } .ptx-content .poem .line.right { text-align: right; } .ptx-content .poem .tab { margin-left: 2em; } /* GeoGebra calculator */ .calculator-container { position: fixed; z-index: 100; bottom: 5px; right: 5px; /* width: 320px; */ width: 253px; /* height: 600px; */ height: 460px; } @media screen and (max-width: 800px) { .calculator-container { bottom: 50px !important; } } .toolBPanel { overflow: hidden !important; } .toolBPanel:hover { overflow: auto !important; } #aboelkins-ACS .ptx-main .ptx-content > section:first-of-type > section:first-of-type > .project-like:first-of-type li { font-size: 300% } /* WW problems */ .ptx-content .wwprob table.attemptResults { margin-left: 2em; background: #efefef; padding: 0.2em; } .ptx-content .wwprob table.attemptResults + .attemptResultsSummary { margin-top: 1em; } .ptx-content .wwprob .problem-main-form { margin-top: 1em; background: #eeeeff; padding: 0.5em; } .ptx-content .wwprob td.ResultsWithoutError { background: #9f9; } .ptx-content .wwprob td.ResultsWithError { background: #f99; } .ptx-content .wwprob tr th { text-align: center; padding: 0.2em 1em 0.2em 1em; } .ptx-content .wwprob tr td { text-align: center; } .ptx-content .wwprob tr td:empty { background: #fff; } .ptx-content .wwprob ol, .ptx-content .wwprob ul { margin-top: 0.75em !important; } .ptx-content .wwprob .problem { background: #fdfdfd; } .ptx-content .wwprob .problem a { text-decoration: none; } .ptx-content .wwprob #footer { font-size: 70%; text-align: right; } .ptx-content .marginresource { position: relative; height: 0; left: 40em; top: 1em; } .ptx-content .marginresource a { color: blue; } .ptx-content .marginresource a[knowl] { border-bottom: 1px dotted blue; } .ptx-content .marginresource .icon { font-size: 200%; margin-right: 1em; display: inline-block; } .ptx-content .marginresource .resource_description { display: inline-block; } .ptx-content .marginresource .resource_links { display: block; margin-left: 2em; } .collectedworks .knowl-output { border: 12px solid #D6E3FF; background: none repeat scroll 0% 0% #FAFCFF; border-radius: 4px; margin-bottom: 1.25em; } .collectedworks .subjectwork { max-width: 750px; } .collectedworks .bib { margin-bottom: 1em; } .collectedworks .bibitem + .bibentry { display: inline; } .collectedworks .bibitem { display: inline; font-weight: bold; margin-right: 1em; } .collectedworks .work .title a { text-decoration: none; color: #009; } .collectedworks .work .title { } .iconlegend { position: absolute; margin-top: 0.5em; top: 0; left: 920px; line-height: 1; } .iconlegend .icon_name { font-size: 90%; margin-right: 1em; } .icongroup + .icongroup { margin-left: 1em; } /* interactive WeBWorK */ label.webwork { display:inline-flex; flex-direction:column; } label.correct .status { background-color: #a0f0a0; } label.partly-correct .status { color: #ffcc66; } label.incorrect .status { color: #b00; } label.incorrect .status::before { content: " "; } .feedback { word-wrap:break-word; } label.correct .feedback { background-color: #00ffcc; } label.partly-correct .feedback { color: #ffcc66; } label.incorrect .feedback { color: #e07070; } .ptx-content .webwork-button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; background-color: #ffffff; } .ptx-content .webwork-button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .webwork-button:active { cursor: pointer; background-color: #a0a0a0; border: 1px solid #999; } .webwork img, .webwork + .knowl-output img {max-width:100%;} .ptx-content .exercise-wrapper form button { border-radius: 3px; padding: 0px 3px 0px 3px; border: 1px solid #999; color: black; background-color: #ffffff; } .ptx-content .webwork-button.activate { width: 22px; height: 22px; background-image: url('https://raw.githubusercontent.com/openwebwork/webwork2/main/htdocs/images/favicon.ico'); background-size: contain; position: absolute; right: -35px; } article.project-like > .heading + div.ptx-runestone-container > div.runestone, article.exercise-like > .heading + div.ptx-runestone-container > div.runestone { margin-top: 0.5em; } /* hack for runestone */ /* .ptx-content .exercise-wrapper form button.btn-success { background-color: #5cb85c; } */ /* to undo Runestone's presentermode.css */ .ptx-content .bottom { position: unset; } /* to undo Runestone's draganddrop.css */ .ptx-content .rsdraggable { font-size: 100%; } .ptx-content .exercise-wrapper form button:hover { cursor: pointer; background-color: #e0e0ff; border: 1px solid #000; } .ptx-content .exercise-wrapper form button:active { background-color: #f0f0f0; } .ptx-content .exercise-wrapper form button + button { margin-left: 0.8em; } .ptx-content .exercise-wrapper, .ptx-content .exercise-wrapper form, .ptx-content .exercise-wrapper form > div:first-child { display: inline-block; vertical-align: top; width: 100%; /* for live ww to open at 100% wide */ } .ptx-content .knowl .exercise-wrapper, .ptx-content .knowl .exercise-wrapper form, .ptx-content .knowl .exercise-wrapper form > div:first-child { width: 100%; } /* .ptx-content .exercise-wrapper form { max-width: 95%; } */ .ptx-content .exercise-wrapper > .para:first-child, .ptx-content .exercisegroup .exercise-wrapper > .para:first-child { margin-top: 0; display: inline; } /* next is realted to having exercises start in-line with their exercise number, including when a static WW problem is made interactive */ /* not sure this was the right way to do it */ /* see https://opentext.uleth.ca/apex-calculus/sec_antider.html#exercise-722 */ .ptx-content .heading + .exercise-wrapper { display: inline-block; max-width: 95%; width: 100%; } /* .ptx-content .exercisegroup .heading + .exercise-wrapper { width: auto; } */ .ptx-content .cols2 .heading + .exercise-wrapper { width: auto; } /* next two need to be separate due to limitations in Chrome and Safari */ @media screen and (max-width: 600px) { .ptx-content .exercisegroup .cols2 > article.exercise-like {flex-basis: calc(100% - 2em);} .ptx-content .exercisegroup .cols3 > article.exercise-like {flex-basis: calc(100% - 2em);} .ptx-content .exercisegroup .cols4 > article.exercise-like {flex-basis: calc(50% - 2em);} .ptx-content .exercisegroup .cols5 > article.exercise-like {flex-basis: calc(50% - 2em);} .ptx-content .exercisegroup .cols6 > article.exercise-like {flex-basis: calc(33.3% - 2em);} .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } @media screen and (max-width: 850px) and (min-width: 786px) { .ptx-content .exercisegroup .cols2 > article.exercise-like {flex-basis: calc(100% - 2em);} .ptx-content .exercisegroup .cols3 > article.exercise-like {flex-basis: calc(100% - 2em);} .ptx-content .exercisegroup .cols4 > article.exercise-like {flex-basis: calc(50% - 2em);} .ptx-content .exercisegroup .cols5 > article.exercise-like {flex-basis: calc(50% - 2em);} .ptx-content .exercisegroup .cols6 > article.exercise-like {flex-basis: calc(33.3% - 2em);} .ptx-content .exercisegroup .cols2 .heading + .exercise-wrapper { max-width: 100%; } } .APEXlogo { white-space: nowrap; } .APEXlogo .A { margin-right: -0.07em; } .APEXlogo .P { margin-right: -0.33em; position: relative; top: -0.30em; } .APEXlogo .E { position: relative; top: 0.33em; } /* testing */ .runestone-profile .dropdown-content { position: absolute; display: none; right: 0; top: 35px; text-align: left; border: 1px solid; border-color: #600; border-color: var(--tocborder); } .runestone-profile.dropdown:hover { background-color: #ddd; overflow: visible; } .runestone-profile.dropdown:hover .dropdown-content { display: block; } .runestone-profile .dropdown-content { background-color: white; z-index: 1800; min-width: 100px; padding: 5px; } .runestone-profile .dropdown-content a { display: block; text-decoration: none; color: #662211; padding: 2px 8px; } .runestone-profile.dropdown .dropdown-content a:hover { background-color: #671d12; color: #ffffff; text-decoration: none; background-color: var(--chaptertoc); } .runestone-profile.dropdown .dropdown-content hr { margin-bottom: 4px; margin-top: 4px; border-color: #600; border-color: var(--sectiontoctext); } ================================================ FILE: css/legacy/pretext_search.css ================================================ .searchresultsplaceholder article { width: 60%; margin-left: auto; margin-right: auto; font-family: sans-serif; } .searchbox { /* height: 60px; border: solid; border-radius: 5px; background-color: #eeee; */ /* position: absolute; top: 37px; right: 0; */ } .ptxsearch { height: 35px; flex: 1 1; } .searchbutton .name { display: none; } .searchwidget { /* padding-top: 15px; padding-left: 20px; font-size: larger; */ text-align: right; } .searchwidget input { /* font-size: larger; */ } .helpbox { display: none; } .detailed_result { margin-bottom: 10px; } .all_results a:link { text-decoration: none; font-size: large; } .all_results a:hover { background-color: lightgray; } .searchresults a:hover { background-color: #eee; } .searchresults a { text-decoration: none; color: #222; } .searchresults a:hover { text-decoration: underline; color: #33f; } .searchresults ul li { list-style-type: none; } ol.searchresults { padding-left: 10px; margin-top: 0; overflow-y: auto; flex: 1 1; } ol.searchresults > li { list-style-type: none; } .search-result-score { display: none; } .high_result { font-weight: 700; } .medium_result { font-weight: 500; } .low_result { font-weight: 200; } .no_result { font-weight: 200; color: #444; } .detailed_result .no_result { font-size: 90%; } .searchresultsplaceholder { position: fixed; top: 5vh; bottom: 5vh; left: 152px; width: 600px; padding: 1em; border: 0.2em solid #009; background: aliceblue; z-index: 5000; display: flex; flex-direction: column; } .search-results-heading { border-bottom: 1px solid rgba(0,0,125,0.5); } .search-results-controls { display:flex; justify-content: space-between; align-items: stretch; gap: 10px; margin-bottom: 1em; } .closesearchresults { display: flex; justify-content: space-between; align-items: center; border: 1px solid black; } .closesearchresults:hover { color: #c00; background-color: #fee; border-color: #f00; } .closesearchresults + h2 { margin-top: -1em; } .searchempty { display: none; padding-left: 10px; padding-top: 5px; } .search-result-bullet { margin-top: 0.3em; } .search-result-clip { font-size: 80%; font-style: italic; color: #444; padding-left: 15px; } .search-results-unshown-count { margin-top: 0.6em; } .search-result-clip-highlight { background: rgba(255,255,0,0.5); } @media screen and (max-width: 800px) { .searchresultsplaceholder { width: 80vw; left: 10vw; bottom: 10vh; } } ================================================ FILE: css/other/catalog.css ================================================ /* Used by the PreTeXt catalog website */ .projects a { text-decoration: none; } .projects p { margin: 0; } .projects p + p { margin-top: 0.75em; } .projects .category { max-width: 700px; } .projects .fact-sheet-knowl { display: none; } .projects .description-knowl { display: none; } .projects .awards-knowl { display: none; } .projects .book-summary { margin-left: 2em; padding-left: 0.5em; } .projects .book-summary + .book-summary { padding-top: 0.5em; padding-bottom: 0.5em; margin-top: 1em; } .projects .book-summary:nth-of-type(even) { background: #efe; } .projects .badges { margin-top: 0.25em; padding-left: 0.5em; min-height: 30px; } .projects .badges img { max-height: 25px; } .projects .badges img + img { margin-left: 5px; } .projects .badge.award + .badge:not(.award) { margin-left: 2em; } .projects .badge.license { margin-right: 0.5em; float: right; } .projects .biblio > .title { font-style: italic; font-size: 120%; } .projects .biblio > .authors { margin-left: 0.25em; } .projects .category > .title { display: block; margin-top: 1em; margin-bottom: 0.4em; margin-left: 1em; background: #ccf; font-size: 150%; padding: 0.5em 0 0.25em 0.2em; } .projects .blurb { margin-top: 0.2em; padding-left: 0.5em; } .projects .category .blurb .id-ref { /* why that name? */ font-style: italic; font-size: 90%; margin-left: 0.5em; } .projects .category .description { padding: 0.5em 2em 0.5em 2em; } [data-knowl]:hover, [data-knowl]:active, [data-knowl].active { color: #8a1200; background: #ffedeb; /* margin-bottom: 0; */ border-bottom: none; } ================================================ FILE: css/targets/ebook/ebook-common.scss ================================================ // Use this file for anything common to kindle and epub @use 'components/pretext'; @use 'components/chunks/codelike'; @use 'components/chunks/exercises'; @use 'components/chunks/solutions'; @use 'components/chunks/sidebyside'; @use 'components/chunks/discussion-inline'; // TODO... needed??? // @use 'colors/legacy/all_colors.scss'; // @use 'colors/legacy/setcolors.css'; // Note: Not sure if .ptx-content.epub selectors need to be different than the // .ptx-content selectors below. They were different in source files this // was constructed from. .ptx-content.epub { img { display: block; } .solutions { margin-top: 1em; .solution .type, .answer .type { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: bold; } .solution .type + .period, .answer .type + .period { margin-right: 0.75em; } .solution .type + p, .answer .type + p { display: inline; } } article.theorem-like, article.definition-like, article.example-like, article.project-like, article.remark-like, article.openproblem-like, article.openproblems-like, /* delete once markup is fixed */ article.computation-like { margin-left: 1px; } .proof { margin-right: 1px; } } // .ptx-content.epub .ptx-content { // sage cell code goes in a pre. What else goes there? pre { font-size: 95%; padding-top: 0.3em; padding-bottom: 0.5em; padding-left: 0.5em; background: #f0f0f0; } pre.code.input { background: #f0f0ff; } pre.code.output { background: #f0fff0; } // Placeholder template to use for section headings, will be extended // here and in other files // The "break-(before/after) might not actually do anything %section-heading { display: block; margin-top: 0; break-after: avoid !important; } section > .heading { @extend %section-heading; } // Placeholder extended here and in other files %section-heading-p { display: block; break-before: avoid !important; } section > .heading + p { @extend %section-heading-p; } figcaption { break-before: avoid !important; } figure { break-inside: avoid !important; .image-box, .tabular-box { break-after: avoid !important; } } } // .ptx-content /* This CSS is presumably from some page that MathJax created: */ /* a page of HTML, with LaTeX mixed into it, got hit by a */ /* MathJax tool to create a new, derived, HTML page and this */ /* CSS was added to control placment of the math bits. We */ /* started using it in June 2020 (commit: d1e899b5d99ce9bf), */ /* so it is a bit hazy as to the exact origin. */ /* Original code comment: */ /* MathJax CSS, which is placed on enclosing span elements */ /* mjpage: for all math, so only class on online math */ /* mjpage__block: for display math, so additional on "md" */ /* Removed as EPUB 3.0 violation: .mjpage direction: ltr; */ .mjpage .MJX-monospace { font-family: monospace } .mjpage .MJX-sans-serif { font-family: sans-serif } .mjpage { display: inline; font-style: normal; font-weight: normal; line-height: normal; font-size: 100%; font-size-adjust: none; text-indent: 0; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; max-width: none; max-height: none; min-width: 0; min-height: 0; border: 0; padding: 0; margin: 0 } .mjpage * { transition: none; -webkit-transition: none; -moz-transition: none; -ms-transition: none; -o-transition: none } .mjx-svg-href { fill: blue; stroke: blue } .MathJax_SVG_LineBox { display: table!important } .MathJax_SVG_LineBox span { display: table-cell!important; width: 10000em!important; min-width: 0; max-width: none; padding: 0; border: 0; margin: 0 } .mjpage__block { text-align: center; margin: 1em 0em; position: relative; display: block!important; text-indent: 0; max-width: none; max-height: none; min-width: 0; min-height: 0; width: 100% } ================================================ FILE: css/targets/ebook/epub/epub.scss ================================================ /*! Theme: epub */ @use '../ebook-common'; // no extra styles ================================================ FILE: css/targets/ebook/kindle/kindle.scss ================================================ /*! Theme: kindle */ @use '../ebook-common'; .ptx-content { // default behavior is excessive space below display math. // should the selector be .mjpage__block? .mjpage { margin-bottom: 0 !important; vertical-align: -.68ex; } .mjpage + p { margin-top: -0.5em !important; } .solution-like > .type { font-weight: bold; } .solution-like .type + p { display: inline; } // Greg's L was a line too long article.theorem-like::after, article.definition-like::after, article.example-like::after, article.project-like::after, article.remark-like::after, article.computation-like::after { margin-top: -1em; } section { padding-top: 0 !important; } .subsection { margin-top: 1.5em !important; } // kindle has these extra selectors... should epub? // use @extend to mix them in via placeholder in ebook-common.scss section article > .heading { @extend %section-heading; } section article > .heading + p, section article > .heading + .introduction { @extend %section-heading-p; } } ================================================ FILE: css/targets/html/README.md ================================================ HTML themes using the modern tooling. Other than default-modern, the intent is to use city names to identify themes. Ideally, related themes are identified by nearby cities (e.g. Denver and Greeley.) ================================================ FILE: css/targets/html/boulder/_customization.scss ================================================ //$color: var(--primary-color) !default; //$text-color: white !default; @use 'components/page-parts/extras/toc-expand-chevrons'; .hide-type .codenumber:not(:empty)::after { content: ". "; } .ptx-masthead { display: none; } .button.disabled { display: none; } //.ptx-toc { // padding-top:unset; //} //// Top heading followed by no content and then a subsection that starts with heading //section > .heading + section > .heading { // margin-top: 0.5em; //} ================================================ FILE: css/targets/html/boulder/theme-boulder.scss ================================================ /*! Theme: boulder */ // Theme designed for short articles (i.e., research papers) or course documents. // Minimal navigation bar; there is likely only one html page per document. // Current maintainer: Oscar Levin // Variables used by theme. CSSBuilder overrides these by prepending // different definitions for these variables to this file before the theme // is compiled. $primary-color: hsl(270, 40%, 15%) !default; $primary-color-dark: hsl(270, 50%, 50%) !default; $background-color-dark: hsl(270, 10%, 5%) !default; @use "sass:map"; // set some default sizing variables - this will also set up // defaults for expandable mixin @use '../salem/sizing-globals' with ( $content-width: 600px, $content-side-padding: 20px ); // Basic components: @use 'components/pretext-web'; @use '../salem/other-widen'; @use '../denver/parts-paper'; //@use 'shell'; @use 'customization'; @use '../greeley/chunks-greeley'; //@use 'heading-tweaks'; // fonts and colors // $body-font: 'Open Sans' !default; // $heading-font: 'Roboto' !default; @use 'fonts/fonts-google'; // with ($body: $body-font, $heading: $heading-font); @use "colors/color-helpers" as colorHelpers; @use "colors/palette-single-bold" as palette-single with ( $primary-color: $primary-color, ); // primary/secondary color defined as determined by palette-chunks from // color-scheme, primary-color, secondary-color $primary-color: map.get(palette-single.$colors, 'primary-color'); //$secondary-color: map.get(palette-dual.$colors, 'secondary-color'); @use 'colors/palette-dark' as palette-dark with ( $primary-color: $primary-color-dark, $background-color: $background-color-dark, ); $light-colors: map.merge(palette-single.$colors, ( "toclevel1-background": var(--content-background), "toclevel2-background": var(--content-background), "toclevel3-background": var(--content-background), )); $dark-colors: map.merge(palette-dark.$colors, ( "toclevel1-background": var(--content-background), "toclevel2-background": var(--content-background), "toclevel3-background": var(--content-background), )); @include colorHelpers.set-root-colors($light-colors, $dark-colors); ================================================ FILE: css/targets/html/default-modern/_chunks-default.scss ================================================ // Standard collection of chunks. This file should only be modified // to fix bugs or improve the default-modern theme. If you want to // make changes for use in some other theme, create a _chunks-XXX file // in that theme's directory. $border-radius: 8px !default; // One stop include for default style content blocks @use 'components/chunks/asides-floating'; @use 'components/chunks/codelike'; @use 'components/chunks/exercises'; @use 'components/chunks/solutions'; @use 'components/chunks/sidebyside'; @use 'components/chunks/discussion-inline'; @use 'components/chunks/knowls' with ($border-radius: $border-radius); @use 'components/chunks/helpers/L-mixin'; @use 'components/chunks/helpers/box-mixin' with ($border-radius: $border-radius); @use 'components/chunks/helpers/heading-box-mixin'; @use 'components/chunks/helpers/sidebar-mixin'; @use 'components/chunks/helpers/inline-heading-mixin'; // rounded box .assemblage-like { @include box-mixin.box($border-color: var(--assemblage-like-border-color), $background-color: var(--assemblage-like-body-background)); } // box with title inset on top .goal-like { @include heading-box-mixin.box( $background-color: var(--goal-like-body-background), $border-color: var(--goal-like-border-color) ); } // L-border .theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like { @include L-mixin.border; } // projects get a dotted L .project-like:not(.knowl__content, .born-hidden-knowl) { @include L-mixin.border($style: dotted); } /* proof gets a backwards facing L */ .proof { @include L-mixin.border(1px, $L-side: right); } /* No decorations/borders in knowls, to save space */ .knowl__content { .theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like, .project-like { padding-left: 0; margin-left: 0; border-left: none; &::after { border-bottom: none; display: none; } } } // wide sidebar on an entire section of solutions section.solutions:not(:is(:first-child)) { @include sidebar-mixin.box( $border-width: 10px, $border-color: var(--page-border-color), ); } .paragraphs, article { @include inline-heading-mixin.heading; } ================================================ FILE: css/targets/html/default-modern/_customization.scss ================================================ // turn on some optional design features @use 'components/page-parts/extras/navbar-btn-borders'; @use 'components/page-parts/extras/toc-last-level-plain'; @use 'components/page-parts/extras/toc-borders'; @use 'components/page-parts/extras/toc-expand-chevrons'; // used to expand math and RS blocks @use 'components/helpers/expandable'; // underlines to headings @use 'components/elements/extras/heading-underlines'; // let math stretch out to fill space on right .displaymath { @include expandable.expandable; } .code-display { @include expandable.expandable; } // grow some rs elements $wide-rs-elements: ".parsons_section, .ac_section, .codelens"; .ptx-runestone-container:has(#{$wide-rs-elements}) { @include expandable.expandable($always-expand: true); } // horizontal scroll for tabular boxes .tabular-box { @include expandable.expandable; } ================================================ FILE: css/targets/html/default-modern/_parts-default.scss ================================================ // Left aligned "page" with limited width, beyond which it is centered $max-width: 1200px !default; $sidebar-width: 240px !default; $scrolling-toc: true !default; $nav-height: 36px !default; $content-width: 600px !default; $content-side-padding: 48px !default; $content-side-padding-tight: 28px !default; $navbar-breakpoint: 800px !default; $sidebar-breakpoint: $content-width + $sidebar-width + $content-side-padding * 2; $content-with-padding-width: $content-width + 2 * $content-side-padding; @use 'components/page-parts/body' with ( $max-width: $max-width, $content-width: $content-width, $content-side-padding: $content-side-padding, ); @use 'components/page-parts/banner' with ( $navbar-breakpoint: $navbar-breakpoint, ); @use 'components/page-parts/navbar' with ( $nav-height: $nav-height, $navbar-breakpoint: $navbar-breakpoint, ); @use 'components/page-parts/toc-default' with ( $scrolling: $scrolling-toc, $sidebar-width: $sidebar-width, $sidebar-breakpoint: $sidebar-breakpoint, $navbar-breakpoint: $navbar-breakpoint, ); @use 'components/page-parts/footer' with ( $navbar-breakpoint: $navbar-breakpoint, ); // Decrease the side margins once out of room @container ptx-main (width < #{$content-with-padding-width}) { .ptx-page > .ptx-main { .ptx-content { padding-left: #{$content-side-padding-tight}; padding-right: #{$content-side-padding-tight}; max-width: calc($content-width + 2 * #{$content-side-padding-tight}); } } } ================================================ FILE: css/targets/html/default-modern/theme-default-modern.scss ================================================ /*! Theme: default-modern */ // Variables used by theme. CSSBuilder overrides these by prepending // different definitions for these variables to this file before the theme // is compiled. $palette: 'blue-red' !default; $primary-color: null !default; $secondary-color: null !default; $primary-color-dark: #698aa8 !default; $background-color-dark: #23241f !default; @use "sass:map"; // --------------------------------------------- // components and layout @use 'parts-default'; @use 'chunks-default'; @use 'components/pretext-web' with ( $navbar-breakpoint: parts-default.$navbar-breakpoint, ); // --------------------------------------------- // fonts and colors @use 'fonts/fonts-google'; @use "colors/color-helpers" as colorHelpers; @use 'colors/palette-dual' as palette-dual with ( $palette: $palette, $primary-color: $primary-color, $secondary-color: $secondary-color, ); // primary/secondary color defined as determined by palette-dual using // $palette, $primary-color, $secondary-color $primary-color: map.get(palette-dual.$colors, 'primary-color'); $secondary-color: map.get(palette-dual.$colors, 'secondary-color'); @use 'colors/palette-dark' as palette-dark with ( $primary-color: $primary-color-dark, $background-color: $background-color-dark, ); // --------------------------------------------- // extra customizations @use './customization'; // --------------------------------------------- // concrete rules / includes that generate CSS // render the actual colors @include colorHelpers.set-root-colors(palette-dual.$colors, palette-dark.$colors); ================================================ FILE: css/targets/html/denver/_chunks-denver.scss ================================================ $border-radius: 0 !default; $chunk-heading-font-size: 1.125em !default; // One stop include for heading-box dominant content blocks @use 'components/chunks/asides-floating' with ( $float-width: 200px, $float-offset: -365px, $min-float-width: 1450px ); @use 'components/chunks/codelike'; @use 'components/chunks/exercises'; @use 'components/chunks/solutions'; @use 'components/chunks/sidebyside'; @use 'components/chunks/knowls' with ($border-radius: $border-radius); @use 'components/chunks/helpers/box-mixin' with ($border-radius: $border-radius); @use 'components/chunks/helpers/heading-box-mixin' with ( $border-radius: $border-radius, $margin-top: 2.5em, $heading-color: var(--block-head-color), $heading-background: var(--block-border-color) ); @use 'components/chunks/helpers/sidebar-mixin' with ($border-width: 4px); @use 'components/chunks/helpers/C-box-mixin' with ($border-radius: $border-radius); @use 'components/chunks/helpers/horizontal-bars-mixin'; @use 'components/chunks/helpers/inline-heading-mixin'; @mixin chunk-heading { & > .heading { font-size: $chunk-heading-font-size; } } .theorem-like { @include heading-box-mixin.box( $background-color: var(--theorem-like-body-background), $border-color: var(--theorem-like-border-color), $heading-background: var(--theorem-like-border-color), ); @include chunk-heading; } .definition-like { @include heading-box-mixin.box( $background-color: var(--definition-like-body-background), $border-color: var(--definition-like-border-color), $heading-background: var(--definition-like-border-color), ); @include chunk-heading; } .assemblage-like { @include heading-box-mixin.box( $background-color: var(--assemblage-like-body-background), $border-color: var(--assemblage-like-border-color), $heading-background: var(--assemblage-like-border-color), ); @include chunk-heading; } .project-like { & > .heading { font-style: italic; font-size: 1.125em; } @include chunk-heading; @include heading-box-mixin.box( $background-color: var(--content-background), $border-color: var(--project-like-border-color), $heading-background: var(--content-background), $heading-color: var(--body-text-color), ); } .proof { padding-bottom: 1.5em; padding-left: 1em; padding-right: 1em; &::after { content: "\220E"; position: absolute; right: 0; bottom: 1.5em; } .heading { display: inline; font-size: unset; font-weight: bolder; } @include inline-heading-mixin.heading; } .solution-like { .heading { display: inline; font-style: italic; font-size: unset; } } .remark-like { @include sidebar-mixin.box( $border-color: var(--remark-like-border-color), $background-color: var(--remark-like-body-background), $padding: 10px, $border-width: 6px, $border-radius: $border-radius, ); @include chunk-heading; } .goal-like { @include horizontal-bars-mixin.bars( $border-color: var(--goal-like-border-color), $font-style: italic, $padding: 0.7em ); @include chunk-heading; } .example-like { @include C-box-mixin.box( $border-color: var(--example-like-border-color), $heading-background: var(--example-like-border-color) ); @include chunk-heading; } .exercise-like.born-hidden-knowl { @include C-box-mixin.box( $border-color: var(--exercise-like-border-color), $heading-background: var(--exercise-like-border-color) ); @include chunk-heading; } // Inline exercises get C-box styling. But we don't want this on any other exercise-like // Last one captures exercise-like in activated webwork. .exercise-like:not(.project-like .exercise-like, .exercise-like .exercise-like, .exercises .exercise-like, .reading-questions .exercise-like, .task, .worksheet .exercise-like, .problem-content .exercise-like) { @include C-box-mixin.box( $border-color: var(--exercise-like-border-color), $heading-background: var(--exercise-like-border-color) ); @include chunk-heading; } .computation-like { @include C-box-mixin.box( $border-color: var(--computation-like-border-color), $heading-background: var(--computation-like-border-color) ); @include chunk-heading; } /* No decorations/borders in knowls, to save space */ .knowl__content { border: none; .theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like, .project-like, .commentary { padding-left: 0; margin-left: 0; border-left: none; &::after { border-bottom: none; display: none; } } } // Keep heading inline for divisional exercises and all tasks (the parent of the .exercise-like will have class .exercises). .exercises .exercise-like, .worksheet .exercise-like, .task { @include inline-heading-mixin.heading; } ================================================ FILE: css/targets/html/denver/_customizations.scss ================================================ $color: var(--primary-color) !default; $text-color: white !default; @use 'components/page-parts/extras/toc-expand-chevrons'; .hide-type .codenumber:not(:empty)::after { content: " "; } //Give navbar a gradient background .ptx-navbar { background: linear-gradient(to bottom, var(--banner-background), var(--navbar-background)); .button:not(.copy-embed-button) { background: linear-gradient(to bottom, var(--banner-background), var(--navbar-background)); // Turn off background-image (linear gradient) on hover so it behaves like a solid color button &:hover:not(.disabled) { background-image: none; } &.open { background-image: none; } } } // Apply blocks of colors to headings when not in dark mode //:root { // &:not(.dark-mode) { // section > .heading{ // background: var(--primary-color-white-30); // padding: 5px; // padding-left: 15px; // color: var(--page-color); // border-radius: 2px; // } // // Section heading is extra dark // section.section > .heading{ // background-color: var(--primary-color); // } // } //} ================================================ FILE: css/targets/html/denver/_parts-paper.scss ================================================ //Some basic variables $centered-content: true !default; $scrolling-toc: true !default; $nav-height: 36px !default; $navbar-breakpoint: 800px !default; //The following variables represent the *max* width of everything. When the screen shrinks, we will reduce some of these. // The sidebar contains the TOC. It is left of the page, with a right-margin to separate it. $sidebar-width: 240px !default; $sidebar-right-margin: 80px !default; $sidebar-total-width: $sidebar-width + $sidebar-right-margin; // ptx-content contains the main content. It is contained in ptx-main $content-width: 600px !default; $content-side-padding: 120px !default; $content-side-padding-tight: 20px !default; $sidebar-breakpoint: $content-width + $sidebar-total-width + 24px; // a little extra for padding // ptx-main contains the ptx-content and footer. It has a width equal to the content plus the content's margins. // There is a right margin that counters the size of the sidebar+sidebarmargin. $main-width: $content-width + (2 * $content-side-padding); $main-right-margin: $sidebar-total-width; // ptx-page contains the sidebar and ptx-main. It's width is the sum of main, main-right-margin, and sidebar-total-width. $page-width: $sidebar-total-width + $main-width + $main-right-margin; @use 'components/page-parts/body' with ( $max-width: $page-width, $content-width: $content-width, $content-side-padding: $content-side-padding, $centered-content: $centered-content, ); @use 'components/page-parts/banner' with ( $max-width: $main-width, $navbar-breakpoint: $navbar-breakpoint, ); @use 'components/page-parts/navbar' with ( $max-width: $main-width, $nav-height: $nav-height, $navbar-breakpoint: $navbar-breakpoint, ); @use 'components/page-parts/toc-default' with ( $scrolling: $scrolling-toc, $sidebar-width: $sidebar-width, $sidebar-breakpoint: $sidebar-breakpoint, $navbar-breakpoint: $navbar-breakpoint, ); @use 'components/page-parts/extras/toc-hidden-scrollbar'; //@use 'summary-links'; @use 'components/page-parts/footer' with ( $navbar-breakpoint: $navbar-breakpoint, ); @use '../salem/rs-widen'; // now handle smaller screens for rs elements @media (width < 850px) { @include rs-widen.smaller-screen-widening; } .ptx-main { margin-right: $sidebar-total-width; } .ptx-sidebar.hidden + .ptx-main { margin-left: $sidebar-total-width; } // .ptx-main is the center column - apply page shadow to it .ptx-main { // The color of the shadow is mostly gray, but with a slight tint of the primary color box-shadow: 5px 10px 40px -10px var(--primary-color-gray-80); } @media (prefers-color-scheme: dark) { .ptx-main { // Dark mode shadow is just black box-shadow: 5px 10px 40px -10px black; } } // visually shift the sidebar off the page .ptx-sidebar { //transform: translateX(-$sidebar-right-margin); margin-right: $sidebar-right-margin; } .ptx-navbar { border: none; // move contents button out of navbar-contents and align with sidebar .toc-toggle { transform: translateX(-$sidebar-total-width); position: absolute; left: 0; justify-content: left; } } .ptx-toc { border: none; position: sticky; top: $nav-height; } // Make expanded parts of TOC look more like subsections .toc-item.visible { font-size: .95em; padding-left: 8px; } .ptx-page { margin-top: 36px; margin-bottom: 36px; } // Sidebar hits the left side of page - need to lock it in place $sidebar-lock-breakpoint: $main-width + 2 * $sidebar-total-width; // @debug "$sidebar-lock-breakpoint: #{$sidebar-lock-breakpoint}"; @media screen and (width <= $sidebar-lock-breakpoint) { .ptx-page { margin-left: 0; max-width: 100%; } .ptx-main { margin-right: calc(100% - $main-width - $sidebar-total-width); max-width: $main-width; } .ptx-sidebar.hidden + .ptx-main { margin-right: auto; margin-left: auto; } .ptx-navbar .ptx-navbar-contents { margin-left: $sidebar-total-width; } } // When the the main content is almost to the edge of the screen, we remove the drop-shadow // and change the layout strategy to center the content in what space is available // Sidebar no only consumes minimum required space as whitespace on left/right of main should be equal $page-border-breakpoint: $main-width + $sidebar-width + 2 * $sidebar-right-margin; // @debug "page-border-breakpoint: #{$page-border-breakpoint}"; @media screen and (width <= $page-border-breakpoint) { // main is centered in page .ptx-main { box-shadow: unset; margin-right: auto; // shrink content padding .ptx-content { padding-left: $content-side-padding-tight; padding-right: $content-side-padding-tight; max-width: calc($content-width + 2 * $content-side-padding-tight); } } .ptx-sidebar { margin-right: 0; } // align toc-toggle with right edge of sidebar .ptx-navbar .ptx-navbar-contents { margin-left: $sidebar-width; } .ptx-navbar .toc-toggle { transform: translateX(-$sidebar-width); justify-content: center; } // Reset margins for page now that we don't show box-shadow .ptx-page { margin-top: unset; margin-bottom: unset; } // And lower TOC accordingly .ptx-toc { padding-top: 36px; } } // Now it is time to hide the sidebar unless requested $sidebar-hide-breakpoint: $content-width + 2 * $content-side-padding-tight + $sidebar-width; // @debug "sidebar-hide-breakpoint: #{$sidebar-hide-breakpoint}"; @media screen and (width <= $sidebar-hide-breakpoint) { .ptx-sidebar { display: none; } } //Adjust again when navbar moves to bottom. @media screen and (max-width: $navbar-breakpoint) { // Undo modifications to toc-toggle and margin that held space for it .ptx-navbar .ptx-navbar-contents { margin-left: 0; } .ptx-navbar .toc-toggle { transform: none; position: relative; justify-content: center; } .ptx-content-footer { padding-left: $content-side-padding-tight; padding-right: $content-side-padding-tight; } } // TOC hover spans entire width of TOC item .toc-item:is(:hover, :focus) { color: var(--tocitem-highlight-text-color); background-color: var(--tocitem-highlight-background); border-color: var(--tocitem-highlight-border-color); } .standalone-page { margin: 0; padding: 0; .ptx-page { margin-top: 0; margin-bottom: 0; } .ptx-main { margin-right: auto; margin-left: auto; box-shadow: none; max-width: 100%; } } ================================================ FILE: css/targets/html/denver/theme-denver.scss ================================================ /*! Theme: denver */ // Theme that uses bold content blocks with a visible centered "page" of content // Current maintainer: Oscar Levin // Variables used by theme. CSSBuilder overrides these by prepending // different definitions for these variables to this file before the theme // is compiled. $palette: 'bold' !default; $color-main: null !default; $color-do: null !default; $color-fact: null !default; $color-meta: null !default; $primary-color-dark: hsl(210, 50%, 50%) !default; $background-color-dark: hsl(210, 10%, 10%) !default; @use "sass:map"; @use 'sass:color'; @use "colors/color-helpers" as colorHelpers; // --------------------------------------------- // components // set some default sizing variables - this will also set up // defaults for expandable mixin @use '../salem/sizing-globals' with ( $content-width: 600px, $content-side-padding: 20px ); @use 'parts-paper' with( $scrolling-toc: true, ); @use 'chunks-denver'; @use 'components/pretext-web' with ( $navbar-breakpoint: parts-paper.$navbar-breakpoint, ); @use '../salem/other-widen'; // --------------------------------------------- // fonts and colors $heading-font: 'Noto Sans, Helvetica Neue, Helvetica, Arial, sans-serif' !default; @use 'fonts/fonts-google' with ($heading: $heading-font); // fancy colors for chunks @use 'colors/palette-quad-chunks' as palette-chunks with ( $palette: $palette, $color-main: $color-main, $color-do: $color-do, $color-fact: $color-fact, $color-meta: $color-meta, ); // primary color defined by color-main as determined by palette-chunks $primary-color: map.get(palette-chunks.$colors, 'color-main'); $secondary-color: map.get(palette-chunks.$colors, 'color-meta'); @use 'colors/palette-single' as palette-light with ( $primary-color: $primary-color, // $secondary-color: $secondary-color ); $custom-colors: map.merge(palette-chunks.$colors, ( "example-like-body-background": var(--content-background), "example-like-border-color": var(--color-main), "toclevel1-background": var(--content-background), "toclevel2-background": var(--content-background), "toclevel3-background": var(--content-background), )); $light-colors: map.merge(palette-light.$colors, $custom-colors); @use 'colors/palette-dark' as palette-dark with ( $primary-color: $primary-color-dark, $background-color: $background-color-dark, ); $dark-colors: map.merge(palette-dark.$colors, ( "toclevel2-background": var(--content-background), "toclevel3-background": var(--content-background), "toclevel1-background": var(--content-background), )); // --------------------------------------------- // customizations // @use './shell'; @use './customizations' with ($text-color: colorHelpers.text-contrast($primary-color)); // --------------------------------------------- // concrete rules / includes that generate CSS // render the actual colors @include colorHelpers.set-root-colors($light-colors, $dark-colors); ================================================ FILE: css/targets/html/greeley/_chunks-greeley.scss ================================================ $border-radius: 8px !default; // One stop include for default style content blocks @use 'components/chunks/asides-floating' with ( $float-width: 200px, $float-offset: -365px, $min-float-width: 1450px ); @use 'components/chunks/codelike'; @use 'components/chunks/exercises'; @use 'components/chunks/solutions'; @use 'components/chunks/sidebyside'; @use 'components/chunks/discussion-inline'; @use 'components/chunks/knowls' with ($border-radius: $border-radius); @use 'components/chunks/helpers/L-mixin'; @use 'components/chunks/helpers/box-mixin' with ($border-radius: 0); @use 'components/chunks/helpers/heading-box-mixin'; @use 'components/chunks/helpers/sidebar-mixin'; @use 'components/chunks/helpers/inline-heading-mixin'; .assemblage-like, .goal-like { @include sidebar-mixin.box( $border-width: 4px, $background-color: var(--goal-like-body-background), ); } .theorem-like, .definition-like { .heading { display: block; font-size: 1.1em; } .para { font-style: italic; } } .example-like, .project-like, .remark-like, .openproblem-like, .computation-like, .commentary { > .heading { display: block; font-size: 1.1em; } } .proof { padding-bottom: 1.5em; padding-left: 1em; padding-right: 1em; &::after { content: "□"; position: absolute; right: 0; bottom: 1.5em; } .heading { font-size: unset; font-weight: bold; font-style: italic; } } .solution-like { .heading { display: inline; font-style: italic; font-size: unset; } } .tasks /* No decorations/borders in knowls, to save space */ .knowl__content { border: none; .theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like, .project-like, .commentary { padding-left: 0; margin-left: 0; border-left: none; &::after { border-bottom: none; display: none; } } } // wide sidebar on an entire section of solutions section.solutions:not(:is(:first-child)) { @include sidebar-mixin.box($border-color: var(--solution-border-color)); } .paragraphs, article { @include inline-heading-mixin.heading; } ================================================ FILE: css/targets/html/greeley/_customization.scss ================================================ //$color: var(--primary-color) !default; //$text-color: white !default; @use 'components/page-parts/extras/toc-expand-chevrons'; .hide-type .codenumber:not(:empty)::after { content: ". "; } //:root { // &:not(.dark-mode) { // section > .heading.hide-type { // background: var(--primary-color-white-30); // padding: 5px; // padding-left: 15px; // color: var(--page-color); // border-radius: 2px; // } // // Section heading is extra dark // section.section > .heading{ // background-color: var(--primary-color); // } // } //} //// Top heading followed by no content and then a subsection that starts with heading //section > .heading + section > .heading { // margin-top: 0.5em; //} ================================================ FILE: css/targets/html/greeley/theme-greeley.scss ================================================ /*! Theme: greeley */ // Theme designed for short articles (i.e., research papers). // Current maintainer: Oscar Levin // Variables used by theme. CSSBuilder overrides these by prepending // different definitions for these variables to this file before the theme // is compiled. $palette: 'grays' !default; $primary-color: hsl(214, 59%, 40%) !default; $secondary-color: null !default; $primary-color-dark: hsl(214, 50%, 50%) !default; $background-color-dark: hsl(214, 20%, 10%) !default; @use "sass:map"; // Imports in this file can be either relative to this file or // relative to css/ directory // Basic components: // set some default sizing variables - this will also set up // defaults for expandable mixin @use '../salem/sizing-globals' with ( $content-width: 600px, $content-side-padding: 20px ); @use 'components/pretext-web'; @use '../salem/other-widen'; @use '../denver/parts-paper'; //@use 'shell'; @use 'customization'; @use 'chunks-greeley'; //@use 'heading-tweaks'; // fonts and colors // $body-font: 'Open Sans' !default; // $heading-font: 'Roboto' !default; @use 'fonts/fonts-google'; // with ($body: $body-font, $heading: $heading-font); @use "colors/color-helpers" as colorHelpers; @use "colors/palette-single-bold" as palette-single with ( $primary-color: $primary-color, ); // primary/secondary color defined as determined by palette-chunks from // color-scheme, primary-color, secondary-color $primary-color: map.get(palette-single.$colors, 'primary-color'); //$secondary-color: map.get(palette-dual.$colors, 'secondary-color'); @use 'colors/palette-dark' as palette-dark with ( $primary-color: $primary-color-dark, $background-color: $background-color-dark, ); $light-colors: map.merge(palette-single.$colors, ( "toclevel1-background": var(--content-background), "toclevel2-background": var(--content-background), "toclevel3-background": var(--content-background), )); $dark-colors: map.merge(palette-dark.$colors, ( "toclevel1-background": var(--content-background), "toclevel2-background": var(--content-background), "toclevel3-background": var(--content-background), )); @include colorHelpers.set-root-colors($light-colors, $dark-colors); ================================================ FILE: css/targets/html/legacy/crc/banner_crc.css ================================================ /*** Some PreTeXt overrides ***/ /* @media (min-width: 801px) { .title-container .title { font-size: unset; font-weight: unset; } } */ .ptx-masthead .title-container > .heading { line-height: unset; } /* .ptx-masthead .title-container > .heading { font-family: unset; font-weight: unset; font-size: unset; line-height: unset; color: unset; } */ .ptx-masthead .byline { margin: unset; font-size: unset; line-height: unset; font-family: unset; } .ptx-masthead .ptx-banner { border-top: 1px solid transparent; border-bottom: none; overflow: hidden; padding-top: 0.625em; padding-bottom: 1.125em; } .ptx-content .summary-links a { display: block; padding: .6em; text-decoration: none; font-family: "Open Sans", sans-serif; font-size: 1em; font-weight: 600; border-radius: 5px; } .ptx-content .summary-links a .codenumber { color: var(--bluegreen) } .ptx-content .summary-links a .title { font-weight: 600; } .ptx-content .summary-links a:hover { color: #fff; background: var(--bluegreen); } .ptx-content .summary-links ul, .ptx-content .summary-links ul li { display: grid; list-style-type: none; min-width: 300px; padding-inline-start: 0px; font-family: "Open Sans", sans-serif; justify-items: stretch; margin: 2px auto 3px auto; } .ptx-content .summary-links > ul { /* // text-align: left; */ } @media screen and (min-width: 600px) { .ptx-content .summary-links ul, .ptx-content .summary-links ul li { width: 60vw; max-width: 500px; } } @media screen and (min-width: 700px) { .ptx-content .summary-links ul, .ptx-content .summary-links ul li { width: 55vw; max-width: 500px; } } @media screen and (min-width: 800px) { .ptx-content .summary-links ul, .ptx-content .summary-links ul li { width: 49vw; max-width: 500px; } } /*** End PreTeXt overrides ***/ .ptx-masthead .title-container { font-size: 1em; padding-left: 9.68px; overflow: hidden; } @media screen and (max-width: 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; } } .ptx-masthead .title-container > .heading { margin: 0; font-size: 2em; } .ptx-masthead .title-container > .heading.hide-type .type { display: none; } .ptx-masthead .title-container > .heading.hide-codenumber .codenumber { display: none; } .ptx-masthead .title-container > .heading.hide-title .title { display: none; } /* @media screen and (max-width: 480px) { .ptx-masthead .title-container > .heading { font-size: 1.5em; line-height: 1.25em; margin: 0; margin-bottom: 0.41667em; } } .ptx-masthead .title-container > .heading a { color: #932919; background: none; text-decoration: none; } .ptx-masthead .title-container > .heading a:active { color: #3572a0; } */ .ptx-masthead .title-container > .heading .subtitle { font-weight: normal; } @media screen and (max-width: 800px) { .ptx-masthead .title-container > .heading .subtitle { /* Force the subtitle onto a separate line */ display: block; /* De-emphasize relative to main title */ color: #595959; /* Remove colon */ } .ptx-masthead .title-container > .heading .subtitle:before { content: normal; } } .ptx-masthead .byline { color: #333333; font-size: 1.2em; font-weight: normal; margin: 0; min-height: inherit; } @media screen and (max-width: 480px) { .ptx-masthead .byline { margin-top: 0; font-size: 1em; line-height: 1.25em; } } .ptx-masthead .byline a { color: #333333; } .ptx-masthead .byline a:active { color: #3572a0; } .ptx-masthead .ptx-banner .title-container .heading { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } /* .ptx-masthead-banner */ .ptx-masthead .ptx-banner { /* maybe .ptx-masthead > .ptx-banner? */ max-width: 904px; display: grid; grid-gap: 1em; grid-template-columns: 50px 1fr; grid-template-areas: "ptx-logobox ptx-title-byline-box"; background-color: #fff; /* #fafafa; */ padding: 0px 20px 0px 20px; /* justify-self: stretch; */ } .title-container .title { color: var(--bodytitle); } .title-container .subtitle { color: var(--bodysubtitle); } /* Adjust font sizes by screen sizes */ /* Phones */ .title-container { margin-top: 0px; } .title-container .title { font-size: .6em; font-weight: 600; } .title-container .subtitle { font-weight: normal; font-size: .5em; } /* Larger than mobile */ @media (min-width: 400px) { .title-container { margin-top: 0px; } .title-container .title { font-size: .7em; font-weight: 600; } .title-container .subtitle { font-weight: normal; font-size: .6em; } } /* Larger than phablet (also point when grid becomes active) */ @media (min-width: 550px) { .title-container { margin-top: 3px; } .title-container .title { font-size: .9em; font-weight: 600; } .title-container .subtitle { font-weight: normal; font-size: .7em; } } /* Large screens */ @media (min-width: 801px) { .title-container { margin-top: 5px; } .title-container .title { font-size: 1.0em; font-weight: 600; } .title-container .subtitle { font-weight: normal; font-size: .8em; } } /* .ptx-logobox */ .logo-link { grid-area: ptx-logobox; color: #000; padding: 15px 0px 0px 0px; justify-self: stretch; } /* Fix the width of logo to always be 50px */ /* .ptx-logobox img */ .ptx-masthead .logo-link img { width: 50px; } /* .ptx-title-byline-box */ .title-container { grid-area: ptx-title-byline-box; color: #000; padding: 0px 0px 0px 0px; justify-self: stretch; } /* ptx-searchbox */ .searchbox { grid-area: ptx-searchbox; } ================================================ FILE: css/targets/html/legacy/crc/navbar_crc.css ================================================ /* Since CRC loads after default, we need to suppress some of the default styling */ .ptx-navbar .treebuttons .next-button, .ptx-navbar .treebuttons .up-button, .ptx-navbar .treebuttons .previous-button { float: unset; } .ptx-navbar .previous-button, .ptx-navbar .up-button, .ptx-navbar .next-button, .ptx-navbar .index-button, .ptx-navbar .calculator-toggle, .ptx-navbar .toc-toggle { width: unset; } .ptx-navbar .calculator-toggle { margin-left: unset; margin-right: unset; } .ptx-navbar .index-button .name { padding-top: unset; } .ptx-navbar-contents { display: flex; flex: 1; max-width: 100%; } /* Generic and large screen layout */ .ptx-navbar .toc-toggle, .ptx-navbar .index-button, .ptx-navbar .searchbox { } .ptx-navbar .nav-other-controls { margin-left: 1em; } .ptx-navbar .treebuttons { display: flex; justify-content: right; } .ptx-navbar .button { padding: 0 10px 0 10px; } .ptx-navbar .treebuttons .button { display: flex; justify-content: center; align-items: center; } .ptx-navbar .treebuttons .previous-button { padding-left: 0px; } .ptx-navbar .treebuttons .next-button { padding-right: 0px; } .ptx-navbar .nav-runestone-controls { display: flex; } nav.ptx-navbar { display: grid; grid-column-gap: 0em; grid-template-columns: auto auto auto 1fr 1fr auto; grid-template-areas: "MH-toc-area MH-extras-area1 ptx-searchbox MH-extras-area2 MH-page-navigation-area MH-preferences-area"; background-color: #fff; /* padding: 20px 0px 0px 0px; */ align-items: start; border: 2px solid #ddd; border-top: none; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; z-index: 20; position: sticky; top: 0; align-items: end; min-height: unset; /* to thwart navbar.less */ margin-bottom: 0; /* to thwart navbar.less */ } nav.ptx-navbar::before, nav.ptx-navbar::after { content: none; /* to thwart clearfix.less */ } /* TOC button may be sized differently */ .toc-toggle { display: inline-block; height: 32px; color: #333; font-family: inherit; text-align: center; font-size: .8em; /*11px; */ font-weight: 600; line-height: 32px; letter-spacing: .1rem; text-transform: uppercase; text-decoration: none; white-space: nowrap; background-color: #eee; border-radius: 4px; border: 1px solid #888; cursor: pointer; box-sizing: border-box; margin-right: 2em; } .toc-toggle:hover { background-color: #fafafa; color: black; } /* .ptx-MH-toc-area */ .toc-toggle { grid-area: MH-toc-area; justify-self: start; /* align-self: start; */ } /* .ptx-MH-extras-area */ .index-button { grid-area: MH-extras-area1; justify-self: right; } .calculator-toggle { grid-area: MH-extras-area2; justify-self: left; } .user-preferences-button { justify-self: left; } /* .ptx-page-navigation-area */ .treebuttons { grid-area: MH-page-navigation-area; justify-self: end; display: flex; width: 100%; /* align-self: start; */ } .nav-runestone-controls { grid-area: MH-preferences-area; justify-self: end; display: flex; padding-left: 4em; } /* .ptx-navbar button, */ .ptx-navbar .button { display: inline-block; height: 32px; color: var(--bodytitle); font-family: inherit; text-align: center; font-size: .8em; font-weight: 600; line-height: 32px; letter-spacing: .1rem; text-transform: uppercase; text-decoration: none; white-space: nowrap; background-color: #eee; border-radius: 4px; border: 1px solid #888; cursor: pointer; box-sizing: border-box; } .ptx-navbar .searchbutton { display: flex; align-items: center; justify-content: center; } .searchresultsplaceholder { left: calc(50vw - 300px); } /* Small screen layout */ @media only screen and (max-width: 800px) { .pretext .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; padding: 0; background: #ededed; grid-template-columns: auto auto auto auto 1fr auto; /* box-shadow: rgba(0, 0, 0, 0.3) 0px -2px 5px; */ /* height: 44.2px; */ align-items: end; } /* .pretext .ptx-navbar .button { width: 24.95%; height: 36px; line-height: 40px; margin: 0; } .ptx-navbar .toc-toggle { width: 25%; margin: 0; } */ .ptx-navbar .toc-toggle { padding: 0 40px; } .ptx-navbar .nav-runestone-controls { padding-left: 0; } .ptx-navbar .treebuttons { justify-content: center; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button) .name { display: none; } .pretext .ptx-navbar :is(.calculator-toggle, .index-button) .icon { display: inline-block; } .searchresultsplaceholder { left: 10vw; } } .ptx-navbar .button:hover { background-color: #fafafa; color: #888; } .ptx-navbar .button:focus { outline: thin dotted #333; outline-offset: -2px; } .ptx-navbar .button:active { background-color: #e0e0e0; } .ptx-navbar .button.disabled { opacity: .4; color: #333333; background: #ededed; cursor: default; box-shadow: none; } .ptx-navbar .toc-toggle .icon { font-size: 1.5em; position: relative; bottom: -0.1em; padding-left: 0; padding-right: 0.4em; } .ptx-navbar .toc-toggle .name { font-size: 1.0em; } .ptx-navbar .index-button .name { /* Nada */ } .ptx-navbar .index-button .icon { display: none; } .ptx-navbar .calculator-toggle .name { /* Nada */ } .ptx-navbar .calculator-toggle .icon { display: none; } .ptx-navbar .runestone-profile .name { display: none; } .ptx-navbar .activecode-toggle .name { display: none; } .pretext .ptx-navbar .dropdown { height: 32px; } .ptx-navbar .up-button { text-align: center; } .ptx-navbar .name { display: inline-block; } .ptx-navbar .searchbutton .name { display: none; position: relative; bottom: 0; } .ptx-navbar .icon { display: inline-block; font-size: 1.5em; } .ptx-navbar .previous-button .icon { margin-left: 0.3em; margin-right: 0.2em; } .ptx-navbar .up-button .icon { margin-left: 0; margin-right: 0.2em; } .ptx-navbar .next-button .icon { margin-left: 0.2em; margin-right: 0.3em; } .ptx-navbar .user-preferences-button { padding: 0 0.8em 0 0.8em; margin-left: 2em; border: 1px solid #bababa; width: 6em; } @media screen and (max-width: 800px) { .ptx-navbar .toc-toggle .name, .ptx-navbar .previous-button .name, .ptx-navbar .up-button .name, .ptx-navbar .up-button .disabled .name, .ptx-navbar .next-button .name { display: none; } .ptx-navbar .toc-toggle { margin: 0; } .ptx-navbar .calculator-toggle .icon { padding-top: 5px; } } ================================================ FILE: css/targets/html/legacy/crc/shell_crc.css ================================================ /******************************************************************************* * shell_X.css controls the overall arrangement of the blocks on the page. ******************************************************************************* * * Author: Thomas Shemanske * ******************************************************************************* */ /* The overall structure is html head body.pretext header.ptx-masthead nav.ptx-navbar div.ptx-page div.sidebar nav.ptx-toc main.ptx-main div.ptx-content div.ptx-content-footer div.ptx-page-footer */ /* Supplied by colors_bluegreen_grey.css */ /* :root{ --bluegreen: hsl(192, 98%, 23%); --bodytitle: var(--bluegreen); --bodysubtitle: var(--bluegreen); } */ /* over-ride some of the default style */ .pretext .ptx-page > .ptx-main { margin-left: unset; } .ptx-masthead .logo-link img { width: unset; height: unset; max-height: unset; } .ptx-masthead .logo-link { font-size: unset; text-align: unset; line-height: unset; } .pretext .ptx-masthead { position: unset; background: unset; min-height: unset; border: unset; position: unset; z-index: unset; } .ptx-content-footer .previous-button .name { margin-left: unset; padding-right: unset; } .pretext .ptx-content-footer .name { position: relative; bottom: 0; } .pretext .ptx-content-footer .button.previous-button, .pretext .ptx-content-footer .button.next-button { font-size: 0.8em; margin-top: 1.5em; padding: 0.4em; } .pretext .ptx-content-footer .top-button .icon, .pretext .ptx-content-footer .top-button .name { display: unset; } .pretext .ptx-content-footer .previous-button .icon { margin-left: unset; margin-right: unset; } .pretext .ptx-content-footer .button { text-align: unset; /* color: unset; background-color: unset; */ padding: 0; display: flex; align-items: center; justify-content: center; height: 35px; min-width: 85px; } /* Elements introduced in order of appearance */ /* .ptx-container */ body.pretext { /* position: relative; */ max-width: 904px; /* To match PreTeXt */ margin: 0 auto 0 auto; /* centered content */ padding: 0; box-sizing: border-box; } /* .ptx-masthead-wrapper */ .pretext .ptx-masthead { border: 2px solid #ddd; border-bottom: none; border-top-left-radius: 5px; border-top-right-radius: 5px; /* overflow: hidden;*/ /* otherwise the rounded corners are not visible */ } .pretext .ptx-masthead { position: relative; background: #fafafa; min-height: inherit; box-shadow: none; } .pretext .ptx-masthead { max-width: 904px; border-right: 1px solid #bababa; } @media only screen and (min-width: 600px) { /* .ptx-masthead-wrapper {*/ .ptx-masthead { z-index: 100; } } .ptx-masthead .searchbox { bottom: 2px; margin-right: -19px; } /* .ptx-main-wrapper */ .ptx-page { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 1.0em; min-height: 100vh; display: grid; grid-template-columns: auto 1fr auto; grid-template-rows: auto; grid-template-areas: "toc main-content" "toc content-footer"; } .ptx-content { min-height: 50vh; } /* MH-toc dropdown Content (Hidden by Default) */ .ptx-sidebar { position: sticky; top: 34px; background-color: #f1f1f1; box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); width: 240px; max-height: 100vh; height: 100vh; grid-area: toc; grid-column-start: 1; grid-column-end: 2; grid-row-start: 1; grid-row-end: 3; /* overflow-y: auto; overflow-x: hidden; */ border: 2px solid var(--bluegreen); border-radius:5px; z-index: 1; } /* .ptx-main-content */ .ptx-page > .ptx-main { grid-area: main-content; grid-column-start: 2; grid-column-end: 3; grid-row-start: 1; grid-row-end: 2; justify-self: start; max-width: 664px; width: 97vw; transition: 0s; padding: 0; margin: 0; z-index: 0; /* Added so horizontal scrollbars in content don't bleed into TOC dropdown */ /* // overflow-y: auto; // border: 2px solid green; */ } @media only screen and (min-width: 500px) { .ptx-page > .ptx-main { margin: 0; max-width: 664px; width: min(100vw,664px); justify-self: center; /* width: 570px; @ 810px */ } } .ptx-page > .ptx-main > .ptx-content { margin-left: 2em; } /* Content footer wrapper playground */ .pretext .ptx-page .ptx-content-footer { display: grid; max-width: 100%; grid-template-columns: 1fr 1fr 1fr; grid-template-areas: "content-footer-prev content-footer-top content-footer-next"; margin-left: 32px; margin-top: 30px; } .ptx-content-footer .previous-button { grid-area: content-footer-prev; justify-self: start; align-self: center; margin: 20px; padding: 5px; display: inline-block; height: 32px; color: var(--bodytitle); font-family: inherit; text-align: center; font-size: .8em; font-weight: 700; letter-spacing: .1rem; text-transform: uppercase; text-decoration: none; white-space: nowrap; background-color: #eee; border-radius: 4px; border: 1px solid #888; cursor: pointer; box-sizing: border-box; } .ptx-content-footer .previous-button:hover{ background-color: #fafafa; color: #888; } .ptx-content-footer .previous-button .name{ margin-left: 2px; padding-right: 5px; } .ptx-content-footer .previous-button .icon{ padding-left: 5px; } .ptx-content-footer .top-button{ grid-area: content-footer-top; justify-self: center; align-self: center; margin: 20px; padding: 5px; display: inline-block; height: 32px; color: var(--bodytitle); font-family: inherit; text-align: center; font-size: .8em; font-weight: 700; letter-spacing: .1rem; text-transform: uppercase; text-decoration: none; white-space: nowrap; background-color: #eee; border-radius: 4px; border: 1px solid #888; cursor: pointer; box-sizing: border-box; } .ptx-content-footer .top-button:hover{ background-color: #fafafa; color: #888; } /* color: #888; } */ .ptx-content-footer .top-button .name{ margin-left: 2px; padding-right: 5px; } .ptx-content-footer .top-button .icon{ padding-left: 5px; } .ptx-content-footer .next-button { grid-area: content-footer-next; justify-self: end; align-self: center; margin: 20px; padding: 5px; display: inline-block; height: 32px; color: var(--bodytitle); font-family: inherit; text-align: center; font-size: .8em; font-weight: 700; letter-spacing: .1rem; text-transform: uppercase; text-decoration: none; white-space: nowrap; background-color: #eee; border-radius: 4px; border: 1px solid #888; cursor: pointer; box-sizing: border-box; } .ptx-content-footer .next-button:hover{ background-color: #fafafa; color: #888; } .ptx-content-footer .next-button .name{ margin-right: 2px; padding-left: 5px } .ptx-content-footer .next-button .icon{ padding-right:5px; } .pretext .ptx-sidebar.visible { display: block; } @media only screen and (max-width: 800px) { .pretext .ptx-sidebar { display: none; } /* copied from shell_default.css Wher is ptx-navbar set in the CRC style */ .pretext .ptx-navbar { position: fixed; top: auto; bottom: 0; z-index: 1100; } .pretext .ptx-sidebar { display: none; position: fixed; top: 10px; z-index: 1000; background: white; } } .pretext .ptx-page-footer .feedback-link { cursor: pointer; text-align: center; color: #333333; background-color: #ededed; border: 1px solid #bababa; margin: 1.5em 0 0 0; padding: 0 1em 0 1em; height: 2em; display: flex; align-items: center; } .pretext .ptx-page-footer { background: #f4f4f4; margin-top: 2em; padding-top: 0; max-width: 900px; border-top: 2px solid var(--sectiontoctext); border-bottom: 2px solid var(--sectiontoctext); display: flex; flex-direction: row; justify-content: space-around; position: relative; /* z-index: 100; */ } .pretext .ptx-page-footer > a { margin: 1em 0; } .pretext .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } ================================================ FILE: css/targets/html/legacy/crc/theme-crc.scss ================================================ /*! Theme: crc-legacy */ // Imports in this file should be relative to css root @use 'legacy/pretext.css'; @use 'legacy/pretext_add_on.css'; @use 'legacy/pretext_search'; @use 'targets/html/legacy/crc/shell_crc.css'; @use 'targets/html/legacy/crc/banner_crc.css'; @use 'targets/html/legacy/crc/navbar_crc.css'; @use 'targets/html/legacy/crc/toc_crc.css'; @use 'targets/html/legacy/default/knowls_default.css'; @use 'targets/html/legacy/default/style_default.css'; @use 'legacy/colors/all_colors.scss'; ================================================ FILE: css/targets/html/legacy/crc/toc_crc.css ================================================ /* over-ride default css */ .ptx-toc > ul.structural > li:not(:first-child) { margin-top: 0; } .ptx-toc ul.structural li a { border-bottom: 0; } .ptx-toc ul.structural li li a { border-bottom: none; /*solid #999 1px; */ } .ptx-toc ul.structural .toc-title-box { border-top: solid #999 1px; } .ptx-toc ul.structural li ul.structural li:last-child { margin-bottom: 0; } .ptx-toc { width: 240px; margin: 0; font-size: 14.72px; overflow-y: auto; overflow-x: hidden; background: #fff; } /* Aligns toc to the top and side of the allotted space, respectively */ .ptx-toc ul { margin: 0px; padding: 0px; } .ptx-toc ul a, .ptx-toc ul .part a, .ptx-toc ul .frontmatter a { font-weight: 700; font-size: .9em; } .ptx-toc ul ul li a { font-weight: 400; grid-template-columns: 1.5em 1fr; } .ptx-toc .toc-chapter .toc-item-list .toc-item .codenumber { font-size: 80%; padding-top: 0.16em; } /* no codenumbers on subsections (anything under section) */ .ptx-toc .toc-section .toc-item-list .toc-item a > .codenumber { display: none; } .ptx-toc .toc-section .toc-item-list .toc-item a:hover > .codenumber { display: inline-block; } .ptx-toc ul ul a > .title { margin-left: 0; } .ptx-toc ul ul a > .title:empty::after { content: "empty heading!"; font-weight: bold; } .ptx-toc ul ul ul a > .title { margin-left: 0.5em; font-size: 90%; } .ptx-toc ul ul ul ul a > .title { margin-left: 2em; font-size: 90%; font-style: italic; } .ptx-toc ul li a { text-decoration: none; } .ptx-toc > ul > li a { font-weight: bold; font-family: "PT Serif", "Times New Roman", Times, serif; padding-left: 0.2em; } /* .ptx-toc ul li ul a:hover { padding-top: -10px; } */ .ptx-toc ul li a:active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } /* ************************************************** */ /* Above code may be old. New code below */ /* ************************************************** */ /* TOC is initially closed in the CRC style */ /* The onload js will close it, but you get an odd fluttering effect */ /* comment out because we need to fix the fluttering effect. if this is hidden by default, the page is not usable without JavaScript .ptx-sidebar { display: none; } */ /* Links inside the dropdown */ .ptx-toc a { padding: .25em .5em .25em .5em; text-decoration: none; font-weight: 500; font-size: .9em; margin: 0px; } .ptx-toc ul, .ptx-toc ul li { list-style-type: none; margin: 0px; /* width: 255px; */ /* This one is key to making items menu uniform width */ padding-inline-start: 0px; } /* The anchor carries the grid content */ /* undo what is in toc_default.css */ .ptx-toc ul li a { display: grid; /* made titles too wide */ /* width: 240px; */ grid-gap: 3px; grid-template-columns: 1.25em 10fr; grid-template-areas: "toc-codenumber toc-content"; } .ptx-toc { position: sticky; top: 0; width: unset; height: 100vh; } /* .ptx-toc::after { content: ""; display: block; height: 13em; background: #fff; } */ .ptx-toc::after { content: url("data:image/svg+xml; utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='338 3000 8772 6866'%3E%3Cg style='stroke-width:.025in; stroke:black; fill:none'%3E%3Cpolyline points='472,3590 472,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,9448 A 4660 4660 0 0 1 8598 9259 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4488,9685 A 4228 4228 0 0 0 472 9732 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,3590 A 4241 4241 0 0 1 8598 3496 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,3496 A 4241 4241 0 0 1 4724 3590 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,9259 A 4507 4507 0 0 1 4724 9448 '%3E%3C/path%3E%3Cpolyline points='5385,4299 4062,8125 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8598,3496 8598,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='850,3496 850,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='4960,9685 4488,9685 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='3070,4582 1889,6141 3070,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='6418,4582 7600,6141 6418,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8976,3590 8976,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4960,9685 A 4228 4228 0 0 1 8976 9732 '%3E%3C/path%3E%3C/g%3E%3C/svg%3E"); display: block; height: 13em; padding: 2em 1em; background: #fff; } .ptx-toc > ul:first-child > li:last-child { border-bottom: 4px solid #669; } /**** Use serif font for Roman numerals ****/ /* .ptx-TOC-codenumber */ .ptx-toc a > .codenumber { font-family: "PT Serif", "Times New Roman", Times, serif; grid-area: toc-codenumber; } /* .ptx-TOC-contents */ .ptx-toc a > .title { grid-area: toc-content; } .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } /* Hide all but active area of book */ .ptx-toc.focused ul.structural:not(.contains-active) > li { display: none; } .ptx-toc.focused ul.structural li.active > ul > li { display: block; } /* Hooks for js based switching */ .ptx-toc.focused ul.structural:not(.contains-active) > li.visible { display: block; } .ptx-toc.focused ul.structural li.active > ul > li.hidden { display: none ; } .ptx-toc.focused > ul.structural > li:not(:first-child) { margin-top: 0em; } .ptx-toc.focused ul.structural li ul.structural a:hover { border: 0; } .toc-title-box { display: flex; } .ptx-toc ul.structural li .toc-title-box a { flex: 1 1; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 30px; line-height: 18px; font-variation-settings: 'wght' 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--highlighttoc); color: var(--highlighttoctext); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--highlighttoctext); } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); } /* Part colors fall back to same as chapter if not defined Defined here and not in setcolors so that colors_ file can override as include order is toc/colors/setcolors */ :root { --parttoc: var(--chaptertoc); --parttoctext: var(--chaptertoctext); --parttocactive: var(--documenttitle); --parttoctextactive: var(--chaptertoctextactive); } /* But if browser supports, make parts very slightly darker than chapters */ @supports (background: color-mix(in srgb, red 50%, blue)) { :root { --parttoc: color-mix(in srgb, var(--chaptertoc), black 15%); } } ================================================ FILE: css/targets/html/legacy/default/banner_default.css ================================================ /******************************************************************************* * PreTeXt Masthead Stylesheet *******************************************************************************/ .ptx-masthead .ptx-banner { border-bottom: 1px solid #d4d4d4; border-top: 1px solid transparent; overflow: hidden; padding-top: 0.625em; padding-bottom: 1.125em; border-bottom: none; } .ptx-masthead { max-width: 904px; border-right: 1px solid #bababa; } .ptx-masthead .title-container { font-size: 1em; padding-left: 9.68px; overflow: hidden; } @media screen and (max-width: 480px) { .ptx-masthead .title-container { padding: 0; text-align: center; margin-top: 0.625em; } } .ptx-masthead .title-container > .heading { font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: 700; margin: 0; font-size: 2em; line-height: 1.25em; color: #932919; } @media screen and (max-width: 480px) { .ptx-masthead .title-container > .heading { font-size: 1.5em; line-height: 1.25em; margin: 0; margin-bottom: 0.41667em; } } .ptx-masthead .title-container > .heading a { color: #932919; background: none; text-decoration: none; } .ptx-masthead .title-container > .heading .subtitle { font-weight: normal; } @media screen and (max-width: 800px) { .ptx-masthead .title-container > .heading .subtitle { /* Force the subtitle onto a separate line */ display: block; font-size: 1.16667em; line-height: 1.42857em; /* De-emphasize relative to main title */ color: #595959; /* Remove colon */ } .ptx-masthead .title-container > .heading .subtitle:before { content: normal; } } .ptx-masthead .logo-link { position: relative; float: left; font-size: 50px; margin-top: 0.1em; margin-left: 9.68px; text-align: center; line-height: 1; } .ptx-masthead .logo-link img { width: auto; height: auto; /* Allow font-size to control height * so that icon placeholder height matches */ max-height: 1em; } .ptx-masthead .logo-link:empty:before { font-family: "Open Sans"; font-size: 1em; content: "\2211"; /* Center the icon in a square the size of the parent's font-size */ line-height: 1; width: 1em; display: inline-block; vertical-align: top; text-align: center; color: #ccc; } .ptx-masthead .logo-link:empty:hover:before { color: #932919; } .ptx-masthead .logo-link:empty:active:before { color: #3572a0; } .ptx-masthead .logo-link { background: transparent; border: none; text-decoration: none; } @media screen and (max-width: 480px) { .ptx-masthead .logo-link { display: block; float: none; margin: 0; font-size: 50px; } } .ptx-masthead .byline { color: #333333; font-weight: normal; margin: 0; font-size: 1.3125em; line-height: 1.42857em; min-height: inherit; font-family: "PT Serif", "Times New Roman", Times, serif; } @media screen and (max-width: 480px) { .ptx-masthead .byline { margin-top: 0; font-size: 1em; line-height: 1.25em; } } .ptx-masthead .byline a { color: #333333; } .ptx-masthead .byline a:hover, .ptx-masthead .byline a:focus { color: #932919; } .ptx-masthead .byline a:active { color: #3572a0; } ================================================ FILE: css/targets/html/legacy/default/knowls_default.css ================================================ /* main knowls styles */ .source-view__link, .knowl__link { cursor: pointer; margin-left: 0.1em; margin-right: 0.1em; color: var(--knowlLinkColor); border-bottom: 1px dotted var(--knowlLinkColor); } .source-view { margin: 0.5em 0; } summary.source-view__link, summary.knowl__link { display: list-item inline; } .source-view__link > *, .knowl__link > * { display: inline; } .source-view__link:is(:hover, :focus, [open]), .knowl__link:is(:hover, :focus, [open]) { background-color: var(--linkbackground); border-bottom-color: transparent; } .knowl__content { margin: 0.2em; border: 6px solid var(--knowlborder); border-radius: 0.4em; padding: 0.8em; background-color: var(--knowlbackground); } .source-view__content { margin: 0.2em 0; } /* No Greg's L in knowls, to save space */ .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like, .proof)::after { content: '' !important; border-bottom: none; margin: 0; padding: 0; width: 0; } .ptx-content .knowl__content > article:is(.theorem-like, .definition-like, .example-like, .project-like, .objectives, .outcomes, .remark-like) { padding-left: 0; border-left: none; } .ptx-content .knowl__content > article:is(.proof) { padding-right: 0; border-right: none; } /* nested knowl alt colors */ .knowl__content .knowl__content { background-color: var(--knowlNested1Background); } .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested2Background); } .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested3Background); } .knowl__content .knowl__content .knowl__content .knowl__content .knowl__content { background-color: var(--knowlNested4Background); } /* spacing tweaks inside knowls */ .ptx-content .knowl__content > figure { margin-left: 0; margin-right: 0; } ================================================ FILE: css/targets/html/legacy/default/navbar_default.css ================================================ /******************************************************************************* * Navbar Stylesheet ******************************************************************************* * * Authors: David Farmer, Rob Beezer * ******************************************************************************* */ nav.ptx-navbar { background: #ededed; border: 0; border-top: 1px solid #bababa; border-bottom: 1px solid #bababa; margin: 0; z-index: 100; font-family: "Open Sans"; overflow: visible; display: flex; } .ptx-navbar-contents { display: flex; flex: 1; max-width: 100%; } .ptx-navbar .button { font-size: 1.0em; display: flex; justify-content: center; align-items: center; padding: 0 10px; gap: 10px; min-height: 34px; color: #333333; background-color: #ededed; border: 0; border-right: 1px solid #bababa; /* Disable accidental text-selection */ user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .ptx-navbar .button:focus { outline: thin dotted #333; outline-offset: -2px; } .ptx-navbar .button:active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-navbar .button:hover { background-color: #fafafa; } .ptx-navbar .button:active { background-color: #e0e0e0; } .ptx-navbar .button.disabled { opacity: .4; color: #333333; background: #ededed; box-shadow: none; } .ptx-navbar .toc-toggle { width: 240px; gap: 0.4em; } .ptx-navbar .button .icon { font-size: 1.5em; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls) { display: flex; } .ptx-navbar .treebuttons { flex: 1 1 210px; justify-content: end; } .ptx-navbar .nav-runestone-controls { flex: 1 1 70px; justify-content: end; } .pretext .navbar .dropdown { height: 34px; } .ptx-navbar :is(.treebuttons, .nav-runestone-controls) > *:first-child { border-left: 1px solid #bababa; } .ptx-navbar .treebuttons > * { display: flex; align-items: center; justify-content: center; min-width: 75px; } .ptx-navbar .treebuttons .icon { margin: 0 -7px; /* chevrons have lots of horizontal padding */ } .ptx-navbar :is(.index-button, .calculator-toggle) .icon { display: none; } .ptx-navbar :is(.runestone-profile, .activecode-toggle, .searchbutton) .name { display: none; } .ptx-navbar .index-button { width: 70px; } .ptx-navbar .calculator-toggle { width: 60px; min-height: 32px; text-align: center; border-radius: 20px; margin-left: 5px; border: 2px solid #66f; line-height: 25px; margin-top: 1px; background-color: #eef; } .ptx-navbar .calculator-toggle.open { background: #fee; border: 2px solid #f66; } @media screen and (max-width: 800px) { .ptx-navbar { position: fixed; top: auto; bottom: 0; left: 0; right: 0; background: #ededed; box-shadow: rgba(0, 0, 0, 0.3) 0px -2px 5px; } .ptx-navbar .nav-runestone-controls { flex: 0; } .ptx-navbar .toc-toggle { flex: 2 1 100px; } .ptx-navbar .treebuttons { flex: 3 1 150px; /* 3:2 ratio with toc-toggle */ } .ptx-navbar .treebuttons > * { flex: 1 1; min-width: 35px } .ptx-navbar .index-button { display: none; } .ptx-navbar :is(.treebuttons) > *:first-child { border-left: 0; } .ptx-navbar :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button) .name { display: none; } .pretext .ptx-navbar :is(.calculator-toggle, .index-button) .icon { display: inline-block; } .ptx-navbar .nav-runestone-controls > *:first-child { border-left: 0 } .ptx-navbar .calculator-toggle { width: auto; height: 35px; border-radius: 0; margin-left: 0; border: 0; border-right: 1px solid #bababa; line-height: inherit; margin-top: 0; background-color: inherit; } } ================================================ FILE: css/targets/html/legacy/default/shell_default.css ================================================ /******************************************************************************* * shell_X.css controls the overall arrangement of the blocks on the page. ******************************************************************************* * * Authors: David Farmer, Rob Beezer * ******************************************************************************* */ /* The overall structure is html head body.pretext header.ptx-masthead nav.ptx-navbar div.ptx-page div.sidebar nav.ptx-toc main.ptx-main div.ptx-content div.ptx-content-footer div.ptx-page-footer */ .pretext .ptx-masthead { position: relative; background: #fafafa; min-height: inherit; border: none; position: relative; } .pretext .ptx-navbar { position: sticky; top: 0; max-width: 904px; height: 36px; } .pretext .ptx-page { position: relative; min-height: 100vh; } .ptx-content { min-height: 60vh; } .pretext .ptx-sidebar { position: sticky; top: 36px; left: 0; float: left; width: 240px; } .pretext .ptx-toc { position: sticky; top: 50px; box-sizing: border-box; overflow-y: scroll; height: calc(100vh - 60px); } .pretext .ptx-page > .ptx-main { display: block; position: relative; overflow-y: hidden; margin: 0 0 0 240px; padding: 1px 0 0 0; background: white; border-left: 1px solid #ccc; } .pretext .ptx-page .ptx-sidebar.hidden + .ptx-main { margin-left: 0; } .pretext .ptx-page > .ptx-main.notoc { margin-left: 0; transition-property: margin-left; transition-duration: 0.3s; } @media screen and (max-width: 800px) { .pretext .ptx-page > .ptx-main { margin-left: 0; left: auto; } .pretext .ptx-page-footer { /* Make space for navbar fixed to bottom of screen */ margin-bottom: 38px; } } .pretext .ptx-page > .ptx-main .ptx-content { max-width: 600px; margin: 32px; } @media screen and (max-width: 663px) { .pretext .ptx-page > .ptx-main .ptx-content { /* Decrease the margins */ margin: 28px; } } /* .ptx-content.serif .para { font-family: "PT Serif", "Times New Roman", serif; font-size: 105%; } .ptx-content.serif #text-in-paragraphs .para, .ptx-content.serif #Bcd .para, .ptx-content.serif #interesting-corollary .para { font-family: "Roboto Serif", serif; font-size: 12pt; line-height: 1.20; font-variation-settings: 'wdth' 100; } .ptx-content.serif #table-calisthenics .para, .ptx-content.serif #section-7 .para, .ptx-content.serif #section-11 .para { font-family: "Tinos", serif; font-size: 115%; line-height: 1.30; } .ptx-content.serif #section-6 .para, .ptx-content.serif #section-6 .para { font-family: "Noto", serif; font-size: 115%; line-height: 1.30; } */ /* text in lists was big */ .ptx-content.serif .para .para, .ptx-content[data-font="RS"] .para .para { font-size: 100%; } .ptx-content[data-font="RS"] .code-inline { background: #f6f6f6; border: 1px solid #eee; padding: 0.01em 0.15em 0.03em 0.15em; margin-left: 0.15em; margin-right: 0.15em; border-radius: 0; } .pretext .ptx-content-footer { margin-top: 2em; display: flex; justify-content: space-around; max-width: 600px; margin-left: 32px; } .pretext .ptx-content-footer .button { min-width: 80px; height: 35px; color: #333333; background-color: #ededed; border: 1px solid #bababa; padding: 0 10px; display: flex; gap: 10px; align-items: center; justify-content: center; /* Disable accidental text-selection */ user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .pretext .ptx-content-footer .button .icon { margin: 0 -7px; /* icons have lots of whitespace */ } .pretext .ptx-content-footer .button:hover, .pretext .ptx-content-footer .button:active, .pretext .ptx-content-footer .button:focus { background-color: #fafafa; } .pretext .ptx-sidebar.visible { display: block; } .pretext .ptx-page-footer .feedback-link { cursor: pointer; text-align: center; color: #333333; background-color: #ededed; border: 1px solid #bababa; margin: 1.5em 0 0 0; padding: 0 1em 0 1em; height: 2em; display: flex; align-items: center; } .pretext .ptx-page-footer { background: #f4f4f4; margin-top: 2em; padding-top: 0; max-width: 900px; border-top: 2px solid var(--sectiontoctext); border-bottom: 2px solid var(--sectiontoctext); display: flex; flex-direction: row; justify-content: space-around; position: relative; /* z-index: 100; */ } .pretext .ptx-page-footer > a { margin: 1em 0; } .pretext .ptx-page-footer > a > .logo:first-child { height: 3em; width: unset; margin: 0; } @media screen and (max-width: 800px) { .pretext .ptx-navbar { position: fixed; top: auto; bottom: 0; z-index: 1100; } .pretext .ptx-sidebar { display: none; position: fixed; top: 10px; z-index: 1000; background: white; } .pretext .ptx-content-footer { display: none; } /* .pretext .ptx-content-footer { margin-bottom: 60px; } */ .pretext .ptx-toc { height: calc(100vh - 50px); } } /******************************************************************************* * * Authors: David Farmer, Rob Beezer * ******************************************************************************* */ ================================================ FILE: css/targets/html/legacy/default/style_default.css ================================================ /* The Greg's L for theorems, proofs, etc */ .ptx-content .proof { border-right: 1px solid #666; padding-right: 0.625em; margin-right: -0.725em; } .ptx-content .proof:after { content: ''; border-bottom: 1px solid #666; display: block; margin-left: auto; margin-right: -0.625em; /* so the corner of the L meets */ width: 1.5em; padding-bottom: 0.25em; } .ptx-content.epub .proof { margin-right: 1px; } .ptx-content .proof .proof { margin-right: -0.2em; border-right: 1.5px solid #ddd; } .ptx-content .proof .proof:after { border-bottom: 1.5px solid #ddd; width: 1em; } .ptx-content article.theorem-like, .ptx-content article.definition-like, .ptx-content article.example-like, .ptx-content article.project-like, .ptx-content article.remark-like, .ptx-content article.openproblem-like, .ptx-content article.openproblems-like, /* delete once markup is fixed */ .ptx-content article.computation-like { padding-left: 0.4em; border-left: 1px solid #569; } .ptx-content.epub article.theorem-like, .ptx-content.epub article.definition-like, .ptx-content.epub article.example-like, .ptx-content.epub article.project-like, .ptx-content.epub article.remark-like, .ptx-content article.openproblem-like, .ptx-content article.openproblems-like, /* delete once markup is fixed */ .ptx-content.epub article.computation-like { margin-left: 1px; } .ptx-content article.theorem-like::after, .ptx-content article.definition-like::after, .ptx-content article.example-like::after, .ptx-content article.project-like::after, .ptx-content article.remark-like::after, .ptx-content article.openproblem-like::after, .ptx-content article.openproblems-like::after, /* delete once markup is fixed */ .ptx-content article.computation-like::after { content:''; border-bottom: 1px solid #569; display: block; margin-right: auto; margin-left: -0.5em; padding-top: 0.25em; width: 1.5em; } /* projects get a dotted L */ .ptx-content article.project-like { border-left: 1px dotted #569; } .ptx-content article.project-like::after { border-bottom: 1px dotted #569; } /* commentary gets a thicker red L */ .ptx-content article.commentary { padding-left: 0.6em; border-left: 3px solid #c33; } .ptx-content article.commentary::after { content:''; border-bottom: 3px solid #c33; display: block; margin-right: auto; margin-left: -0.6em; padding-top: 0.25em; width: 1.5em; } .ptx-content .assemblage-like { border: solid 2px #1100AA; border-radius: 12px; padding: 10px; background-color: #f4f4fe; } .ptx-content .assemblage-like .heading { margin-top: 0; } .ptx-content .assemblage-like + .sidebyside { margin-top: 1.25em; } .ptx-content section article.assemblage-like .heading + .para { display: block; } .ptx-content .goal-like { border: solid 3px #999999; padding: 0.7em; margin-bottom: 1em; } .ptx-content .goal-like > .heading { margin-top: -1.5em; background-color: white; display: table; padding: 5px 1em; margin-left: 5px; font-style: italic; font-size: 120%; } .ptx-content .goal-like > .heading .codenumber { display:none; } .ptx-content .goal-like > .heading::after { display:none; } .ptx-content .aside-like { position: absolute; margin-left: 45%; overflow-x: hidden; max-width: 495px; max-height: 7em; overflow-y: hidden; border: none; padding: 4px 10px 0 10px; color: #888; z-index: 100; } .ptx-content .example-like .aside-like { margin-top: 0; position: absolute; } .ptx-content .aside-like { font-size: 90%; } .ptx-content .aside-like { margin-bottom: 5px; background-color: #f5faff; box-shadow: 0 0 1.0em 0.2em #fff inset; } .ptx-content .aside-like .para { overflow-x: auto; } .ptx-content .aside-like:first-child { margin-top: -2.25em; } .ptx-content .aside-like:after { content : ""; position : absolute; z-index : 1; top : 0em; bottom : 0; left : 0; pointer-events : none; background-image : linear-gradient(to bottom, rgba(255,255,255, 0.4), rgba(255,255,255, 1) 90%); width : 550px; height : 8em; } /* example of where the following is needed? */ /* .ptx-content .aside-like * { background-color: #f5faff !important; } */ .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { position: relative; z-index: 0; padding: 8px 15px 10px 15px; padding: 2px 10px; margin: 5px 0px 5px 10px; border: 2px solid #dcebfa; max-height: none; max-width: 550px; color: inherit; font-size: 100%; box-shadow: none; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .example-like .aside-like.front { margin-top: 1.25em; } .ptx-content .aside-like.front + p{ margin-top: 1.25em !important; padding-top: 0; } .ptx-content .aside-like .aside-like { background-color: #fafff5; border: 1px dotted #aaa; } .ptx-content article.aside-like > p:first-child { margin-top: 0; } .ptx-content .aside-like > .heading { font-size: 95%; } .ptx-content .aside-like + *{ margin-top: 3em; /* !important; */ margin-right: 3em; } /* on sufficiently large screens, there is enough of a margin to see part of the aside */ @media screen and (min-width: 943px) { .ptx-content .aside-like + * { margin-right: 0; } } /* on a wide screen, asides should appear in the right margin */ @media screen and (min-width: 1100px) { .ptx-content .aside-like, .ptx-content .aside-like.front, .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { position: absolute; margin-top: -2em; margin-left: 660px; max-width: 200px; /* for some reason the width was too small, so I had to put width (next line) */ width: 200px; color: inherit; } .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { max-height: none; max-width: 223px; border: 2px solid #dcebfa; } .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { margin-left: 654px; /* because .example-like has 6px of padding */ } .ptx-content .aside-like + * { margin-top: 1.25em; /* background: none; */ margin-right: 0; } /* previous and next point to the need to rethink asides: structurally they are in the midts of the other elements, so they affect neighbor selectors. but visually they often are off to the side */ .ptx-content .aside-like + .solutions, .ptx-content .aside-like + .instructions { margin-top: 0; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .aside-like:nth-of-type(3n+1) { margin-left: 660px; } .ptx-content .aside-like:nth-of-type(3n) { margin-left: 680px; } .ptx-content .aside-like:nth-of-type(3n+2) { margin-left: 640px; } } .ptx-content .aside-like:hover:after, .ptx-content .aside-like:focus:after { top: 3em; height: auto; background-image : none; } .ptx-content .aside-like:hover, .ptx-content .aside-like:focus { color: inherit; padding: 2px 8px 0 8px; border: 2px solid #dcebfa; height: auto; max-height: none; } .ptx-content .aside-like.front:hover, .ptx-content .aside-like.front:focus { padding: 4px 10px; } /* find a better way to handle asides in content that has a wide left margin */ /* see http://pretext.jahrme.com/aside-in-knowl/section-1.html */ .ptx-content section dl dd .aside-like { margin-top: 0 !important; margin-left: 100px !important; } .ptx-content section dl dd .aside-like.front { margin-left: -300px !important; } @media screen and (max-width: 1099px) { .ptx-content .aside-like { position: relative; float: right; z-index: 0; overflow-x: hidden; margin-left: 1em; margin-top: 1em; max-width: 195px; max-height: 4em; margin-right: -8em; } .ptx-content li > .aside-like:last-child { position: absolute; } } .searchbox .searchresultsplaceholder { background: #eaf0f6; } ================================================ FILE: css/targets/html/legacy/default/theme-default.scss ================================================ /*! Theme: default-legacy */ // Imports in this file should be relative to css root @use 'legacy/pretext.css'; @use 'legacy/pretext_add_on.css'; @use 'legacy/pretext_search'; @use 'targets/html/legacy/default/shell_default.css'; @use 'targets/html/legacy/default/banner_default.css'; @use 'targets/html/legacy/default/navbar_default.css'; @use 'targets/html/legacy/default/toc_default.css'; @use 'targets/html/legacy/default/knowls_default.css'; @use 'targets/html/legacy/default/style_default.css'; @use 'legacy/colors/all_colors.scss'; ================================================ FILE: css/targets/html/legacy/default/toc_default.css ================================================ /* -------------------toc-------------------- */ .ptx-toc { /* IMPORTANT height must be calculated by javascript. */ width: 240px; margin: 0; font-size: 14.72px; overflow-y: auto; overflow-x: hidden; } .ptx-toc::after { content: url("data:image/svg+xml; utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='338 3000 8772 6866'%3E%3Cg style='stroke-width:.025in; stroke:black; fill:none'%3E%3Cpolyline points='472,3590 472,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,9448 A 4660 4660 0 0 1 8598 9259 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4488,9685 A 4228 4228 0 0 0 472 9732 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:butt;' d='M 4724,3590 A 4241 4241 0 0 1 8598 3496 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,3496 A 4241 4241 0 0 1 4724 3590 '%3E%3C/path%3E%3Cpath style='stroke:%23000000;stroke-width:126;stroke-linecap:round;' d='M 850,9259 A 4507 4507 0 0 1 4724 9448 '%3E%3C/path%3E%3Cpolyline points='5385,4299 4062,8125 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8598,3496 8598,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='850,3496 850,9259 ' style='stroke:%23000000;stroke-width:126; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='4960,9685 4488,9685 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='3070,4582 1889,6141 3070,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='6418,4582 7600,6141 6418,7700 ' style='stroke:%23000000;stroke-width:300; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpolyline points='8976,3590 8976,9732 ' style='stroke:%23000000;stroke-width:174; stroke-linejoin:miter; stroke-linecap:round; '%3E%3C/polyline%3E%3Cpath style='stroke:%23000000;stroke-width:174;stroke-linecap:butt;' d='M 4960,9685 A 4228 4228 0 0 1 8976 9732 '%3E%3C/path%3E%3C/g%3E%3C/svg%3E"); display: block; height: 13em; padding: 2em 1em; background: #fff; } .ptx-toc > .toc-item-list:first-child > .toc-item:last-child { border-bottom: 8px solid #999; } /* -------------------toc-items-------------------- */ .ptx-toc { --codenumber-pad-left: 0.3rem; --codenumber-pad-right: 0.5rem; --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right)); } /* will be less indentation */ .ptx-toc:is(.depth1, .parts.depth2) { --codenumber-pad-right: 0.5rem; } .ptx-toc .toc-item-list { margin: 0px; padding: 0px; list-style-type: none; } .ptx-toc .toc-item { border-top: 1px solid var(--tocborder, #d1d1d1); } /* -------------------title-box------------------- */ .ptx-toc .toc-title-box { display: flex; } .ptx-toc .toc-title-box > .internal { position: relative; display: flex; flex-grow: 1; padding: 0.2em; font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: bold; } /* at second level, switch fonts */ .ptx-toc .toc-item-list .toc-item-list .toc-title-box > .internal { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: normal; } /* Extra border above top level items */ .ptx-toc > .toc-item-list > .toc-item { border-top: 2px solid var(--tocborder, #d1d1d1); } .ptx-toc .toc-item.active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } /* -------------------codenumbers-------------------- */ .ptx-toc .codenumber { min-width: var(--toc-indent-first); padding-left: var(--codenumber-pad-left); padding-right: var(--codenumber-pad-right); display: inline-block; text-align: left; flex-grow: 0; } /* second level of numbering */ /* anything 1+ levels deeper than a chapter in a book */ .book .ptx-toc .toc-chapter .toc-item-list .codenumber, /* anything 1+ levels deeper than a section in an article */ .article .ptx-toc .toc-section .toc-item-list .codenumber, /* anything 1+ levels deeper than backmatter */ .ptx-toc .toc-backmatter .toc-item-list .codenumber { font-size: 80%; padding-top: 0.16em; min-width: var(--toc-indent-second); } /* third level of numbering */ /* anything 2+ levels deeper than a chapter in a book */ .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber, /* anything 2+ levels deeper than a section in an article */ .article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber, /* anything 2+ levels deeper than backmatter */ .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber { min-width: var(--toc-indent-third); visibility: hidden; } /* reveal on interaction */ .ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber { visibility: visible; } /* -------------------titles-------------------- */ .ptx-toc .toc-title-box .title { flex-grow: 1; } /* Any toc item without a codenumber needs indentation Can't select absence of a preceeding, so indent all titles and then clear indent if there is a codenumber */ .ptx-toc .toc-item .toc-title-box .title { margin-left: var(--toc-indent-first); } /* second level as defined by codenumber selectors */ .book .ptx-toc .toc-chapter .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .title { margin-left: var(--toc-indent-second); } /* third level as defined by codenumber selectors */ .book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .article .ptx-toc .toc-section .toc-item-list .toc-item-list .title, .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { margin-left: var(--toc-indent-third); } /* unless there is a codenumber */ .ptx-toc .toc-item > .toc-title-box .codenumber + .title { margin-left: 0 !important; } .ptx-toc ul.structural ul.structural .title:empty::after { content: "empty heading!"; font-weight: bold; } .ptx-toc .toc-chapter .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .title, /* 2 levels deep in back matter */ .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title { font-size: 90%; } .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title, .ptx-toc .toc-section .toc-item-list .toc-item-list .title, /* 3 levels deep in back matter */ .ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title { font-style: italic; } /* ??? */ .ptx-toc ul.structural li a.has-chevron { padding-right: 2em; } /* -------------------depth controls-------------------- */ .ptx-toc.depth0 ul.structural { display: none; } .ptx-toc.depth1 ul.structural ul.structural { display: none; } .ptx-toc.depth2 ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural { display: none; } .ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural { display: none; } /* if depth is shallow, identify best available toc item */ .ptx-toc.depth1 ul.structural .toc-item.contains-active { background-color: var(--chaptertocactive); color: var(--chaptertoctextactive); } .ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active { background-color: var(--parttocactive); color: var(--parttoctextactive); } /* -------------------focused toc-------------------- */ /* Hide all but active area of book */ .ptx-toc.focused ul.structural:not(.contains-active) > li { display: none; } .ptx-toc.focused ul.structural li.active > ul > li { display: block; } /* Hooks for js based switching */ .ptx-toc.focused ul.structural:not(.contains-active) > li.visible { display: block; } .ptx-toc.focused ul.structural li.active > ul > li.hidden { display: none ; } .ptx-toc.focused > ul.structural > li:not(:first-child) { margin-top: 0em; } .ptx-toc.focused ul.structural li ul.structural a:hover { border: 0; } .ptx-toc.focused .toc-expander { border: 0; padding: 2px 5px; background: inherit; color: inherit; display: flex; align-items: center; } .ptx-toc.focused .toc-expander .icon { font-size: 30px; line-height: 18px; font-variation-settings: 'wght' 200; } .ptx-toc.focused .toc-expander:is(:hover) { background-color: var(--highlighttoc); color: var(--highlighttoctext); } .ptx-toc.focused .toc-expander:is(:hover) .icon { fill: var(--highlighttoctext); } .ptx-toc.focused .toc-item.expanded > .toc-title-box > .toc-expander > .icon { transform: rotate(-90deg); } /* Part colors fall back to same as chapter if not defined Defined here and not in setcolors so that colors_ file can override as include order is toc/colors/setcolors */ :root { --parttoc: var(--chaptertoc); --parttoctext: var(--chaptertoctext); --parttocactive: var(--documenttitle); --parttoctextactive: var(--chaptertoctextactive); } /* But if browser supports, make parts very slightly darker than chapters */ @supports (background: color-mix(in srgb, red 50%, blue)) { :root { --parttoc: color-mix(in srgb, var(--chaptertoc), black 15%); } } ================================================ FILE: css/targets/html/legacy/min/shell_min.css ================================================ /******************************************************************************* * shell_X.css controls the overall arrangement of the blocks on the page. ******************************************************************************* * * Authors: David Farmer, Rob Beezer * ******************************************************************************* */ /* The overall structure is html head body.pretext header.ptx-masthead nav.ptx-navbar div.ptx-page div.sidebar nav.ptx-toc main.ptx-main div.ptx-content div.ptx-content-footer div.ptx-page-footer */ .pretext .ptx-masthead { position: relative; background: #fafafa; min-height: inherit; border: none; } .pretext .ptx-navbar { position: sticky; top: 0; max-width: 904px; } .pretext .ptx-page { position: relative; } .pretext .ptx-sidebar { position: sticky; top: 41px; float: left; width: 240px; } .pretext .ptx-toc { position: sticky; top: 50px; box-sizing: border-box; overflow-y: scroll; height: calc(100vh - 60px); } .pretext .ptx-page > .ptx-main { display: block; position: relative; overflow-y: hidden; margin: 0 0 0 240px; padding: 1px 0 0 0; background: white; border-left: 1px solid #ccc; } @media screen and (max-width: 800px) { .pretext .ptx-page > .ptx-main { margin-left: 0; left: auto; } } .pretext .ptx-page > .ptx-main .ptx-content { max-width: 600px; margin: 32px; } @media screen and (max-width: 663px) { .pretext .ptx-page > .ptx-main .ptx-content { /* Decrease the margins */ margin: 28px; } } /* .ptx-content.serif .para { font-family: "PT Serif", "Times New Roman", serif; font-size: 105%; } .ptx-content.serif #text-in-paragraphs .para, .ptx-content.serif #Bcd .para, .ptx-content.serif #interesting-corollary .para { font-family: "Roboto Serif", serif; font-size: 12pt; line-height: 1.20; font-variation-settings: 'wdth' 100; } .ptx-content.serif #table-calisthenics .para, .ptx-content.serif #section-7 .para, .ptx-content.serif #section-11 .para { font-family: "Tinos", serif; font-size: 115%; line-height: 1.30; } .ptx-content.serif #section-6 .para, .ptx-content.serif #section-6 .para { font-family: "Noto", serif; font-size: 115%; line-height: 1.30; } */ /* text in lists was big */ .ptx-content.serif .para .para, .ptx-content[data-font="RS"] .para .para { font-size: 100%; } .ptx-content[data-font="RS"] .code-inline { background: #f6f6f6; border: 1px solid #eee; padding: 0.01em 0.15em 0.03em 0.15em; margin-left: 0.15em; margin-right: 0.15em; border-radius: 0; } .pretext .ptx-content-footer { margin-top: 2em; display: flex; flex-direction: row; justify-content: space-around; max-width: 650px; } .pretext .ptx-content-footer .button { cursor: pointer; text-align: center; color: #333333; background-color: #ededed; border: 1px solid #bababa; padding: 0; display: flex; align-items: center; } .pretext .ptx-content-footer .button:hover, .pretext .ptx-content-footer .button:active, .pretext .ptx-content-footer .button:focus { background-color: #fafafa; } .pretext .ptx-content-footer .button.top-button { text-align: center; width: 40px; height: 50px; } .pretext .ptx-content-footer .button.previous-button, .pretext .ptx-content-footer .button.next-button { font-size: 1.0em; cursor: pointer; display: inline-block; vertical-align: middle; height: 35px; width: 65px; /* Disable accidental text-selection */ user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; float: left; position: relative; margin-top: 0.5em; } .pretext .ptx-content-footer .previous-button { text-align: left; } .pretext .ptx-content-footer .next-button { text-align: right; } .pretext .ptx-content-footer .name { position: relative; bottom: 0; } .pretext .ptx-content-footer .icon { font-size: 1.3em; Position: relative; bottom: -0.1em; } .pretext .ptx-content-footer .previous-button .icon { margin-left: 0.3em; margin-right: 0.2em; } .pretext .ptx-content-footer .next-button .icon { margin-left: 0.2em; margin-right: 0.3em; } .pretext .ptx-content-footer .next-button { text-align: right; } .pretext .ptx-content-footer .previous-button { width: 70px; float: right; border-left: 1px solid #bababa; border-right: 1px solid #bababa; } .pretext .ptx-content-footer .next-button { width: 70px; float: right; border-right: 1px solid #bababa; } .pretext .ptx-content-footer .top-button { display: block; } .pretext .ptx-content-footer .top-button .icon, .pretext .ptx-content-footer .top-button .name { display: block; } .pretext .ptx-content-footer .top-button .icon { bottom: 0; } .pretext .ptx-content-footer .top-button .name { position: relative; bottom: 0.4em; } @media screen and (max-width: 800px) { .pretext .ptx-navbar { position: fixed; top: auto; bottom: 0; } .pretext .ptx-sidebar { display: none; } .pretext .ptx-content-footer { display: none; } /* .pretext .ptx-content-footer { margin-bottom: 60px; } */ .pretext .ptx-toc { height: calc(100vh - 50px); } .pretext .ptx-navbar .calculator-toggle, .pretext .ptx-navbar .index-button { display: none; } .pretext .ptx-navbar .toc-toggle { width: 25%; } .pretext .ptx-navbar .treebuttons { width: 75%; } .pretext .ptx-navbar .previous-button, .pretext .ptx-navbar .up-button, .pretext .ptx-navbar .next-button { width: 33.3%; } } /******************************************************************************* * * Authors: David Farmer, Rob Beezer * ******************************************************************************* */ ================================================ FILE: css/targets/html/legacy/min/theme-min.scss ================================================ /*! Theme: min-legacy */ // Imports in this file should be relative to css root @use 'legacy/pretext.css'; @use 'legacy/pretext_add_on.css'; @use 'legacy/pretext_search'; @use 'targets/html/legacy/min/shell_min.css'; @use 'targets/html/legacy/default/banner_default.css'; @use 'targets/html/legacy/default/navbar_default.css'; @use 'targets/html/legacy/min/toc_min.css'; @use 'targets/html/legacy/default/knowls_default.css'; @use 'targets/html/legacy/default/style_default.css'; @use 'legacy/colors/all_colors.scss'; ================================================ FILE: css/targets/html/legacy/min/toc_min.css ================================================ .ptx-toc { /* IMPORTANT height must be calculated by javascript. */ width: 240px; margin: 0; font-size: 14.72px; overflow-y: auto; overflow-x: hidden; } /* Aligns toc to the top and side of the allotted space, respectively */ .ptx-toc ul { margin: 0px; padding: 0px; list-style-type: none; } /* Places codenumbers */ .ptx-toc .codenumber { position: absolute; margin-right: 0; margin-left: 0em; /* margin-top: 0.4px; */ left: 0.3em; display: inline-block; } /* no codenumbers on subsections */ .ptx-toc ul.structural ul.structural a > .codenumber { display: none; } .ptx-toc ul.structural .title { margin-left: 1.4em; display: inline-block; } .ptx-toc ul.structural ul.structural .title { margin-left: 1.5em; } .ptx-toc ul.structural ul.structural .title:empty::after { content: "empty heading!"; font-weight: bold; } .ptx-toc ul.structural ul.structural ul.structural .title { margin-left: 2.5em; font-size: 90%; } .ptx-toc ul.structural ul.structural ul.structural ul.structural .title { margin-left: 3.2em; font-size: 90%; font-style: italic; } /* more specific than something in toc_default (obsolete comment?) */ .ptx-toc ul.structural li ul.structural li ul.structural li:last-child { margin-bottom: 0; border-bottom: 1px solid #ddd; } .ptx-toc .part > a .codenumber { position: relative; display: block; float: left; margin-right: 0.7em; } .ptx-toc .part > a .title { display: block; margin-left: 1em; } .ptx-toc ul.structural li a { position: relative; display: block; padding: 2.86957px; padding: 0.2em; /* // padding-left: 0.5em; */ border-top: 1px solid #d1d1d1; border-bottom: 1px solid #d1d1d1; font-family: "PT Serif", "Times New Roman", Times, serif; font-weight: bold; } .ptx-toc ul.structural ul.structural li a { font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: normal; /* // padding-left: 2.0em; */ } /* Sets spacing between section headings*/ .ptx-toc > ul.structural > li:not(:first-child) { margin-top: 0.3em; } /* But not at the start of a part */ /* I cannot see that this actually does anything --DF */ .ptx-toc > ul.structural > li.part + li, .ptx-toc > ul.structural > li.frontmatter + li, .ptx-toc > ul.structural > li.backmatter + li { margin-top: 0; } /* Removes underlines from links in toc */ .ptx-toc ul.structural li a, .ptx-toc ul.structural li a:link, .ptx-toc ul.structural li a:visited, .ptx-toc ul.structural li a:hover, .ptx-toc ul.structural li a:focus, .ptx-toc ul.structural li a:active { text-decoration: none; } /* .ptx-toc > ul > li a, .ptx-toc > ul > li a:link, .ptx-toc > ul > li a:visited { font-weight: bold; font-family: "PT Serif", "Times New Roman", Times, serif; padding-left: 0.2em; } */ /* Ensures that there is no double border between subsections */ .ptx-toc ul.structural li ul.structural a { border-top: none; } /* Allows both "top" and bottom border of a subsection to be highlighted on hover */ .ptx-toc ul.structural li ul.structural a:hover { border-top: 1px solid #3c110a; margin-top: -1px; } /* Removes the excess space between the last subsection and the next section (caused by the margin on top of sections being used to space out adjacent sections) */ .ptx-toc ul.structural li ul.structural li:last-child { margin-bottom: -0.3em; } /* Removes double border between last subsection and next section */ .ptx-toc ul.structural li ul.structural li:last-child a { border-bottom: none; } .ptx-toc ul.structural li a:active { box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px inset; } .ptx-toc ul.structural li a.has-chevron { padding-right: 2em; } .ptx-toc .toc-item { position: relative; } ================================================ FILE: css/targets/html/legacy/oscarlevin/style_oscarlevin.css ================================================ /* Since the detault style is loaded before the oscarlevin style, */ /* some of the default style has to be undone */ .ptx-content article.theorem-like::after, .ptx-content article.definition-like::after, .ptx-content article.example-like::after, .ptx-content article.project-like::after, .ptx-content article.remark-like::after, .ptx-content article.openproblem-like::after, .ptx-content article.openproblems-like::after, .ptx-content article.computation-like::after { content: unset; } .ptx-content article.theorem-like, .ptx-content article.definition-like, .ptx-content article.example-like, .ptx-content article.project-like, .ptx-content article.remark-like, .ptx-content article.openproblem-like, .ptx-content article.openproblems-like, .ptx-content article.computation-like { padding: unset; border: unset; } :root { /* Set colors for environments */ --assembbody: var(--bluelight, hsl(210, 90%, 90%)); --assembborder: var(--blue, hsl(210, 40%, 60%)); --assembhead: var(--blue, hsl(210, 40%, 75%)); --definitionbody: var(--greenlight, hsl(180, 40%, 90%)); --definitionborder: var(--green, hsl(180, 40%, 50%)); --definitionhead: var(--green, hsl(180, 40%, 50%)); --theorembody: var(--violetlight, hsl(270, 40%, 90%)); --theoremborder: var(--violet, hsl(270, 40%, 75%)); --theoremhead: var(--violetdark, hsl(270, 40%, 25%)); --examplebody: var(--bluedull, hsl(240, 40%, 90%)); --exampleborder: var(--bluedark, hsl(240, 40%, 25%)); --examplehead: var(--exampleborder); --examplelikebody: var(--examplebody); --examplelikeborder: var(--bluedull, hsl(240, 40%, 75%)); --examplelikehead: var(--examplelikeborder); --projectbody: var(--greenlight, hsl(180, 40%, 90%)); --projectborder: var(--green, hsl(180, 40%, 75%)); --projecthead: var(--green, hsl(180, 40%, 75%)); --investigateborder: var(--bluerich, hsl(180, 40%, 25%)); --goalborder: var(--violetrich, hsl(270, 90%, 25%)); --remarklikebody: var(--yellowlight, hsl(330, 55%, 90%)); --remarklikeborder: var(--yellow, hsl(330, 55%, 50%)); --remarklikehead: var(--yellow, hsl(330, 55%, 50%)); --computationborder: var(--orangedull, hsl(180, 40%, 75%)); /* temporary workaround for setcolors.css use of assemblage */ --asemblagebackground: var(--assembbody) !important; --assemblageborder: var(--assembborder) !important; } /* We can style all the *-like environments: definition-like, theorem-like, example-like, project-like, remark-like, computation-like, goal-like, and assemblage-like. We also could do something for proofs, and commentary. (should we style aside-like? Or just copy from style_default?) We define the style of environments in three steps: first the shape, then the color, and finally the shape and color of the heading/title. The only reason to group these as such is that we can then have a common shape for differet *-like elements, but still allow for different colors to distinguish them. Start with the important custom environments (theorem might be different from the other theorem-like, etc.), then clean up any standard *-like. */ /* definitions, theorems, assemblages, with theorem-like.theorem distinguished */ .ptx-content article.assemblage-like, .ptx-content article.definition-like, .ptx-content article.theorem-like.theorem { margin-top: 1.75em; padding: 1em; border-radius: 2px; margin-bottom: 1em; } .ptx-content article.theorem-like { margin-top: 1.25em; padding: 1em; border-radius: 2px; margin-bottom: 1em; } .ptx-content article.assemblage-like{ background-color: var(--assembbody); border: 2px solid var(--assembborder); } .ptx-content article.definition-like { background-color: var(--definitionbody); border: 2px solid var(--definitionborder); } .ptx-content article.theorem-like.theorem, .ptx-content article.theorem-like { background-color: var(--theorembody); border: 2px solid var(--theoremborder); } .ptx-content article.assemblage-like .heading, .ptx-content article.definition-like .heading, .ptx-content article.theorem-like.theorem .heading { margin-top: -1.75em; margin-left: -0.25em; display: table; padding: 0.25em 0.4em; } .ptx-content .assemblage-like .heading { background-color: var(--assembhead); color: #000; } .ptx-content .definition-like .heading { background-color: var(--definitionborder); color: #000; } .ptx-content .theorem-like.theorem .heading { background-color: var(--theoremborder); color: #000; } .ptx-content .example-like > .heading + .introduction, .ptx-content .computation-like > .heading + .introduction, .ptx-content .assemblage-like .heading + .para, .ptx-content .computation-like > .heading + .para, .ptx-content .example-like .heading + .para, .ptx-content .theorem-like.theorem .heading + .para, .ptx-content .definition-like .heading + .para { display: block; margin-top: 0.25em; } /* Examples and example-like; computation-like styled same as example-like with different colors */ .ptx-content article.example-like, .ptx-content article.computation-like { padding-left: 0.8em; padding-bottom: 0.5em; } .ptx-content article.example-like.example { border-left: 0.1em solid var(--examplehead); border-bottom: 0.1em solid var(--examplehead); } .ptx-content article.example-like { border-left: 0.1em solid var(--examplelikeborder); border-bottom: 0.1em solid var(--examplelikeborder); } .ptx-content article.computation-like { border-left: 0.1em solid var(--computationborder); border-bottom: 0.1em solid var(--computationborder); } .ptx-content .example-like > .heading, .ptx-content .computation-like > .heading { display: inline-block; padding: 0.3em 0.5em; margin-left: -0.8em; } .ptx-content .example-like.example > .heading { border: 0.1em solid var(--examplehead); /* maybe no border-left? */ background: var(--examplehead); color: white; } .ptx-content .example-like > .heading { background: var(--examplelikeborder); color: black; } .ptx-content .computation-like > .heading { background: var(--computationborder); color: black; } /* Project-like */ .ptx-content article.project-like { background-color: white; border: solid 3px var(--projectborder); border-radius: 10px; padding: 10px; margin-bottom: 1em; } .ptx-content article.project-like.investigation { border-color: var(--investigateborder); } .ptx-content article.project-like > .heading { margin-top: -1.5em; background-color: white; display: table !important; padding: 5px 1em; margin-left: 10px; font-style: italic; font-size: 120% !important; } /* Goal-like */ .ptx-content .goal-like { background-color: white; border-radius: 0em; padding: 0.7em; margin-bottom: 1em; } .ptx-content .goal-like.objectives { border-top: solid 3px var(--goalborder); border-bottom: solid 3px var(--goalborder); border-left: none; border-right: none; } .ptx-content .goal-like.outcomes { border-top: solid 3px var(--goalborder); border-bottom: solid 3px var(--goalborder); border-left: none; border-right: none; } .ptx-content .goal-like .heading { margin-top: -1.5em; background-color: white; display: table; padding: 5px 1em; margin-left: 10px; font-style: italic; font-size: 120%; } /* remark-like */ .ptx-content article.remark-like { margin-top: 1.25em; padding: 1em; padding-top: 0.7em; margin-bottom: 1em; border-radius: 0px; border-left: 5px solid var(--remarklikeborder); background-color: var(--remarklikebody); } /* proofs */ .ptx-content section > .proof { margin-bottom: 1em; } /* Common fixes? */ .ptx-content article.assemblage-like .heading::after, .ptx-content article.theorem-like.theorem .heading::after, .ptx-content article.theorem-like .heading::after, .ptx-content article.example-like > .heading::after, .ptx-content article.project-like > .heading::after { content: ""; } /* Fixes for mathjax: */ /* These gradients need to be adjusted to match background colors */ .ptx-content .assemblage-like .MJXc-display, .ptx-content .definition-like .MJXc-display, .ptx-content .theorem-like.theorem .MJXc-display { background-image: linear-gradient(to right, #e9eff5, #e9eff5), linear-gradient(to right, #e9eff5, #e9eff5), linear-gradient(to right, rgba(0,0,0,.25), rgba(242,242,254,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(242,242,254,0)); } .ptx-content .theorem-like.corollary .MJXc-display { background-image: linear-gradient(to right, var(--bodytitlehighlight), var(--bodytitlehighlight)), linear-gradient(to right, var(--bodytitlehighlight), var(--bodytitlehighlight)), linear-gradient(to right, rgba(0,0,0,.25), rgba(242,242,254,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(242,242,254,0)); } /* END OF STYLE_OSCARLEVIN (below is only stuff copied from style_default) */ /* Assides, copied directly from style_default.css */ /* next selector first part of the following is due to the mistake of putting paragraph spacing in the margin-bottom Redo when we fix that error */ .ptx-content .aside-like { /* margin-top: -1.25em; */ position: absolute; margin-left: 45%; overflow-x: hidden; max-width: 495px; max-height: 7em; overflow-y: hidden; border: none; padding: 4px 10px 0 10px; color: #888; } .ptx-content .example-like .aside-like { margin-top: 0; position: absolute; } .ptx-content .aside-like { font-size: 90%; } .ptx-content .aside-like { margin-bottom: 5px; background-color: #f5faff; box-shadow: 0 0 1.0em 0.2em #fff inset; } .ptx-content .aside-like:first-child { margin-top: -2.25em; } .ptx-content .aside-like:after { content : ""; position : absolute; z-index : 1; top : 0em; bottom : 0; left : 0; pointer-events : none; background-image : linear-gradient(to bottom, rgba(255,255,255, 0.4), rgba(255,255,255, 1) 90%); width : 550px; height : 8em; } /* example of where the following is needed? */ /* .ptx-content .aside-like * { background-color: #f5faff !important; } */ .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { position: relative; z-index: 0; padding: 8px 15px 10px 15px; padding: 2px 10px; margin: 5px 0px 5px 10px; border: 2px solid #dcebfa; max-height: none; max-width: 550px; color: inherit; font-size: 100%; box-shadow: none; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .example-like .aside-like.front { margin-top: 1.25em; } .ptx-content .aside-like.front + .para{ margin-top: 1.25em !important; padding-top: 0; } .ptx-content .aside-like .aside-like { background-color: #fafff5; border: 1px dotted #aaa; } .ptx-content article.aside-like > .para:first-child { margin-top: 0; } .ptx-content .aside-like > .heading { font-size: 95%; } .ptx-content .aside-like + *{ margin-top: 3em !important; margin-right: 3em; } /* on sufficiently large screens, there is enough of a margin to see part of the aside */ @media screen and (min-width: 943px) { .ptx-content .aside-like + * { margin-right: 0; } } /* on a wide screen, asides should appear in the right margin */ @media screen and (min-width: 1100px) { .ptx-content .aside-like, .ptx-content .aside-like.front, .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { position: absolute; margin-top: -2em; margin-left: 660px; max-width: 200px; /* for some reason the width was too small, so I had to put width (next line) */ width: 200px; color: inherit; } .ptx-content .aside-like.front, .ptx-content .example-like .aside-like.front { max-height: none; max-width: 223px; border: 2px solid #dcebfa; } .ptx-content .example-like .aside-like, .ptx-content .example-like .aside-like.front { margin-left: 654px; /* because .example-like has 6px of padding */ } .ptx-content .aside-like + * { margin-top: 1.25em !important; /* background: none; */ margin-right: 0; } .ptx-content .aside-like.front:after, .ptx-content .example-like .aside-like.front:after { background-image: none; } .ptx-content .aside-like:nth-of-type(3n+1) { margin-left: 660px; } .ptx-content .aside-like:nth-of-type(3n) { margin-left: 680px; } .ptx-content .aside-like:nth-of-type(3n+2) { margin-left: 640px; } } .ptx-content .aside-like:hover:after, .ptx-content .aside-like:focus:after { top: 3em; height: auto; background-image : none; } .ptx-content .aside-like:hover, .ptx-content .aside-like:focus { color: inherit; padding: 2px 8px 0 8px; border: 2px solid #dcebfa; height: auto; max-height: none; } .ptx-content .aside-like.front:hover, .ptx-content .aside-like.front:focus { padding: 4px 10px; } /* find a better way to handle asides in content that has a wide left margin */ /* see http://pretext.jahrme.com/aside-in-knowl/section-1.html */ .ptx-content section dl dd .aside-like { margin-top: 0 !important; margin-left: 100px !important; } .ptx-content section dl dd .aside-like.front { margin-left: -300px !important; } @media screen and (max-width: 1099px) { .ptx-content .aside-like { position: relative; float: right; z-index: 0; overflow-x: hidden; margin-left: 1em; margin-top: 1em; max-width: 195px; max-height: 4em; margin-right: -8em; } .ptx-content li > .aside-like:last-child { position: absolute; } } ================================================ FILE: css/targets/html/legacy/oscarlevin/theme-oscarlevin.scss ================================================ /*! Theme: oscarlevin-legacy */ // Designed to support custom styling for oscarlevin style // Imports in this file should be relative to css root @use 'legacy/pretext.css'; @use 'legacy/pretext_add_on.css'; @use 'legacy/pretext_search'; @use 'targets/html/legacy/default/shell_default.css'; @use 'targets/html/legacy/default/banner_default.css'; @use 'targets/html/legacy/default/navbar_default.css'; @use 'targets/html/legacy/default/toc_default.css'; @use 'targets/html/legacy/default/knowls_default.css'; @use 'style_oscarlevin.css'; @use 'legacy/colors/all_colors.scss'; ================================================ FILE: css/targets/html/legacy/soundwriting/style_soundwriting.css ================================================ /* :root { --documenttitle: #660000; --bodytitle: #8e0a0c; --bodysubtitle: #A62E1C; --bodytitlehighlight: #eeeff3; --bodysubtitlehighlight: #fce5e4; --chaptertoc: #6d8899; --chaptertoctext: white; --chaptertocactive: var(--documenttitle); --chaptertoctextactive: white; --sectiontoc: white; --sectiontoctext: #6f080b; --sectiontocactive: var(--documenttitle); --sectiontoctextactive: white; --tocborder: #152f53; --highlighttoc: #330000; --highlighttoctext: white; --highlighttocborder: var(--chaptertoc); --videoplay: var(--bodytitle); --assemblageborder: #1100aa; --assemblagebackground: #f5f8ff; --knowlborder: var(--bodytitlehighlight); --knowlbackground: var(--assemblagebackground); } */ :root { /* Colors for titles */ --chaptertitle: var(--documenttitle); --sectiontitle: var(--documenttitle); --subsectiontitle: var(--documenttitle); /* Set colors for blocks */ --bordercolor: var(--documenttitle); --listbackground: #d0ccbd; /*neutral1*/ --insightbackground: #d0c681; /*muted2*/ --conventionbackground: #b1a77d; /*muted3*/ --notebackground: #93a396; /*muted4*/ --examplebackground: #a2bac2; /*muted5*/ --warningbackground: #b4bd00; /*bright4*/ --observationbackground: #48848d; /*bright6*/ } /* Headings: */ .ptx-content section.chapter h2.heading { color: var(--chaptertitle); } .ptx-content section.chapter h2.heading .title { display:block; font-size:larger; margin-top: 5pt; } .ptx-content section.section h2.heading { color: var(--sectiontitle); border-top: 1pt solid; border-bottom: 1pt solid; margin-bottom: 20pt; width: 100%; } .ptx-content section.subsection h2.heading { color: var(--subsectiontitle); border-bottom: 1pt solid; margin-bottom: 20pt; width: 90%; } /* frontmatter headings: */ .ptx-content section.frontmatter h2.heading { color: var(--chaptertitle); font-size:2em; } .ptx-content section.preface h2.heading, .ptx-content section.acknowledgement h2.heading, .ptx-content section.colophon h2.heading { color: var(--chaptertitle); margin-bottom: 15pt; font-size: 1.75em; } .ptx-content section.preface h2.heading .title { display:block; font-size:larger; } /* Blocks: */ /* set background colors */ .ptx-content .list { background-color: var(--listbackground); } .ptx-content .insight { background-color: var(--insightbackground); } .ptx-content .convention { background-color: var(--conventionbackground); } .ptx-content .note { background-color: var(--notebackground); } .ptx-content .example { background-color: var(--examplebackground); } .ptx-content .warning { background-color: var(--warningbackground); } .ptx-content .observation { background-color: var(--observationbackground); } /* set titles and borders */ .ptx-content .remark-like, .ptx-content .example-like, .ptx-content .list { padding: 1em; border-radius: 10px; margin-bottom: 1em; border: 2px solid var(--bordercolor); } .ptx-content .example-like .example-like { padding: 0; margin: 0; border: none; background: inherit; } /* override list margins */ .ptx-content .list { margin-left: 0 !important; margin-right: 0 !important; } .ptx-content .remark-like .heading, /* .ptx-content .example-like .heading, */ .ptx-content .list figcaption { display: block; margin-top: -0.5em !important; padding-bottom: 1em; font-size: large; /*sets font caption size to match h6*/ } ================================================ FILE: css/targets/html/legacy/soundwriting/theme-soundwriting.scss ================================================ /*! Theme: soundwriting-legacy */ // Designed to support custom styling for https://github.com/UPS-CWLT/soundwriting // Imports in this file should be relative to css root @use 'legacy/pretext.css'; @use 'legacy/pretext_add_on.css'; @use 'legacy/pretext_search'; @use 'targets/html/legacy/default/shell_default.css'; @use 'targets/html/legacy/default/banner_default.css'; @use 'targets/html/legacy/default/navbar_default.css'; @use 'targets/html/legacy/default/toc_default.css'; @use 'targets/html/legacy/default/knowls_default.css'; @use 'style_soundwriting.css'; @use 'legacy/colors/all_colors.scss'; ================================================ FILE: css/targets/html/legacy/wide/banner_wide.scss ================================================ @use '../default/banner_default.css'; :root { --banner-background-color: #ffffff; } .pretext .ptx-masthead { max-width: var(--page-width); background-color: var(--banner-background-color); margin: 0 auto; } .pretext .ptx-masthead .ptx-banner { margin: 0 auto; display: flex; align-items: center; justify-content: center; max-width: var(--page-width); padding: 8px 0; } ================================================ FILE: css/targets/html/legacy/wide/navbar_wide.scss ================================================ @use '../default/navbar_default.css'; :root { --nav-background-color: #ededed; } .pretext .ptx-navbar { max-width: 100%; margin: 0 auto; display: flex; width: var(--page-width); background: var(--nav-background-color); border-top: 0; box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); } .ptx-navbar-contents { display: flex; flex: 1; max-width: 100%; } .pretext .ptx-navbar .toc-toggle { border-left: 0; } .ptx-navbar .calculator-toggle { width: auto; height: 35px; text-align: center; border-radius: 0; margin-left: 0; border: 0; border-right: 1px solid #bababa; line-height: inherit; margin-top: 0; background-color: #ededed; padding: 0 15px; } .ptx-navbar > :last-child > :last-child { border-right: none; } ================================================ FILE: css/targets/html/legacy/wide/shell_wide.scss ================================================ @use '../default/shell_default.css'; :root { --content-margin: 32px; --content-width: 750px; --content-width-wide: 1050px; --page-width: 1100px; --xl-margin: calc((var(--content-width) - var(--content-width-wide)) / 2 - var(--content-margin)); --content-font-size: 1.2rem; } html { font-size: 16px !important; /* temp override runestone injection */ } :root { --questionBgColor: var(--componentBgColor) !important; } :root { --component-border-color: #bababa; --page-gutter-color: #c5c4c4; --page-border-color: #444; --page-color: white; } .pretext .ptx-masthead { border-bottom: 1px solid var(--component-border-color); } body.pretext { background-color: var(--page-gutter-color); } .pretext .ptx-page { position: relative; min-height: 100vh; max-width: var(--page-width); margin: 0 auto; background: var(--page-color); box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); } .searchresultsplaceholder { left: calc(50vw - 300px); } .pretext .ptx-page .ptx-main { max-width: var(--content-width); margin: 0 auto; padding-bottom: 2em; border: 0; overflow: visible; } .pretext .ptx-page .ptx-sidebar.hidden + .ptx-main { margin: 0 auto; } .pretext .ptx-page > .ptx-main .ptx-content { max-width: var(--content-width); font-size: var(--content-font-size); } .pretext .ptx-page-footer { max-width: var(--page-width); justify-content: center; margin: 0 auto; gap: 90px; box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); border-bottom: 0; } .pretext .ptx-content-footer { max-width: 100%; margin: 2em auto 0; padding-bottom: 2em; justify-content: space-evenly; } .pretext .ptx-page-footer a { --margin: 15px 45px; } /* components that should be wide */ .ptx-content .runestone:is(.ac_section, .codelens, .parsons_section, .hparsons_section), /* .ptx-content pre.program, */ .ptx-content .runestone.datafile, .ptx-content .contains-wide { width: var(--content-width-wide); max-width: unset; margin-left: var(--xl-margin); max-width: unset; border-width: 1px; border-radius: 3px; } /* unless nested in other runestone's */ .ptx-content .runestone .runestone:is(.ac_section, .codelens, .parsons_section, .hparsons_section), /* .ptx-content .runestone pre.program, */ .ptx-content .runestone .runestone.datafile { width: 100%; margin-left: auto; } .ptx-content .runestone { border-width: 1px; border-radius: 3px; } .pretext .ptx-page > .ptx-main .ptx-content pre, .pretext .ptx-page > .ptx-main .ptx-content .ptx-runestone-container :is(.ac_code_div), .ptx-runestone-container .parsons .sortable-code-container, .ptx-runestone-container .hparsons_section .hparsons-input { font-size: 1rem; } /* limit width of content inside ac except for actual activecode */ .ptx-content .runestone.ac_section > div > div > *:not(.ac_code_div):not(.ac_output):not(.codelens):not(.ac_actions) { max-width: calc(var(--content-width) - 2 * var(--content-margin)); margin-left: auto; margin-right: auto; } /* limit width of content inside contains-wide */ .ptx-content .runestone.contains-wide .tab-content { max-width: var(--content-width); margin-left: auto; margin-right: auto; } /* but widen item that needs it */ .ptx-content .runestone.contains-wide .tab-content .runestone:is(.ac_section, .codelens, .parsons_section, .hparsons_section) { width: calc(var(--content-width-wide) - 20px); margin-left: calc(var(--xl-margin) + 8px); } /* limit width of content inside parsons except for actual parsons */ .ptx-content .runestone.parsons_section > .parsons { width: 100%; padding-right: 0; } .ptx-content .runestone.parsons_section > .parsons > div > *:not(.sortable-code-container) { max-width: calc(var(--content-width) - 2 * var(--content-margin)); margin-left: auto; margin-right: auto; } .ptx-content .runestone .parsons .sortable-code-container { display: flex; flex-flow: wrap; justify-content: center; gap: 15px; margin: 10px auto; } .ptx-content .ptx-runestone-container .parsons .sortable-code { margin: 0; } .ptx-content .runestone .parsons .runestone_caption_text { max-width: unset; } .ptx-content .runestone .parsons .lines code { white-space: nowrap; } .ptx-content .runestone .parsons .lines code .token { background: none; /*fix prism overlap */ } .ptx-runestone-container .runestone.parsons_section { padding-top: 15px; } /* whole bunch of rules to relatively gracefully handle lots of different sizes without js */ @media screen and (max-width: 1100px) { /* tune to match --page-width */ :root { --page-width: 100%; } } @media screen and (max-width: 1100px) { :root { --content-width-wide: 1000px; } } @media screen and (max-width: 1050px) { :root { --content-width-wide: 950px; } } @media screen and (max-width: 1000px) { :root { --content-width-wide: 900px; } } @media screen and (max-width: 950px) { :root { --content-width-wide: 850px; } } @media screen and (max-width: 900px) { :root { --content-width-wide: 800px; } } @media screen and (max-width: 943px) { /* Override rule that adds scrollbars to program listings when not needed */ .ptx-content .figure-like { overflow-x: inherit; } } @media screen and (max-width: 850px) { /* match to --content-width - should be that + 100 */ :root { --content-width: 100%; --content-width-wide: calc(100% + 2 * var(--content-margin)); --xl-margin: calc(-1 * var(--content-margin)); } /* nested sizing */ .ptx-content article:is(.theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like) > .ptx-runestone-container > .runestone:is(.ac_section, .codelens, .parsons_section, .hparsons_section), /* .ptx-content article:is( .theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like ) > .ptx-runestone-container > pre.program, */ .ptx-content article:is(.theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like) > .ptx-runestone-container > .runestone.datafile, .ptx-content article:is(.theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like) > .ptx-runestone-container > .runestone.contains-wide { width: calc(var(--content-width-wide) + 10px); } .ptx-content .runestone:is(.ac_section, .codelens, .parsons_section, .hparsons_section, .contains-wide) { border-left: 0; border-right: 0; border-top: 1px solid #aaa; border-bottom: 1px solid #aaa; border-radius: 0; } .ptx-content .code-inline { white-space: pre-wrap; } .ptx-runestone-container .cd_section, .ptx-content .ptx-runestone-container .parsons .sortable-code { overflow-x: auto; } .ptx-content .ptx-runestone-container .parsons .sortable-code:first-of-type { padding: 0 25px; } .searchresultsplaceholder { width: 80vw; left: 10vw; bottom: 10vh; } } @media screen and (max-width: 663px) { :root { --content-margin: 28px; /* based on shell_default */ } } ================================================ FILE: css/targets/html/legacy/wide/style_wide.scss ================================================ @use '../default/style_default.css'; /* handle margin of articles that items might be nested inside */ /* first change nesting unit to px to avoid font-size issues */ .ptx-content article:is( .theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like ) { padding-left: 10px; } /* now overcome the indentation */ .ptx-content article:is( .theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like ) > .ptx-runestone-container > .runestone:is(.ac_section, .codelens, .parsons_section, .hparsons_section), /* .ptx-content article:is( .theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like ) > pre.program, */ .ptx-content article:is( .theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like ) > .ptx-runestone-container > .runestone.datafile, .ptx-content article:is( .theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like ) .contains-wide { margin-left: calc(var(--xl-margin) - 10px); } .ptx-content .datafile pre { border: 1px solid #616160; border-radius: 3px; padding: 10px; } .ptx-content .runestone.datafile { margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; align-items: center; gap: 10px; } .ptx-content .datafile_caption { background: transparent; border: 0; margin: 0; padding: 0; } .ac_actions { font-size: 1rem; margin-bottom: 5px; } .ptx-content .ptx-runestone-container .ac_output { margin-bottom: 10px; } .ptx-content .ptx-runestone-container .codelens { margin-bottom: 10px; } .ptx-content .ptx-runestone-container .ac_output pre { width: 100%; max-width: var(--content-width); margin: 10px auto; } .ptx-runestone-container .ac-canvas { margin-left: calc(50% - 202px); } .ptx-runestone-container .ac-canvas:empty { display: none; } .runestone_caption { font-size: 1rem; } .ptx-runestone-container .unittest-results table { background: white; } .ptx-content .ptx-runestone-container div.ExecutionVisualizer table.visualizer { width: 100%; } .ptx-content table tr td { font-size: 1rem; } .pretext .ptx-content-footer { align-items: stretch; } /*change margin to px to avoid font size issues */ .ptx-content article:is( .theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like )::after { margin-left: -10px; } .video-box { margin: 0.75em auto !important; } .ac_code_div { margin-top: 10px; } .pretext .ptx-runestone-container .ac_actions { max-width: var(--content-width); margin: 0 auto; flex-wrap: nowrap; align-items: center; gap: 10px; padding-left: 10px; padding-right: 10px; } .pretext .ptx-runestone-container .ac_actions > * { flex: 0 1; margin: 0 !important; } .pretext .ptx-runestone-container .ac_actions > div:first-of-type { display: flex !important; flex-direction: column; align-items: stretch; text-align: center; flex-grow: 1; } .ptx-runestone-container .unittest-results { display: flex; flex-direction: column; align-items: center; } .ptx-content pre.program.line-numbers, .ptx-content pre.code-block.line-numbers { overflow-x: auto; } .hparsons_section { max-width: unset !important; } .hparsons_section > :not(.hparsons_section, .hp_question) { max-width: unset !important; } .ptx-runestone-container .hparsons_section .hp_question { max-width: var(--content-width); } .codepart_section > div > div { font-size: 1rem; clear: both; } .codepart_section > div > div:first-of-type { font-size: var(--content-font-size); } @media screen and (max-width: 600px) { .pretext .ptx-runestone-container .ac_actions > * { white-space: break-spaces; flex-grow: 1; } } ================================================ FILE: css/targets/html/legacy/wide/theme-wide.scss ================================================ /*! Theme: wide-legacy */ // Imports in this file should be relative to css root @use 'legacy/pretext.css'; @use 'legacy/pretext_add_on.css'; @use 'legacy/pretext_search'; @use 'targets/html/legacy/wide/shell_wide.scss'; @use 'targets/html/legacy/wide/banner_wide.scss'; @use 'targets/html/legacy/wide/navbar_wide.scss'; @use 'targets/html/legacy/wide/toc_wide.scss'; @use 'targets/html/legacy/default/knowls_default.css'; @use 'targets/html/legacy/wide/style_wide.scss'; @use 'legacy/colors/all_colors.scss'; ================================================ FILE: css/targets/html/legacy/wide/toc_wide.scss ================================================ @use '../default/toc_default'; .pretext .ptx-sidebar { display: none; width: 200px; position: sticky; top: 36px; z-index: 10; height: 0; } .pretext .ptx-sidebar.visible { position: sticky; top: 36px; z-index: 10; height: 0; } .pretext .ptx-sidebar .ptx-toc { width: 360px; background-color: var(--page-color); border: 1px solid var(--tocborder); } .pretext .ptx-page .ptx-main { margin-left: inherit; } .ptx-toc::after { height: auto; max-width: 100px; margin: 0 auto; } ================================================ FILE: css/targets/html/salem/_chunks-salem.scss ================================================ // Standard collection of chunks. This file should only be modified // to fix bugs or improve the default-modern theme. If you want to // make changes for use in some other theme, create a _chunks-XXX file // in that theme's directory. $border-radius: 2px !default; // One stop include for default style content blocks @use 'components/chunks/asides-floating' with ( $float-width: 300px, $float-offset: -524px, $min-float-width: 1820px ); @use 'components/chunks/codelike'; @use 'components/chunks/exercises'; @use 'components/chunks/solutions'; @use 'components/chunks/sidebyside'; @use 'components/chunks/discussion-inline'; @use 'components/chunks/knowls' with ( $border-radius: $border-radius, $border-width: 1px, $pad: 12px ); @use 'components/chunks/helpers/L-mixin'; @use 'components/chunks/helpers/box-mixin' with ($border-radius: $border-radius); @use 'components/chunks/helpers/heading-box-mixin' with ( $heading-color: white, ); @use 'components/chunks/helpers/sidebar-mixin' with ( $border-width: 4px, $border-radius: 4px, ); @use 'components/chunks/helpers/inline-heading-mixin'; @use 'components/chunks/helpers/C-box-mixin' with ( $heading-color: white, $border-radius: $border-radius, $border-width: 1px, $padding: 12px, $padding-right: 0px ); .remark-like { @include sidebar-mixin.box( $background-color: var(--remark-like-body-background), $border-color: var(--remark-like-border-color), ); } .assemblage-like { @include box-mixin.box( $border-color: var(--assemblage-like-border-color), $background-color: var(--assemblage-like-body-background) ); } // get rid of this wrapper when print worksheet styles are fixed .ptx-content:not(:has(>.worksheet)) { // avoid styling inside runestone containers .conclusion:not(.ptx-runestone-container *), .goal-like:not(.ptx-runestone-container *) { @include heading-box-mixin.box( $background-color: var(--goal-like-body-background), $border-color: var(--goal-like-border-color), $heading-background: var(--goal-like-border-color), $heading-color: white ); } } .ptx-content:has(>.worksheet) { .goal-like { margin-top: 1.5em; } } $c-boxes: "theorem-like", "definition-like", "example-like", "project-like", "computation-like", "proof-like"; @each $box in $c-boxes { .#{$box} { @include C-box-mixin.box( $border-color: var(--#{$box}-border-color), $heading-background: var(--#{$box}-border-color), ); } } // skip styling of exercises in worksheets, apply elsewhere $c-boxes-screen-only: "exercise-like"; @each $box in $c-boxes-screen-only { .ptx-content:not(:has(>.worksheet)) .#{$box} { @include C-box-mixin.box( $border-color: var(--#{$box}-border-color), $heading-background: var(--#{$box}-border-color), ); } .ptx-content:has(>.worksheet) .#{$box} { @include inline-heading-mixin.heading(); } } ================================================ FILE: css/targets/html/salem/_heading-tweaks.scss ================================================ // underlines to headings @use 'components/elements/extras/heading-underlines'; .hide-type .codenumber:not(:empty)::after { content: " -"; } ================================================ FILE: css/targets/html/salem/_other-widen.scss ================================================ // -------------------------------------------------------------------------- // Flexible / centered widening of other components // options should already be set in a previous @use @use 'components/helpers/expandable'; $top-level-containers: ".chapter, .section, .subsection, .subsubsection" !default; :is(#{$top-level-containers}) > .tabular-box, :is(#{$top-level-containers}) > .table > .tabular-box { @include expandable.expandable; } // get rid of indentation for tablular figures, interferes with centering wide elements figure.table-like { margin-left: 0px; margin-right: 0px; } ================================================ FILE: css/targets/html/salem/_parts-salem.scss ================================================ // Produces a centered "page" with borders and centered banner // TOC will be an initially hidden overlay $sidebar-width: 350px !default; $nav-height: 36px !default; $content-width: 725px !default; $content-side-padding: 48px !default; $navbar-breakpoint: 800px !default; $sidebar-breakpoint: $content-width + $sidebar-width + $content-side-padding * 2; @use 'components/page-parts/body' with ( // $max-width: 0, $content-width: $content-width, $content-side-padding: $content-side-padding, $centered-content: true, $footer-button-border-radius: 2px, ); @use 'components/page-parts/banner' with ( $navbar-breakpoint: $navbar-breakpoint, ); @use 'components/page-parts/navbar' with ( // $max-width: 0, $nav-height: $nav-height, $navbar-breakpoint: $navbar-breakpoint, ); @use 'components/page-parts/toc-overlay' with ( $nav-height: $nav-height, $sidebar-width: $sidebar-width, $navbar-breakpoint: $navbar-breakpoint, ); @use 'components/page-parts/footer' with ( $navbar-breakpoint: $navbar-breakpoint, ); :root { --page-width: 1100px; } .standalone-page { --page-width: 1600px; } @mixin page-block { @at-root { @media screen and (width > 800px) { & { max-width: var(--page-width); margin-left: auto; margin-right: auto; } } @media screen and (width > 1100px) { & { border-left: 1px solid var(--page-border-color); border-right: 1px solid var(--page-border-color); } } } } .ptx-masthead { .ptx-banner { justify-content: center; } .title-container { flex: unset; } @include page-block; } .ptx-navbar { @include page-block; } .ptx-page { @include page-block; } .ptx-page-footer { border-bottom: 0; @include page-block; } .ptx-content-footer { justify-content: space-evenly; } @container ptx-main (width < #{$navbar-breakpoint}) { .ptx-page > .ptx-main { .ptx-content { padding-left: 20px; padding-right: 20px; max-width: calc($content-width + 40px); } } } ================================================ FILE: css/targets/html/salem/_rs-widen.scss ================================================ // -------------------------------------------------------------------------- // Flexible / centered widening of rs elements and other components $small-nested-margin-offset: 0px !default; // These will have defaults that have possibly been overridden by @use in main theme file @use 'sizing-globals' as sizing; @use 'components/helpers/expandable'; // designed to be used with a @container/media query by file using this // left to user to include in a media query // e.g. @container ptx-main (width < 850px) { @include smaller-screen-widening; } @mixin smaller-screen-widening { .ptx-runestone-container:has(#{sizing.$rs-wide-elements}) { width: calc(100cqw); margin-left: calc(-0.5*(100cqw - 100%)); } :is(#{sizing.$grouping-elements}):has(#{sizing.$rs-wide-elements}) { width: calc(100cqw); margin-left: calc(-0.5*(100cqw - 100%)); } :is(#{sizing.$grouping-elements}) .ptx-runestone-container:has(#{sizing.$rs-wide-elements}) { width: 100%; margin-left: $small-nested-margin-offset; //cheat into padding } } // widen all runestone elements that should be wide .ptx-runestone-container:has(#{sizing.$rs-wide-elements}){ @include expandable.responsive; } // unless nested in other runestones .ptx-runestone-container { .ptx-runestone-container:has(#{sizing.$rs-wide-elements}) { width: 100%; min-width: 100%; margin-left: auto; } } // also wide grouping elements that have wide elements :is(#{sizing.$grouping-elements}):has(#{sizing.$rs-wide-elements}) { @include expandable.responsive; } // unless nested in other wide elements :is(#{sizing.$grouping-elements}):has(#{sizing.$rs-wide-elements}) { :is(#{sizing.$grouping-elements}):has(#{sizing.$rs-wide-elements}) { width: 100%; margin-left: auto; } } // which simplifies the nested wide elements :is(#{sizing.$grouping-elements}) .ptx-runestone-container:has(#{sizing.$rs-wide-elements}) { width: 100%; margin-left: 0; } /* limit width of content inside ac except for actual activecode */ .runestone.ac_section > div > div > *:not(.ac_code_div):not(.ac_output):not(.codelens):not(.ac_actions) { max-width: sizing.$content-width; margin-left: auto; margin-right: auto; } /* same for exercise-statement in any runestone */ .runestone { .exercise-statement { max-width: sizing.$content-width; margin-left: auto; margin-right: auto; } } /* limit width of statement and success/error message inside hparson */ .hparsons_section .hp_question, .hparsons_section .hp_feedback { max-width: sizing.$content-width; margin-left: auto; margin-right: auto; } /* limit width of content inside parsons except for actual parsons */ .runestone.parsons_section > .parsons { width: 100%; padding-right: 0; .sortable-code-container { display: flex; flex-flow: wrap; justify-content: center; gap: 15px; margin: 10px auto; } .sortable-code { margin: 0; } .runestone_caption_text { max-width: unset; } & > div > *:not(.sortable-code-container) { max-width: sizing.$content-width; margin-left: auto; margin-right: auto; } } ================================================ FILE: css/targets/html/salem/_sizing-globals.scss ================================================ // This file can be @use'd with overrides once // Then future @uses will get those overrides instead of the values listed here $content-width: 725px !default; $content-side-padding: 48px !default; $content-with-padding-width: $content-width + 2 * $content-side-padding; // rs components that should be wide $rs-wide-elements: ".ac_section, .codelens, .parsons_section, .hparsons_section, .datafile" !default; // grouping elements that may have wide elements and require different margins // need to make sure those elements have a consistent amount of (padding+border) $grouping-elements: ".timedAssessment, .theorem-like, .definition-like, .example-like, .exercise-like, .project-like, .remark-like, .openproblem-like, .openproblems-like, .computation-like, .knowl__content" !default; // import expandable helper and set some defaults // future @uses will get these defaults @use 'components/helpers/expandable' with ( $width-hard-cap: 10000px, //no functional limit $base-content-width: $content-width, $content-padding: $content-side-padding, $always-expand: true, $centered: true ); ================================================ FILE: css/targets/html/salem/theme-salem.scss ================================================ /*! Theme: salem */ // A theme focused on displaying wide content gracefully // Current maintainer: Andrew Scholer // Variables used by theme. CSSBuilder overrides these by prepending // different definitions for these variables to this file before the theme // is compiled. // light colors $palette: 'ice-fire' !default; $color-main: null !default; $color-do: null !default; $color-fact: null !default; $color-meta: null !default; // dark colors $primary-color-dark: #9db9d3 !default; $background-color-dark: #23241f !default; @use "sass:map"; @use 'sass:color'; @use "colors/color-helpers" as colorHelpers; // --------------------------------------------- // components // set some default sizing variables - this will also set up // defaults for expandable mixin @use 'sizing-globals'; @use 'parts-salem'; @use 'chunks-salem'; @use 'components/pretext-web' with ( $navbar-breakpoint: parts-salem.$navbar-breakpoint, ); // --------------------------------------------- // fonts and colors $heading-font: 'Noto Sans, Helvetica Neue, Helvetica, Arial, sans-serif' !default; @use 'fonts/fonts-google' with ($heading: $heading-font); // fancy colors for chunks @use 'colors/palette-quad-chunks' as palette-chunks with ( $palette: $palette, $color-main: $color-main, $color-do: $color-do, $color-fact: $color-fact, $color-meta: $color-meta, $heading-text-color: black, ); // primary color defined by color-main as determined by palette-chunks $primary-color: map.get(palette-chunks.$colors, 'color-main'); @use 'colors/palette-single-bold' as palette-light with ( $primary-color: $primary-color, ); $light-colors: map.merge(palette-light.$colors, palette-chunks.$colors); @use 'colors/palette-dark' as palette-dark with ( $primary-color: $primary-color-dark, $background-color: $background-color-dark, ); $palette-dark: map.merge(palette-dark.$colors, ( "toclevel2-background": var(--content-background), "toclevel3-background": var(--background-color-gray-20), "toclevel1-background": var(--content-background), )); palette-dark.$colors: map.merge(palette-dark.$colors, ()); // --------------------------------------------- // customizations @use 'heading-tweaks'; @use 'other-widen'; @use 'rs-widen' with ( $small-nested-margin-offset: -5px ); // now handle smaller screens @container ptx-main (width < 850px) { @include rs-widen.smaller-screen-widening; } // bump up font size to avoid long lines in wider body body.pretext { font-size: var(--content-font-size); } :root { --content-font-size: 1.1rem; --auto-collapse-toc: yes; } @media screen and (width < #{parts-salem.$navbar-breakpoint}) { body.pretext { font-size: 1rem; } } // --------------------------------------------- // concrete rules / includes that generate CSS // render the actual colors @include colorHelpers.set-root-colors($light-colors, palette-dark.$colors); ================================================ FILE: css/targets/html/tacoma/_chunks-minimal.scss ================================================ $border-radius: 8px !default; // One stop include for default style content blocks @use 'components/chunks/asides-basic'; @use 'components/chunks/codelike'; @use 'components/chunks/exercises'; @use 'components/chunks/solutions'; @use 'components/chunks/sidebyside'; @use 'components/chunks/discussion-inline'; @use 'components/chunks/knowls' with ($border-radius: $border-radius); @use 'components/chunks/helpers/L-mixin'; @use 'components/chunks/helpers/box-mixin' with ($border-radius: 0); @use 'components/chunks/helpers/heading-box-mixin'; @use 'components/chunks/helpers/sidebar-mixin'; @use 'components/chunks/helpers/inline-heading-mixin'; .assemblage-like, .goal-like { @include sidebar-mixin.box( $border-width: 4px, $background-color: var(--goal-body-background), ); } .theorem-like, .definition-like { .heading { display: block; font-size: 1.1em; } .para { font-style: italic; } } .example-like, .project-like, .remark-like, .openproblem-like, .computation-like { > .heading { display: block; font-size: 1.1em; } } .proof { padding-bottom: 1.5em; &::after { content: "□"; float: right; } .heading { font-size: unset; font-weight: bold; font-style: italic; } } .solution-like { .heading { display: inline; font-style: italic; font-size: unset; } } .paragraphs { @include inline-heading-mixin.heading; } ================================================ FILE: css/targets/html/tacoma/_customization.scss ================================================ // more generous spacing for sections/articles @use 'components/page-parts/extras/toc-expand-chevrons'; // used to expand math and RS blocks @use 'components/helpers/expandable'; section>*:not(:first-child) { margin-top: 1.5em; } article>*:not(:first-child):has(.heading) { margin-top: 1.5em; } // let math stretch out to fill space on right .displaymath { @include expandable.expandable; } .code-display { @include expandable.expandable; } // horizontal scroll for tabular boxes .tabular-box { @include expandable.expandable; } ================================================ FILE: css/targets/html/tacoma/_parts-tacoma.scss ================================================ // Left aligned "page" with limited width, beyond which it is centered $max-width: 1000px !default; $sidebar-width: 240px !default; $scrolling-toc: true !default; $nav-height: 36px !default; $content-width: 600px !default; $content-side-padding: 48px !default; $content-side-padding-tight: 28px !default; $navbar-breakpoint: 800px !default; $sidebar-breakpoint: $content-width + $sidebar-width + $content-side-padding * 2; $content-with-padding-width: $content-width + 2 * $content-side-padding; @use 'components/page-parts/body' with ( $max-width: $max-width, $content-width: $content-width, $content-side-padding: $content-side-padding, $centered-content: true, ); @use 'components/page-parts/banner' with ( $navbar-breakpoint: $navbar-breakpoint, ); @use 'components/page-parts/navbar' with ( $max-width: $max-width, $nav-height: $nav-height, $navbar-breakpoint: $navbar-breakpoint, ); @use 'components/page-parts/toc-overlay' with ( $nav-height: $nav-height, $sidebar-width: $sidebar-width, $navbar-breakpoint: $navbar-breakpoint, ); @use 'components/page-parts/footer' with ( $navbar-breakpoint: $navbar-breakpoint, ); // breakpoint to end centering @media screen and (width < 1000px) { .ptx-main .ptx-content { margin: 0; } } // Decrease the side margins once out of room @container ptx-main (width < #{$content-with-padding-width}) { .ptx-page > .ptx-main { .ptx-content { padding-left: #{$content-side-padding-tight}; padding-right: #{$content-side-padding-tight}; max-width: calc($content-width + 2 * #{$content-side-padding-tight}); } } } ================================================ FILE: css/targets/html/tacoma/theme-tacoma.scss ================================================ /*! Theme: tacoma */ // A theme focused on a minimal distraction reading environment // Current maintainer: Andrew Scholer // Variables used by theme. CSSBuilder overrides these by prepending // different definitions for these variables to this file before the theme // is compiled. $primary-color: #2a5ea4 !default; $primary-color-dark: #829ab1 !default; $background-color-dark: #23241f !default; @use "sass:map"; @use "colors/color-helpers" as colorHelpers; // --------------------------------------------- // components @use 'parts-tacoma' as parts; @use 'chunks-minimal' with ($border-radius: 0); @use 'components/pretext-web' with ( $navbar-breakpoint: parts.$navbar-breakpoint, ); // --------------------------------------------- // fonts and colors @use 'fonts/fonts-google'; @use 'colors/palette-single-muted' as palette-light with ( $primary-color: $primary-color, ); @use 'colors/palette-dark' as palette-dark with ( $primary-color: $primary-color-dark, $background-color: $background-color-dark, ); // --------------------------------------------- // customizations @use './customization'; // --------------------------------------------- // concrete rules / includes that generate CSS // render the actual colors @include colorHelpers.set-root-colors(palette-light.$colors, palette-dark.$colors); ================================================ FILE: css/targets/print-worksheet/_chunks-worksheet.scss ================================================ // Standard collection of chunks. This file should only be modified // to fix bugs or improve the default-modern theme. If you want to // make changes for use in some other theme, create a _chunks-XXX file // in that theme's directory. $border-radius: 8px !default; // One stop include for default style content blocks @use 'components/chunks/asides-floating'; @use 'components/chunks/codelike'; @use 'components/chunks/exercises'; @use 'components/chunks/solutions'; @use 'components/chunks/sidebyside'; @use 'components/chunks/discussion-inline'; @use 'components/chunks/knowls' with ($border-radius: $border-radius); @use 'components/chunks/helpers/inline-heading-mixin'; @use 'components/chunks/helpers/horizontal-bars-mixin'; @use 'components/chunks/helpers/box-mixin' with ($border-radius: $border-radius); .theorem-like, .definition-like, .example-like, .project-like, .remark-like, .openproblem-like, .computation-like, .assemblage-like { > .heading { display: block; font-size: 1.1em; } } .proof { padding-bottom: 1.5em; &::after { content: "□"; float: right; } .heading { font-size: unset; font-weight: bold; font-style: italic; } } .solution-like { .heading { display: inline; font-style: italic; font-size: unset; } } .goal-like { @include horizontal-bars-mixin.bars( $border-width: 1px, $padding: 0.5em ); } .paragraphs, article { @include inline-heading-mixin.heading; } .assemblage-like { @include box-mixin.box( $border-width: 1px, $border-color: var(--assemblage-like-border-color), ); > .heading { font-size: 1.1em; } } ================================================ FILE: css/targets/print-worksheet/print-worksheet.scss ================================================ /*! Theme: print-worksheet */ // Used for print versions of worksheets (including their previews) for all themes // File is only included in standalone printable worksheet pages (the print preview pages). // Most rules apply to both screen and print; rules at the bottom of the file split into these two cases. // Also see: // components/_printing.scss : base rules for printing a standard PreTeXt page - removes UI // components/_worksheet.scss : rules that apply to worksheets in context and in print/preview. // Current maintainer: Oscar Levin // --------------------------------------------- // Grouping containers - based off of those in default-modern @use 'chunks-worksheet' with ($border-radius: 0); // Bring in the standard PreTeXt styles for components @use 'components/pretext'; // Use underline style headings //@use 'components/elements/extras/heading-underlines'; // Make sure fonts are available @use 'fonts/fonts-google'; // For the print button @use 'components/helpers/buttons-default' as buttons; // Make sure we are including the root colors using simple black-and-white palette // Always use colors from the light mode palette, since the print preview and printed version will be light mode. @use "sass:map"; @use "colors/color-helpers" as colorHelpers; @use 'colors/palette-single' as palette with ( $primary-color: black, ); $light-colors: map.merge( palette.$colors, ( "block-head-color": black, ) ); // Print worksheets should always render with the light palette, even if the page // root still carries the site's dark-mode class. :root, :root.dark-mode { color-scheme: light; @include colorHelpers.scss-to-css($light-colors); } // --------------------------------------------- // concrete rules / includes that generate CSS // Set variables for default width and margins :root { --ws-width: 8.5in; // Default width for worksheets --ws-height: 11in; // Default height for worksheets --ws-top-margin: 40px; // Default top margin for worksheets --ws-right-margin: 55px; // Default right margin for worksheets --ws-bottom-margin: 45px; // Default bottom margin for worksheets --ws-left-margin: 45px; // Default left margin for worksheets --ws-content-width: calc(var(--ws-width) - var(--ws-right-margin) - var(--ws-left-margin)); --ws-content-height: calc(var(--ws-height) - var(--ws-top-margin) - var(--ws-bottom-margin)); } // Remove surrounding UI elements .pretext .ptx-masthead, .pretext .ptx-navbar, body.pretext > a.assistive, .pretext .ptx-page > .ptx-sidebar, .pretext .ptx-page-footer, .pretext .ptx-main > div.ptx-content-footer { display:none; } // Remove the print preview link .heading .print-links { display: none; } .autopermalink { display: none; } // Some elements don't make sense to print: // image descriptions // webwork "activate" buttons // buttons in general (to remove Runestone "Check Me" button) // We remove these here. .image-description, .ptx-content .webwork-button, .ptx-runestone-container button.btn { display: none; } // Set font appropriate for printing section.worksheet, section.handout { font-size: 11pt; font-family: var(--font-print); } // .onepage is the common class that wraps all content in a single worksheet page (often modified by the javascript) .onepage > .heading { margin-top: 0; font-size: 1.3em; } // Headings made out of paragraphs titles .onepage h4.heading { font-size: 1.2em; margin-top: 1em; } .onepage .instructions { display: none; } // Headers and footers .onepage .first-page-header, .onepage .running-header, .onepage .first-page-footer, .onepage .running-footer { display: flex; justify-content: space-between; align-content: flex-start; // Make divs have minimum width to make it easier to select them for editing div { min-width: 10em; } .header-center, .footer-center { text-align: center; } .header-right, .footer-right { text-align: right; } } .onepage .first-page-header, .onepage .running-header { margin-bottom: 1em; border-bottom: 1px dashed lightgray; } .onepage .first-page-footer, .onepage .running-footer { margin-top: 1em; border-top: 1px dashed lightgray; } // Style solutions divs, which the javascript transforms from knowls to divs with titles .solutions { margin-top: 1em; .solution-like.born-hidden-knowl { margin-top: 1em; padding: unset; h5 { font-weight: bolder; display: inline; font-size: 1em; } > div { display: inline; } .knowl__content { display: inline; border: none; background-color: unset; padding: 0; >:first-child { display: inline; } .para { margin-top: 0.5em; } } } } // Additional styling tweaks for print .code-inline { border: unset; background: unset; } .onepage article { padding-left: 0; border: none; } .onepage article::after { all: unset; } .onepage > .para:first-child, .onepage > article:first-child { margin-top: 0; } // Some headings have larger top-margins than their parent section, so we fix that here. .onepage > section > .heading { margin-top: 0; } // tasks might be "free-floating" articles, in which case they should get the same indenting as tasks inside exercises. section article.task, .conclusion.subtask { margin-left: 20px; } section article.subtask, .conclusion.subsubtask { margin-left: 40px; } section article.subsubtask { margin-left: 60px; } section.worksheet > .heading, section.handout > .heading { display: inline; font-size: 1.1em; } section.worksheet > .heading + .para, section.handout > .heading + .para { display: inline; } .introduction, .conclusion { > .heading { font-size: 1.1em; font-weight: bold; margin-bottom: 0; border-bottom: none; + .para { margin-top: 0.5em; } } } form.papersize-select { padding-bottom: 8px; } // Screen specific styles (mostly for showing the border around a worksheet with it's "margins" and for the print controls) @media screen { .ptx-main { max-width: var(--ws-width); margin: 50px auto; } .worksheet, .handout { max-width: var(--ws-width); margin: 0 auto; } .onepage { width: 100%; height: var(--ws-height); padding: var(--ws-top-margin) var(--ws-right-margin) var(--ws-bottom-margin) var(--ws-left-margin); box-shadow: 5px 10px 40px -10px; } // Set space between pages .onepage + .onepage { margin-top: 2.5em; } .workspace-container { display: flex; overflow: visible; } .workspace { width: 100%; } .highlight-workspace .onepage .workspace { border: 1px dashed gray; background: hsl(224, 100%, 95%); } // Normally, the .workspace.original is hidden in the print preview, but if the highlight-workspace checkbox is checked, it will be shown. .onepage .original-workspace { display: none; } .highlight-workspace .onepage .original-workspace { display:block; width: 10px; background: hsl(152, 29%, 65%); } .highlight-workspace .onepage .warning { background: hsl(36, 65%, 67%); } .print-button { @include buttons.ptx-button; } .papersize-select { z-index: 1; .name::after { content: ": "; } } .print-controls { display: flex; justify-content: space-between; align-items: center; padding-bottom: 1em; } // Make labels and inputs for print options have pointer cursor label, input { cursor: pointer; } // Add spacing for header/footer options .header-option, .footer-option { display: flex; gap: 1em; align-items: baseline; .title::after { content: ":"; } } // Style the additional printing options the same as we do for knowls .print-options { summary { cursor: pointer; display: list-item inline; } .hide-option { display: inline-block; padding-right: 1em; } } } // Print specific styles @media print { body { margin: 0; padding: 0; width: var(--ws-content-width); } .print-preview-header { display: none; } section.worksheet, section.handout { border: none; width: 100%; .onepage { margin-top: 0; width: 100%; height: var(--ws-content-height); overflow: hidden; page-break-after: always; page-break-inside: avoid; } // Avoid a blank page at the end if the last page fits on the previous page .onepage:last-of-type { page-break-after: avoid; } .first-page-header, .running-header { border-bottom: none; } .first-page-footer, .running-footer { border-top: none; } // Never show the workspace preview in print div.workspace, div.workspace.squashed.tight { border: none; padding: 0; background: none !important; } } a { color: black; } @page { // Note: when we allow custom margins, the javascript will need to change these defaults. // Default margins appear to be necessary for Firefox and Safari (Chrome already works with the variable values). margin: var(--ws-top-margin, 40px) var(--ws-right-margin, 55px) var(--ws-bottom-margin, 45px) var(--ws-left-margin, 45px); } } ================================================ FILE: css/targets/revealjs/reveal.scss ================================================ /*! Theme: reveal */ // Tip: to build just this file directly to a folder for testing, do something like: // npm run build -- -w -t pretext-reveal -o ../../examples/sample-slideshow/out/_static/pretext/css @use "components/elements/list-styles"; //---- List Styles ---- ul { display: block !important; } .cols1 li, .cols2 li, .cols3 li, .cols4 li, .cols5 li, .cols6 li { float: left; padding-right: 2em; } //---- Container Styles ---- // Force sidebyside divs to be full width .sidebyside { width: 100%; } /* Callout boxes */ // Note: the box around a "theorem" does not contain // the associated "proof" because the HTML does not // provide an enclosure containing both. .definition-like, .theorem-like, .proof, .project-like { border-width: 0.5px; border-style: solid; border-radius: 2px 10px 2px; padding: 1%; margin-bottom: var(--r-block-margin); } .definition-like { background: color-mix(in srgb, var(--r-background-color) 75%, #006080); } .theorem-like { background: color-mix(in srgb, var(--r-background-color) 75%, #a00); } .proof { background: color-mix(in srgb, var(--r-background-color) 75%, #aaa); } .project-like { background: color-mix(in srgb, var(--r-background-color) 75%, #608000); } //---- Media Styles ---- .reveal img { border: 0.5px !important; border-radius: 2px 10px; padding: 4px; } .image-box, .audio-box, .video-box, .asymptote-box { position: relative; } iframe.asymptote, .video-box .video, .video-box .video-poster { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } // make small images full-width in #sidebyside // could improve with a .sidebyside class div[style*="display:table-cell"] img { width: 100%; } //---- Codelike Styles ---- .code-inline { background: color-mix(in srgb, var(--r-background-color) 75%, var(--r-link-color)); padding: 0 3px; border: 1px solid; margin: 3px; display: inline-block; } .sagecell_sessionOutput { background: white; color: black; border: 0.5px solid var(--r-main-color); } .program { background: color-mix(in srgb, var(--r-background-color) 75%, var(--r-link-color)); max-height: 450px; overflow: auto; border: 0.5px solid var(--r-main-color); } .ptx-sagecell, .reveal .program { font-size: calc(var(--r-main-font-size) * 0.6); } code[class*="language-"], pre[class*="language-"] { padding: 0; line-height: 1.2; } // Undo some reveal.js defaults .reveal pre { box-shadow: none; line-height: 1; font-size: inherit; width: auto; margin: inherit; } .reveal pre code { display: block; padding: 0; overflow: unset; max-height: unset; word-wrap: normal; } //---- Other Styles ---- dfn { font-weight: bold; } ================================================ FILE: doc/guide/COPYING ================================================ PreTeXt Guide by Robert A. Beezer, David Farmer, Alex Jordan, Mitchel T. Keller Copyright (C) 2013-2016 Robert A. Beezer, David Farmer, Alex Jordan, Mitchel T. Keller Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the appendix entitled "GNU Free Documentation License" and appended below. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GNU Free Documentation License Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. ================================================ FILE: doc/guide/README.md ================================================ # The PreTeXt Guide PDF and HTML versions of this guide are available at the [PreTeXt](https://pretextbook.org) site in the Documentation area. If you wish to build from source, possibly as part of contributing improvements, follow these steps: 1. To build LaTeX for input to `pdflatex`: cd /path/to/guide pretext build latex -d -w 1. And for HTML output: cd /path/to/guide pretext build html -d -w 1. The preceeding two steps will attempt to build all of the webwork representations and diagrams needed for your book. You may be missing some of the prerequisites, such as Sage that will need to be installed before a full build can be completed. If you are contributing new material, note that there are three important elements in use. Please make use of them in your contribution. - `tag` - for element names - `tage` - for names of empty elements - `attr` - for names of attributes ================================================ FILE: doc/guide/appendices/cli-transition.xml ================================================ Transitioning to the PreTeXt-CLI Sean Fitzpatrick

This appendix is intended for authors of existing (legacy) projects who want to transition from using xsltproc to the PreTeXt-CLI.

Setup

We will assume you have the following:

  • An existing project, in a folder called PROJECT.
  • A Python installation at version 3.8 or newer.
  • The PreTeXt-CLI, installed using the instructions in .

For usage of the CLI, see .

The first thing we will do is to create a new folder. Call this folder PROJECT-CLI, and put it at the same level as the PROJECT folder. In a terminal (or in Python), enter the PROJECT-CLI directory, and run the pretext new book command. This will create the directory structure that the PreTeXt-CLI expects.

You now should see the following:

  • A project.ptx file
  • An assets folder
  • A generated-assets folder
  • A publication folder
  • A source folder

Within the source folder, there will be a file called main.ptx, and within the publication folder, there will be a publisher file, called publication.ptx.

Transferring files

In your original project, you probably have one folder containing your source, and you may have other folders containing external files, such as images, or code for interactive elements. If you use additional XSL, such as a LaTeX style sheet, you may have a folder for those files as well.

You want to copy your files as follows:

  1. Copy all of your source files into PROJECT-CLI/source.

    If you already have a file called main.ptx, it is fine to let this file overwrite the one created by the pretext init command. If you do not have such a file, you can either delete main.ptx, or rename your top-level file to main.ptx.

    Note: if you do not end up with a file called main.ptx, or if your file with this name is not your top-level file, see for details on how to edit the project.ptx file accordingly.

  2. Copy each folder containing external assets such as images into the assets folder. Note that you want to copy the folders and not the contents of those folders. This should result in folders such as PROJECT-CLI/assets/images.

  3. If applicable, copy over your xsl folder, and any other relevant folders. But do not copy over your output or publication folders.

Updating docinfo, the publication file, and the project manifest

Open both your original publication.ptx file, and the one created by the pretext init command. The file created by pretext init will contain some directory management details, such as: <source> <directories external="../assets" generated="../generated-assets"/> </source>

If your publication file did not already have a source element, copy this from the auto-generated publisher file into your own. If it does, adjust your existing content to match the director structure needed by the PreTeXt-CLI.

When this is done, replace the publication file created by pretext init with your own.

If your docinfo contains a brandlogo, you may need to change the source attribute from logo.png to images/logo.png, where logo.png is the name of the file used for your brand logo. This assumes that the file you use for your brand logo is contained in PROJECT-CLI/assets/images/.

Next, we need to update the project.ptx file that was created by pretext init. Opening the file, you will see there are several components: html, latex, pdf, and subset. The subset component is quite useful for editing: specify an xml:id from your book (such as a chapter or section), and you can use the command pretext build subset to do a partial build of your project.

In each component, ensure that the source tag points to the top level file of your project. By default, this is source/main.ptx, but if you kept a different file name during the step in , you will need to change this line to point to the correct file.

Similarly, ensure that the publication tag points to the correct publication file.

If you use any string parameters that cannot be transitioned to the publisher file, you can add them in your project.ptx manifest. For example, if you have WeBWorK problems and use the static preview feature, your xsltproc executable would have contained --stringparam webwork.divisional.static no In the html section of project.ptx, you can add <stringparam key="webwork.divisional.static" value="no"/> You can also specify a WeBWorK server as a string parameter, using key="server" , with value set to the server you use.

Finally, if there is any component for which you use additional XSL, you can specify this in the manifest as well. For example, if you have a LaTeX style sheet xsl/latex-style.xsl, then in both the latex and pdf sections, you should add the line <xsl>xsl/latex-style.xsl</xsl> See below for further details on using custom XSL.

Updating your custom <init>XSL</init>

Because the PreTeXt-CLI uses its own copy of , we have to change how the custom XSL imports the style sheets.

At time of writing, import of the entities.ent file, which defines all the different components of , does not seem to work automatically. Our first step will be to make a copy of this file, and place it in the xsl folder, next to our custom XSL style sheet.

If you still have a copy of the repository, you can copy entities.ent from pretext/xsl. If not, open a Python terminal, and then run: from pretext import static static.core_xsl('pretext-latex.xsl',as_path=True) This will output the path to the XSL, and in that folder you can find entities.ent and copy it to PROJECT-CLI/xsl.

Next, open your custom XSL file. You will need to change two lines. First, you will have a line that looks something like <!ENTITY % entities SYSTEM "../xsl/entities.ent"/> Change the string ../xsl/entities.ent to simply entities.ent. (Alternatively, instead of copying this file as above, you could enter the full path.)

Second, for each style sheet that you import, you will have a line that looks something like <xsl:import href="../xsl/pretext-latex.xsl"/> if you are using custom XSL for LaTeX. Replace href="../xsl/pretext-latex.xsl" with pretext-href="pretext-latex.xsl" . This tells the PreTeXt-CLI to import the XSL style sheet that it ships with.

At this point, you should be ready to try building your project with the PreTeXt-CLI. The advice above is based on a particular case study, using APEX Calculus. The requirements of your particular project may differ somewhat from the steps presented here.

As development proceeds on the PreTeXt-CLI, some of this advice may change. In particular, in a future version, it should no longer be necessary to make a copy of entities.ent.

================================================ FILE: doc/guide/appendices/cli-v1vsv2.xml ================================================ CLI versions 1 vs 2 Oscar Levin

This appendix describes the differences between the PreTeXt-CLI version 1.x and 2.x. Generally, projects started in version 1 of the CLI will continue to work in version 2.

The primary difference between the versions of the CLI is the format of the project manifest (project.ptx): in version 1, most properties were described as XML elements, where they are now given as attributes. The functions of each attribute for the version 2 manifest is described in . Here we illustrate how these relate to the legacy elements.

In we show a project manifest containing almost all options available. Then shows the same project manifest in version 2 format.

Example of version 1 project manifest html source/main.ptx publication/publication.ptx output/web pdf source/main.ptx publication/publication.ptx output/print mybook.pdf html source/main.ptx publication/rs-publication.ptx published/mydoc-id xsl/runestone.xsl latex pdflatex xelatex asy sage convert pdftops node file2brl ]]> Example of version 2 project manifest ]]>

One advantage of version 2 of the CLI is that many of the options are now optional, or can be applied at the project level to all targets. The example shown above can be further simplified, as shown in , since most values are the defaults anyway.

Simplified project manifest in version 2 format ]]>

Attributes for the project element that describe paths are common roots for any paths specified in target elements.

Notice that there is no longer a place to specify your executables in the manifest. This is because your executables are generally specific to a particular system, not a project. So instead, you specify executables in the file executables.ptx which is ignored by git. As with the version 2 manifest, the name or path to the executables are given as values of attributes. An example is shown in .

The project manifest can be further simplified by setting attributes for the project element. See for details.

Hopefully the examples above make it clear how the two versions compare for basic options. Below we list a few more differences between how you specify options in the version 1 and version 2 manifests.

  • <attr>ptx-version</attr>

    For the CLI to know you are using a version 2 manifest, you must include the ptx-version attribute in the project element, with value 2.

  • string parameters

    In version 1, you would specify string parameters as a sequence of stringparam elements, each with key and value attributes. In version 2, you use a single stringparams element with attributes for each key set to the value for the string parameter's value. See the example in

  • zipped output

    In version 1, you could get a zipped version of your html output by setting the format of the target to html-zipped. In version 2, this is replaced by setting the compression attribute to zip in the target element.

  • Braille options

    In version 2, you specify what embossing method you use for Braille formatted targets using the braille-mode attribute, with value either emboss or electronic.

  • WeBWorK Sets

    In version 1, you could generate webwork sets using the "webwork-sets" format. In version 2, this is replaced by setting the format attribute to webwork in the target element. Such a target can be compressed using the compression attribute.

  • Local asymptote

    In version 2, you can require that asymptote elements are generated using a local version of asymptote (instead of the server). You can specify this by setting the asy-method attribute to local, in either the target element, or as an attribute of project to use this method for all targets.

  • ================================================ FILE: doc/guide/appendices/editors.xml ================================================ Text Editors, Spell Check

    This appendix has information about using various text editors efficiently with source, along with suggestions for spell-checking. The choice of an editor that suits you is a big part of being a productive author. We are partial to Visual Studio Code because it is available free, is open-source, has a range of features, has community support (plug-ins), and has cross-platform support (Linux, Mac, and Windows). So we lead with Visual Studio Code, but also include Sublime Text, Emacs, XML Copy Editor, and vi/vim. A summary table of schema-aware editors can be found at .

    Visual Studio Code Oscar Levin

    VS Code is a free and open source, cross platform text editor from Microsoft. The package PreTeXt-tools provides highlighting and snippets for by extending the XML language support of VS Code.

    Sublime Text Dave Rosoff

    Sublime Text is a fast cross-platform editor with thousands of user-contributed packages implemented in its Python API. It is not free or open-source, although most of the user-contributed packages are both. Development is active as of December2024. However after build 4180 of Sublime Text 4, the PreTeXt support is broken.

    Here we outline several of the most important Sublime Text features that will help you to minimize your typing overhead and work more efficiently with your project. We also introduce the no longer maintained PreTeXtual package designed to help authors work more efficiently.

    Sublime Text 2, 3 and 4 are available for an unlimited evaluation period, but a license must be purchased for continued use.

    Settings

    Sublime Text settings are stored and managed in a collection of JSON files as key-value pairs, in files that have a .sublime-settings extension. You change the settings by visiting these files and editing the values away from their defaults.

    To edit your Sublime Text settings, you can use the Preferences/Settings User menu (Sublime Text/Preferences on OS X). Make sure that when you go to edit Settings, you always choose the User option. Changes to Default settings files will be overwritten when Sublime Text updates. It is recommended to use the Default files to see what settings are available to change. There are a lot, and not all are documented.

    All Sublime Text users should be aware that a particular view (buffer) may receive settings in several different ways, e.g., from global default settings, from global OS-specific settings, from package-provided settings, from user-provided settings, and so on.

    Key bindings are also stored in files with a similar format. There are only a limited number of keyboard shortcuts available, although Sublime Text does support multi-step shortcuts like Emacs. If you find that you wish to reassign shortcuts, this is certainly possible through the Preferences/Key Bindings User menu (Sublime Text/Preferences on OS X).

    Package Control

    Sublime Text's Python API exposes a lot of the Sublime Text internals to plugin and package authors. Packages extend Sublime Text's functionality, much like Emacs major modes. A package usually consists of some Python scripts that define Sublime Text events and actions, some text-based configuration files (XML/JSON/YAML files defining language syntax, symbol recognition, custom snippet insertion triggers and contexts, keybindings for new and old commands, ), and perhaps some other stuff too. These typically get bundled into a .zip archive that is disguised with the unusual extension .sublime-package. These archives live in the Packages directory, accessible via the Preferences menu (the Sublime Text/Preferences menu on OS X). Sublime Text monitors the Packages directory for changes and reloads all affected plugins on the fly.

    The first thing you should do after installing Sublime Text is install the Package Control package. This package manager operates within Sublime Text to automatically fetch updates for packages you have installed (unless you disable this feature). You can also list currently installed packages, find new packages to investigate, remove packages,

    Thousands of user-contributed packages are available for easy installation via Package Control. It is possible to maintain packages by hand, since most package authors publish via GitHub, but Package Control is the universally recommended method of obtaining, managing, and removing packages for your installation.

    1. Visit the Package Control download site.

    2. Find the Sublime Text console command (make sure the correct version of Sublime Text is selected) and copy it to the clipboard.

    3. Open the Sublime Text console (Ctrl-`) and paste the command into the window that appears, then press Enter.

    Having installed Package Control, you can use the command palette to deploy its commands, such as Install Package, List Packages, and Remove Package. See the documentation for more. A few packages that are especially useful are recommended throughout this section, and summarized in .

    Project Management

    Like many modern editors, Sublime Text has good project management features. These allow files that are part of a larger project to work together. For example, Sublime's Goto Anything command allows quick access to any file in a project. The Find in Project command permits users to search and replace (with or without regular expressions) across an entire project. Matches are displayed in a text buffer and double-clicking opens the relevant file at the appropriate position.

    The sidebar provides a convenient view of all of the files and directories in a projector, if you like, a filtered view, where files of your choice are excluded. The MBXTools package () also makes some use of project-specific settings in order to provide some of its functionality.

    The Open Folder Command

    The easiest way to make use of the project management functionality is to store related files in a single directory and its subdirectories. If you then use the File/Open Folder command, the entire directory is opened and all its subdirectories and files are shown in the sidebar. You can toggle the sidebar with either the command palette or directly with Ctrl+K, Ctrl+B (Cmd+K, Cmd+B on OS X).

    By making use of this command you are already using project management, even if you never save your project. Sublime Text always has an implicit project open if you don't open an explicit one. This is good enough for many users a lot of the time, since it provides the most useful feature (Find/Find in Project). The Goto/Go To Symbol in Project command is also useful, but not fully implemented in MBXTools (). Some of the benefits of explicit project management are outlined below.

    Explicit Projects

    To save your project explicitly, use the Project menu to choose Save As Project and choose an appropriate name and location. For a XML project, this would probably be the same name and location as the document root file. Use the Project menu commands to open and close your project.

    There are a few benefits to using an explicit project to group files.

    • You can group together files and folders in different parts of the file system, instead of being restricted to subtrees.

    • You can have project-specific settings that are different from Sublime Text's defaults and different from your user preferences ().

    • Sublime's project workspaces will remember which files you had open when you last closed the project, and at which positions.

    • If you get very fancy, you can have multiple workspaces for the same project, with different filters and views for different purposes.

    • It is fine to include .sublime-project files in Git repositories, but .sublime-workspace files should never be so included (according to the Sublime Text documentation).

    Using the Sidebar

    The project sidebar allows you to view the entire directory tree (rooted at the folder you opened with the Open Folder command), or, if you've opened an explicit project as described above, all of its files and folders. You can use the sidebar to copy, move, rename, delete, and duplicate files, for example, as well as opening them.

    The package SideBarEnhancements is highly recommended (install via Package Control). It makes the sidebar much more useful.

    An alternative to the sidebar that Emacs users especially will find helpful is the dired package. The link is to a git repository since the package is no longer available from Package Control. This package allows you to browse the directory tree in a Sublime Text buffer. You can rename and move files within itusing all your favorite Sublime commands, including multiple selections (). You might also try the SublimeFileBrowser package, which is actively maintained, available in Package Control, and seems to provide similar functionality.

    Multiple selections

    Multiple selections are the single most useful and irreplaceable feature of Sublime Text, the one that will keep you coming back. From the documentation:

    Any praise about multiple selections is an understatement.

    The base functionality of multiple selections is simple. Hold down the Ctrl key (Cmd on OS X), and click somewhere in the open view to get a second cursor. Continue to add more cursors. All of them will behave together when you type: text will be inserted, most snippets or other text commands function as usual, etc. Even mouse commands work in an intuitive way with multiple selections.

    It is hard to explain exactly what makes multiple selections so powerful. You just have to try it for yourself. Here is a typical example. In a structured document, many bits of text occur quite frequentlyelement and attribute names, for example. You may want to update several occurrences of a fragment at oncemaking several identical changes. Sublime's Quick Add Next command (Ctrl+D/Cmd+D) makes this a snap.

    1. Place the caret somewhere in the word you'd like to modify.

    2. Use Quick Add Next to expand your (empty) selection to the current word.

    3. Use Quick Add Next again to add the next instance to the selection, which will then typically be disconnected.

    4. Continue to Quick Add Next as many times as you like. Use Quick Skip Next (Ctrl+K, Ctrl+D/Cmd+K, Cmd+D) to jump over instances you would like to leave alone. If you go too far and select in error, hit Ctrl+U/Cmd+U to undo.

    5. Make your modification, only one time.

    Another example that occurs frequently when authoring XML is when you use the Wrap with Tag snippet (Alt+Shift+W/Ctrl+Shift+W). This snippet wraps the selection(s) in a p tag, with the tag name highlighted in both the start and end tags. If the p element is not what you wanted, just type. Both tags are replaced. This is a huge benefit to the XML author that makes essential use of multiple selections, even though you are barely aware of this as you use the feature.

    Column selection allows you to select a rectangular area of a file. This is unbelievably useful when editing a structured document. There are lots of ways to do it (see the Sublime Text documentation for an almost exhaustive list), but the most frequently used is to hold down Shift while clicking and dragging with the right mouse button (on OS X, hold down Option while dragging with the right mouse button). See the documentation for keyboard-based shortcuts.

    Column selection becomes even more useful when used in combination with the keyboard shortcuts for moving and selecting, such as Ctrl+Shift+Right (select to end of word) and Shift+End (select to end of line).

    Yet another example of the appallingly great utility of multiple selection comes when copying and pasting from a different file format. Suppose you have copied some lines of text and wish each such line to become a list item in your source.

    1. Use column selection, as described above, to select each line individually.

    2. Use Wrap with Tag to wrap each of the selected lines with matched begin/end li tags, all at once.

    3. Now you have to select the lines again, to wrap them with matched begin/end p tags. First, hit Shift+End to select to end of line.

    4. If your lines are wrapped, you may need to hit Shift+End again to get to the end of the wrapped lines.

    5. Now you've selected too far: the </li> are selected as well. Hold down Ctrl+Shift and hit the left arrow twice (unselect by word). (After a little practice, steps like this seem automatic.)

    6. Use Wrap with Tag to wrap each of the selected lines with matched begin/end p tags, all at once.

    This does take a little mouse-work, but the keystroke savings can be considerable. (The Emmet package, described in , provides an even quicker way to do this task and much more complicated ones.)

    There are so many incredibly handy ways to use multiple selections that we will forgo any further examples to leave the reader the pleasure of discovering her own favorites. One particularly helpful package is Text Pastry, which provides some auto-numbering and text insertion commands that work nicely with multiple selections. There are also a handful of packages that extend multiple selection functionality, such as PowerCursors and MultiEditUtils. PowerCursors allows you to add cursors and manipulate them without using the mouse. MultiEditUtils provides additional text processing commands designed to work with multiple selections.

    Emmet

    Emmet is the most downloaded plugin for Sublime Text (1.82 million installs via Package Control). It is mostly used by HTML and CSS authors and provides a lot of functionality for them. It is also useful for writing XML, as we see below. The main benefits of working with Emmet are ease of tag creation, manipulation, and removal.

    Emmet by default overrides Sublime's binding for the Tab key, endowing it with new behavior (the command Expand Abbreviation). This new behavior is to create a matching XML tag pair for whatever word is to the left of the caret, or with whatever words are selected. For example, if you were to type ol and press the Tab key, the resulting text would be<ol></ol>with the caret positioned between the two newly created tags. Pressing Tab a further time moves the caret to the right of the end tag.

    Emmet will produce any word it does not recognize into a matched tag pair when the Expand Abbreviation command is run. Some XML elements are empty, though. Within a matched tag pair, the command Split/Join Tag (Ctrl+Shift+`/Cmd+Shift+`) will contract it into an empty tag, removing any text between the existing begin and end tags. (If the caret is inside a tag for an empty element, this command replaces the empty element with a matching begin/end tag pair.)

    The default behavior (creating tag pairs whenever Tab is pressed) interferes with Sublime Text's usual Tab-completion, which may be undesirable. It may be disabled by setting"disabled_keymap_actions": "expand_abbreviation_by_tab"in the Preferences/Package Settings/Emmet/Settings User file. The functionality of Expand Abbreviation will still be available through Ctrl+E.

    For a more involved example of abbreviations, suppose you have pasted the items of an ordered list. Now you need to structure it with ol, li, and so on.

                    Lists are often good.
                    You can provide list items with <c>@xml:id</c>.
                    You probably don't want to number them, though.
                

    The desired output is:

                    <ol>
                        <li xml:id="item1">Lists are often good.</li>
                        <li xml:id="item2">You can provide list items with <c>@xml:id</c>.</li>
                        <li xml:id="item3">You probably don't want to number them, though.</li>
                    </ol>
                

    Using Emmet, one produces it by executing the Wrap as you Type command (Ctrl+Shift+G/Ctrl+W) and entering the following expression in the minibuffer.

                    ol>li[xml:id=item$]*>p
                

    The > symbol denotes a child element, the square brackets (with or without assignment) denote an attribute list, the $ provides the line-based numbering, and the * specifies wrapping each selected line with the indicated subtree (so each line is wrapped with lip, instead of the entire selection).

    Emmet can produce a large hierarchy of nested XML tags at various levels using this abbreviation syntax. For example, suppose you know that you will need to produce a tag structure of the following form.

                    <section xml:id="">
                        <introduction>
                            <p></p>
                        </introduction>
                        <subsection xml:id="">
                            <p></p>
                            <p></p>
                            <figure></figure>
                            <p></p>
                            <ol>
                                <li></li>
                                <li></li>
                                <li></li>
                            </ol>
                        </subsection>
                        <conclusion>
                            <p></p>
                        </conclusion>
                    </section>
                

    Admittedly, this is a bit much, but it makes the point. The Emmet abbreviation for this structure is:

    section[xml:id]>introduction>p^(subsection[xml:id]>p*2+figure+p+ol>li*3)^^conclusion>p

    Upon typing this string and placing the caret to the right of it, hit Ctrl+E (or Tab, if you didn't disable the Emmet default). The entire tree structure is created immediately, with tab stops for the missing attribute values and for each matching begin/end pair.

    The Expand Abbreviation As You Type command allows you to tweak such abbreviations interactively. Hit Ctrl+Alt+Enter and type the expression above into the minibuffer at the bottom of the window, watching the tree appear as you type.

    Emmet is a very powerful package that can do much more than is outlined here. However, it is by default mostly adapted to writing CSS and HTML. Customizing it to work more directly with is an ongoing project. You can discover more about Emmet by examining the Emmet documentation or poking around in the Settings and Keymap files.

    PreTeXtual<mdash />a Sublime Text package for <pretext/>

    PreTeXtual is a Sublime Text package designed to assist authors using . It is no longer supported and will not work in the latest version of Sublime Text 4.

    The package owes its inspiration and much of its code to the excellent LaTeXTools package. Please let the author know of any bugs you find or any features you would like to see included in MBXTools by creating a GitHub issue.

    Installation via Package Control

    It is recommended to install PreTeXtual via Package Control. If you have not installed Package Control yet, you should do that first (and restart Sublime Text afterwards).

    After Package Control is installed, use the Install Package command to search for the PreTeXtual package, and select it from the Quick Panel to install. This method of installation allows Package Control to automatically update your installation and show you appropriate release notes.

    via git

    You may also install PreTeXtual via git. Change directories into your Packages folder. To find the Packages folder, select Browse Packages from the Preferences menu (from the Sublime Text 4 menu on OS X). Make sure you are in the Packages folder and not Packages/User.

    Then, rungit clone https://github.com/daverosoff/PreTeXtual.gitand restart Sublime Text (probably not necessary).

    Usage

    You can activate the package features by enabling the syntax. The syntax definition looks for .mbx or .ptx file extensions. If your files end with .xml, you will either need to add a comment to the first line of each file (after the XML declaration):<!-- PTX -->or you will need to enable the syntax manually using the command palette. To enable it manually, open a file and press Ctrl+Shift+P (Cmd+Shift+P on OS X) and type pretext. Select Set Syntax: PreTeXt from the list of options.

    You should see the text PreTeXt in the lower right corner if you have the status bar visible (command palette: Toggle Status Bar).

    There are only a few features implemented so far.

    1. If you have some sectioning in your PTX file, hit Ctrl+R (Cmd+R on OS X) to run the Go To Symbol command. You should see a panel showing all the divisions' xml:id names.

    2. If you have been using xml:id to label your stuff, try typing <xref ref=" (the beginning of a cross-reference). Sublime Text should show you a panel containing all xml:id values along with the elements they go with. Choose one to insert it at the caret and close the xref tag. Alternatively, type ref and hit Tab to activate the xref snippet. Then hit Ctrl+l followed by x or Ctrl+l followed by Ctrl+Space to bring up the completions menu. There are several variants of the ref snippet, namely refa, refp, and refpa.

    3. Type chp, sec, ssec, or sssec and hit Tab to activate the division snippets. A blank title element is provided and the cursor positioned within it. As you type, the xml:id field for the division is filled with similar text mirroring the title you are entering.

    Known issues

    1. When manually adding an xref (not using the snippets or autocomplete), you will frequently see a spurious Unrecognized format error.

    2. The ref snippet does not bring up the quick panel. Should it?

    3. Recursive search through included files for labels is not yet implemented.

      This will only work for xref completion, not Go To Symbol.

    4. Nothing has been tested on OS X or Linux.

    Recommended Packages

    1. Package Control

    2. Emmet

    3. SideBarEnhancements

    4. PowerCursors

    5. MultiEditUtils

    6. Text Pastry

    7. Git or SublimeGit

    8. SublimeLinter

    9. MBXTools

    Aspell

    Aspell is a spell-checker which you can easily configure to skip every piece of text used as a name of an XML element, and to skip elements that are likely to contain text that is not really made up of words and sentences. For example, the element chapter might not be flagged by some mainstream spell checkers, but most likely the element mdash will be flagged by every spell checker, including the default configuration of Aspell. And your m elements are full of , not words. Unfortunately, Aspell will not follow your xi:xinclude directives, so you need to run it against each of your files if you have modularized your source. A command-line invocation would like like: aspell -c ~/aota/src/fish.xml

    Installation on Linux should be straightforward through your distribution's package manager. On a Mac, the executable, and a dictionary for your language, can be installed easily via MacPorts (). Recent improvements on Windows (ca. 2019-06-06) perhaps imply that WSL or the Ubuntu Linux install may provide an easy avenue. Please report steps that result in a successful Windows installation, so we can include them here.

    Configuration is achieved via a hidden file at the top of your home directory, namely .aspell.conf. A Mac will try to keep you away from hidden files, which are the ones whose name begins with a period. Let SublimeText give you an assist here. In we show a first run at a useful configuration file. You definitely want to add the SGML filter, since this is what tells Aspell that you are working on XML filesSGML is the precursor of XML., so that all element names, attributes, etc. will not be checked. The remainder is a suggested list of elements to skip. Suggestions for additions are welcome here.

    Aspell Configuration File add-filter sgml # elements with lots of code # but not "pre", since it is like a "p" add-sgml-skip c add-sgml-skip cd add-sgml-skip program add-sgml-skip console add-sgml-skip sage # image formats add-sgml-skip latex-image add-sgml-skip asymptote add-sgml-skip sageplot # elements that display XML elements add-sgml-skip tag add-sgml-skip tage add-sgml-skip attr # initialisms and friends add-sgml-skip init add-sgml-skip acro add-sgml-skip abbr # math (latex) add-sgml-skip m add-sgml-skip me add-sgml-skip men add-sgml-skip md add-sgml-skip mdn add-sgml-skip usage # in "notation" # not really content, by and large add-sgml-skip docinfo

    You can run Aspell in a sort of batch, non-interactive mode by adding the -a switch and then providing your source on standard input and directing results from standard output. But I do not find it very useful.

    emacs

    Jason Underdown reports on 2016-05-12 that emacs' nXML mode works well with a schema, and Mitch Keller reports on 2021-04-18 that specifically a RELAX-NG schema may be used. The two versions of the RELAX-NG schema for can be found at pretext/schema/pretext.rng pretext/schema/pretext.rnc The first is the real version, while the second is an entirely equivalent (compact) syntax that is meant to be a bit more human-readable, so perhaps either may be employed.

    On 2021-04-18, Mitch Keller reports success with placing the following schemas.xml file in his source file directories. Note that you may need to adjust the path in the uri attribute, and the pattern attribute implies that Mitch has used a .ptx suffix for all his source filenames. If you are already using emacs, you should have no trouble making the necessary adjustments.

    
            
              
            
            ]]>
            

    You simply put your cursor at any point in the document, start a new tag with < and then call the completion-at-point function (I bound it to the key-chord: C-<return>) to get a list of possible completions. Or you can start typing a few characters to narrow the list of possibilities. It will also let you know if the element you are trying to insert is invalid.

    Jason Underdown
    XML Copy Editor

    Michael Doob reports on 2017-02-03 that XML Copy Editor works well, in particular on Windows. This is an open source program, for Windows and a variety of popular Linux distributions, that supports both DTD and RELAX-NG schemas. It is less of a general programmer's editor and more like dedicated tools for working strictly with XML documents.

    vi, vim Using vi and <pretext /> together

    Any smart editor, and vi is no exception, allows the addition of new commands to make repetitive tasks easier. Since creating documents with markup often is repetitive, it makes sense to explore the techniques of creating additional commands in vi to make editing easier.

    The expectation for this section is that the reader is able to use vi to create and edit files, but no greater depth of knowledge is assumed. The term vi is meant to be inclusive, that is, it includes vim, gvim and the like.

    Modes of vi: Command, Normal, and Insert

    One of the most fundamental properties of vi is that every editing task may be accomplished using the keyboard. For different editing contexts, it is advantageous to have the keyboard strokes have different meaning; these different interpretations are called the modes of vi.

    Here are the pertinent modes of vi:

    • Normal mode: This mode is for changing position within the file. For example, j moves down, 2w moves forward two words, and -2} moves backwards two paragraphs. It is also used for block operations on text: -3dd is used to delete three previous lines, or 2.yy will yank the next two sentences. Usually vi starts in normal mode.
    • Insert mode: This mode is for inserting new text into the file. Typing Galloping Gertie leapt into the air. causes that text to be inserted at the current position in the file.
    • Command mode: This mode is to execute commands. Typing /abc in normal mode initiates a forward search for the first occurrence of abc via the command mode. Similarly :w will use command mode to write out the current working material (buffer) to the disk.

    Now a quick review of the keys used to move between modes: From a given position in a file in Normal mode, using i or a will change to Insert mode and insert text before or after that position. Similarly, I or A will insert text in front of or directly following the current line, and O or o will insert text above or below the current line. Returning to Normal mode is done using Esc.

    If /, ?, or : is typed when in normal mode, a small one-line window opens up (called the command line) to receive text. This entered text is terminated by Enter. The / or ? initiates a forward or backward search for the entered text. The : sends the entered text to the vi program for further processing.

    show the keys used to move between modes.

    Keys for moving between different modes in vi unitsize(1.0cm); void modebox(string s, pair P) { label("\setlength{\fboxrule}{2.0pt} \framebox[72pt]{\vbox{\begin{center}"+s+"\\mode\end{center}}}",P); } void keybox(string s, pair C, real w, real h, real r) { real c1=C.x, c2=C.y; pair [] X = { (c1-w+r,c2-h), (c1+w-r,c2-h), (c1+w-r,c2-h+r), (c1+w,c2+h-r), (c1+w-r,c2+h-r), (c1-w+r,c2+h), (c1-w+r,c2+h-r), (c1-w,c2-h+r), (c1-w+r,c2-h+r) }; path P = X[0]--X[1]-- arc(X[2],r,270,0,direction=CCW)-- X[3]-- arc(X[4],r,0,90)-- X[5]-- arc(X[6],r,90,180)-- X[7]-- arc(X[8],r,180,270) --cycle; filldraw(shift(.05,-.05)*P,gray); filldraw(P,lightgray); label("\footnotesize "+s,C); } pair C=(0,0), N=(5,0), I=(10,0); //LL of Control, Normal, Insert boxes modebox("Command",C); modebox("Normal",N); modebox("Insert",I); pair L=(1.5,0.3), R=(6.5,0.3), XD=(2.2,0), YD=(0,-0.7); draw (L..L+XD,Arrow); draw (L+YD+XD..L+YD,Arrow); draw (R..R+XD,Arrow); draw (R+YD+XD..R+YD,Arrow); real w=0.25, h=0.27, r=0.12; // default width, height, radius of curvature keybox("/", L+0.5*XD+2*YD, w, h,r); keybox("?", L+0.5*XD+3.0*YD,w, h,r); keybox(":", L+0.5*XD+4*YD, w, h,r); keybox("Esc", R+0.5*XD+2*YD, w+0.12,h,r); keybox("Enter",L+0.5*XD-1.5*YD,w+0.3, h,r); keybox("i", R+0.5*XD-1.0*YD,w, h,r); keybox("a", R+0.5*XD-2.0*YD,w, h,r); keybox("o", R+0.5*XD-3.0*YD,w, h,r);

    An exclamation point prefix ! in Command mode sends that command to the operating system. For example, entering :!date will cause the results of the operating system command date to be displayed on the command line. In addition the percent character % gets expanded to the name of the file being edited. If your operating system uses ls -l to list file information, then :!ls -l % will give the properties of the file being edited.

    Using :set

    The Command mode in vi allows users to change their interaction with the editor. (Remember that entering : changes to Command mode, and any text string entered in Command mode is terminated by Enter.) For example, entering :set number will cause line numbers to appear on the left. They are not in the file itself, of course, but are there for the convenience of the user. Entering :set nonumber will remove these line numbers. Similarly :set autoindent will cause a new line to preserve the indentation of the previous one and :set expandtab will replace the tab character by an appropriate number of spaces (both are very useful for writing documents). Some useful set commands are given in .

    Some useful parameters for the set command Command Resulting change :set autoindent A new line preserves indentation :set expandtab Inserted tabs converted to spaces :set rows=n Set number of lines displayed :set columns=n Set the display size of each line :set list Show tabs and carriage returns :set tabstops=n Tab inserts n spaces :set Show all current settings
    A little editing etiquette

    The xml files used with are ordinary text files. This makes it easy for coauthors to email them back and forth in order to expand and improve the content. There are a few potential problems, and hence some useful precautions.

    • If a Tab is entered and not expanded to spaces, different editors may display the text with different alignments.
    • If there are extra spaces at the end of a line, there may be odd line wrapping.

    Fortunately, these are easy to avoid.

    • A tab character may be found in the usual manner for searches: : / Tab will find the next tab; it can be removed and replaced by spaces.
    • A space before the end of a line can be found with the search : / Space $ (vi will interpret $ as the end of a line rather than as a dollar sign). The spaces at the end of the line can then be removed.

    There is another feature of vi that is helpful in this respect. Using :set list will make the tab and end of line characters visual as ^I and $. This makes the appropriate deletions easy. It is good editing etiquette to do so.

    Abbreviations

    The :abbreviation command allows the replacement of longer expressions by shorter ones. Try this: in Command mode enter :abbreviate ups University of Puget Sound and then (in Insert mode) type I enjoyed my visit to the ups. If all goes well, the abbreviation is expanded and the text is I enjoyed my visit to the University of Puget Sound. Now suppose you want to write My favourite letter of the Greek alphabet is upsilon. Looks like trouble with the last word, but in fact all is well. Abbreviations are not expanded until the next character after the abbreviation is read. If the next character after the abbreviation is either a letter or a number, no expansion takes place. Careful observation of the original example reveals that the abbreviation is not expanded until the period is entered. Here is another example: You want to write I love pushups. What about the end of the last word? No problem! The ups is expanded only if it is at the beginning of a word.

    Amusingly enough, when in Command mode, the abbreviate command can itself be abbreviated to ab.

    The choice of an abbreviation is essentially arbitrary. However, if desiring an abbreviation within I enjoyed my visit to the Technische Hogeschool Eindhoven, it would be folly to use :ab the Technische Hogeschool Eindhoven. The abbreviation should be mnemonic, but avoid actual words.

    Now consider the following problem: what if the Enter key is one of the desired characters in the abbreviation? Since that key terminates Command mode, it appears impossible. Not so! The characters <enter> (that's seven of them) will be replaced by a single character equivalent to Enter.

    There are other characters that are treated in the same manner:

    Text equivalents to keyboard entries Desired key Text equivalent (not case sensitive) Enter <enter> or <cr> Backspace <bs> Insert <ins> Delete <del> Esc <esc> <left> <right> <up> <down> Home <home> End <end> Ctrl+x <C-x> Alt + y <M-y>

    Here is a useful example: Define the abbreviation ab gm <m></m><left><left><left><left> and then enter (in Insert mode) It follows from gm\log(\theta)=0 that gm\theta=1. It will (almost) be expanded to It follows from <m>\log(\theta)=0</m> that <m>\theta=1</m>. That's almost because it is necessary to move the cursor past the </m> when leaving the mathematics input. It's pretty easy to see how this abbreviation works. The first seven characters <m></m> are expanded unchanged and then the cursor moves to the left four times to put it right where it needs to be to enter the mathematics. Careful observation will reveal a little trick used in this example: gm is followed by a \ and so terminated the abbreviation correctly. If the variable were x, then inputting gmx would not work. A workaround: enter a Space after the gm. This terminates the abbreviation and it will work as desired. (Actually, there will be an extra space before the x, which causes no ill effect, but if true perfection is desired, using gmSpace Backspace will eliminate it.)

    When :ab is used, it is in effect in all modes. When abbreviations are for Input mode only (as is the present case), then iab: may be used and is usually preferable.

    Here is another useful (nonmathematical) example. Define (for use in Input mode) :iab gp <p><cr></p><up>. Then entering gpEnter on a new line will create three lines appearing like:

                <p>
    
                </p>
                

    That is, the first and third line start and end a paragraph and the cursor, represented by | is at the beginning of the second line. If autoindent is set, (see ), the line indentations are preserved. With this definition, the frequent task of starting a new paragraph appropriately formatted may be carried out using only three key strokes.

    A further example: :iab gcom <!--<CR><CR>--><Up> is useful to entering comments. Starting a line with gcom Tab will help create nicely indented comments.

    Want to know what abbreviations are in effect? Just enter :ab and they will be listed.

    Maps

    Maps, like abbreviations, are shortcuts that save extra key strokes. There is a difference in method: the map command uses key bindings that (re)define the meanings of key strokes. For example, inputting (while in Normal mode) :map <C-X> :w<CR> will define (map) the Ctrl +X key combination so that it is equivalent to typing the rest of the definition, :w<CR>. This three-key sequence, of course, just changes to Command mode, writes the current buffer to disk, and returns to Normal mode.

    Presumably this newly defined key binding is meant to be invoked in Normal mode. To do so in Insert mode would be a mistake; to avoid this, there is an nmap command that defines key binding for Normal mode only. Similarly, there is an imap command for Insert mode only. Thus defining a key binding using :nmap <C-X> :w<CR> will make it valid only in Normal mode. Unlike abbreviations, the binding takes effect the moment the key is pressed.

    There is a cute technique to use the same binding in Normal and Insert modes. The key binding :imap <C-X> <esc><C-X>a defines a binding for Insert mode. The first character, <esc>, changes to Normal mode; the next character, <C-X>, will use the the Normal mode definition of <C-X>. The final character a returns to the previous position in Insert mode.

    We can make special use of the special characters ! and % as described at the end of .

    The author using usually edits an xml file, say myfile.xml . This file is then processed using xsltproc in conjunction with an xsl file, say myfile.xsl. Often the xsl file is pretext-html.xsl or pretext-latex.xsl. The usual command used by the author is xsltproc myfile.xsl myfile.xml. With this in mind, we could define a map: :nmap <C-X> !xsltproc myfile.xsl myfile.xml<CR> so that the xml file could be processed with a single keystroke. Even better: :nmap <C-X> :w<cr>:!xsltproc myfile.xsl %<CR> defines a map that first writes the file being edited to disk and then processes it with xsltproc. This command is independent of the particular file being edited.

    A final somewhat complicated but very useful definition: imap <C-A> <Esc>yiwi<<Esc>ea></<Esc>pa><Esc>F<i which is a truly cryptic sequence of key strokes. Here is what they do:

    <tabular halign="center"> <row bottom="minor"> <cell right="minor">Key strokes</cell> <cell>Interpretation</cell> </row> <row> <cell right="minor"><esc></cell> <cell>Leave input mode</cell> </row> <row> <cell right="minor">yiw</cell> <cell>Save (yank) word above cursor</cell> </row> <row> <cell right="minor">i<</cell> <cell>Insert <c><</c> </cell> </row> <row> <cell right="minor"><esc></cell> <cell>Go to to Normal mode</cell> </row> <row> <cell right="minor">e</cell> <cell>Move to end of word</cell> </row> <row> <cell right="minor">a></<esc></cell> <cell>append <c> ></</c> and return to Normal mode</cell> </row> <row> <cell right="minor">p</cell> <cell>Paste the saved word</cell> </row> <row> <cell right="minor">a><Esc></cell> <cell>append <c>></c> and leave Insert mode</cell> </row> <row> <cell right="minor">F<</cell> <cell>Move to preceding <</cell> </row> <row> <cell right="minor">i</cell> <cell>Go to Insert mode</cell> </row> </tabular> </table> <p> The effect of this map: Entering <c>abc<C-A></c> will change <c>abc</c> to <c><abc>|</abc></c> where <c>|</c> is the position of the cursor. </p> <aside> <p> The definition needs to be a bit convoluted so that it works with both single letter and multiple-letter words. </p> </aside> <p> To list all of your defined maps, just use <c>:map</c>. </p> </subsubsection> <subsubsection> <title>Saving abbreviations and maps

    The abbreviations and maps defined during an editing session disappear when the session is over. There are a number of ways to retain them over different sessions.

    • Ephemeral use in one file: For most versions of vi, after entering Command mode the history may be accessed using the \(\uparrow\) key. Backing up to the previous definition of an abbreviation or map and pressing Enter will reinstate the definition. The line can also be edited if changes are desired (very useful while developing new abbreviations and maps). This history is preserved between editing sessions.
    • Repeated use in several files in one directory: The abbreviations and maps can be saved in a text file, say mymaps.txt. A line within the file might look like :ab ups University of Puget Sound Vi is then started with the -s mymaps.txt option to initialize the definitions.
    • Repeated use for files in different directories: Put the abbreviations and maps in the file .vimrc (_vimrc for Windows) in your home directory.

    Spell Checking Output

    While browsing your HTML output, it is possible to have the web browser's native spell checker highlight spelling errors. Create a bookmark with the following for its URL (all at once on one line, there are three lines here just for clarity): javascript:document.body.contentEditable=!document.body.isContentEditable; document.designMode=(document.designMode === 'on') ? 'off' : 'on'; void 0 Now when viewing a page and you click this bookmarklet, JavaScript will change browser settings so that the native spell checker highlights spelling errors. This is done by making the text content of the page editable, which is normally what is needed for the browser's spell checker to kick in. While this is active, you will not be able to click most links and buttons. Click the bookmarklet again to toggle things back to how they were.

    Some browsers may have extensions that you can install for spell checking the content of a page. For example, Chrome has Webpage Spell-Check.

    ================================================ FILE: doc/guide/appendices/gfdl-pretext.xml ================================================ GNU Free Documentation License

    Version 1.3, 3 November 2008

    Copyright 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. <>

    Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

    0. PREAMBLE

    The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

    This License is a kind of copyleft, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

    We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

    1. APPLICABILITY AND DEFINITIONS

    This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The Document, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as you. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

    A Modified Version of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

    A Secondary Section is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

    The Invariant Sections are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

    The Cover Texts are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

    A Transparent copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not Transparent is called Opaque.

    Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

    The Title Page means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, Title Page means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.

    The publisher means any person or entity that distributes copies of the Document to the public.

    A section Entitled XYZ means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as Acknowledgements, Dedications, Endorsements, or History.) To Preserve the Title of such a section when you modify the Document means that it remains a section Entitled XYZ according to this definition.

    The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

    2. VERBATIM COPYING

    You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

    You may also lend copies, under the same conditions stated above, and you may publicly display copies.

    3. COPYING IN QUANTITY

    If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

    If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

    If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

    It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

    4. MODIFICATIONS

    You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

    1. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.

    2. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.

    3. State on the Title page the name of the publisher of the Modified Version, as the publisher.

    4. Preserve all the copyright notices of the Document.

    5. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.

    6. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.

    7. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.

    8. Include an unaltered copy of this License.

    9. Preserve the section Entitled History, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled History in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.

    10. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the History section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.

    11. For any section Entitled Acknowledgements or Dedications, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.

    12. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.

    13. Delete any section Entitled Endorsements. Such a section may not be included in the Modified Version.

    14. Do not retitle any existing section to be Entitled Endorsements or to conflict in title with any Invariant Section.

    15. Preserve any Warranty Disclaimers.

    If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.

    You may add a section Entitled Endorsements, provided it contains nothing but endorsements of your Modified Version by various parties for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

    You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

    The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

    5. COMBINING DOCUMENTS

    You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

    The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

    In the combination, you must combine any sections Entitled History in the various original documents, forming one section Entitled History; likewise combine any sections Entitled Acknowledgements, and any sections Entitled Dedications. You must delete all sections Entitled Endorsements.

    6. COLLECTIONS OF DOCUMENTS

    You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

    You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

    7. AGGREGATION WITH INDEPENDENT WORKS

    A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an aggregate if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

    If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

    8. TRANSLATION

    Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

    If a section in the Document is Entitled Acknowledgements, Dedications, or History, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

    9. TERMINATION

    You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.

    However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

    Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

    Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it.

    10. FUTURE REVISIONS OF THIS LICENSE

    The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See .

    Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License or any later version applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document.

    11. RELICENSING

    Massive Multiauthor Collaboration Site (or MMC Site) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A Massive Multiauthor Collaboration (or MMC) contained in the site means any set of copyrightable works thus published on the MMC site.

    CC-BY-SA means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization.

    Incorporate means to publish or republish a Document, in whole or in part, as part of another Document.

    An MMC is eligible for relicensing if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008.

    The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.

    ADDENDUM: How to use this License for your documents

    To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

            Copyright (C)  YEAR  YOUR NAME.
            Permission is granted to copy, distribute and/or modify this document
            under the terms of the GNU Free Documentation License, Version 1.3
            or any later version published by the Free Software Foundation;
            with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
            A copy of the license is included in the section entitled "GNU
            Free Documentation License".
            

    If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the with Texts. line with this:

            with the Invariant Sections being LIST THEIR TITLES, with the
            Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
            

    If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

    If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.

    ================================================ FILE: doc/guide/appendices/git.xml ================================================ Revision Control: git

    Authoring a textbook without revision control is like driving without a seat belt. Sooner or later, you will wish you had used it. git is a popular program for revision control for software projects, and works quite well with , though not perfectly. Notes here are designed to help. For more on git itself, in the context of authoring a book, see Git for Authors, by Robert Beezer and David Farmer at pretextbook.org/gfa/html.

    Word Wrap

    git is designed for code, where a newline often expresses the end of a statement. In , it might make sense to author an entire (long) paragraph without any newlines. If so, a line-oriented file diff is not so useful. Fortunately, git has a flag, --word-diff, which does an excellent job of displaying small edits precisely.

    Messages for Commits and Merges

    When you make a commit or merge, you can supply a message at the command line with the -m argument. Otherwise you get thrown into an editor, with the default being vi, which can be hard to get out of if you have not used it before. Better, as Joe Fields suggests, is to tell git which editor you want to use. To set pico as the default editor, the one-time command-line incantation would be: git config --global core.editor "pico" You can also directly edit the configuration file at ~/.gitconfig. More suggestions can be found on this thread on StackOverflow at stackoverflow.com/questions/2596805.

    ================================================ FILE: doc/guide/appendices/glossary.xml ================================================ alt text alt text

    A text description of an image or other visual content. Its purpose is to describe content to readers who are unable to see the page.

    AMSMath AMSMath

    A package containing a wide variety of common math symbols.

    Asymptote Asymptote

    A package for drawing graphs, diagrams or pictures which may be used with or .

    attribute attribute

    In XML, tags can have attributes, which provide more information about the element. For example, in <section permid="dWf"> the tag is section, the attribute is permid, and the value of that attribute is dWf.

    BibTeX BibTeX

    A package for typesetting bibliographies.

    branch branch (git)

    In git, the files in a repository can exist in multiple versions which are independent of each other, but are able to be merged. Each independent version is a branch

    commit commit (git)

    In git, the act of declaring that changes to the files in a branch are now a permanent part of that branch.

    copyleft copyleft

    An arrangement whereby software or artistic work may be used, modified, and distributed freely on condition that anything derived from it is bound by the same condition.

    Creative Commons Creative Commons CC

    An organization which has created several open licenses for creative works.

    The Creative Commons licenses are: CC BY, CC BY-SA, CC BY-ND, CC BY-NC, CC BY-NC-SA, and CC BY-NC-ND. The strings BY, SA, ND, and NC represent, respectively, Attribution, Share Alike, No Derivatives, and Noncommercial.

    D3.js D3.js

    A JavaScript library for animating data. The name comes from Data Driven Documents.

    Desmos Desmos

    A graphing calculator that can be embedded in a Web page.

    division division

    In , a part, chapter, section, subsection, subsubsection, appendix, or paragraphs of a document, other similar components such as readingquestions, exercises, or glossary, as well as various similar content markup outside the main content.

    DVI DVI

    A file format intermediate between and PS or PDF. Stands for Device Independent.

    EPS EPS

    Encapsulated Postscript: a form of Postscript designed to hold a fragment of a page, to be included in a larger document.

    escape character escape (character)

    Every markup language has escape characters which play a special role. In XML there are two escape characters: & and <. In there are 10 escape characters: # $ % & \ ^ _ { } and ~.

    FontAwesome FontAwesome

    A package containing many popular icons.

    GeoGebra GeoGebra

    An interactive environment particularly suited for constructing demonstrations in Euclidean geometry.

    GFDL GFDL

    GNU Free Documentation License: a copyleft license for manuals, textbooks, and other written materials.

    GIF GIF

    Graphics Interchange Format: a lossless bitmap image format.

    git git

    A version control system which is is used to track changes to computer files. Git is particularly useful for large projects involving multiple authors.

    GitHub GitHub

    A commercial website which hosts repositories for software projects, with the assumption that users use git to transfer material between GitHub and other systems.

    GPL GPL

    GNU General Public License: a copyleft license which gives users the right to run, study, share and modify software.

    HTML HTML

    Hypertext Markup Language: the markup language used to describe the content of Web pages.

    JavaScript JavaScript

    A computer language in common use for interactivity in Web pages.

    JPEG JPEGjpgJPEG

    A method for compressing digital images, where the amount of compression can be adjusted, allowing for a tradeoff between image size and image quality. Named for the Joint Photographic Experts Group, which developed the standard. Files with JPEG compression usually have the extension .jpg.

    Jupyter Jupyter

    An interactive computing environment designed to support a wide variety of computer languages. Named after the languages Julia, Python and R.

    A Jupyter notebook is a Web-based environment running Jupyter, typically accessed through a browser.

    JSXGraph JSXGraph

    A JavaScript library for interactive geometry, function plotting, and data visualization.

    knowl knowl

    Similar to a hyperlink, except the referenced material appears inside the current Web page. Usually indicated by a dotted underline.

    Pronounced knoll as in a knoll is a small hill.

    <latex/>

    A markup language used for books and papers with lots of mathematics, which is built on . uses as an intermediate format to produce PDF and print output.

    main branch main branch

    In git, the name of the default branch.

    Markdown Markdown

    A plain text markup language which is easy to use, is limited in its capabilities (compared to or , for example), but can convert to many other formats.

    markup language markup language

    A computer language that uses tags to define the content of a document. XML, HTML, Markdown, and are examples of markup languages.

    master branch master branch

    In git, the former name of the default branch. Currently main is the preferred.

    MathJax MathJax

    A JavaScript package for converting math to presentation MathML or other visual formats.

    MBX MBX

    was once known as MathBook XML, commonly abbreviated as MBX. This abbreviation appears in many historical references.

    MP3 MP3

    A format for storing audio content.

    MP4 MP4

    A format for storing video content.

    MyOpenMath MyOpenMath

    A free and open online homework system.

    Ogg Ogg

    A format for storing video content.

    origin repository origin repository

    In git, the default name for the remote repository from which the local repository was cloned.

    PDF PDF

    Portable Document Format: a file format designed for printing documents, where the appearance of the pages is identical on all devices.

    PDFLaTeX PDFLaTeX

    One of the available programs to convert to PDF.

    pgfplots pgfplots

    A package for drawing graphs of functions.

    PNG PNG

    Portable Network Graphics: a raster image format that supports lossless data compression. PNG offers a similar functionality to GIF but is not subject to patent protection.

    Postscript Postscriptps (file extension)Postscript file extensionpsPostscript

    A page description language and file format designed for printing documents.

    <pretext/>

    The markup language and document preparation system for creating the next generation of textbooks. And the generation after that.

    PSTricks PSTricks

    A package for drawing diagrams and pictures.

    pull pull (git)

    In git, the process of transferring information from a remote repository to a local repository.

    pull request pull request

    In git, a suggestion that the changes to the files in one branch be merged into another branch (typically in another repository).

    push push (git)

    In git, the process of transferring information from a local repository to a remote repository.

    Python Python

    A general-purpose programming language, noted for making it easy (compared to other programming languages) for a programmer to read the code written by someone else. Sage is written in Python.

    QR code QR code

    Quick Response code: a type of two-dimensional bar code, usually consisting of a grid of small black-and-white squares.

    R R (programming language)

    A programming language and software environment for statistics; available in Sage.

    Sage Sage

    An open source computer algebra system for a wide range of symbolic and numerical mathematical computations.

    Sage cell Sagecell

    A text box in which the user can run Sage commands, designed to be included in a Web page.

    Sage interact Sageinteract

    A interactive demonstration, with sliders and boxes to adjust parameters, created as a single Python function in Sage.

    siunitx siunitx

    A package for typesetting scientific units.

    SVG SVG

    Scalable Vector Graphics: an XML vector image format for two-dimensional graphics.

    tag tag

    In XML, tags are enclosed in angle brackets and are used to describe the contents of a document. For example, if All about even was the title of a book about numbers that are multiples of 2, then the XML source of that book might mark up the title using the title tag, as <title>All about even</title>. In XML, most tags occur in pairs which surround their content, with the closing tag beginning with a slash /. However, some tags which do not contain content are are self-closing, meaning that they end with a slash, such as <mdash/> and <pretext/>.

    <tex/>

    A typesetting language with high-quality automatic line- and page-breaking, specifically designed for mathematics.

    three.js three.js

    A JavaScript library for animating 3-dimensional graphics on a Web page.

    TikZ TikZ

    A package for drawing diagrams and pictures.

    unicode unicode

    The accepted standard for encoding text in any language.

    upstream repository upstream repository (git)

    In git, the usual name for the remote repository from which the local repository was originally forked.

    URL URL

    Uniform Resource Locator: the web address of a Web page (or other online content) consisting of a domain name, optionally followed by strings separated by slashes (/) which indicate specific content in the domain.

    Vimeo Vimeo

    A commercial website for hosting videos.

    WebM WebM

    A format for storing video content.

    <webwork/>

    An open-source online homework system for math and sciences courses.

    Wolfram CDF Wolfram CDF CDF

    Wolfram Computable Document Format: a system for creating interactive demonstrations hosted in the Wolfram Cloud.

    <xelatex/>

    One of the available programs to convert to DVI or PDF, the executable is xelatex.

    XML XML

    eXstensible Markup Language: the base syntax for the language. Angle brackets enclose matching begin and end tags. Tags can nest hierarchically, and can have attributes. HTML is another markup language that uses XML syntax.

    XSL XSL

    eXstensible Stylesheet Language: the language that describes how to convert XML to other formats. 's XSL stylesheets are used to convert XML to , HTML, ePub, and other formats.

    xsltproc xsltproc

    A command-line program which takes as input an XSL file and and XML file, using the contents of the XSL file to transform the contents of the XML file. It is now preferred to use the CLI for transforming.

    xypic xypic

    A package for drawing simple commutative diagrams.

    YouTube YouTube

    A commercial website for hosting videos.

    ================================================ FILE: doc/guide/appendices/journals-table.xml ================================================
    Journals supported by PreTeXt Full Journal Name Code AMS journals ams Elsevier journals elsevier Springer Nature journals springer-nature Taylor Francis journals taylor-francis Annals of Pure and Applied Logic ann-pure-appl-logic Bulletin (New Series) of the American Mathematical Society bull-amer-math-soc Conformal Geometry and Dynamics conform-geom-dyn Electronic Journal of Combinatorics electron-j-combin Experimental Mathematics exp-math Journal of Algebraic Geometry j-algebraic-geom Journal of the American Mathematical Society j-amer-math-soc Mathematics of Computation math-comp Quarterly of Applied Mathematics quart-appl-math Proceedings of the American Mathematical Society proc-amer-math-soc Representation Theory represent-theory Theory of Probability and Mathematical Statistics theory-probab-math-statist Transactions of the American Mathematical Society trans-ams
    ================================================ FILE: doc/guide/appendices/journals.xml ================================================ List of Supported Journal Styles

    This appendix contains the list of supported journals and their short name codes. To specify one of these journals, use the publication file. See .

    The code for a journal is taken from the list of abbreviations used by MathSciNet available at https://mathscinet.ams.org/msnhtml/serials.pdf.

    ================================================ FILE: doc/guide/appendices/latex-conversion.xml ================================================ Conversion from <latex />

    As part of the UTMOST project, we offer a service to help convert existing textbooks from to . The service is free if you are planning to release your book with an open license. The conversion will only be 95 percent correct, but that means it will take you 20 times less effort than converting it yourself.

    Before converting your book, familiarize yourself with to the point of being able to compile the sample article and sample book into HTML and PDF. Check that you can edit the source files and the resulting output files behave as expected. That way, you will be on familiar ground when you finish the last 5 percent of the conversion.

    The actual conversion will be done by David Farmer from the American Institute of Mathematics. The first hurdle is to get your files to David. The preferred method is:

    1. Put your entire source into a GitHub repository. Do not edit or restructure in any way, nor provide just a subset for testing, since this only complicates the process. You do not need to include the image files.
    2. If the repository is private, make David a collaborator so he can access it. (GitHub username: davidfarmer.)
    3. Email farmer@aimath.org with your request for conversion, including the URL of your repository and a brief description of your project.
    4. When the first draft of the conversion is ready, you will receive a pull request from David via GitHub. Go ahead and accept it, and now your repository will have new files that are the source.
    5. Spend some time to review the files carefully, looking for consistent mis-interpretations of your intent. Convert to HTML and PDF and see how they look. There may be some back-and-forth with you explaining what your was trying to do, and David improving the conversion to .
    6. At some point it will be up to you to take ownership of the source and finish the conversion.

    This service is for authors who wish to consider having as the official source of their textbook. It is not feasible to maintain source and expect to have all of the features of .

    ================================================ FILE: doc/guide/appendices/liblouis.xml ================================================ LibLouis liblouis

    liblouis is an open-source library for low-level translation of phrases into braille, supporting many, many languages. We rely on Python bindings for this library to translate all of the literary text (non-math) to braille for a document, so this is an essential piece of the pipeline. Once installed, its use is transparent. This appendix outlines two alternative installation methods, current as of 2025-12-19, on Linux, Mac, and Windows Subsystem for Linux. Contributions of adjustments for other operating systems are welcome.

    Installing as a system package

    For many operating systems, one may install the liblouis Python bindings as a system package. For instance, on Debain/Ubuntu systems and Windows Subsystem for Linux, run # sudo apt install python3-louis and on Mac # brew install liblouis To test the bindings, the following should complete successfully in a Python interpreter >>> import louis

    If you are following best practices by using a Python virtual environment for your project, you will need to give the environment access to system packages since liblouis is now installed as a system package. You can do this when creating the virtual environment using # python3 -m venv /path/to/venv --system-site-packages If you have an existing virtual environment configured for your project, you may alternatively edit one line in the file pyvenv.cfg in the virtual environment's main directory: include-system-site-packages = true

    Installing from source

    While the python3-louis system package appears to be updated frequently, if you need a more recent version of liblouis or simply feel a little more adventurous, you may wish to install liblouis directly from source following these instructions:

    • Download the liblouis-X.YY.0.tar.gz archive from the downloads page. Releases are tracked at the GitHub release page. The liblouisutdml package is not necessary.

    • tar -xvf liblouis-X.YY.0.tar.gz into a scratch directory like /tmp.

    • Switch to being root (sudo) and cd into the directory created by the extraction.

    • In your terminal run # ./configure --enable-ucs4 # make # make install The ucs4 flag enables 32-bit Unicode support, which is necessary for running tests later.

    • Read /tmp/liblouis-X.YY.0/python/README.md and perform two steps, still as root, from within the directory structure in /tmp: install the bindings into your Python distribution and run the Python tests. Instructions for setting up a Python virtual environment are also available in that file.

    • I do not do anything special to clean-up afterwards, and of course, my /tmp goes away on the next reboot. I also do not do anything special when installing the next version, I just follow the same procedure as a fresh install.

    ================================================ FILE: doc/guide/appendices/mac-os.xml ================================================ MacOS Installation Notes

    This appendix explains how to install necessary software on Apple's Mac.

    Java

    The jing and trang schema tools () require the Java Development Kit (JDK). These instructions come from Mitch Keller and Jane Butterfield on 2019-07-23. You may need to change some version numbers over time.

    Install Java on MacOS
    1. From get an open source JDK. In other words, not the proprietary version from Oracle.

    2. Unzip the file you download until you have a directory called jdk-12.0.1.jdk. Put that directory somewhere useful. We will pretend that you put it in your home directory and that your user is called jane, which means that the directory is now at /Users/jane/jdk-12.0.1.jdk.

    3. In a Terminal, runexport JAVA_HOME=/Users/jane/jdk-12.0.2.jdk/Contents/Homeadjusted appropriately. A good check is to get this same directory back from the commandecho $(/usr/libexec/java_home)

    4. If you are doing this to install jing and trang, then, in the same Terminal window, cd into the jing-trang directory and run ./ant.

    ================================================ FILE: doc/guide/appendices/node-npm.xml ================================================ Node and npm Node npm

    To run a Javascript program outside a web browser requires a program that can interpret the Javascript language. A popular choice is node.js, whose executable is simply node. Programs designed for execution by node often build on other programs. These are all organized in packages, which can be managed by the Node Package Manager, known as npm for short. A basic purpose of npm is to manage versions and dependencies among packages.

    So the first step is to install both node and npm on your system. Instructions for installing node and npm can be found at nodejs.org. These programs are meant to be cross-platform, so once you do these two operating-system-specific installations, we can proceed with generic instructions.

    Now node should be on your path, and you can try which node to see if your operating system can locate it automatically. If not, then you will need to edit your personal copy of the pretext.cfg configuration file to have the node key provide a path to the executable (see ).

    Some useful npm commands are listed below, in the form of examples. These commands depend on running in a package a folder containing a file named package.json. So before trying to run any of them, make sure to navigate to such a folder (e.g. script/mjsre or script/cssbuilder). In particular, note npm install which must be run before using a script.

    When using node with git (see ), you generally should should check package.json and package-lock.json into source control, but ignore the entire node_modules folder.

    Useful <c>npm</c> commands npm install Install the packages listed in the package.json file to the folder node_modules. This is required one time before you use a package. npm list Full tree of installed packages (local) npm list mathjax-full Just one package npm view speech-rule-engine version Available version
    ================================================ FILE: doc/guide/appendices/offline-mathjax.xml ================================================ Offline MathJax MathJax

    uses the well-known syntax for mathematics. One fundamental reason for this choice is that the MathJax Javascript library is so capable at rendering inside of an HTML web page. Of course, it is not hard to render syntax inside of output! But what about output formats that are not processed by or Javascript, such as EPUB or braille? That is where running MathJax offline (locally) comes into play.

    MathJax and Speech Rule Engine Speech Rule Engine

    MathJax is packaged as a node.js program. A component of MathJax is Speech Rule Engine (SRE), which converts to text that represents a spoken version of the mathematics, and to Nemeth braille, a braille code for expressing mathematics.

    Any node.js script requires installing Node. See for instructions on doing so. Once Node is installed, you can use the following instructions to complete the installation of MathJax and the SRE.

    Follow the directions here exactly. Do not free-style and think some modification will have a better or identical result. In a terminal, set your working directory with cd /path/to/pretext/script/mjsre Install both packages at the same time with a single command: ./update-sre It is possible you will need to make this simple script executable. On Unix-style systems (Linux, Mac OS) this can be done with the chmod command. As this is a bash script, Windows users must use Window's Subsystem for Linux or examine the contents of the script to run the commands manually.

    The update-sre script is supplied by . It will create a file and a directory: /path/to/pretext/script/mjsre/package-lock.json /path/to/pretext/script/mjsre/node_modules Neither will be tracked by git. Since SRE changes faster than MathJax, this will replace MathJax's expectation for a version of SRE with a potentially newer version. So do not be alarmed if it appears MathJax is missing a dependency, that is intentional.

    Now you have copies of MathJax and SRE that can be used by the pretext/pretext script to process mathematics offline into useful formats for conversions to EPUB, Kindle, and braille.

    Mathematics Representations

    Once MathJax is installed properly, the pretext/pretext script will be able to produce an EPUB version of your project. The script will first analyze your document, isolating all of the mathematics. These are then processed by MathJax and produce a file of representations of the mathematics, either as SVG images or as MathML versions. These representations are then inserted properly into the eventual output. This process is all automatic but explains why it is possible to produce two different types of EPUB. A good test of your installation is to use the pretext/pretext script to make an EPUB () or the script can be used to simply produce structured files of these alternate representations (see or paragraph just below).

    With SRE also installed, text (speech) becomes a possible representation, as well as Nemeth braille. This makes possible an EPUB version that is all text, and there are online sites that will turn this EPUB into an audio book (of not very good quality). The braille representations are one component of the production of braille output. (, )

    If you use the pretext/pretext script with a math component, and a format of svg or mathml, you will produce a file of these representations, structured by XML (naturally). These files are not much use by themselves, but may be of interest.

    ================================================ FILE: doc/guide/appendices/python.xml ================================================ Python
    Python Executable

    While the majority of the processing of your text is accomplished with XSL transforms, we rely on Python for numerous other tasks and conveniences. So, sooner or later, you will want, or need, to get Python working on your system. Part of our attraction to Python is that is very popular and so should run very similarly (identically?) on a variety of systems: Linux, Mac, and Windows. So the quicker we can get you to a platform-neutral setup, the better.

    On Linux and Mac, you will likely have at least some version of Python already installed. On Windows, you may need to explicitly install it. (We hope to provide some more careful advice here for Windows users. For now, see and .)

    Python 2 is no longer being developed and is officially dead. That does not mean you do not have it on your system. And for older systems, it may well be the default. requires at least Python 3.8.5 (current as of 2022-08-31). At a command-line, or in a terminal or console, or at a command-prompt, try python --version and if the result is unacceptable, then try python3 --version Remember which variant you needwe will just routinely use the generic python.

    Python Virtual Environment

    There is a very good chance your system has a version of Python installed already since various other programs rely on it. You will be much happier if various Python programs you need for do not get entangled with your Python programs installed as system software. And if we need to help you debug some related problems we will ask you to work in a virtual environment anyway. We will follow a primer that has been recommended by Brad Miller, founder of Runestone Interactive. See that page for more details.

    These are condensed instructions without much explanation.

    1. Do not install the old-school virtualenv module.
    2. Make a directory anywhere you like named virtual-python and change into it.
    3. python3 -m venv ptx makes a virtual environment named ptx. (Requires Python 3.6 or later.)
    Done. But how do you use it?
    1. To activate your virtual environment, be sure you are in the virtual-python directory. For Mac or Linux, with a bash shell go source ptx/bin/activate (ptx) $ There are other scripts for other shells, take a look around.

      For Windows, go ptx/Scripts/activate.bat (ptx) > Notice that your prompt has changed to remind you that now anything you do with Python will be sandboxed in this virtual environment and not get mixed up with your system Python.

    2. Now you can do any Python-related task using your virtual environment, and can change directories if desired.
    3. When you are finished with your virtual environment, on Mac or Linux with a bash shell you simply go (ptx) $ deactivate $

      For Windows, similarly (ptx) > deactivate >

      We have one report, on a Mac, of deactivation dropping you into a different virtual environment named (base). A way to leave that virtual environment is to run (base) $ conda deactivate This appears to be due to Anaconda somehow creating a default base environment initially. If you have this experience and find a simple solution, please report it. Some details at Stack Overflow 54429210 may be helpful.

    <init>PIP</init> Install

    PIP, in the open source tradition of recursive acronyms, stands for PIP Installs Packages. This package manager helps you obtain software and keep it up-to-date. There are three packages that are indispensable for use with so you can practice doing installations now via your virtual environment.

    If you have installed the -CLI already using pip, then all the programs below are already installed. Otherwise (for example, if you are using xsltproc) you will need to install the following manually.

    To install all required additional python libraries, in your virtual environment, navigate to the pretext directory and run (ptx) $ pip install You can also install individual libraries, as in (ptx) $ pip install lxml

    With lxml, you have a collection of Python routines that interface with the same base libraries for XSL processing as the xsltproc executable. A second library is requests which moderates communications with online servers and is necessary to communicate with WeBWorK servers and with a YouTube server that provides thumbnail images for static versions of videos. The pdfCropMargins package provides a tool that will crop images during their production with the pretext script. The pyMuPDF library then converts the PDF that was cropped to SVG and PNG images. Finally, playwright uses a Chromium headless browser to take static screenshots of interactive elements of your project.

    Note that right after you install playwright then you want to run playwright install one time only. This will install three web browsers (Chromium, Firefox, WebKit) and FFMPEG where they should only be available to this package.

    PIP-installable Python Packages Package Purpose lxml

    XSL processing

    requests

    Communication with online servers

    pdfCropMargins

    Crop images during production

    playwright

    Automatic screenshots of interactive elements

    pyMuPDF

    Convert images to SVG and PNG

    ================================================ FILE: doc/guide/appendices/references.xml ================================================ The Chicago Manual of Style. Fifteenth Edition, The University of Chicago Press. 2003. Knuth, Donald E., Literate Programming. The Computer Journal, 1983, . Fred Leise, Kate Mertes, Nan Badgett, Indexing for Editors and Authors: A Practical Guide to Understanding Indexes, American Society of Indexers, 2008 ================================================ FILE: doc/guide/appendices/schema-install.xml ================================================ Schema Tools

    This appendix has technical information about tools that work with the RELAX-NG schema and our additional validation stylesheet. See for a more general overview.

    Jing and Trang

    These tools come from James Clark, an author of the RELAX-NG syntax. trang is a converter between different formats for schemas. An author should not ever need it. Though a developer might find it useful, and it is a by-product of the jing-trang install described below.

    jing is our recommendation for RELAX-NG validation by authors, and works very well.

    jing and trang are packaged (separately) for Debian/Ubuntu Linux, see . Reports of other similarly easy installations for other operating systems, to be included here, are especially welcome. We have employed the Debian/Ubuntu versions and also versions built from source, see .

    <c>jing</c> on Ubuntu and CoCalc

    CoCalc runs Ubuntu when you create a terminal window. The necessary Ubuntu Linux (Debian) package is also named jing and is installed as part of the CoCalc setup. So on Ubuntu, you need to install this package, and on CoCalc you will need to copy over the schema/pretext.rng version of the schema. If you have a CoCalc subscription, it would be even better if you made a clone of the PreTeXt repository, so it would be trivial to update and always have the latest version of the schema in your CoCalc account.

    Now it is straightforward to execute jing: jing /path/to/pretext.rng aota.xml

    Presumably something similar to the above will work for any Linux distribution that has packages for jing.

    Note that if you have modularized your source files (see ), you only need to provide the top-level file as an argument to jing. In particular, the subsidiary files are certain to fail validation since they do not have a pretext root element.

    Install <c>jing</c> from Source

    If you cannot install this tool easily as part of your system, you can still follow the notes below to build from source. Many authors have done this successfully. Installation notes for jing and trang follow.

  • Clone

    Clone the git repository at with the command git clone https://github.com/relaxng/jing-trang which assumes you have a command-line version of git installed. You will end up with a new jing-trang directory, which you will certainly want outside of your files and outside of your project files.

  • <c>readme.md</c>

    Follow the instructions in the readme.md found at the top level of the jing-trang distribution, observing the following notes keyed to the four steps. These helpful notes come courtesy of the experiences of Jahrme Risner, Mitch Keller, Bruce Yoshiwara, Ken Levasseur, and Jessica Sklar on a variety of operating systems.

    1. It is necessary to have a developer's version of java on your machine. Try which java to see if one is already available. Any output here might help in the next step. References here to the JDK is the Java Development Kit. There are specific directions for MacOS () and Windows ().

    2. You will need to have the JAVA_HOME environment variable set correctly. You can try echo ${JAVA_HOME} in a Linux console to see if it produces anything sensible and/or consistent with Step 1. Ken Levasseur notes that on MacOS you can go echo $(/usr/libexec/java_home) and the output is what you set to the JAVA_HOME variable.

      On Windows you may need to set Environmental Variables in the Windows System Properties GUI, both here and in Step 4.

    3. Setting your working directory to the root directory of the jing-trang distribution should not cause any particular difficulties.

    4. You may need to install the ANT tool, almost certainly on Windows. Again, on Windows you may need to set an ANT_HOME environment variable. On Linux, this may be all set for you already as a system tool.

      The README suggests changing slashes on Windows. But you may already be using a shell that gives Unix-like behavior. So try both directions, if necessary. Also, the README suggests running ./ant test (or .\ant test). Doing this on Windows may yield a BUILD FAILED message, but jing may still work.

  • Results

    Change into the build subdirectory. You may have more files here, but the two you really want are jing.jar and trang.jar. So if you have these, you are in good shape.

    If you have modularized your source files () then you need one more library. Look in the top-level lib directory (a peer of build) for xercesImpl.jar. You have two and a half choices now.

    • Copy lib/xercesImpl.jar into build.
    • Or make a symbolic link to the third JAR archive. Be sure you are in build and go ln -s ../lib/xercesImpl.jar which will just make your operating system think this third archive is in the build directory.
    • A third option would be to adjust/augment some classpath information below and send us a report of success. We have not tested this approach.

  • Now you are ready to use jing to validate a document. Note that the commands below require the XML version of the schema, which is the non-compact version. Also, these are the commands if you build jing-trang from source. If you install a system-supplied version, then consult the man pages, or similar, for syntax which is likely much easier and direct.

    For a document contained in a single file, run (with suitable working directory and path prefixes). java -jar jing-trang/build/jing.jar pretext.rng my-book.xml For a document modularized across several files using the xinclude mechanism, issue as one single command line (again, with suitable working directory and path prefixes). This presumes you have moved or symlinked the lib/xercesImpl.jar file into the build directory. Do not leave any spaces around the equals-sign, we have split that line there for readability, so the -D option should not have any spaces in its argument. java -classpath jing-trang/build -Dorg.apache.xerces.xni.parser.XMLParserConfiguration= org.apache.xerces.parsers.XIncludeParserConfiguration -jar jing-trang/build/jing.jar pretext.rng my-book.xml It may go without saying that scripting this task will make you more likely to do it as often as is necessary and you will save yourself much time, and a little frustration, in the process.

    Jahrme Risner provides the following setup he uses to make it very convenient to regularly validate his sources. This is a shell script, which a Linux user might add to their ~/.bashrc file. Note that we have again split the line with the -D option at the equals-sign, without a line-continuation character. Do not do that in your version. ptx-check() { java\ -classpath ~/GitHub/jing-trang/build\ -Dorg.apache.xerces.xni.parser.XMLParserConfiguration= org.apache.xerces.parsers.XIncludeParserConfiguration\ -jar ~/GitHub/jing-trang/build/jing.jar\ ~/GitHub/pretext/Schema/pretext.rng "$1" } Then he can simply go ~ $ ptx-check my-book.xml at anytime. Note that you might have to provide or adjust some of the paths above for your situation. And there are other ways to script tasks like this.

    <pretext/> Validation Plus

    The second step of validation is our validation-plus stylesheet. Fortunately, there is nothing to install. Use it just like the conversions you have already been doing. In the distribution, in the schema directory you will find pretext-validation-plus.xsl. This is a stylesheet, unique to , which will carefully analyze your source to find any exceptions that the RELAX-NG schema was not designed to catch. You use the stylesheet like any other, xsltproc ~/pretext/schema/pretext-validation-plus.xsl ~/books/aota/animals.xml with suitably adjusted paths, and be sure to provide the -xinclude switch if your source is modularized across multiple files (). No news is good news, but each exception found should provide enough explanation for you to locate, and correct, the problem. These messages are under 's control, so please report any that are not helpful enough. That's iteasy.

    ================================================ FILE: doc/guide/appendices/welcome.xml ================================================ Welcome to the <pretext/> Community

    Thank-you for your interest in , and welcome! This appendix is meant to answer some questions you may have about how this open-source project is organized, how you can get help, and how you can contribute back.

    is not and it is not Word. Some features of those languages are intentionally missing, but more importantly, the mind-set expected of authors is completely different. One of the most important distinctions is that treats the author, the publisher, and the reader (which might be an instructor) as separate entitieseven when those are all the same person.

    Newcomers to should focus on the author role. Make sure the structure of your book is marked-up properly. If something looks wrong in your output, assume it is a problem with the source markup. If the source is correct but the output does not look as you wish, leave that as a problem for the publisher, to be addressed after you have finished writing the content.

    Help and Support

    There is a documentation area at the project website. Presumably, that is where you found this Guide. This is what another software project might call the User's Manual. So start here. Re-read on the project philosophy and the principles in at regular intervals. is meant to inform you of the features of , without getting into all the details. It will frequently refer you to for all those details.

    PreTeXt is fundamentally a specification of a set of elements and attributes, a topic discussed in . This chapter also discusses validation. Once comfortable, but before authoring lots of material, take the time to get validation working, and use it regularly. Do not save it for last.

    There are many examples available in an area on the website. Compare source to the resulting output (in both directions). The sample article is not always pretty, since it is used for testing, but it does try to have one of everything.

    When the above is not sufficient, the pretext-support Google Group is the right place to ask questions. If you are trying to determine which elements to use to accomplish something, provide some context. Do not ask, How do I print a line of text upside-down? Instead say, I am writing a monograph on mammalian vision, and I'd like the reader to use a mirror to view a line of text written upside down. What is the best way to do that? (I think the answer would be: make an image and include that, rather than trying to get reflected text.) Sometimes a quick search of the Goggle Group may yield insights. Overall, do your best not to be a Help Vampire.

    Weekly Drop-Ins

    Since May2020 there has been a standing weekly online gathering of authors and developers on Friday afternoons. And now there is a companion session on Tuesday afternoons, and a Getting Started session on Mondays. A weekly schedule of these, and other activities, is posted to the pretext-announce Google Group, so look there for particulars. Once in a while there are scheduled discussions on development topics or seminars on topics of interest to authors and developers (such as building an index, see ). But mostly there is no agenda and no schedule. Come late, leave early, drop-in, drop-out. If you are present, then you are implicitly available to help someone with questions, even if you are working on something yourself. The rest of us may lurk and/or join in. We can use break-out rooms if a subgroup wants to run a discussion, work on a targeted project, or help somebody get started one-on-one. The model is the hotel lobby after dinner at a workshop, but you provide your own contraband.

    So this is a great place to discuss a support question (likely with the person who wrote the code!) or a place to get involved with development.

    Feature Requests and Reporting Problems

    We use the issue tracker at the GitHub site as an organized to-do list. You do not need to know anything about git to use this forum. Just make a new issue, or make a comment on an existing issue. Frequently, a discussion on the groups will culminate with the creation of a new issue. It is nice to have a link from the discussion to the issue, and vice-versa.

    If you are asked to create an issue in response to a discussion you initiated, please consider doing so. It will save the other volunteers just a bit of time to work on other parts of . And you will also get email-for-life as the issue is discussed and eventually closed. It is a very helpful contribution.

    As you gain more experience, you will identify bugs, obsolete instructions, typos, Search the issues to see if there is something relevant you can add. For example, your particular version of a bug might provide the key insight into identifying the cause. When you are certain something is wrong, and there is no need to discuss it in the groups, feel free to go straight to making an issue. For something like a list of typos, make a single issue and just keep editing your initial post.

    If you have some structural problem, see if you can reproduce it by adding into the minimal example, and post that entire source file. If the rendering in HTML is a bit off or you think it exhibits a bug, be sure to post a link to a live example, not just a verbal description and definitely not a screenshot. If you need an easy, quick, free, temporary location to host one file or your whole project as HTML, try Netlify Drop.

    If you are posting code snippets, and copying out of an editor using Dark Mode, try ctrl-shift-V when you paste and perhaps the Dark Mode color scheme will go awaymaking it easier for some to read.

    Contributing

    As a project that is licensed openly, we welcome contributions. And this does not necessarily mean you need to learn our primary language, XSL. For ideas, find the issues on GitHub that have the label contributor project. As one example, it would be very helpful if a member of the community would create and maintain a Wikipedia page. That is a skill that is very distinct from the other skills used to create and maintain other parts of the project. See Issue #207.

    The documentation is authored in , so you know how to create additions, clean-up obsolete parts, and fix typos. If you know git and GitHub, then a pull request (on a new branch!) is a very economical way for us to manage contributions. Even if you do not know GitHub, we can easily accept files written in that contain changes to the documentation. For example, files supporting localization to new languages (see ) are ideal for simply submitting an entire file. (Send files to us by email, or post as attachments on one of the Google groups.)

    Conversions are written in XSL, a declarative language. It has a steep learning curve, but is very powerful for an application like this. Start small, and we do not mind helping you along with suggestions and critiques. Do not, do not, begin an ambitious task unless your skills are up to it.

    When you have gained significant experience as an author, and have a good feel for the questions asked by other authors due to your material participation in the pretext-support group, then it may be time to apply to be part of the pretext-dev group. This where design discussions are held and nasty bugs are squashed collectively.

    Personal Email

    How do we put this politely? Personal email to the core developers should be your last resort. We are not unfriendlyjust the opposite. We would love to hear from you, but in the groups. Here is the rationale:

    • You may get a better answer from somebody who is not the most active developer, but understands your particular need better than anybody else. You will never get that answer with a personal email.
    • Developers teach university courses, travel to professional meetings, sleep at night, take naps, turn off their email for big coding pushes, and sometimes travel in the wilderness and are offline for days at a time. You are likely to get quick responses from the core developers through the groups, but if they are not available a personal email may get a slower response. (I am inclined to answer posts on the groups before I work through personal email.)
    • Many contributors prefer to provide help in a public forum because their efforts are then more widely recognized.
    • Your question and its answer are searchable by others. (The groups and issues are public.) A personal email is no help to anybody else.
    • We prefer to make as many decisions as possible openly. So a discussion on a public group or site is there for all to see, now and later.
    • We depend on granting agencies for much of our funding. Membership in groups, forks on GitHub, activity in the groups, number of issues, and number of contributors to the repository, are all crude measures of the health of the project. Personal emails add nothing to those measures.
    • Everybody who has committed their big writing project to likes to see an active, responsive, friendly community supporting its use and growth. Just by asking a necessary question, you can add to that community.

    We understand that nobody likes to pop their head up and ask a stupid question. But it is counterproductive to do personally what we can do better collectively. The groups are friendly forums (we will enforce that if we ever have to) and everybody there made an initial post once. And the group members largely enjoy sharing their advice, experience, and knowledge. So, please make a contribution simply by saving the personal emails for that which is really personal. Thanks, and we'll look forward to chatting with you on the groups!

    ================================================ FILE: doc/guide/appendices/windows-cli.xml ================================================ Installing the <pretext/>-CLI on Windows Sean Fitzpatrick

    The -CLI is the simplest way for authors to get started using , and it is the recommended method on all systems, including Windows. Details on using the CLI can be found starting in . Setting up the -CLI on Windows is considerably simpler than the method presented in , but there is still some effort required. In particular, you will have to install several pieces of software to get your system ready for using .

    If you prefer a video walkthrough, one is provided below. The video is approximately 40 minutes in length, but it goes through the entire installation process, from adding the necessary software, to setting up GitHub.

    Software prerequisites

    We begin with the programs you will want to have installed prior to using the -CLI. All software can be downloaded free of charge, and is relatively easy to install.

    VSCode

    VSCode is short for Visual Studio Code. This is a text editor developed by Microsoft; we recommend it not because it plays well with Windows (although it does), but because of the availability of the pretext-tools add-on, which will let you run the -CLI without leaving the editor.

    To install, the editor, first download the installer from the VSCode website.

    Screenshot of the VSCode website, showing where to click to download the installer

    When running the installer, be sure that the Add to PATH option is selected:

    Screenshot of the VSCode installer program, showing where to click to ensure the program is added to the Windows system environment variables

    You should now have VSCode installed on your system.

    Python

    One difficulty with using on Windows is the fact that Python is not core software, and there are many different ways to install install. The recommended method for installing Python is to get it directly from . Other Python installations, such as Anaconda, or even Miniconda, include a lot of extras that we don't need.

    To install Python, simply download the installer from the Python website.

    Screenshot of the python.org webpage, showing where to access the installer download

    When you run the installer, be sure to check off the box to add Python to the Windows PATH during installation. This will ensure that Python commands can be run from the command line without needing to provide the path to the Python program.

    Screenshot of the Python installer program, showing the box that needs to be checked to ensure it is added to the system environment variables

    Git for Windows

    The next piece of software we need to install is Git for Windows. This will provide tools for allowing us to interact with textbook source on GitHub. More importantly, it provides us with the Git Bash terminal, which is what we will be running all of the commands for .

    You can get Git for Windows at .

    The installation process for Git for Windows can seem quite complicated, as there are a lot of options, and many of them are quite technical. You can safely choose the defaults throughout, unless there is a particular setting you're familiar with that you wish to change. The only thing you might want to do is change the default editor. Since we have already installed VSCode, we can choose to use that instead of an editor like Emacs or Nano that you may be unfamiliar with.

    Screenshot of the Git for Windows installation program, showing how to select VSCode as the default text editor

    Other software

    A number of additional programs may be needed to assist in processing your book, depending on what elements your book contains.

  • <latex/>

    You will almost certainly need to be able to process , either to produce the PDF version of your book, or to process images for the HTML version of your book.

    There are two ways to install on Windows: MikTeX, or TeXLive. Although TeXLive is the default distribution for Linux and MacOS platforms, most Windows users find MikTeX easier to use, since it comes with package management software to assist with automatically installing needed packages. One thing to keep in mind: with MikTeX, you must run an initial update from the MikTeX package manager before it will work correctly.

  • Screenshot of the Windows system property control panel, showing how to access the Environment Variables

    Screenshot of the Environment Variables control panel, showing how to access and edit the Path

    Screenshot of the interface for editing the Windows Path to add a new program

  • Sage

    If your book includes Sage components, such as sageplot (but not Sage Cells), you will need to install Sage to process them. Sage is available at . Click on the download button, and follow the instructions in the installer.

  • GitHub Desktop

    If you find it difficult to manage git from the command line, GitHub provides a graphical user interface for the Windows environment, called GitHub Desktop. This provides a point-and-click interface for synchronizing your local changes with GitHub.

  • Installing the CLI

    You now have all the necessary software installed. Next, we need to set up Git Bash, and install the -CLI.

    Setting up Git Bash

    One change that you will want to make right away is setting the default working directory for Git Bash. In your home folder (C:\Users\Sean in our example), look for a file called .bashrc. If it doesn't already exist, open Git Bash, navigate to this folder, and type touch .bashrc to create the file. Open the file (it is a plain text file), and add the line cd C:/Users/Sean, where you should replace the directory with the one you want to use.

    Next, we need to set up SSH authentication, for more efficient communication with GitHub. We assume that you already have a GitHub account; it not, you should create one at . There are existing instructions available online at docs.github.com. To begin with, please follow the instructions provided there for generating an SSH key using Git Bash, and adding it to GitHub.

    There is one aspect of the instructions that is not quite correct. When you get to the step for adding the ssh key to the ssh agent, the instructions will tell you to add your SSH key to the SSH agent using a relative path, with a line such as ssh-add ~/.ssh/id_ed25519. You must use a full path here. Instead, type ssh-add /c/Users/Sean/.ssh/id_ed25519, where as usual you should replace Users/Sean with your own directory.

    There is one more step you will want to complete. The ssh-agent program will not start automatically when you open Git Bash. To change this, we follow the instructions provided at .

    1. In the file /c/Users/Sean/.ssh, open the config file (or create it using the touch command in Git Bash if it doesn't already exist), and add the following lines: Host github.com Hostname github.com IdentityFile ~/.ssh/id_rsa Note that the second and third lines are indented by one space. Note also that this assumes an RSA key, but you may have chosen a different encryption method. You may, for example, want to replace id_rsa with id_ed25519.

    2. In the file /c/Users/Sean/.bash_profile, (again, create it if it does not already exist) add the following lines: test -f ~/.profile && . ~/.profile test -f ~/.bashrc && . ~/.bashrc

    3. In the file /c/Users/Sean/.ssh, we need to add the following script, which will automatically start the ssh-agent.

      # Start SSH Agent #---------------------------- SSH_ENV="$HOME/.ssh/environment" function run_ssh_env { . "${SSH_ENV}" > /dev/null } function start_ssh_agent { echo "Initializing new SSH agent..." ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}" echo "succeeded" chmod 600 "${SSH_ENV}" run_ssh_env; ssh-add ~/.ssh/id_rsa; } if [ -f "${SSH_ENV}" ]; then run_ssh_env; ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { start_ssh_agent; } else start_ssh_agent; fi

    You should now be set up to work with GitHub on your Windows machine. When you clone a GitHub repository containing a book, be sure to choose the SSH option rather than HTML.

    Installing the CLI

    Finally, we are ready to install the -CLI. This is perhaps the easiest step of the whole process. From the Git Bash terminal, first type which python to confirm that Python has been successfully added to the PATH. You should see the path to your Python program if things are working correctly. If you don't, you may need to reinstall Python, or you can manually add it.

    To install the CLI, simply type pip install pretext.

    Congratulations! You are now ready to start using on your Windows machine. If you did not do so previously, there is one additional step you may want to take. In VSCode, go to File, then Preferences, then Extensions in the menu, or type Ctrl-Shift-X. In the search bar that comes up, type pretext-tools, and install the package that comes up. This will equip VSCode with syntax highlighting for .ptx files, as well as some automatic tag completion. (For example, typing thm and then the Tab key will automatically insert the XML markup for a theorem.)

    Additionally, from the command palette, (View, then Command Palette in the menu, or Ctrl-Shift-P) if you type pretext, you will see some built-in options for building your book using the CLI.

    ================================================ FILE: doc/guide/appendices/windows-wsl.xml ================================================ Windows Subsystem for Linux

    Windows Subsystem for Linux is no longer the recommended method for Windows users. Instead, consider using either the web-based GitHub solution described in or the handy -CLI as discussed in .

    developers who use Windows may be interested in the information in this appendix but do note that some information may be out of date.

    The Windows Subsystem for Linux (WSL) may be installed on computers running Windows 10. Several distributions of Linux are available. We will use Ubuntu as an example; working with other distributions is quite similar. The latest news and announcements about WSL may be found at .

    Installing WSL

    If you have Windows 10 with OS Build greater than 16215 (August 2016), then installing WSL is not difficult. Just follow the (reasonably straightforward) instructions given by Microsoft at the address .

    Upon completion of the installation, you should

    • be able to use the bash command from the PowerShell window,

    • have your own WSL userid (distinct from Windows),

    • have your own WSL password (distinct from Windows).

    Installing software

    The default configuration of WSL does not have the software needed for creating documents with .

    The program xsltproc is used to create your readable documents. It is installed with the command sudo apt-get install xsltproc.

    You are now ready to set up .

    Putting <pretext/> on your computer

    Here are the steps necessary to get the software onto your computer:

    • Make a new directory mkdir pretext

    • Make your own clone of the repository git clone https://github.com/PreTeXtBook/pretext.git

    • Move to the new directory cd pretext

    • Initialize the new directory with git pull

    This last command synchronizes your files with those in the official repository. You should run it frequently to keep your files up to date.

    The simplest example

    Here is a brief description of the use of WSL to create readable files. You, as the author, create the xml file. The system will contain an appropriate xsl file that translates your xml file to something readable.

    Several editors come with WSL by default including nano, pico, vi, and vim. In addition, editing is possible using notebook.exe. Here are the steps to follow:

    1. Type the command cd to align yourself in your home directory.

    2. Use one of the editors to create a file called hw.xml (you could use the command nano hw.xml), and add the following text: <?xml version="1.0" encoding="UTF-8" ?> <pretext> <article xml:id="hw"> <p>Hello, World!</p> </article> </pretext>

    3. Run the command xsltproc pretext/xsl/pretext-html.xsl hw.xml Upon completion, your should have a file called hw.html.

    4. You now want to view the hw.html file in a browser, This is done with the command explorer.exe hw.html.

    The edit-xsltproc-view cycle just given may seem daunting at first blush. Some things that can help:
    • Pressing the up arrow when at the command line displays the previously executed commands. Hitting the enter key while such a command is displayed executes it. This saves a lot of retyping.

    • It is possible to define aliases to shorten commands. Your local Linux guru can show how this is done.

    • It is possible to define scripts to shorten multiple commands. Your local Linux guru can show how this is done.

    ================================================ FILE: doc/guide/appendices/windows.xml ================================================ Windows Installation Notes Dave Rosoff

    The recommended method for setting up on Windows now uses the -CLI. For instructions on setting up the CLI, see . This appendix explains how to install the older toolchain using xsltproc, and is intended primarily for developers. It has been tested on Windows 7, 8, and 10. We assume that none of the listed tools or equivalents have been previously installed. That may complicate matters. This is especially true if you use Cygwin, or if you have already installed Python on your machine. compatibility with existing Python installations is addressed elsewhere in this document ().

    If you have Windows 10, be sure to read about WSL in , which could be a whole lot easier to setup and maintain.

    Setup

    In this section, we do some initial setup, establish notation, and issue warnings. Some of the steps in this process are dangerous. Typos could lead to an unstable system, or possibly even to unrecoverable system errors. Double-check everything.

    Notation

    Strings enclosed in <angle brackets> are variables whose values you should substitute in typed expressions. <username>, for example, should be replaced with your Windows username (, mine is drosoff). Throughout this installation process it is very important to pay attention to the direction of slashes / and backslashes \.

    Initial Windows setup

    It is easier to see what is happening if your Windows file browser is not set up to hide file extensions from you. Disable the hide file extensions behavior before proceeding. In Windows 7/8, this can be done through the Control Panel. In Windows 10, there is a checkbox somewhere in the ribbon for it.

    Initial Windows Setup
    • On Windows 7 or 8:

      1. Open the Start Menu and type Control Panel. Select the Control Panel entry from the popup list.

      2. Type Folder Options into the search box in the Control Panel window. Select Folder Options when it appears.

      3. Select the View tab.

      4. Uncheck the box for Hide extensions for known file types.

      5. Click OK until there are no more OKs to click.

    • On Windows 10:

      1. Open the Start Menu (icon shaped like a Window at the bottom left, typically). Select the File Explorer option, right above Settings, from the popup list.

      2. Click on this, and then select View from the ribbon lists of options along the top.

      3. After clicking this, on the right there should be a check box for File Name Extensions. Click this box; that should do it.

    A word on path names

    An appallingly large fraction of the difficulties of using GNU/Linux-based utilities with Windows come from the differences in formatting path names. Windows path names begin with a drive letter (usually C) and a colon. Like all path names, they describe a path in a rooted tree. The root directory (folder) in Windows is called \, a backslash. Note the direction carefully. Children of the root node are either subdirectories or files in the root directory (leaves). The path to my downloads folder is:

    C:\Users\drosoff\Downloads\

    The trailing backslash is often unnecessary, but it is an easy way to see immediately whether a path name refers to a file or to a directory. Windows path names are not case-sensitive.

    Linux/Mac OS X path names are quite similar, but lack drive letters, start with an explicit reference to the root, use forward slashes, and are case-sensitive (more or less so, in Mac's case). A path to a typical Linux user's download folder might be

    /home/typical.username/Downloads

    Again, Linux pathnames are case-sensitive and Mac OS X pathnames are typically case-preserving. The Git Bash shell for Windows is an emulation of a Linux environment, and the utilities within it expect path names that follow Linux conventions. So we conform to this expectation as follows.

    1. Remove the colon, but keep the drive letter.

    2. All backslashes \ become slashes /.

    3. Add an initial slash preceding the drive letter.

    The path name to my Windows download folder becomes

    /c/users/drosoff/Downloads

    Even though Git Bash is pretending to be a Linux shell, path names are still the underlying Windows path names, and therefore are not case sensitive. You can verify this using tab-completion.

    Path names that begin with the drive letter (Windows) or the root / (Linux/Mac OS X) are called absolute path names. Their referents do not depend on the location from which the path name is invoked. Relative path names, on the other hand, begin in the so-called current working directory. A relative pathname might look something like this:

    ../../examples/sample-article/sample-article.xml

    The symbol .. is a shortcut for the parent of the current directory. Thus, the relative path name above means from where we are, ascend two levels, then descend into the examples and sample-article subdirectories, and find the file sample-article.xml.

    Path names that contain spaces are evil, and should be avoided in many cases. Unfortunately, all Windows default program installation locations contain at least one space (directory name Program Files). This does not appear to cause problems, except when installing ImageMagick (). To be extra careful, you could always choose an installation location that is free of space characters.

    Do I have 64-bit Windows?

    Find out on Windows 7:

    1. Open the start menu and type Computer. Right-click the Computer item in the popup menu.

    2. Select Properties from the drop-down menu.

    3. Read in the right-hand side of the pane to find the System heading.

    4. From the System type entry, read whether you have a 32- or a 64-bit OS.

    Now you are ready to begin installing the various pieces of the puzzle. The first one, xsltproc (), is the most annoying. You might want to go get a snack or another cup of coffee.

    Installing xsltproc xsltproc binaries

    This is the most annoying part of the installation. Obtain four zip archives from Igor Zlatkovic's FTP site that hosts the most recent Libxml binaries for Windows. At the time of this writing, the 64-bit binaries were considered experimental. I have had no trouble using the 32-bit binaries on my 64-bit Windows 7 system, so I suggest that all users download the most recent 32-bit version of the following libraries:

    <c>xsltproc</c> Zip Files
    1. iconv (filename something like iconv-1.9.2.win32.zip)

    2. libxml2 (filename something like libxml2-2.7.8.win32.zip)

    3. libxslt (filename something like libxslt-1.1.26.win32.zip)

    4. zlib (filename something like zlib-1.2.5.win32.zip)

    We only need a handful of files from these archives. So the simplest thing is to leave them in your Downloads folder and grab what we need. Create a new folder C:\xsltproc (it can be anywhere, as long as it's a new location). We'll call this location <xsltproc> in case you named your folder something different.

    Extract the following files from the four zip archives you downloaded above into <xsltproc>:

    <c>xsltproc</c> Extracted Zip Files
    1. From iconv-*.win32.zip:

      1. iconv-*.win32\bin\iconv.dll

    2. From libxml2-*.win32.zip:

      1. libxml2-*.win32\bin\libxml2.dll

      2. libxml2-*.win32\bin\xmllint.exe

    3. From libxslt-*.win32.zip:

      1. libxslt-*.win32\bin\libexslt.dll

      2. libxslt-*.win32\bin\libxslt.dll

      3. libxslt-*.win32\bin\xsltproc.exe

    4. From zlib-*.win32.zip:

      1. zlib-*.win32\bin\zlib1.dll

    Change PATH environment variable

    Note: if you prefer not to meddle with this, it can be avoided. Now, we need to make sure your system can find these files when we need them.

    Path Environment Variable for <c>xsltproc</c>
    1. Open the Start menu and start typing Edit the system environment variables. Select this option when it becomes visible.

    2. Click the Environment Variables button near the bottom of the dialog.

    3. In the bottom part of the dialog labeled System environment variables, look for a variable named PATH. You may need to scroll.

      1. If you do not find one, create it using the New... button. Make sure to use all capital letters. (This really shouldn't happen. Make sure you are editing the system environment variables, not the user environment variables.)

      2. If you do find the PATH variable, select it and click the Edit... button.

    4. Regardless of which of steps 1 and 2 you followed, now you should see a dialog with two text fields. Your variable name should be PATH.

    5. If you created this variable, populate the second field with the full path name of <xsltproc>, the location where you put the seven files from Igor's zip archives. For me this looks like C:\xsltproc.

    6. If you are editing the PATH variable, place the cursor in the existing value and press the End key, so that the cursor moves to the back of the line. The PATH string is a ;-delimited list of full path names, so append the string <xsltproc>; (note the semicolon) to the existing value. If you named <xsltproc> as we suggested above, then the last part of your PATH variable is now C:\xsltproc;.

    7. Click OK to save changes.

    Congratulations, you have successfully installed xsltproc.

    Note that you have installed the xmllint utility as part of this procedure. This utility will allow some text editors to lint your files, that is, to automatically detect and highlight errors, and perhaps even to explain them.

    Installing git

    In this section we install the git version control system and some tools to interact with it, including a fairly full-featured emulation of the bash command line shell. I strongly recommend you use the Git Bash shell or another bash emulation, so that you can use Linux commands referenced elsewhere.

    Steps to install git git Installation
    1. Visit the official git (download starts automatically) and obtain the latest binary for your system.

    2. Find the installer in your Download location and run it.

    3. Choose whatever location you like for the git installation folder. I recommend you use the default.

    4. At the Adjusting your PATH environment dialog, select either of the first two items. I recommend the second, Add git executable to Windows PATH. This will allow you to use git from within other Windows programs, such as Sublime Text or other text editors, which can be extremely convenient. If you are apprehensive about adding git to the Windows PATH, select the first option. I do not recommend the third option.

    5. Accept the default options for all the remaining prompts.

    Changing the path with .bashrc

    In , we promised that you could avoid messing with the Windows environment variables. If you install something else later that wants to use xsltproc, then this might not be the best idea. But if you are only going to use it from within Git Bash, then this will work fine.

    From the Git Bash command prompt, enter this line of text and hit Enter. Do not make any typos. You should substitute your value of <xsltproc> where indicated, but make sure to conform to the conventions at the end of regarding Windows path names in Git Bash. (I warned you this was going to be annoying.)echo "export PATH=<xsltproc>:$PATH" >> ~/.bashrcYou may get a message from Git Bash the next time you run it about .bash_profile, which you may safely ignore.

    Congratulations, you have successfully installed git.

    Installing Anaconda

    Anaconda is a well-regulated development environment for Python under Windows, and I recommend it for users who do not already have Python installed. The essential pretext script has to support both Python 2 and Python 3. Therefore we make no recommendation about which Python version to choose.

    If you already have a working Python installation, skip to .

    You have some choice with your Anaconda installation. It actually supports the installation of several independent Pythons side-by-side (since both 2.7 and 3.x are in active use, this is more reasonable than it seems). If you do not need Python for anything else or are simply a minimalist, Miniconda is also an option. Miniconda installs no packages, but these can be installed via the conda utility at the command line later.

    1. Download either Miniconda, Python 2.7, or Python 3.5 from the .

    2. Run the installer and accept all the default suggestions.

    Congratulations, you have successfully installed Python.

    If you do not care about images, you can stop here. Much of the functionality is already present. However, to use the pretext/pretext script to create SVG images from sources like PDF/PNG images, Sage, Asymptote, or TikZ, you need to install ImageMagick using the directions in .

    Installing ImageMagick

    Visit the and grab a binary. If you have a 64-bit Windows installation (), use the recommended version. If you have a 32-bit installation, find the version whose filename is obtained from that of the recommended version by substituting x86 for x64. For example, if the recommended version's filename is:

    ImageMagick-7.0.1-6-Q16-x64-dll.exe

    then a good choice for a 32-bit Windows would be

    ImageMagick-7.0.1-6-Q16-x86-dll.exe
    imagemagick Installation
    1. Run the installer from your download location.

    2. Accept the license agreement.

    3. Choose a default installation location that has no spaces in its folder name. The default choice Program Files causes problems because of path name issues. I chosec:\ImageMagick-7.0.1-Q16\It matters because the ImageMagick utility convert is used by the pretext script to convert your images into different formats. The pretext script will have a lot of trouble with path names that contain spaces.

    4. When confronted with Select additional tasks, make sure that the boxes for Add application directory to your system path and Install legacy utilities are checked.

    5. If you like, carry out the procedure to verify your installation.

    Congratulations, you have successfully installed ImageMagick.

    Installing jing

    The jing utility for schema validation can be installed in Windows. To install, first make sure Java is installed on your machine. You can either install the official Oracle JDK from or, if you prefer an open license, . Download the .zip file, and extract to a folder such as C:\Java. (Avoid installing to the Program Files folder due to the space in the folder name.)

    Next, follow the installation instructions in , ignoring the BUILD FAILED message. You will almost certainly want to copy the file xercesImpl.jar from the lib. folder into build.

    If you are using Git Bash for processing, you may want to set up a command shortcut to avoid the rather lengthy command given in , especially if you have modularized source. Before proceeding, make sure that you have configured your Windows environment variables to include a path to Java. For example, if you installed JDK 12.0.1 in C:\Java you will want the path C:\Java\jdk-12.0.1\bin.

    As suggested in , you can set up a command in .bashrc. Git Bash on Windows requires a .bash-profile to load .bashrc. Open Git Bash and change to your user directory: cd /c/Users/your.name. Windows does not like file names beginning with a period, so if they do not already exist, you'll need to create them in Git Bash. Do touch .bash-profile and touch .bashrc to create the files. Use your favorite text editor to add the line if [ -f ~/.bashrc ]; then . ~/.bashrc; fi to .bash-profile

    You can then create the ptx-check command as in . Absolute paths are recommended. Using the Git Bash syntax for Windows paths, your definition in .bashrc will look something like the following: ptx-check() { java\ -classpath /c/jing-trang/build\ -Dorg.apache.xerces.xni.parser.XMLParserConfiguration= org.apache.xerces.parsers.XIncludeParserConfiguration\ -jar /c/jing-trang/build/jing.jar\ /c/PreTeXt/pretext/schema/pretext.rng "$1" } The above assumes that jing-trang is installed at C:\jing-trang and that PreTeXt has been cloned at C:\PreTeXt\pretext. Adjust your paths as needed. You can now run validation from Git Bash using ptx-check ~/path/to/project/index.ptx > jing_report.txt and the jing_report.txt file will be created in your working directory.

    What's Missing

    Development of a Windows-compatible pretext script () is mostly complete. If you need help with pretext, contact Dave Rosoff. There are still a few use cases that haven't been tested, mostly those to do with Asymptote.

    A Windows installer for Sage is available from several mirrors at . The installer provides Sage Math, the Sage Math Shell, and the Sage Math Notebook (Jupyter).

    If you find any problems or bugs, please let us know at the Support group in Google Groups, or email drosoff AT collegeofidaho DOT edu.

    ================================================ FILE: doc/guide/author/advice.xml ================================================ Authoring Advice

    In this chapter we gather advice on authoring. In some cases it is discipline-specific.

    Writing Your Student-Friendly Math Textbook Kathy Yoshiwara

    So you are writing a math textbook. You love your subject enough to put in the hours, and you probably have some ideas on how the standard presentation can be improved. You care about good pedagogy and want to engage your students.

    You know that writing a text for undergraduates requires a different style from writing a research paper or a scholarly article for colleagues. But how to achieve that style? A good first step is to adjust your linguistic goal from

    Elegant Argument

    to

    Illuminating Explanation

    We can examine this strategy in three areas:

    1. Language
    2. Layout or Format
    3. Content

    Language

    In the exposition, it is useful to adopt an informal voice. But, perhaps counter-intuitively, that does not mean a conversational voice. In conversation, you have gestures and tone of voice to help convey meaning: what are the main points, what are helpful hints, what are asides, and what are social interactions.

    None of these prompts are available when communicating in print. The author must shape the material so that the reader can navigate the ideas on his or her own. It is best to be as brief and direct as possible. After writing a section or so, go back and omit any unnecessary words or phrases. For example, before presenting an Example, there is no need to say Here is an example to illustrate the ideas we have just discussed. Subconsciously, the reader must absorb and then jettison this comment as unimportant. Doing so constantly leads to reader fatigue.

    Often an explanation can be improved just by (judiciously) making it shorter. In addition, while trying to understand a new concept, most students will not find helpful our philosophical musings or historical anecdotes. These can be presented in a sidebar or addendum. Do try to relate new ideas to previous ones and show how they fit into the overall scheme, but avoid references such as we'll need this for our later study of (whatever).

    The principles of good writing for any format apply equally to textbooks, mathematical or otherwise. Usually, active voice is more effective than passive voice, and a positive form is clearer than a negative one. Strunk and White's classic The Elements of Style and, more recently, George Gopen's reader expectation approach are standard resources for techniques of composition. (Although sometimes their advice is contradictory, which just goes to show that no rule is appropriate in every situation.) Steven Pinker's The Sense of Style is also useful.

    Layout or Format

    In a textbook, it is good practice to deliver material in digestible portions. Try to keep blocks of uninterrupted text rather short. Break up the exposition visually with boxes, Examples, Cautions, Notes, and so on. Use bulleted or numbered lists to highlight important points. Consider whether it would be more effective to start a particular section with a motivating example, or perhaps with a few sentences explaining how the new topic arises naturally, or in some other way.

    Instead of opening your textbook with a Chapter 0 type catalog of all the notation and terminology needed in the entire book, it would be kinder to students to introduce new notation and terminology as needed. Also, it is not necessary to front-load all the information about a topic at one time; let students absorb and practice the fundamental ideas, then return later to elaborate, generalize, or present exceptions. Resist the temptation to proceed too quickly to general or abstract statements. Most people grasp abstract ideas more easily if they first see specific and concrete examples.

    Choosing effective examples helps make your text student-friendly. A simple example has greater impact than a complicated one. If you are introducing asymptotes, the graph of y=\dfrac{x-3}{x-2} is a better example than y=\dfrac{x^2-9}{x^2-x-2} . It is also better than y=\dfrac{1}{x} because the latter may lead students to believe that asymptotes are identified with the coordinate axes. If you are introducing subgroups, do not limit your examples to subgroups of cyclic groups. Always consider your example from the students' point of view! Is your example too general or too specific? Are there confounding features that may distract from the intended message?

    What about proofs? These days a good background in mathematics is necessary for a wide variety of occupations, so that only a small number of your students may be headed to graduate school in mathematics, even in junior or senior level classes. Here is a good place to strive for illuminating rather than elegant.

    Content

    Choosing and organizing the material for your textbook requires more thought than any other aspect of the creative process. To make your textbook truly student-friendly, you may want to rethink the traditional or standard order of content. If you are used to presenting material by topic, you might want to consider how better to make connections or to take advantage of sound pedagogical principles.

    For example, forty years ago high school algebra was taught by first covering all the one-variable material and then (if time permitted) considering graphs and other two-variable topics. Now it is considered more effective to study graphs throughout the course. Linear algebra courses used to start with the study of vector spaces. Now many texts prefer to begin with systems of linear equations. In trigonometry, maybe we can start with just three trig functions instead of six; maybe we can work in one quadrant first, then add the second quadrant, before treating all four.

    In a sense, textbooks drive the curriculum. Think of the innovations introduced in the calculus renewal movement that are now incorporated into most calculus texts: the catalog of functions, the rule of four, the inclusion of conceptual exercises. Many instructors, especially adjunct or part-time instructors, rely on their textbooks to shape their courses. You have a real opportunity to influence the direction of your field and to shape the way it is taught. Now get to work.

    ================================================ FILE: doc/guide/author/author-faq.xml ================================================ Author FAQ: Frequently Asked Questions

    Technical questions first, followed by questions about markup.

    1. On my local machine, why is the <fillin characters="8"/> not working?

      The could be a knowl that appears empty. Or a sage cell that appears empty. Or an interactive element of some sort that seems broken. Or any component of the HTML page that is fancy.

      Viewing an HTML file on your own computer is not the same as visiting it on a website. There is no web server, so you should assume that things will be different.

      The cause of the difficulty is that some web browsers will behave differently when viewing a local file compared with viewing it on a website. If there are other resources to fetch (for example, the content of a knowl) the browser may consider it a security risk to fetch them while viewing a local file.

      Try viewing your HTML file using a different browser, and you may find that the feature is working there. However the real test is to transfer the files to an actual web server, or to set up a local web server so that local files operate in the usual way.

      To set up a local server, see .

    2. How do I install <c>xsltproc</c> on Ubuntu or Debian Linux?

      sudo apt-get install xsltproc

    3. How do I install <c>pdf2svg</c>?

      As of July 2024, you no longer need pdf2svg to process latex-images; we now use the python pyMuPDF library instead.

    4. Why is there no tag for bold?

      Because the first principle of is that the markup captures the structure of the document, not the appearance.

      A better question is: why do you want to print something in bold? Is it emphasis? (See em.) Is it the volume number of a journal? (See journal.) Do you want to SHOUT? Try alert. And so on. There are lots of good answers, some of which are not yet implemented. We would love to hear about elements you need that are about expressing content, and not about altering presentation. See Principle.

    5. Can I create <pretext/> source in Microsoft Word or Google Docs?

      Unlikely. is designed around XML markup, so using a text editor to create a text file is the intended process for creating source. When you create a file with other word processors it is likely to use different characters in some places, such as smart quotes, and convert other things you type, such as converting three periods into a single ellipsis character. And if you make font changes, such as italics for emphasis, that will not translate directly to .

      Perhaps you know somebody technically-minded you want to convert your word-processor files for you? First, this is a tedious job. Second, they may not accurately translate your intent. Third, you cannot make any edits and you will be reliant on them alone to maintain your project for you.

      If you insist on authoring with a traditional word-processor, then you should. But you will get whatever output that tool provides, and miss out on the benefits of the semantic markup that allows us to create all the various output formats provides.

    6. Why do I get no output and some warnings about bugs?

      There is a good chance you have modularized your source files and have not included an xi:include for each modularized file. (See .) If that was your mistake, then you should have seen a warning. Please check to see if there was a warning you missed. (If not, we can improve the warning if you tell us how your source was organized. So please do, since we would love to hear about it.)

    7. I don't like surprises and have not updated in months. Why do I now have a problem?

      We almost never release mistaken code that breaks output produced from valid source (). And when we have, the cause is usually a small typo, or something that gets fixed easily and quickly. We do sometimes make backwards-incompatible changes, but you always get warnings, often the changes can wait, there are announcements on the mailing lists, and whenever possible, we update tools that automate the changes.

      As volunteers, we cannot support problems from old versions, and sometimes we have to implement changes in reaction to third-party software (like MathJax), which is beyond our control. So while development is rapid, we implore you to remain on the dev branch of the repository and git pull regularly. Such as daily, with your morning coffee as you sit down to write, or with your last compilation of the evening. You will have far fewer unpleasant surprises this way, and we can help you better.

      We understand that is a moving target, but we are iterating to a better state, and it is best to have everybody along for the whole ride.

    8. I have not updated in months, so I did a pull, and now I have a bunch of warnings. How do I catch up?

      Changes on our end which produce new warnings are almost always announced on the pretext-announce Google Group. This is a very low-traffic, announcement-only list, so you could skim the messages you missed. Also, read warnings carefully, as they often have explicit suggestions about what to do next.

    9. There are lots of different blocks, but my project needs one that does not exist.

      We do not support creating new blocks. But you can repurpose an existing one. See .

    10. How do I put mathematics into my list markers?

      List markers are an organizational device for grouping small bits of information. It is not appropriate to use mathematics in this situation. (Even if list item labels allow such a construction.) The alternative is to use a description list, with a dl element. Put your mathematics in the title and put the associated content into the remainder of the li. Or, put titles on the list items of an ordered or unordered list, and include mathematics there.

    11. I have errors when I try to validate my markup, but everything looks okay when I make the HTML and the PDF. Should I be worried?

      Occasionally the schema lags behind the code, so your first step is to post to pretext-support@googlegroups.com to find out if it is a problem with the schema.

      Possibly there is another way to accomplish what you want, and that markup will fit the schema. Or maybe what you are doing meets the common and reasonable test and can become a feature request. The discussion on pretext-support should provide an answer.

    12. Why are theorems, definitions, examples, remarks, etc.<nbsp/>all numbered using the same counter?

      The following is an argument in favor of using common counters for blocks of similar appearance. The argument is stronger in the context of using a printed copy of the book, where physical page flipping is necessary, but also applies to scrolling through a (long) page in a web browser.

      Suppose your professor gave you a note to review Example 2.4.7 in your textbook. The 2.4 is useful information directing you to Chapter 2, Section 4. You can tell by the 7 that the example is probably not right at the beginning of the section, so you open to the middle of the section. You find yourself on a page with no examples, but you do see Remark 2.4.11. What do you do: flip forward or flip backward?

      If examples and remarks are numbered using separate counters, you have no information about which way to go. You need to make a random decision, and flip pages until you find another example that you can use as a guidepost. And examples might be rare and sparse, so it may take quite a bit of page flipping to find that guidepost. You may end up at Example 2.4.8, telling you that you need to flip backward now. But how far? Will it be one page earlier or twenty?

      For a more expansive discussion along these lines, see .

      Also, as an author, recognize that there is a very flexible mechanism for making lists of objects that may be included in the backmatter (or elsewhere). To continue the example here, you could make a list of all the examples in the book, and a separate list of all the remarks. Each list would be in the order of appearance, include the number (and a title if you provide one). In HTML output, each is a knowl which will quickly provide the content (independent of location), and also provides an in-context link to take you to the location for surrounding material. This useful feature requires very little additional effort, especially if you title your blocks as you author them.

    13. Why do I have <latex /> errors?

      If you have errors when you run pdflatex or xelatex, that is more likely to be caused by a problem with your installation than with . It is difficult to make legitimate that fails to compile; an exception being math markup inside a math element (m, md, and friends).

      To check your installation, run pdflatex -version. If it reports something older than TeX Live 2017, then updating may help. If the trouble seems to be coming from a particular package, then check which version of the package is being used. For example, if the tasks package is causing a problem, run kpsewhich tasks.sty in the directory where you are compiling the . If the package is in your personal texmf tree, that may be the problem.

      If the PDF is created without errors, but something looks wrong in the PDF, then probably the source markup is wrong. Validate your source against the schema (see ), and also carefully examine the HTML output. If that does not reveal the problem, seek expert help.

    14. I have great output, so why does validation produce hundreds of errors?

      Success with a tool like the -CLI (see ), in terms of no errors and great-looking output, does not mean your source is correct. XSLT processing can be forgiving, and many invalid constructions just work, and look great. But that is no guarantee this situation will continue, or the same happy accidents occur for a conversion to a different output format.

      We do raise some errors during processing with the -CLI, but error-checking your input is a job for a validator, so in theory we should not ever produce any errors during a conversion. So strive for having 100% valid source, not simply great-looking results. See and .

    15. I'd like to keep using <latex/> markup for mathematics, in other words, $<ellipsis/>$ and \[<ellipsis/>\]

      If you were somehow able to mix-in a dollar sign into your document, how would you then write The bus ride cost me $2.50? The solution, \$, is not going to help you. It is a shortcoming of that so many characters have special meanings in certain circumstances.

      If you insist, you can still author using $$ and \[\], and before processing do a global search-and-replace. But converting a leading $ to <m> and a trailing $ to </m> will drive you mad unless you are really good with regular expressions. So perhaps better to use \( and \) for inline mathematics and search-and-replace will go better. I count six key presses for that, including the shifts for the parentheses, while it just takes me seven key presses for the PreTeXt m element, when I use an editor that auto-completes elements with a two-key combination.

      We realize change is hardwe used for thirty years. But we believe the long-term advantages of markup are worth the short-term rearrangements.

    16. Why not <latex/>? Why <pretext/>?

      was first released in 1978. There was no Internet, no HTML, no Unicode, and no YouTube. There have been many attempts to convert / to more modern document formats. They are not hard to findnone is satisfactory. We know because we have spent many years trying to adapt them to our purposes.

      Many laud for its ability to separate content from presentation. The key word is ability. It is possible to use in a purely semantic way. But it very rarely happens in practice. And we suspect that when it does, the result looks much like XML anyway, such as the use of many \begin{}/\end{} pairs. allows authors enough freedom that it is impossible to accurately discern intent in a totally automated way.

      By contrast, an XML vocabulary defined by a schema (i.e.) forces authors to communicate intent and denies authors the opportunity to micro-manage presentation. The result is automated conversions to many useful output formats with no extra effort from the author, including future conversions to formats not yet imagined. And XSL, once understood, is a robust and powerful tool for the sorts of text-manipulation tasks necessary.

    17. Why do I have an <q>extra</q> period at the end of a title?

      Author your titles without punctuation at the end meant for spacing or separation (period, colon, semi-colon, hyphen). Do include punctuation which imparts meaning (question-mark, exclamation-point). will then add separation (a period, or spacing), as needed, in all the places where it is required. But will respect your question-marks and exclamation-points.

      If you think you have an additional punctuation character that conveys meaning at the end of a title, please bring it to our attention.

    18. I'm a little confused about the less-than character, the ampersand, and <q>escape characters</q> in general

      When you process XML, the less-than character, <, is a signal that the name of an opening or closing tag is coming next. How do you prevent this if you really need the character, especially for something like computer code? Answer: you use the escaped version, &lt;. The ampersand is known as an escape character. It is a signal to the processor to escape from its usual rules. But, I hear you say, we just gave the ampersand character a special meaning, now how do I get that character when I need to say I went to the A&P store.? Simplethere is an escaped version, &amp;.

      So think of &lt; and &amp; as being the characters < and &. End of story. These two concessions should work throughout your source and in every conversion. Every markup language needs, and uses, an escape character, but XML and have you covered and really only need these two (infrequent) exceptions.

      It is worth repeating: think of the escaped versions of the characters as actually being the characters themselves. That is the way the XML processor sees them and uses them. For more, see , , , , and .

      Postscript: XML has the escaped characters &gt, &apos, and &quot for >, ', and " (respectively). But they are rarely (never?) necessary within .

      Extra-credit homework: think about how some of the above was authored and then look at the source to grade your own work.

    19. The titles of my description list are long, and the formatting is really bad.

      Use shorter titles? Read too about the width hint for list items within .

      Or convert your list to an ol or ul. The titles will now render more like their own paragraphs.

    20. My math looks great in one output format (<latex/> or <init>HTML</init>) but is causing errors or looks bad in another output format (<init>HTML</init> or <latex/>). What's up?

      There are subtle and minor variations and restrictions around the interpretation of syntax by itself and the MathJax Javascript routines for rendering in a web page. Work backwards from for details.

    21. I would like to use a standard package in my Sage code

      See for an explanation.

    22. I would like to use a (large) data file in my Sage code

      See for an explanation.

    23. Processing my project takes a long time. Can I <q>comment out</q> some parts?

      First, we know some aspects of processing are inefficient and therefore slow for large projects. We are working on it.

      Your source is not a program, nor is it , which can also be a program. So the idea of commenting out code, or mimicking conditional use of 's \include{} command, are injurious to your source. Processing expects to see all of it. Some aspects of producing output demand it.

      We have the notion of a version which can eliminate some (large) portions of your source in controlled ways (see ). Processing tools, such as the -CLI and the pretext/pretext Python script support the notion of restricting some processing to a subtree of your source, without hiding parts of your source from the processor. See for how to do this with the pretext/pretext Python script.

    ================================================ FILE: doc/guide/author/overview.xml ================================================ Overview of Features

    This chapter is a high-level view of the important concepts, features and design decisions that go into the creation of . For careful exact descriptions of details, we will direct you to one of the many sections in the chapter. So this chapter should make you aware of what is possible and expand on the philosophy described earlier in , while also giving you examples of many basic constructions you can use to get started quickly.

    Structure

    A document is a nested sequence of structural divisionsstructural division. For a book, these would go part, chapter, section, subsection, and subsubsection. Using part is optional, but a book must always use chapter (or else it is not a book!). No skipping over divisions. For example, you cannot divide a section directly into several subsubsections without an intervening subsection.

    An article starts divisions from section, though it may choose to have no divisions at all. paragraphs are exceptional. They lack a full set of features, but can be used to divide anything, in books or in articles, though they are always terminal since you cannot divide them further. You will have noticed that we prefer the generic term divisiondivisionstructural division (rather than section) since a section is a very particular division.

    A division may be unstructured, in which case you fill it with paragraphs and lists and figures and theorems and so on. But if you choose to structure a division it must look like the following:

    • An optional introduction
    • One or more divisions of the next finer granularity
    • An optional conclusion.
    Either version may have a single exercises division at the end, or other specialized divisions. The structured version may have more than one exercises, and more than one of each of the types of specialized divisions. For example a references is a second example of a specialized division. (See .)

    The introduction and conclusion divisions are meant to be short, and may not contain any other numbered tag. No exercises, theorems, listings, etc. If you want to have an introductory division with any of the numbered elements you are free to omit the introduction and use the next finer subdivision with a title of Introduction.

    Every division tag can carry an xml:id attribute, and it is a good practice to (a) provide one, (b) use a very short list of words describing the content, and (c) adopt a consistent pattern of your choosing. Do not use numbers, you may later regret it. These are optional, and with practice you will learn how best to use them. See just below for more on this.

    The exercises and references tags are special divisions, see and .

    This explanation is expanded and reiterated at and is worth reading earlier rather than later.

    Paragraphs paragraph

    Once you have divisions, what do you put into them? Most likely, paragraphsparagraph. We use long, exact names for tags that are used infrequently, like subsubsection. But for frequently used elements, we use abbreviated tags, often identical to names used in HTML. So a paragraph is delimited by simply the p tag.

    Lots of things can happen in paragraphs, some things can only happen in a paragraph, and some things are banned in paragraphs. Inside a paragraph, you can emphasize some text (em), you can quote some text (q), you can mark a phrase as being from another language (foreign), and much more. You can use almost any character your keyboard can produce, but need to be careful with the three XML exceptional characters: ampersand (&), less than (<), and rarely, greater than (>). (See .) You must put a list inside a paragraph, and all mathematics () will occur inside a paragraph. You cannot put a table or a figure in a paragraph, and many other structured components are prohibited in paragraphs.

    Paragraphs are also used as part of the structure of other parts of your document. For example, a remark could be composed of several p. As you get started with , remember that much of your actual writing will occur inside of a p and you will have a collection of tags you can use there to express your meaning to your readers.

    So early in your writing project, familiarize yourself with the components of a paragraph detailed in .

    Blocks blocks environmentsblocks

    Besides paragraphs () the most common object to include in a division is what we informally refer to as a block. These are self-contained units of text, almost always set-off visually, and likely with a number and a title. If you know , you may be in the habit of calling these environments. Mathematical results are one example, and you can start at to learn more. There are others that are more general-purpose, such as remark and example. While fundamentally different from these blocks that are textual with reflowable lines, objects like figure and table () or program and console () are blocks, even if their contents are more rigid or spatial. For a more precise description, see .

    Cross-References cross-reference

    Cross-references in a document are easy, powerful and flexible. So it is worth familiarizing yourselves with them early, here and then ahead in .

    Any element that you place a xml:id on can become the target of a cross-referencecross-reference. This could be a division, a remark, a bibliographic entry, or a figure. So for example, suppose your source had <subsection xml:id="subsection-flowers"> and someplace else you wrote <xref ref="subsection-flowers" />. Then at the latter location you would get a reference to the Subsection that discusses flowers. In print this might just be the number for the subsection, but in various electronic output formats, these cross-references can be very powerful interactive ways to explore the content. And the mechanism is always the same, pair up an xml:id on a target with a ref on an xref cross-reference.

    Since the value of an xml:id is also used in a variety of ways, such as to construct some file names, some care should be taken in how you author them. We limit the possible characters to letters and numbers (a-z, A-Z, 0-9), with hyphens and underscores (-_) available as word-separators. Our advice is to stick to lowercase letters, though we are not yet aware of any problems with case-insensitivity. So in short, use kebab-case or snake-case for your xml:id values.

    For more, see because cross-references have many features. But first, here are two features you do not want to miss. In the early stages of writing, you can author <xref provisional="subsection-flowers" /> to point to a subsection you are contemplating (but have not written yet) and you will get various polite reminders to get that straightened out eventually (see for details). Also the default behavior is to automatically provide the generic name of the target, so you will get something like Subsection 4.3.2 without ever typing the Subsection part. If you move the target, the generic name will adjust if necessary, and if you switch to one of the supported languages, the generic name will switch language (see .

    Titles title

    Divisions always require titles, you accomplish this with a titletitle tag first thing. Almost everything that you can use in a paragraph can be used in a title, but a few constructions are banned, such as a displayed mathematical equation (for good reason). Try to avoid using footnotes in titles, even if we have tried to make them possible.

    Since titles migrate to other places, such as a Table of Contents, there are options for variants of a title, such as a short version, or a markup-free version. Some (major) titles may also be structured as a sequence of line elements to control line-breaks for long titles.

    Many, many other structures admit titles. Experiment, or look at specific descriptions of the structure you are interested in. Titles are integral to , much like cross-references. Titles migrate to the Table of Contents, get used in page headers for print output, can be used in lists (such as a List of Figures), and can be used as the text of a cross-reference, instead of a number. You might be inclined to not give a remark a title, but it would definitely be good practice to do so (study ). For more details consult .

    Mathematics mathematics

    With experience, you may realize that utilizes three principal languages. One is the narrative of everyday sentences and paragraphs. Most of what you write in a paragraph, or a table cell, or a title, or a caption, or an index heading, is in this language. Then there is the structural language, which is the majority of the elements in , such as chapter, theorem, or figure. Then finally, there is the language of mathematical symbols and notation.

    A key design decision is that mathematical symbols, expressions and equations are authored using syntax. More precisely, we support the symbols and constructions provided by MathJax, which quite closely follows the amsmath package maintained by the American Mathematical Society. Neither you nor I want to write MathML by hand!

    The symbols and macros supported by MathJax can be found at their Supported commands documentation. Look here to see which parts of may be used in your mathematical expressions.

    For inline mathematicsmathematicsinline mathematics, use the short m tag within a p (or within a title or caption). For example, <m>\alpha^2 + \beta^4</m> will do what you expect, in print and in electronic outputs. To get a single equation, centered, with some vertical separation before and after, use the md tag (math display) in the same way within a p, but do not try using it within a title. For example, <md>\rho = \alpha^2 + \beta^4</md>. If you want your equation numbered, add the number attribue with the value set to yes.

    There is a way to incorporate your own (simple) custom macros within mathematics (only). They will be effective in your print and electronic outputs, and can be employed in graphics languages like TikZ and Asymptote. You can also author multi-line display mathematicsmathematicsdisplay mathematics using the md tag, but now it should contain a equence of mrow elements holding syntax. We defer the details to .

    Images image

    You can include an image via the imageimage tag, using the source attribute to provide a filename, likely prefixed by a relative path from the top-level of the appropriate directory. Read for details on how to set these directories correctly. If you are starting a new project, using the -CLI (with the command pretext new book, for example), then most of the setup portion is done for you and the top-level directory for images that are created external to the project is called assets, and it is a sibling of the source directory. It is your responsibility to locate that file properly relative to this directory, and that the file format is compatible. So, for example, suppose your source contained <image source="images/butterflies.jpg"/>. Then you would want to have a directory named images below wherever you set the external top-level directory, and you would place the butterflies.jpg file inside of the images directory.

    The width attribute can be used to control the size of the image. Widths are expressed as a percentage of the available width, such as width="60%". Instead of a width, you can also specify margins and the width will be deduced.

    The optional rotate attribute controls the angular rotation of the image about its center, for example image/@rotate="30" will rotate the image 30 counterclockwise.

    You may want to wrap your image in a figure to have it centered, and to have some vertical separation above and below. A figure must also have a caption, and the figure will be numbered.

    You can also place an anonymous image (no caption, no number) almost anywhere you might place a paragraph (but not within a paragraph). Note also that the sidebyside tag provides some very flexible options for placing several images () together, or combining figures with subcaptions.

    If you wish to construct technical diagrams, with editable source, and perhaps including the use of macros, provides support for authoring with graphics languages such as Asymptote, TikZ, PGF, PSTricks, and xy-pic in addition to using Sage code to describe a plot or image. In most cases output can be obtained as smoothly-scalable SVG images, in addition to other formats like PDF or PNG. Making all this happen is one of the more technical aspects of , so read the details in along with frequent references there to the pretext script described in .

    For accessibility, every image should either have a description or it should explicitly declare itself to be a decorative image setting decorative to the value yes. Descriptions are of two types. A shortdescription should minimally describe the important information in the image that is not already present in the surrounding text. It should have no element children except possibly var children. This content will be used as the alt attribute for the HTML img. Some screen readers may cut off reading this content after the first 100140 characters, therefore you should keep this element short. A description element should be structured with p and tabular children and has no technical limit on length. It may describe the image more completely. The content of the description should describe the image, but should not be necessary for a sighted reader to take in the important features of the image. (If there are features of the image that need to be explained to all readers, this should happen in the main body of the text.) An image may have one or both types of description, but it is incorrect to have neither unless decorative is set to value yes.

    Lists list

    Ordered lists (numbered)listordered list, unordered lists (bullets)listunordered list and description lists (defined terms)listdescription list are all supported, and syntax generally follows HTML. Lists usually live within a paragraph (p), though there are limited exceptions. Their structure is given by the ol, ul, dl tags (respectively). These can specify a variety of options for the labels via attributes, as described in .

    List items, for any of the three types, are delimited with the li tag. What is different from HTML is that the contents of a list item may be structured, with paragraphs (p) being the most likely and frequent element. So to nest lists you begin a paragraph in a list item of the outer list, then begin the inner list within that paragraph. However, a simple list item may be authored just like you were authoring within a paragraph, much like writing sentences elsewhere. A structured list item may begin with title for ordered and unordered lists, and is mandatory for a description list. In this latter case, the text of the title will become the text that is being described (the label of the list item). For the optional uses, the title will be rendered as its own paragraph, with a different font (perhaps italics or oblique). A description list cannot be contained within another list. In other words, it is a top-level list.

    Lists are more complicated than they appear, so be sure to read the details at before you start designing really involved lists.

    Exercises exercise

    Textbooks in many disciplines have exercises for the reader. In there are five places where you can set a question for the reader to pursue.

  • Divisional

    There is a special exercisesexercisedivisional exercise division and an exercise placed there is then known as a divisional exercise. This division supports extra features designed for exercises, such as an exercisegroup for short exercises with common instructions. The exercises division can be used at any level. In other words, it can be a peer of any other division.

  • Inline

    Immediately within any division, you can interrupt the narrative with an inline exercise.exerciseinline exercise It will be rendered similar to a theorem or other block, with a number, and a optional title.

  • Reading Question

    Another specialized division, reading-questions, can be used to house exercise designed to test or guide a reader's comprehension of the material in that division.

  • Worksheet

    The main component of a worksheet is an exercise (). Notably the exercises in a worksheet may be arranged with a sidebyside element ().

  • Project

    A project is similar to an inline exercise, other than the type name and the fact that it can run on a separate counter from theorems, figures, etc. (When running on a separate counter, the same counter is used for activity, exploration, and investigation.)

  • If an exercise is simply a statement of the question, then it may be authored with paragraphs (p) and similar elements. If an exercise has hints, answers, or solutions, then it must be structured with a statement, followed by (possibly several) optional hint, answer and/or solution. Conceptually, an answer is a short final result, while a solution provides details about the route to the answer. Each of these four components is structured further, with paragraph-like elements, and the exercise itself may have a title. A title is strongly encouraged for inline exercises, and nearly-mandatory if you plan to have inline exercises rendered in knowls in a conversion to HTML.

    There is a wide variety of interactive exercise types you may specify, such as multiple choice, Parson problems, matching, and more. See for descriptions of each type and the details of markup for each.

    You need (and want) to have the hints, answers and solutions grouped with the statement as you author, but there is a lot of flexibility on making these available at the location of the exercise, or in the back matter. See for more.

    An inline exercise typically gets a fully qualified unique number and is rendered similar to an example or a remark. A divisional exercise (including reading questions and worksheet exercises) only gets a sequential number, though this can be overridden with the number attribute if you want to maintain stable numbering in response to edits. (Be careful, once you override the sequential numbering, you probably need to manually specify every subsequent number, so save overrides for when your project matures.)

    Within a run of divisional exercises a subgroup can be delimited as an exercisegroup, which requires an introduction and allows a conclusion to explain some commonality. A title is optional, and a default will be provided otherwise. An exercisegroup should be rendered in some way that makes it clear to the reader that they are a group.

    Programs and Consoles program console

    If you are writing about computer science, or more general scientific or engineering topics, you may wish to include sample computer programs, or command-line sessions. A program will contain a complete computer program, or a portion of the code from a program, while a pf (program fragment) will display a chunk of code inline with the text. Some program can execute in an online output format, while others are both editable and executable. This behavior depends on the language used and the host employed. A console holds a command-line session. These elements feature monospace fonts, preservation of whitespace, and syntax highlighting. These may also be placed in a listing to be more prominent, or as the target of a cross-reference. See for details.

    Worksheets worksheet

    Another division is a worksheet. It is similar to a chapter, section, and so on, but with some variations to support a worksheet or in-class activity. Here we recognize the primacy of printed output (perhaps to bring into a classroom), and the online version is a less-capable representation.

    There is no limit to what you can place in a worksheet division: objectives, an introduction, theorems, figures, images, and so on. But the principal element is an exercise, which mostly behaves like an exercise in an exercises division, but with additional capabilities.

    An exercise in a worksheet can have a specified width when included in a sidebyside, and in any case may have a specified additional blank working space of specified height. Page breaks can be specified, and the four margins on a page can be independently controlled. So if you want to create ancillary worksheets for your project, and you like to use all of the space on a printed page, then there is some layout control to support that.

    Notice that all of this layout control is an exception to the philosophy of . So in particular, margins and working space do not appear in the HTML output. We do give a visual indication where a page break in a worksheet is placed. An author might wish to collect all of the worksheets in a book, for printing as an activity book, and so there are plans (2018-08-11) to support and automate that process. Details for authoring worksheets can be found in .

    References reference

    Like exercises, a references division may go anywhere a more typical division could go. This allows for things like a Further Reading list at the end of every chapter of a book. These are populated with biblio items that are individual bibliographic entries. Support is presently very minimal, but is planned to improve.

    Figures, Tables, Listings, Lists figure table listing listnamed

    Some elements in are containers, meaning they do not stand by themselves, but are meant to be filled with other elements. Other elements are atomic, meaning they cannot be decomposed into smaller elements. A canonical example is the case of a figure, which is a container meant to be filled with other elements. One such element is an image, which is atomic. Note that the figure can be filled with other items, and that an image may appear inside other elements, including as a child of a division, perhaps as a peer within a run of paragraphs. A purpose of the container is typically to provide a number and some text (a title, caption, or similar) as identification or description, in addition to indicating to conversions the necessity for some visual formatting (such as small amounts of separating vertical space above and below). Note that an author provides the caption, while provides the vertical spacing.

    Here we provide very brief descriptions of these four containers. Be sure to consult the in-depth topics for more details on specifics. Generally, the common thread here is that these containers contain text or graphic elements that has a two-dimensional quality to it. To different degrees the content is rigid. Unlike a paragraph, which could be unwound into a single (linear) long sequence of characters, something about the contents of these containers would be lost if stretched out in one dimension. To reflect this rigid two-dimensional flavor, we refer to these objects (and their containers) as planar.

    A figure is the most general planar container. It can hold an image, a audio, a video, and more. A caption is authored early as metadata, but will likely render below. A title can be used for cross-references or in lists of figures, but may not render where authored. See for full details.

    A table is the container for a tabular, an atomic element which is the only allowed content of a table. A title is the identifying information, and renders above the rows and columns of the table. A variety of notes (to appear below the table) are possible (not implemented as of 2021-12-10). The elements we provide to describe a table are heavily influenced by the discussion in Chicago Manual of Style , which is worth reading if your project has many important tables. See for full details.

    A listing is a container for computer code or programs, to support projects in computer science and other technical disciplines. These languages often rely on indentation (Python) or even exact column numbers of text (FORTRAN), hence a planar quality. Other languages can be written syntactically-correct as one long reflowable line (C, Pascal), but are impractical to do so as part of an exposition. So the allowed content is a program or console, which will respect indentation, use monospace fonts, and include syntax highlighting. Otherwise, a listing is very similar to a figure in how a caption and title are handled. See for full details.

    A list may not be what you think it is. An actual list (be it ordered, unordered, or description) is a common and popular device for organizing information. Start at for details on lists. Since these lists are considered part of a sentence (within a paragraph), or a part of a paragraph, it is hard to create a cross-reference to them. So when you have a list that is important to mention elsewhere, you can create a named list with the list element, a container that has an optional introduction, followed by a actual list, and then an optional conclusion. An example might be a laboratory procedure, such as the steps necessary to dissect a frog. Like a table this element should have a title, and will be given a number. Using a new line for each new list item, and conveying nesting with indentation gives a list a planar quality. See for full details.

    We use a table to summarize these similar containers.

    Containers for Planar Content Figure Table Listing List Element figure table listing list Contents various tabular program, or console introduction ol, ul, or dl conclusion Title Caption Notes Details
    Exceptional Characters exceptional characters charactersexceptional

    An advantage of XML syntax is that very few characters are reserved for the language's use, and thus very few characters need to be escaped. Of course, there is always the need to escape the escape character.

    The escape character for XML is the ampersand, &. The other dangerous character is the left angle bracket, the less than, <. If you like to be symmetric, you can also handle the right angle bracket, the greater than, >, similarly. Single and double quotation marks are used to delimit attributes, so are part of the XML specification, but do not present difficulties in narrative text.

    These first two characters are interpreted by the XML processor very early in the analysis of your source. So they need to be authored specially via the XML entities &amp; and &lt;. In practice, escaping > is rarely necessary. So fundamentally within there are just two characters to type carefully or exceptionally.

    If you consistently follow the prescription in the previous paragraph you will avoid a descent into escape-character hell and avoid a lot of head-scratching. In particular, you should have no need of the <![CDATA[]]> mechanism of XML, so please just forget we even mentioned it. But see if you are curious, or want a more thorough discussion.

    Nontrivial Characters nontrivial characters charactersnontrivial

    Quality typography is more expansive than the limited capabilities of computer keyboards, whose history is rooted in the machines known as typewriters. Some characters are never present on a keyboard (e.g., a pilcrow), while others are ambiguous. Is a diagonal line a slash used to separate information (either/or), or is it a solidus used to form a simple fraction such as 34? is a sample of how addresses this. (The last two are the technical exceptions imposed by using a markup language, see .) See for a more comprehensive and detailed discussion.

    Nontrivial Characters To get this: Type this: To get this: Type this ellipsis fillin <icon name="gear"/> <icon name="wrench"/> PrtScn <kbd>PrtScn</kbd> <kbd name="shift"/> ndash mdash registered copyright permille pilcrow section-mark midpoint trademark swungdash times plusminus solidus obelus degree prime dblprime & &amp; < &lt;
    Verbatim and Literal Text verbatim text literal text

    Typesetting literal text, usually in a monospace font, can sometimes be tricky. For short bits of such text, as part of a sentence in a paragraph, or in a caption or title, use the c tag, which is short for code. For much longer blocks of literal text, with line breaks that are to be preserved, use the cd element within a paragraph (code display). Outside a paragraph, most anywhere you could place a regular paragraph, use the pre tag, which is short for pre-formatted.

    For the content of a pre element, the indentation will be preserved, though an equal amount of leading whitespace will be stripped from every line, so as to keep the code shifted left as far as possible.

    The behavior of these two tags is to preserve characters exactly. Certainly the ASCII character set will behave as expected, and Unicode characters will migrate successfully to output formats based on HTML. As mentioned in the ampersand and left angle bracket will confuse the initial XML processing. So use the XML entities &amp; and &lt; to represent these characters to the conversion tool, the -CLI. See for further details.

    Sage

    SageSage is an open source library of computational routines for symbolic, exact and numerical mathematics. It is designed to be a viable free open source alternative to Magma, Maple, Mathematica, and Matlab. contains extensive support for including example Sage into your document.

    A typical use of the sage tag is to include an input element, followed by an output element. The content of the input element may be presented statically in PDF output, or dynamically as a Sage CellSage cell in an output format based on HTML. Of course, for output as a CoCalc or Jupyter worksheet, the Sage code is presented in the worksheet's native format.

    The content of the output element is included in PDF output, but not in dynamic instances, since it can be re-computed. Notably, there is a conversion which pairs input and output into a single file in the format used by Sage's doctest framework. So if expected output is provided, it becomes automatic to identify when Sage has diverged from your expectations, and you can adjust your examples accordingly.

    The Sage Cell Server can also be configured to interpret different languages, because Sage by default contains everything needed to evaluate code in these languages. This is done by providing a language attribute, where possible values are sage, gap, gp, html, macaulay2, maxima, octave, python, r, and singular. The default is sage.

    Note that the dynamic formats (including the Sage Cell) may run Sage interacts, so that is possible to embed interactive demonstrations into your dynamic output formats.

    Interactives

    We strive to make it simple for authors to incorporate interactive demonstrations in the online output of their projects. Of course, this prompts the question of what to do with this content in less-capable formats like PDF or braille.

    The interactive element provides a consistent way to specify these demonstrations. There are many possibilities, but perhaps they can be grouped mostly into three broad classes.

  • Server Hosted

    Interactive demonstrations hosted at external sites, such as those from GeoGebra or Desmos, can be included simply by providing the appropriate identifying information, much like the way you would specify a YouTube video ().

  • Source Code

    Some interactives can be described by source code that you include in your source. Examples include JessieCode, CircuitJS, and Sage Interacts. We also support GeoGebra this way. This is similar to how we employ Sage Cells, but without as much specialization.

  • Roll Your Own

    If you know HTML, CSS, and Javascript, you can provide your own routines and libraries to incorporate any sort of demonstration you can imagine and can code.

  • See for details.

    For output formats where executing an interactive would be impossible, we manufacture a static version. This includes a screenshot of the demonstration (automatically generated, or supplied by the author) and a Quick Response (QR) code that will point to a standalone HTML page that contains the interactive. Again, see for details.

    Side-by-Side Panels side-by-side panel

    A sidebysideside-by-side panel is a useful organization of elements in a horizontal layout, and so begins to blur the line between content and presentation. While we default to organizing information in a vertical sequence, it is often desirable to organize smaller elements adjacent to each other horizontally. Specifically, images, tabular, figures, tables, paragraphs, and more, may all be combined and there is good control over vertical and horizontal alignment. Captioning, both overall and individually, is especially flexible. An sbsgroup (side-by-side groupside-by-side group) collects multiple sidebyside to stack vertically, which allows for displays in grids. See for details.

    Mathematical Results mathematicsmathematical results mathematicsmathematical resultstheorem-like elements

    Definitions, theorems, corollaries, are supported by the tags: theorem, corollary, lemma, algorithm, proposition, claim, fact, definition, conjecture, axiom, and principle. Each may have a title (strongly encouraged), and then contains a statement which is a sequence of paragraphs and other elements. As appropriate, some of these elements (such as a lemma) may contain an optional proof (or several), while other elements may not have a proof (such as a conjecture).

    A definition is a natural place to define notation as well (see ), and to use the term tag to identify the terminology being defined.

    In order to assist readers locating numbered items, these items are all numbered consecutively in a group that includes examples, remarks and inline exercises.

    Front Matter front matter

    In the beginning of your book or article you can have a frontmatterfront matter element that contains various items that would precede your first chapter or section (respectively). Possibilities include bibinfo (to hold bibliographic information about your document), titlepage, colophon, biography, abstract, dedication, acknowledgement, foreword, and preface. Some of these may be duplicated (e.g., several prefaces for multiple editions), many of these items are restricted to books (e.g., a foreword), and some items are restricted to articles (e.g., an abstract). The schema () will help you place them in the right order in your source. See for details.

    The frontmatter is also employed in other types of documents, such as a slideshow, in similar, but not identical, ways.

    Back Matter back matter

    Similar to front matter, there is material you might wish to include after your book's final chapter or your article's final section. Possibilities to place in a backmatterback matter include appendix, references, glossary, solutions, index, and colophon. There are empty tags you can place into an appendix to generate lists of notation, or lists of particular elements of your choice, such as a list of figures. A similar empty element actually generates the index, index-list, but you will almost always want to place it into the index division. See for details on the back matter generally. Also, be sure to read about the powerful and flexible automatic list feature (), which is not restricted to just the back matter.

    Index and Notation Entries index notation notation list listof notation

    Construction of an indexindex and a list of notationnotation is accomplished by placing information into your text in the appropriate places in the right way.

    The idx tags denote an index entryindexindex entry. These should be placed within the element that they describe. By this we mean that an idx element can be placed within a theorem to refer to just that theorem, or it might be placed within a subsection to refer to that subsection. When you do this, a natural place to place the idx is right after the title and similar metadata. In this way, electronic versions of your work can have an index that is more informative than a traditional index that uses just page numbers, since it will be apparent while reading and using the index just what type of object the entry refers to. (See the end of this Guide in an electronic format for an example, ). Note that the text contained within the idx tags does not actually appear in the articleit only serves to mark the location the index entry points to. You can have several levels of headings by structuring your idx element with up to three h tags (h for heading). Additionally, you can use see or seealso for cross-references within the index.

    See for more details and the finer points of creating index entries.

    A similar device is used to create a list of notation for a technical (mathematical) work. Place a notation element as close as possible to the place where notation is first introduced. If you use the definition tag for your definitions, then this is a very natural place to also introduce notation. Inside of notation use the usage tag to include a short example of the notation in use, wrapped in an m tag and use syntax (as usual). The description tag should contain a very short description in words of what the notation is for. So center of a group would be a good description to accompany the usage Z(G).

    See for more details and the finer points of creating notation entries.

    <webwork/> Exercises exercise

    It is possible to include /PG problems in your source. These can be authored using , included from local PG files, or referenced from a host course. A static version of the exercise will be rendered in your static output formats such as /PDF. A live version will be rendered in HTML output. If the HTML is hosted on a Runestone server, the student's progress completing the live exercises can be tracked. You can also extract the problems into a single archive suitable for uploading into a course. This is a big topic, so see the dedicated for details.

    MyOpenMath Exercises myopenmath exercise

    MyOpenMath is a hosted online homework system with hundreds of thousands of prebuilt questions. These questions can be embedded in PreTeXt using the myopenmath tag. See for details.

    In the web output, the MyOpenMath question will be embedded and interactive though not tied to any student or faculty account. In static output, a static version of the question will be included. Note that there are some limitations on which problems will display correctly in web and static output. See for best practices.

    STACK Exercises STACK exercise

    STACK is an online assessment system, and these exercises can be embedded in a document. STACK is an acronym for System for Teaching and Assessment using a Computer algebra Kernel. See for details.

    <init>URL</init>s and External References URL external referenceexternal referenceURL

    The url tag always requires an href attribute. Usually this will be a complete address for some external web page, or other external resource. The visual attribute is sometimes mandatory, but sometimes optional. It should provide a simplified version of the URL for use in print, or similar situations. Finally, you can provide content for the url element, which will become the clickable text in most realizations.

    If the url element is empty (no content), then the value of the href attribute or the optional visual attribute will be the link text, with a preference for the latter. When you instead provide content, you can use elements much like any other piece of text that would occur in a paragraph. In this case, a visual attribute is now highly recommended, as an alternative to the content, providing information about the actual URL for non-electronic formats like print. A default version of the value of the href attribute will be used in its absence. This visual version of the URL will appear in a trailing parenthetical for print PDF versions.

    See for an example and full details. There is a similar dataurl element for pointing to supporting files, see .

    Video video

    Videosvideo, either author-hosted, via a URL, or hosted on YouTube, may be embedded in a document that is converted to HTML, and may be optionally popped-out to view on another page. For a YouTube video, it is simplicity itself, as an author need only supply the identification string, and all the details of the embedding are handled by . See for details.

    Scientific Units scientific units SI unitsscientific units unitsscientific units

    If you are writing about science or engineering, or even if you are not, there is extensive support for scientific unitsscientific units. So, for example, you could author a force in metric units as

            <quantity>
                <mag>20.7</mag>
                <unit prefix="kilo" base="gram" />
                <unit base="meter" />
                <per  base="second" exp="2" />
            </quantity>
            

    This would be rendered as 20.7. More in .

    Localization localization internationalization

    We are interested in helping authors produce documents with open licenses around the entirety of the world. provides infrastructure for doing so (or internationalization) in accordance with guidelines of the W3C Internationalization (I18n) Activity at W3C (www.w3.org).

    In order to actually adapt to another language (localization), there are two requirements:

    • A file for localization into the desired locale.
    • The author adds an xml:lang attribute on the pretext element.
    See for more details.

    Accessibility accessibility web accessibility

    The Web Accessibility Initiative at W3C (www.w3.org) says:

    The Web is fundamentally designed to work for all people, whatever their hardware, software, language, culture, location, or physical or mental ability. When the Web meets this goal, it is accessible to people with a diverse range of hearing, movement, sight, and cognitive ability.

    Thus the impact of disability is radically changed on the Web because the Web removes barriers to communication and interaction that many people face in the physical world. However, when websites, web technologies, or web tools are badly designed, they can create barriers that exclude people from using the Web.

    Since we are interested in helping authors produce documents with open licenses, and we concentrate on employing open standards for the HTML output we create, we are ideally positioned to help you easily create highly-accessible documents. There are many technical features which happen automatically, and there are some features which we make available for your use as an author and which only an author can provide, or elect to use. Before getting too deep into your project, review for full details and ways you can make the HTML version of your document more accessible, and more useful for a wider audience.

    Slides slides

    In addition to articles and books, support for authoring slideshows is also available, but is experimental (so tags and attributes are subject to change).

    Currently, support for producing Reveal.js and Beamer slideshows is available. Details on authoring may be found in , and publishing details are in .

    Also, future support for annotating books and articles to export slides is in the works, but not yet available.

    Literate Programming literate programming

    If you know what literate programming is, then you may not be surprised to learn that provides excellent support primarily with two additional elements: fragment and fragref.

    If you have never heard of literate programming, it is a way to mix code and documentation for a computer program in a single file. But rather than typographically simple code comments, you have the full power of every other feature in and all of the possible output formats. Furthermore, you can arrange your code in an order that might make more sense to a human (top-down, bottom-up, a mixture, or ) and will rearrange the code into an order that the compiler or interpreter understands.

    So the idea is that from one file you get a program for the compiler, and a beautiful, typeset explanation for a human reader in any format supports. An accessible introduction is Knuth's description of his WEB system for the Pascal programming language , or many more resources are at the literate programming site. Full details on the implementation are at .

    ================================================ FILE: doc/guide/author/processing.xml ================================================ Processing, Tools and Workflow

    This chapter explains in full detail how to convert your source into various output formats, using both the simple -CLI as well as other methods to combine your source file with an XSL stylesheet that might provide greater flexibility and control. It expands on the simple cloud-based workflow in , providing options for a local installation and processing.

    Options for Processing

    There are currently three supported options for converting (processing) your source:

    1. The -CLI: very easy and friendly, but somewhat limited in customization. Requires Python 3.10 or later. Documentation appears in , and throughout the Guide as needed.

    2. The script (sometimes referred to as pretext/pretext): a Python script that has a large variety of utilities to process your source and its components. Requires Python 3.6 or later. This script is very useful for development and for users who prefer a Swiss Army Knife approach to their tools. In rare cases this may be needed to test new features that have not yet been exposed in the -CLI. See .

    3. xsltproc: an executable program that directly converts XML using a specified XSL file. The command-line program is easily available on Linux and MacOS, but harder to install on Windows (using Windows Subsystem for Linux is probably your best bet). Demonstrations of use in this Guide are being phased-out but will be collected in .

    The -CLI, can be installed on the command-line using the command pip install pretext, see . To use options 2 and 3 above, you will need to get a copy of from its GitHub repository. This can be done using the command git clone https://github.com/PreTeXtBook/pretext.git, or by downloading a zip file directly from the repository.

    Wherever the functionality of the -CLI allows it, instructions in this guide will use that method. We will collect corresponding processing instructions using xsltproc in . Information on the use of the script can be found in . These tools are especially useful when developing new features for , so they are housed in the .

    If you prefer to use online, cloud-based tools, all of the processing options are available when using a Github Codespace or similar online platform. If you already use and have a license for CoCalc, it should have all the tools ready to go (although you will likely want to update the CLI).

    The <pretext />-CLI CLI Oscar Levin

    Here we will outline the functionality of the -CLI. Instructions for using the CLI without any local installation can be found in . An easy first step toward getting PreTeXt working locally would be to download VS Code and install the pretext-tools extension (which will install the -CLI for you, assuming you have an appropriate version of python available).

    command-lineterminalconsole We will work at the command-line inside of a terminal or console. If you do not know what this is, it will seem very primitive at first. This will be called a Command Prompt or PowerShell in Windows or a Terminal on a Mac. In Linux it may be known as a console or a shell. Whenever the guide says to enter something on the command line or in a terminal, or just to enter the command, this is what we are talking about.

    Installing <pretext />

    Before you can install locally, make sure you have the following software on your computer, or else install it using instructions easily searched for online.

    • Python, version 3.10 or later. In a terminal, type python --version to ensure you are already set up. On MacOS or Linux, your command for python might be called python3, so also try python3 --version.

    • To use an HTML theme other than the default, you will need Node.js, version 18 or later. You can check if you have it installed by running node --version in your terminal.

    • To produce a pdf, or to generate tikz images from source, you need . Try xelatex --version to see if you already have this.

    • Any text editor. Visual Studio Code is an excellent choice (and has an extension, PreTeXt-tools, with specific language support), but other editors such as SublimeText, atom, emacs, vi, etc. can also be used. See .

    Now we can install . Open a terminal and type the following:

    pip install pretext[all]

    If this fails, try:

    python -m pip install pretext[all]

    (or, if python3 worked above, do python3 -m pip install pretext[all].)

    The python -m helps in case Python is on your PATH but pip is not. This is a useful fix for the rest of the commands listed for the -CLI.

    Including the [all] at the end of the instillation command will install both optional dependencies with the CLI: pelican for generating a static landing page if you wish to deploy multiple targets, and prefigure, to include accessible prefigure graphics. You could install just one of these using pip install pretext[prefigure], for example. If something goes wrong, you can always just include the required dependencies with pip install pretext.

    Newer Linux distributions and MacOS versions may give an error or warning when using pip outside of a virtual environment. It is likely best practice to use a virtual environment, especially if you use python for other projects. Some instructions are available in .

    Alternatively, you can use pipx to install the CLI with pipx install pretext, which will create and manage a virtual environment for you.

    To verify that the CLI is installed, type pretext --version (or python -m pretext --version) and you should get back a number (2.13.5, for example).

    CLI--help For quick hints about what you can do, the CLI has built-in help. You can access this by entering pretext --help or pretext build --help (replacing build with new or view or generate etc.).

    Upgrading

    This documentation will assume you have version 1.0 or later of the CLI. You can upgrade the CLI to the most recent version through PIP using the command:

    pip install pretext --upgrade

    Versions of the CLI starting with 2.12 also allow you to simply run pretext upgrade to get the most recent version.

    If you want to experiment with bleeding-edge features, you can install a nightly development version of the CLI by running:

    pip install pretext --upgrade --pre

    If you ever want to downgrade to previous version, you can do that with pip as well. For example, to install version 2.20.1:

    pip install pretext=="2.20.1"

    If you installed the -CLI before version 1.0, you need to manually uninstall the package pretextbook (which is what the CLI was called during early development). Run pip uninstall pretextbook and then pip install pretext te get caught up.

    Starting a New Project: <c>pretext new</c> new pretext new CLInew

    To generate a new book or article, from the folder in which you want to project located, type:

    pretext new book

    This creates a new book in the folder new-pretext-project (which you can safely rename). For a new article, use pretext new article. You might also try pretext new demo to get a project that shows off more features available, or pretext new course for a collection of course documents. pretext new slideshow will create a new project with a simple slideshow template.

    Inside the new-pretext-project folder, you will find the following folders and files:

  • assets

    A folder to place static (external) assets, such as images or data files, that you will include in your project, for example, with image source="frog.jpg".

  • generated-assets

    A folder that will hold assets (such as images) generated from source, using the pretext build or pretext generate commands. You should not manually edit any contents of this folder.

  • publication

    A folder to hold your publication files used to customize how your output looks. One publication file is included, but you can have as many as you want. See .

  • source

    A folder to hold all your source files. These are the main files you will edit to control the content of your project.

  • project.ptx

    An XML file called the project manifest. This specifies options for converting your source into different target outputs. We will describe the contents of this file in .

  • README.md

    A file that you can use to describe your project.

  • requirements.txt

    A simple text file that contains the version of the CLI that is initially used to build the project. If you upgrade the CLI, you will be warned to also update the version in this file once you know that things build as expected.

  • Once you build your project, you will get a folder called output and possibly one called .cache (which stores cached generated assets). Do not edit the contents of these folders manually; such changes will be overwritten anyway.

    Additional files and folders will be generated if your project is managed by git (for example, if you use GitHub). You can expect to see a file .gitignore and folders .devcontainer and .github.

    Whenever you upgrade your installation of the CLI, you should run pretext update from inside your project folder. Doing so will update any managed files that you have not edited. This can be useful to get the latest features.

    Converting: <c>pretext build</c> build pretext build CLIbuild

    To convert your source into one of the available output formats, say HTML, run the command:

    pretext build web

    Here web is the name of one of the targets in the project manifest (project.ptx). To build different targets, replace it with the name of another target, as in pretext build print.

    You can also build the first (default) target of the manifest by omitting the target: just type pretext build.

    Viewing output: <c>pretext view</c> CLIview view pretext view

    After you convert your source into, say HTML, you can view the output using the command:

    pretext view web

    This will direct you to open a file running in a local server (that the CLI started for you) at a provided address (perhaps ). Once you have run pretext view once, you can navigate to other output targets by navigating to a different url (maybe ) or just rerun the pretext view command with a different target name.

    Running pretext view will attempt to open your default program for the type of file you are opening. You can prevent this attempt using the --no-launch flag.

    Assuming you ran this command in a terminal, the easiest way to continue working is to open a new terminal tab to run pretext build again; the local server will continue in the original terminal until you stop it with CTRL+C.

    When using pretext view, your project is only viewable on your local machine (even if you are working in a Codespace or on CoCalc). To make the output available to the public, you will need to copy the output to a web server, or use the pretext deploy command, described below.

    Hosting your project: <c>pretext deploy</c> hosting CLIdeploy deploy pretext deploy

    When you are ready to share your project with the world, you can copy the contents of the output/web (or whatever you called the output of your html build) to any webserver. A convenient free option is to use GitHub Pages, and the CLI makes this especially easy.

    If you already track your source files using GitHub, all you need to do is enter the following command:

    pretext deploy

    If you watch the terminal, you will either get directions for how to set up your repository, or will simply be told what the live website for your project is.

    Behind the scenes, this command copies the contents of the output folders you want to deploy to a folder output/stage, and then moves the entire contents of that folder to the gh-pages branch of your github repository. If you have not already created a gh-pages branch, the CLI will create one for you. If you have not already set up your repository to track your source files, the CLI will walk you through the steps you need to get set up.

    If you don't have your project set up with GitHub yet, the CLI will try to walk you through the process.

    Sometimes authentication with GitHub can be tricky. Especially on Macs, it appears that conflicts can arise if you use different methods for authenticating in different applications. A fix that seems to work is to open Keychain Access, search for github and delete some or all of the entries you find (GitHub api seems to be a culprit). You will need to reauthenticate then, but after that, it should work.

    You can deploy multiple targets, starting with the 2.0 release of the CLI. To do this, you will need to specify a deploy-dir attribute in your project manifest for each target you want to deploy. Additionally, you should create a folder in the root of your project called site and create a landing page for your project. The site folder and the output folders for each specified project will all be copied to output/stage. We recommend using the flag --stage-only so you can preview you complete site before deploying it.

    Generating assets: <c>pretext generate</c> generate pretext generate CLIgenerate

    Some elements require special processing: exercises, prefigure, latex-image, sageplot, and asymptote images, as well as previews for embedded youtube videos or interactive elements. We call these elements assets or generated assets.

    Prior to version 1.7 of the CLI, you would need to run pretext generate -t [target] (where [target] is the name of a target, like web) in order to generate assets. Since then, you can still do this, but it is usually not necessary: whenever you build a target, the CLI will automatically generate any assets that are out of date. If you want to force the generation of assets, you can use the -g flag when building (e.g., pretext build web -g). If you really don't want to automatically regenerate assets, you can use the --no-generate flag when building (e.g., pretext build web --no-generate).

    If you want to generate assets without building (or if you are using an older version of the CLI), the following instructions can help you limit what you generate.

    • You can limit which sorts of assets you generate. For example, if you edit a few latex-image elements, you can just generate these (for the first target in the manifest) with pretext generate latex-image. To get the same assets for a different target, use the -t flag (e.g., pretext generate -t print prefigure). If you want to generate all assets for a specific target, use the --all-assets flag (e.g., pretext generate -t web --all-assets). This will generate all assets for the specified target, regardless of whether they are out of date or not.

      Valid choices for what types of assets you can generate in this specific way are: webwork, prefigure, latex-image, sageplot, asymptote, interactive, youtube, codelense, and datafile.

    • To be even more precise, if the element you wish to generate has an xml:id, you can generate just that element using the -x flag. For example, if your latex-image has id img-circle, generate it with pretext generate -x img-circle

    • Finally, there might be times you would like to get all output formats for the assets you are generating. You can accomplish this using the --all-formats flag on pretext generate. Different output formats require different asset formats; to get just those formats for a particular target, you can use the -t flag to specify a target name.

    The project manifest: <c>project.ptx</c> project manifest manifest CLIproject manifest project.ptx

    The project manifest, always named project.ptx, contains information about each target you will build. Prior to version 2.0 of the CLI, it also contained the names of executables of external tools that might be needed for building targets and generating assets. (In 2.0 and later, if you need to change the default names or paths to executables, you will use a separate executables.ptx file.)

    The CLI looks for this file, so you should have only one. If you have a project that was not created using pretext new, you can get a copy of the file by running pretext init. You can also get the most recent template version of the manifest by running pretext init --refresh, which will create a new versions of the files (and create a .bak backup version for those you have modified so you can compare then and update accordingly).

    While we use the .ptx extension, the manifest is not technically a document, since it does not agree with the schema. However, it must have a specific structure to be used with the CLI. An example of a simple manifest is given in . Note this is version 2 manifest; for a comparison of legacy manifests and the current format, see .

    Example of a very simple project manifest. ]]>

    The manifest contains a single project element with a ptx-version attribute. This attribute is required and must be set to 2 for the CLI to recognize the file as a valid manifest. Additional optional attributes of project can also be specified, which we will describe below. The project element has a single child, targets, which contains a list of target elements.

    CLItargets Each target must have a name attribute. The name (e.g., web, print) is what you specify when you run build, view, or generate for a specific target (so pretext build web, pretext view web or pretext generate -t web).

    CLIformat The second required attribute of target is format, which must be one of html, pdf, latex, custom, epub, kindle, or braille (although the last three of these are still experimental, as of 9/1/2023).

    With just these attributes, as with the manifest in , the CLI assumes your project uses default values throughout. The following defaults are constructed from the default value for an attribute of the root project element with the default value for an attribute of a particular target element. Each of the two pieces can be overridden. The net default folders are:

    • The source is source/main.ptx.

    • The publication file is publication/publication.ptx.

    • Output is stored in output/ (with each target in a subfolder identical to the target's name).

    • The staging directory to preview deploys is output/stage.

    Again, each of these can be modified using the appropriate attribute of either the root project element or a particular target element.

    In and we give all the attributes you can have on the project and target elements, respectively. Some attributes can be specified for both elements. In such cases, the values will be paths, and the path given in the target's attribute will be relative to the path given in the project's attribute. This can be useful, for example, if all targets have publication files in the same folder, but the files for some targets are different.

    All paths described in are given relative to the root of your project (the location of the project.ptx file).

    Attributes available for the <tag>project</tag> element. AttributeDescription ptx-version

    Required. Must have value 2.

    source

    Optional, default: source. Path to folder holding main source file.

    publication

    Optional, default: publication. Path to folder holding publication file.

    output-dir

    Optional, default: output. Path to folder in which output files/folders for each target will be created.

    site

    Optional, default: site. Path to folder holding user-provided landing page for deploying multiple targets.

    stage

    Optional, default: output/stage. Path to folder where deployable targets will be collected before they are deployed.

    xsl

    Optional, default: xsl. Path to folder holding custom xsl files.

    asy-method

    Optional, default: server. Valid values: server or local. Used to specify whether asymptote images should be generated using the server asymptote version or a local asymptote install.

    generated-cache

    Optional, default: .cache. Path to folder holding cached versions of some generated assets.

    cname

    Optional, default: None. The custom domain you want to use for a deployed target through github pages. Only needed if you set a custom domain.

    Any file paths described in attributes of a target element are relative to a corresponding attribute value from the root project element.

    Attributes available for the <tag>target</tag> elements. AttributeDescription name

    Required. The name you use when executing a CLI command.

    format

    Required. Valid values: html, pdf, latex, epub, kindle, braille, webwork, and custom. The format the target will be built into.

    source

    Optional, default: main.ptx. Path to the root source file of the project (relative to the value of the source of project).

    publication

    Optional, default: publication.ptx. Path to publication file (relative to the value of publication attribute of project).

    output-dir

    Optional, default: the value of name. Path to folder in which output files/folders will be created (relative to the value of output-dir attribute of project).

    output-filename

    Optional, default: generated by pretext. Only valid for formats that produce a single output file. Path to output file to be built (relative to the value of output-dir of the same target element).

    deploy-dir

    Optional, no default. Path to subdirectory of deployed site where this target will live. If deploying multiple targets, then this attribute must have a value for it to be deployed.

    xsl

    Optional, no default. Required when format is custom. Path to custom XSL file (relative to the value of xsl attribute of project).

    latex-engine

    Optional, default: xelatex. Valid values: xelatex, pdflatex, or latex. Only used on targets that build with latex, to specify what latex command to call in that step.

    latex-source

    Optional, default: no. Valid values: yes or no. Only used on pdf format targets. If yes, the LaTeX source file will be included in the output directory. Equivalent to using the --latex flag with pretext build.

    braille-mode

    Optional, default: emboss. Valid values: emboss or electronic. Only used when format is braille, to specify the mode for braille.

    platform

    Optional, no default. Only valid when format is html. Valid values: runestone. Used to specify that the target will be hosted on Runestone.

    compression

    Optional, no default. Only valid when format is webwork or html and platform is not runestone. Valid values: scorm or zip. Results in output being compressed (as .zip file), and if the value is scorm, the required scorm manifest is also include in the archive.

    asy-method

    Optional, default: server. Valid values: server or local. Overrides the asy-method attribute on project.

    standalone

    Optional, default: no. Valid values: yes or no. If yes, the target will be built as a standalone document. This will place the output adjacent to the source file, unless output-dir is specified. Useful for creating a target for which you will specify a different source file (using the -i flag when building).

    Example Project Manifest

    To illustrate how the relative paths work, with attributes on both project and targets elements, consider the following manifest:

    ]]>

    Here, the web target, with format html, will build from the root file "src/main.ptx", using the publication file "publication/publication.ptx", and will place the output in the folder "out/web".

    The print target, with format pdf, will build from the file "src/main-print.ptx", using the publication file "publication/pub/publication.ptx", and will place the output in the folder "out/print".

    stringparam CLIstringparam xmlid-root CLIxmlid-root In addition to the attributes available for target elements, there is one optional child element, stringparams, which can be used to specify string parameter options (see ). These are specified using an attribute for the name of the string parameter, and the value of the attribute is the value of the string parameter. Multiple string parameters are set using multiple attributes on the single stringparams element. For example, <stringparams author.tools="yes" html.css.extra="external/custom-style.css" />

    Executables CLIexecutables

    uses several external tools to build and generate assets. The CLI will automatically find these tools if they are installed in the default location for your operating system. If you have installed them in a non-standard location, you can specify the path to the executable in a executables.ptx file, at the root of your project. In we give the defaults and formatting of such a file.

    Example of version 2 executables file ]]>

    Prior to version 2 of the CLI, these executables were contained in the project.ptx file. If you are using a version prior to 2.0, see .

    Using <pretext /> outside of a project standalone files

    Most of the time you will want to set up a project folder that will hold all the files you need for your project, including the project.ptx and publication.ptx configuration files, your possibly modular source files, and external assets. However, it is also possible to use to process a single file, similar to how you might with . Starting with the CLI version 2.19.0, this can be done easily.

    Suppose a colleague sends you a file mypaper.ptx which you save to your ~/Desktop folder. You can process this file using the following command.

    pretext build pdf -i ~/Desktop/mypaper.ptx

    This will create a mypaper.pdf file in the ~/Desktop folder (i.e., adjacent to the source .ptx file).

    You can also get portable HTML output using pretext build html -i ~/Desktop/mypaper.ptx, which will create a folder mypaper_html in the ~/Desktop folder. Note that often a portable HTML build will result in a single .html file, so this can easily be shared with others or uploaded to a web server.

    Getting help

    CLI-v debug In addition to checking pretext --help, pretext build --help, pretext view --help, etc, you have a few options when you run into trouble. If you are getting errors that don't make sense, even after trying follow the suggestion of the error messages, look at the time-stamped log files inside the logs folder (or the cli.log file if you are using a CLI version prior to 2.0), which includes debug-level log messages. You can also run the CLI using this higher level of verbosity using the -v debug option, which must go right after pretext command, before the subcommands (build, deploy, etc.). That is, enter the following for example,

    pretext -v debug build web

    pretext support CLIsupport You can also ask for help on the google support group. When you post there, please run pretext support from inside your project's folder and copy the output into your help request.

    Modular Source Files modular source files including filesmodular source files

    For a large project, such as a book, you will likely want to split up your source into logical units, such as chapters and sections. The -CLI supports an inclusion mechanism automatically (see for what you need to do different for xsltproc).

    Suppose your book on animals has a chapter on mammals with a section on monkeys. Then you need to do the following:

    1. For the file containing the chapter tag for the chapter on mammals, place the attribute xmlns:xi="http://www.w3.org/2001/XInclude" on the outermost tag in the file.

    2. Within the chapter element for the chapter on mammals, add the line <xi:include href="monkeys.xml" /> to pull in the section on monkeys at that location. The href attribute can point to a file in a subdirectory, but will be interpreted relative to the location of the file containing the mammal chapter element.

    Several comments are in order.

    • Begin small and start a project without using modular files. Modularizing seems to add a layer of complexity that sometimes obscures other beginner's errors. So get comfortable with a single source file before branching out.

    • The XML specification requires that a source file only contain a single outermost element. So for example, two chapter elements cannot go into the same file as simultaneous outermost elements.

    • There will always be a main file that contains the pretext element as its single outermost element. In this Guide we will call this the top-level file.top-level file
    • Any file that uses an xi:include element will need the xml:ns declaration on the outermost element. So in our animal book example, the top-level file, which presumably includes several chapter files, would need this declaration on the pretext element.

    • In practice, there is not a lot to be gained by creating a subdirectory structure mirroring your modularizationall your source files can go into one big directory and the XML hierarchy will take care of the organization. I do sometimes like to name my files accordingly, so for example chapter-mammals.xml and section-monkeys.xml.

    • When you validate your source (see and ) you will always point to the top-level source file (the one with the pretext tags).

    The book generated by pretext new demo has modular source, so is a nice starting point to see how this works. Other examples are the sample book in examples/sample-book amply demonstrates different ways to modularize parts of a project (but in no way should be taken as best practice in this regard). This guide, in doc/author-guide is a simple example of modular source files, and might be a good template to follow for your book. See for some of the finer points of this topic.

    Verifying your Source

    A schemaschema, in our case a RELAX-NG schema, is a formal specification of an XML vocabularyschemaXML vocabularyXML vocabulary (the allowed tags and attributes), and how they relate to each other. So, for example, the restrictions that say you cannot nest a book inside of a chapter, nor can you nest a subsection in a chapter without an intervening section, are expressed and enforced by the schema. One of the beauties of the schema is that it is written using a very specific syntax and then there are tools that use a schema as input. In particular, a source file that conforms to the schema is said to be validvalid schema. You should strive to always, always, always have valid source files, and therefore you want to regularly verify that this is the case.

    You can find the schema in the schema folder of the GitHub repository. The version we author and maintain is pretext.xml, which is used to create pretext.rnc, which uses the compact syntax of the RELAX-NG specification. By providing the schema and your source to a program called a validatorvalidator you can check if your source is valid, and if not, why. See for the details on doing this.

    The -CLI also has some basic validating capability: after running pretext build, open the .error_schema.log file in the main folder of your project to see validation errors.

    If you author source that is valid , then a conversion of your source to another format should succeed. And maybe in the future, somebody will create a new conversion to a new output format, and your source should still produce faithful output, with no extra effort from you. Think of the schema as a contract between authors of source files and developers of converters. This is different than performing a conversion and getting good-looking outputthat can just be a happy accident and your source may not succeed with some other conversion.

    We cannot stress enough the importance of setting up and performing regular validation and preventing many consistent errors of the same type. You will learn what elements are allowed where, and which are not, from the messages produced by validation errors. And when a conversion fails, or produces spectacularly incorrect output, validating your source should be your first reaction. Always.

    The other beauty of a schema is that you can supply it to a text editor () and then you will get context-sensitive help that greatly assists you in using only the tags and attributes that are allowed in a given location of your source. XML Copy Editor is the one editor like this we have tried, but we do not have extensive experience.

    We have devoted an entire chapter () to amplifying this introduction and providing more details, such as where to find details on installing a validator.

    Customizations

    There are some aspects of your output that are entirely divorced from the actual content, and are presumably all about how that content is presented. Two good examples are the size of the font used in /PDF/print output, and the granularity of web pages in HTML output (by this we mean, is each web page a whole chapter, a whole section, a whole subsection?). Producing output with varying values of these parameters does absolutely nothing to change your content in any way, and so should not be a part of your writing, nor a concern while you concentrating on your writing.

    Therefore, many aspects of how your writing is presented is accomplished by your publisher. Note that this is very different from your role as the author of your project. When your project is mature then you can consult with your publisher about how to best present your project to your audience. An entire part of this guide is devoted to this process (), but if you are curious, the first part of can serve as an introduction.

    Directory Management

    Organizing your source files, external assets (like images) and other support files, can become a challenge as your project grows. supports managing external and generated files (including images), but this requires some setup and understanding of the correct way to specify assets in your source. This section explains both those steps.

    If you are starting a new project, using the -CLI (with the command pretext new book, for example), then most of the setup portion is done for you.

    External and Generated Files

    Early in your writing project, you will decide you want to add images, embedded YouTube videos, interactive demonstrations, or other enhancements that are more than just words on the page. Some of these objects will be created outside of your project, such as a photograph. But some images are described within your project, such as a diagram authored using the TikZ package, and will help generate different versions of the diagram in different file formats for use in output formats that are not . For an embedded YouTube video we provide tools that will automatically get you a thumbnail preview image from a YouTube server, which will then appear in your non-interactive PDF version. We describe the photograph as external, since it comes from somewhere else, independent of anything you authored in your source. In contrast, an SVG image of your TikZ diagram for HTML output, and a preview image of a YouTube video for use in a print version, are described as generated since they are dependent on what you have put in your source, and automates almost all of their creation for you.

    As these files are added to your project, you want to organize them in a specific (but flexible) way. First, make a directory (folder) for your external files. You can use any name you like, including external. Within reason you can place it wherever you want. Natural choices are as a peer of a source directory that holds your files, or as a subdirectory of your project's top-level directory that may hold all your files. You can also organize this directory with subdirectories of your own choice, if that helps you stay organized.

    Similarly, you need a separate directory for your generated files. As above, it can be named anything, including generated, and you can place it almost anywhere (close by). But now, it must have a precise directory structure, described below in , according to what sort of generation produced the files.

    After you have read this section, see the discussion of generated and external files in for some good examples of why this flexibility is useful.

    Managing Directories

    The name, and location of the external and generated directories (both of them, always) are then specified in a publication file (see for the precise specification). The values of these attributes are relative pathnames to the directories, relative to the location of the main file for your project. Let us take a look at an example.

    Sample Directory Management

    Suppose you are M.Jones, the author of the AOTA project, and so you might have the following directory and file structure. There is some sort of overall path from the root of your entire filesystem to your project, so on Linux this path could be /home/mjones/books/ and on other operating systems it will be slightly different, but those differences are not relevant here. Inside of books there would be an aota directory for the AOTA project, structured as follows. We are most interested in the ext and gen directories. aota source aota.ptx alligators.ptx dogs.ptx publication print.ptx online.ptx epub.ptx ext photos slow-alligator.jpeg fast-whippet.png movies alligator-chases-whippet.mp4 data deer-weights.csv gen latex-image marsupial-life-cycle.svg youtube sloth.jpg

    In your publication files you would then have the entry, as a sub-element of the source element, <directories external="../ext" generated="../gen"/> Notice that we have deliberately named our directories ext and gen as part of this illustration, so that they are not identical to the attribute names on the directories element. The two attribute values are relative to the location of the main file, in this case aota.ptx. The two periods, .., mean to go up a level, here to the aota directory, then the slash indicates a step down to either gen or ext. Note that latex-image and youtube within gen must be specified exactly that way. Now every production tool can deduce where your files are.

    How do you specify in your source which file to use where? Suppose you want your two (external) photographs to be used in a sidebyside element. You would author <sidebyside widths="50% 30%"> <image source="photos/slow-alligator.jpeg"/> <image source="photos/fast-whippet.jpeg"/> <sidebyside/> Notice that the values of your source attributes do not include ext or ../ext. This gives you the freedom to move your ext directory or rename it, and then you only change the publication file and not your source. The decision to have the subdirectories photos and movies are not easily changed, since they will be in your source, but they may have value for the organization of your project.

    The chase video is of your own creation, you have included it as part of your project's files, and will be hosting it on your web server, where the rest of your HTML version is made available for viewing. You might author <figure xml:id="fig-chase"> <caption>Alligator chases whippet</caption> <video source="movies/alligator-chases-whippet.mp4"/> <figure/>

    The situation with the generated files is presently a bit more complicated, but will eventually be transparent to an author. The marsupial life cycle diagram has been authored in your source using the language from the TikZ package, which is delimited as a latex-image element. When building a PDF from output this is a no-brainer just puts your TikZ code into the file. But how about HTML output? The pretext/pretext script will manufacture a standalone version of this image and then convert it to an SVG, and this version will work very well in the online version of your project. What do you author? <figure xml:id="fig-life-cycle"> <caption>Marsupial Life Cycle</caption> <latex-image xml:id="marsupial-life-cycle"> -- some TiKZ code here -- </latex-image> <figure/> With the right options to the pretext/pretext script, the file marsupial-life-cycle.svg will be generated. Presently, you must explicitly tell the script to place the output in the directory /home/mjones/books/gen/latex-image but we plan to make this the default behavior. Or you could generate the file anywhere, and move it to the latex-image subdirectory of gen. Notice how much of the process of creating a companion SVG image (which excels in a web browser) is automated, and how the xml:id attribute and the directories in the publication file are used to keep everything coordinated. The latex-image directory is not negotiable, it is the home for every image authored using a latex-image element (see ).

    The slow sloth video was created by somebody else and posted to YouTube as a super slo-mo 240fps video. You authored it within a figure simply by using the ID of the video on YouTube. <figure xml:id="fig-sloth"> <caption>Slow Sloth</caption> <video xml:id="sloth" youtube="DJWEqYcxUl8"/> <figure/> With the right options to the pretext/pretext script, the file sloth.jpg will be generated by requesting a thumbnail preview from YouTube's servers. Note how this content is generated from your source (precisely, the YouTube ID) through an automated process. Presently, you must explicitly tell the script to place the output in the directory /home/mjones/books/gen/youtube but we plan to make this the default behavior. The youtube directory is not negotiable, it is the home for every server-generated preview image for an embedded YouTube video (see ). (Note that any video may have an author-provided image as its preview, and then this would be considered an external file.)

    As you can tell from the above, different output formats have different expectations for additional files and when producing an output, there may be different expectations for where exactly where to find files. A good example is the EPUB format, which despite being basically an HTML format, is still very rigorous about names, formats, and locations for image files. With the above procedures you provide just enough information for to handle the remainder of the complexity for you, without you becoming an expert with the EPUB standard. So the pretext/pretext script can automatically produce PDF, HTML, EPUB, Kindle, and braille, each in a single step.

    We have skirted one finer point of all this. How does an author know if a file is external or generated and what are the supported subdirectories of the generated directory? A source attribute will almost always point to a file that belongs in the external directory. An exception is the preview attribute which is used to specify static images to use in outputs like PDF or print to represent more dynamic objects employed in more-capable electronic formats (videos, audio, interactives). (Please alert us to other exceptions!) The list below describes the subdirectories of the generated directory. The files that belong in these directories are all generated by the pretext/pretext script using aspects of your authored source.

    Subdirectories of the Generated Directory
  • <c>asymptote</c>

    Images described by Asymptote code in an asymptote element.

  • <c>dynamic_subs</c>

    XML files needed for dynamic fill-in-the-blank exercises.

  • <c>latex-image</c>

    Images described by code in a latex-image element.

  • <c>mermaid</c>

    Images described by Mermaid code in a mermaid element.

  • <c>prefigure</c>

    Images described by PreFigure code in a prefigure element.

  • <c>preview</c>

    Static images of dynamic content, created with automatic screenshots via a headless web server.

  • <c>problems</c>

    MyOpenMath problems in static forms.

  • <c>qrcodes</c>

    QR codes for PDF files that point to live versions of some interactive elements.

  • <c>sageplot</c>

    Images described by Sage code in a sageplot element.

  • <c>trace</c>

    Program trace data for codelens elements

  • <c>youtube</c>

    Static images for YouTube videos, automatically downloaded from YouTube servers.

  • Just one more obscure situation to address, requiring a peek under the hood. Occasionally there are external files used in ways that cannot see them and provide the management necessary. One example is a file of data points used to generate a plot using the latex-image element. Suppose we have a file /home/mjones/books/ext/data/deer-weights.csv as shown in . We will use this inside of a latex-image element employing PGF code with a table {}; construction. As part of building the output, this file will be copied to a temporary directory as external/data/deer-weights.csv Note that your ext has been converted to external as files are copiedthat is not a typo. is not going to examine all your code and try to guess where you have requested a file. So you need to author \addplot table {external/data/deer-weights.csv}; using the filename created after the copy. Then the compilation will locate the file successfully. The external directory after the file copy is not negotiable, that is what is always used.

    Backward-Compatibility and Migration

    Directory management was added in the middle of 2021. For projects existing at that time, it is an opt-in feature. In other words, existing projects can still be built by moving additional files in the same ways as always, so long as you do not have a directories element in your publication file.

    However, it is absolutely necessary to opt-in to directory management (via the publication file) if you want to build EPUB or Kindle formats. You will also then be able to build PDF and HTML output with a single invocation of the pretext/pretext script, without any extra effort to place additional files in the right places.

    New projects should definitely adopt directory management as their project develops. New features and tools will assume this. We now describe how existing projects can migrate.

    Previously there was not a firm distinction between external and generated files, though they were specified differently in source. Many authors placed both types of files into a single directory, and since the default for locating generated files was a directory called images, this was often the single directory employed. Thus, external files would be specified with a source attribute such as <image source="images/bobcat.jpg"/> A solution, if a bit clunky, is to make a new directory named ext and copy images and its contents to become a subdirectory of ext. Then place a relative path to ext in the external attribute in your publication file. This means you will not have to edit your source at all. At some later time, you could remove all references to images in your source and move the files themselves directly into ext.

    For generated files it will be a bit more involved. You need a new directory, such as gen, and you need to add it to your publication file with the right relative path. Then you will need to create as many of the relevant directories from as necessary, as subdirectories of gen. Populate these subdirectories with the relevant files, which may have been located in images before you started migrating. There was a string parameter, directory.images, that could be used to specify an alternative directory to the default, images. That parameter is now announced as deprecated, but will still be effective until your project opts-in.

    As another short-term option for Mac or Linux users, it is possible to take previously existing resource directories and make symbolic links from a previous image directory, such as my_images, to the names provided here. In that case, assuming the directory structure provided here, a command like ln -s my_images external (issued in the directory containing my_images) would create the correct symbolic link.

    Creating Images with Inkscape Inkscape vector graphicsInkscape

    A strength of is the ability to create diagrams and images with editable source code, embedded alongside your other source material (, ). But sometimes you want, or need, to be more artistic. Inkscape is a great tool for creating images. It ticks all the boxes: open source, mature, cross-platform, standards-compliant. Bethany Llewellyn helped research Inkscape capabilities for this section.

    Inkscape's native file format is Scalable Vector Graphics (SVG). As the name suggests, this translates into excellent support for vector graphics. (See and for the distinction.) Why use Inkscape?

    • SVG files are small and scale smoothly when you zoom in on a web page. So this format is our top choice for how images are realized in the HTML output. They will also work well in formats based on HTML, such as EPUB.
    • The SVG format is how Inkscape works with images internally. The file format it calls Inkscape SVG is valid SVG, along with additional information to make editing better and/or easier. So any author may come back and easily edit an image saved in this format.
    • Inkscape will export easily and efficiently to Portable Document Format (PDF), another vector format. This is our top choice for realizing images in output, which will become print or PDF output.
    • SVG is an XML format, just like .

    When would you use Inkscape?

    • Your image is more free-form and artistic than what a source language like TikZ or Asymptote will provide, and you do not need to embed any mathematical symbols.
    • You do not want to learn some new source language (there is a significant learning curve for most of these).
    • You want to annotate screenshots (see ).

    Note that when you save an image as SVG from within Inkscape, you have two choices: Plain SVG and Inkscape SVG. The latter contains additions to the former which make subsequent editing better and/or easier. So, you can choose to use Plain as the format used for your HTML output, and it will be smaller and provide great performance. But you can also make an Inkscape version of the same name, and distribute it with your source files in a different directory, so you and others can edit it easily later.

    Annotated Screenshot

    Suppose you want to include a screenshot of some application, and point out some aspect of it.

    1. View the application on the highest-resolution monitor you can get your hands on. Not a laptop and not a phone.
    2. Zoom in, so the area of interest fills as much of the screen as possible. You are trying to capture as many pixels as possible.
    3. Use a screen-capture tool that allows you to save the result as Portable Network Graphics (PNG). This is a lossless format, and you may be able to elect a high level of compression as part of the file-saving process.
    4. The only raster format explicitly supported by Inkscape is PNG. So you can import the screenshot into Inkscape, and use the tools there to add arrows, red ovals, etc. to highlight key parts of the image.
    5. Save the result as PNG, since it already has a significant raster component, for use in HTML conversions. And save again as PDF for use in print and PDF output.
    Images Described in Source

    We believe it is important to preserve a record of how diagrams and other graphics are produced. This can be easy when a graphics language is employed to describe the graphical elements, rather than creating a bit-mapped image with some other interface. So we have asymptote, latex-image, and sageplot for elements holding code to produce diagrams or imagesimage.

    The upside to this is that small edits to the code can easily accomplish minor changes or corrections necessary for the images. The macros provided by an author can be used in the text and in a diagram, leading to greater consistency between the two. Finally, starting from source, we can do the best possible job of producing image formats that are compatible with the document output formats and which scale smoothly in PDFs and in web browsers.

    The downside is that processing these images requires various helper programs, such as pdflatex and sage. This requires installing the helper program and perhaps setting the path to it on your system. This is done inside the project.ptx manifest as children as the executables element.

    Whenever you need to process images described in your source, run pretext generate. This will build the correct image output file for your specified target (use -t [target]). If you would like to build additional image formats, you can add --all-formats to the command.

    Author Tools author tools

    While your writing project is getting underway, you may want to go in several directions at once. We have two devices, and three reports, which can help you manage this.

    You may want to make a forward-reference to some future, not-yet-written material. So you can go <xref provisional="a reminder of future material"/> in your source. In your output, you will get a temporary place-holder of sorts.

    Comments in the source code of a computer program, labeled TODO, is a common device to help a programmer remember tasks that need to be completed. You can use a similar device in your source. Use an XML comment, delimited by <!-- and -->, and make the first four non-blank characters spell todo, using any combination of lower- and upper-case you like. Your Author's Report (next) will look even better if you follow that with a colon and a space, but this is not required. So, for example, go <!-- ToDo: include a section on salamanders and their life-cycle --> As an XML comment, you can place this anywhere. Contents need to be plain characters, no XML will be active here. Remember to escape the two XML characters, and also be aware that -- is banned in comments outside of the delimiters.

    Use the author.toolsauthor.tools parameter set equal to yes and your and HTML output will be annotated. (See for more on parameters.) Provisional cross-references and todo-comments will be visible and highlighted, and in particular, the output will display an abundance of extra information (maybe too much). The -specific publication file entry for draft mode will activate the draft option (see ). The intent here is to make a rough draft, for an author or collaborator only, reporting as much as possible that is incomplete, pending, or hidden, in the usual output.

    For users of xsltproc, the authors-report.xsl stylesheet, found in the xsl/utilities directory, will report all of the provisional cross-references and all of the properly prefixed todo-comments. See .

    Keeping Your Source Up-to-Date

    Once in a while it becomes necessary to adjust how the vocabulary is arranged, which involves adding or removing elements or attributes, or changing their behavior. When elements or attributes are removed, or their relationships with other elements change, we say that certain items or behaviors are deprecateddeprecated. Fortunately, we can often automate the changes.

    When there is a deprecation, a warning is added so that any conversion will report the presence of the old use in the console. Sometimes we can preserve the old behavior, so there is no rush to make changes to your source. Sometimes a change needs to be more urgent. And frequently old behaviors do not get updates or bug-fixes. Our warnings provide advice and information about what you need to do. There are also announcements on public discussion groups, clearly marked as deprecations. Also, the schema will change as part of any deprecation, so the old elements or old use will be reported.

    For some suggestions about how to automate the process of adjusting your source, see .

    Testing <init>HTML</init> Output Locally

    Certain complicated parts of HTML output will not always function when you look at output by just opening files in your web browser. These include knowls, Sage cells, and YouTube videos. This is a consequence of security policies and so will vary from browser to browser. A solution is to run a web server on your own machine, which is much easier than it sounds.

    In fact, this is exactly what the -CLI does when you type the following command.

    pretext view web

    You can replace web with any target name, although it is really HTML builds that benefit from this feature. The CLI uses python to spin up a local web server so you can see a copy of your output by going to the URL the CLI gives as output (usually , although if you are working in a GitHub codespace, this will be different).

    There are two useful options that can be used with pretext view to speed up authoring. First, the -b flag will build your source before starting the server (i.e., runs pretext build in the background). Similarly, the -g flag will generate assets prior to viewing.

    It is also possible to specify whether your server is public or private (on your local network) with the -a option, and to specify a port other than 8128 with the -p option. (Run pretext view --help for more.)

    Another option, in the case where you know where your output lives (such as when you use the pretext/pretext script) is to use Python itself to start a simple web server. Ideally, first set your working directory to the location of your HTML output. Then in a console, at a command-line:

    python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

    Which tells you to open your browser using the address http://0.0.0.0:8000/. Ctrl-C in the terminal will kill the server when you are done. See the Python documentation for more options.

    Testing <init>HTML</init> Output Globally

    Just like testing files locally can sometimes be misleading, testing on your own server can sometimes be misleading. For example, on some university campuses, frequently accessed content (your textbook!) can be cached. So when you update your files, it might not look like anything has changed. An easy, free, quick solution is to place your HTML temporarily at Netlify Drop as a double-check on the source of any problems.

    This can also be a great solution if you do not have a server setup and want help from the community with your HTML output. (See .)

    Doctesting Sage Code

    Adding computer code to your textbook is a tricky proposition. You can propose that it is merely an illustration, and not meant to have all the necessary details, or you can make it exact, correct and executable, and then risk inevitable changes to render your code obsolete. At least you have the option of editing and reposting online versions quickly and easily.

    One of our main motivations for this project was mixing in code from the powerful, open source, mathematical software project, Sage (). When you add example Sage code to illustrate mathematical ideas, you are then encouraged to also include expected output in the output element. Here comes one of the powerful advantages of XML source and XSL processing.

    This process currently requires xsltproc, and is described in .

    The pretext/xsl/pretext-sage-doctest.xsl stylesheet, used in the usual way, will create one, or several file(s), in exactly the format Sage expects for automated testing. So all your words are gone, and all your Sage input and output is packaged so Sage can run all the input and compare the results to the expected output. See for details on obtaining more than one file.

    We have many years' experience testing hundreds of non-trivial Sage examples from textbooks, for linear algebra and abstract algebra. Roughly every six months, we discover ten to twenty examples that fail. Frequently the failures are trivial (usually output gets re-ordered), but some are significant changes in behavior that leads us to re-word surrounding guidance in the text, and in a few cases the failures have exposed bugs introduced into Sage. It has been relatively easy to do this maintenance on a regular basis, and if it had not been done, the accumulated errors would be enough to greatly degrade confidence in the accuracy of the examples.

    Exact details for this process can be found in . Note that Sage is really just a huge Python library, so it might be possible to test pure Python code with this facility, but we have not tested this at all. Similar support for other languages can be considered if requested for use in a serious project.

    ================================================ FILE: doc/guide/author/schema.xml ================================================ <pretext /> Vocabulary Specification

    This Guide, along with the sample article and sample book distributed with the source, provide a wealth of examples of how to author in . However, at some point, you will undoubtedly encounter a situation where some of your text fails to appear in your output or the -CLI produces an error. Those are good moments to start investigating the formal specifications of the vocabulary, as most likely you tried to use something in a way incompatible with those specifications. This chapter will help you understand, and work with, the formal specification of .

    <acro>RELAX-NG</acro> Schema

    A schemaschema is a set of patterns which describe how the elements of a language may be combined. The vocabulary is described by a RELAX-NG schema, which is included in the distribution. (RELAX-NGRELAX-NG stands for REgular LAnguage for XML Next Generation and is pronounced relaxing.) In general terms, the schema tells you which elements are available, which attributes they may carry, and which other elements they may contain. You can then infer where you can place an element. The schema also indicates if an element is required or optional, if it may be repeated, or if it needs to appear in a prescribed order with other elements, and may limit attribute values.

    Besides providing a concise formal description of the vocabulary, your XML source and the RELAX-NG schema can be provided to tools which will automatically validate your source against the formal definition. The best validatorsvalidator will provide accurate and helpful messages about errors in your source. Further, some editing tools will use a schema to provide context-sensitive assistance on available elements and attributes as you write, sparing you typographical errors, misplaced elements, and the need to frequently context-switch in order to consult reference material.

    The schema does not tell you anything about how an element or attribute will behave. But hopefully there is not much ambiguity about the behavior of the content of a title element nested within a chapter element. You would not be surprised to see that content duplicated in the Table of Contents of a book. The purpose of this guide, and other documentation, is to help you understand what to expect. It is better to think of the schema as a contract between you and the developers of conversion tools. If your source conforms to the schema, then a conversion tool will produce reasonable output that conveys the structure and meaning of your writing. Twenty years from now, when GEFF is the dominant document format, a conversion of your source will preserve your meaning, while also taking advantage of the amazing features of GEFF. (GEFF stands for Great Electronic Format of the Future.)

    In summary, the RELAX-NG schema

    • is the formal specification of the vocabulary,
    • is a key input to validation,
    • can be incredibly helpful in the editing process, and
    • provides guidance to implementors of conversions.
    As such, we are very deliberate about changes, and hope over time to make changes only very rarely.

    Validation Plus validationadditional

    The RELAX-NG schema is very good at specifying parent-child relationships, in other words, which elements can nest directly under/within other elements. But we have situations where the possible elements depend on grandparents, great-grandparents, or older ancestors. An example is the var element, which is only useful if it is contained somewhere within a webwork element. You can describe these situations with RELAX-NG, but it becomes cumbersome and redundant. So our strategy is to allow some prohibited situations in the RELAX-NG schema, and use an additional stylesheet to identify the prohibited situations. Continuing our example, the RELAX-NG schema makes it appear that var can be used many places, but the validation-plus stylesheet provides a helpful message indicating you have used it outside the context of a problem.

    You have put a lot of time and effort into your source, and we want to help you make the best possible output. A little more effort from you will allow us to make the fine distinctions that produce really high-quality output. So this stylesheet is our best attempt to help you make the very best possible source. It is full of (automated) advice and warnings.

    To use this stylesheet, simply apply it at the command-line with xsltproc like any other stylesheet. xsltproc -xinclude -o report.txt schema/pretext-validation-plus.xsl aota/animals.xml The output will be a text file that indicates the suspect element by its location in the document tree.

    You may get lots of output on first use, especially if your source was born somewhere else, not meant for use by . We could make improvements in managing all this output, but for now we have one suggestion. Sorting on the actual messages realyed, rather than a hodgepodge of messages in document order, can help you identify consistent situations that you might be able to fix in bulk. First, apply the stylesheet again, but now use the stringparam single.line.output set to the value yes (). As you suspect, this will put all the output on one line, and the message text will be in the third field, which can be used by the command-line utility sort, cat report.txt | sort -k 3 > report-sorted.txt

    We once used Schematron for this purpose. Its author, Rick Jelliffe, says Schematron is a feather duster to reach the corners that other schema languages cannot reach. Our additional stylesheet is similar.

    Why do we have two tools for validation? We have explained the necessity of an extra stylesheet. Why not describe the entire grammar in this stylesheet? The reason is that RELAX-NG is a recognized standard, and so can be converted to other formats, and may also be utilized by XML editors or integrated development environments (IDE) to provide features like code completion. Besides, it would be very tedious to provide all the code for checking everything that is possible and everything that is not.

    Versions of the Schema literate programming

    The schema is born within a document, schema/pretext.xml, where surrounding text provides documentation and guidance on implementation. The literate programming support in (start at ) is used to produce a file, schema/pretext.rnc, which is a RELAX-NG specification in compact syntax. HTML and PDF versions are available on the website as documentation. We provide some guidance below on reading the compact syntax.

    The compact syntax is a faithful representation of the more verbose XML syntax. And vice-versa, so it is possible to translate back-and-forth between the two syntaxes. In practice, we convert the compact version to the XML version, producing a file schema/pretext.rng. Some tools require this latter (100% equivalent) version. We perform this conversion with trangtrang, an open source program written by James Clark, one of the authors of RELAX-NG. (trang stands for TRAnslator for relax NG.) The compact syntax is often indicated as RNC and the XML syntax is often indicated as RNG.

    XSDXSD (XML Schema Definition), from the World Wide Web Consortium (W3C), is an alternative to the RELAX-NG syntax. It cannot express as many situations as the RELAX-NG syntax, but we have created the schema in a way that trang can convert to an XSD specification without introducing any more-permissive approximations. But the XSD version seems to have a few small inaccuracies, and in particular should not be used for validation. That said, schema/pretext.xsd may be useful for tools ( editors) that require it.

    The files pretext.xml, pretext.rnc, pretext.rng, and pretext.xsd are all provided in the schema directory under revision control, and are updated by the schema/build.sh script when changes are made to pretext.xml. So as an author, you do not need to install or run trang and should just link to the (continually updated) copies in your pretext directory.

    We once provided a document type definitiondocument type definition (DTDDTDdocument type definition) as a description of the vocabulary. Mitch Keller wrote an excellent initial version of this chapter to help others understand similar principles in the context of the DTD. However, the DTD was not sufficiently flexible to handle elements that behave differently in different locations, such as an introduction to a chapter versus an introduction to an exercisegroup. As further evidence, trang will knowingly refuse to convert the schema to a DTD since the DTD syntax is not sufficiently expressive to describe .

    If you are interested in conversions, more tools can be found at and we have information on installation in . We would be pleased to learn more about authors' experiences with other converters.

    Reading <acro>RELAX-NG</acro> Compact Syntax

    The compact syntax might remind you of Java or C++ syntax. We do not provide a tutorial here, but do provide some hints on the various delimiters and special symbols, which may make it fairly easy to see your way through to the meaning. The fundamental object of the schema is a patternpattern, and named patternsnamed patternpatternnamed pattern can be reused in order to reuse common patternscommon patternpatterncommon pattern and modularize the description. One approach to validation is to remove portions of your source that match required patterns until only optional material remains. Notice that if you were to chase your way through substituting the named patterns with their employment, you would have a single (large) pattern which every possible document would match, and by definition an XML document that does not match is not . (OK, that is a slight exaggeration, see .)

    <acro>RELAX-NG</acro> Compact Syntax Summary element foo { } Define foo and children attribute bar { } Define bar and values text Sequence of characters (any length) mixed { } Mixed-content, characters interleaved in pattern Exactly one (required) + One or more (required) * Zero or more (optional) ? Zero or one (optional) , Sequence, in prescribed order | Choice & Sequence, any order ( ) Grouping = Define named pattern |= Accumulate named pattern as a choice
    Validation

    We cannot stress enough the importance of validatingvalid schema your source early and frequently. Error conditions and messages can be built into processing (we have some anyway), but they are much better accommodated by tools built for just this purpose. If your processing with the -CLI suddenly fails, or if chunks of your content fail to materialize, it is highly likely that a validation check will tell you where the problem lies. If you integrate regular checks into your workflow, then sudden problems can be traced to recent changes. (Perhaps paired with using git bisect, in the extreme. You are using revision control, aren't you?)

    We use jingjing for the first step, RELAX-NG validation. This is an open source companion to the trang converter described above. As a Java program, it should be cross-platform. It is also packaged for Debian and Ubuntu Linux, and is available in a GitHub codespace. It provides messages keyed to the line number and character number of your source, and the messages are very clear and informative. See notes on installation in . We would be pleased to learn more about authors' experiences with other validators.

    You might get a lot of error messages the first time you use jing. If so, it might be that many of them are the same situation. If you pipe the output of jing through sort -k 2 then the output will group similar messages together.

    Previously, we used xsltproc as the XSLT processor. We no longer recommend this option for authors, who should be using the -CLI. However, if you still use xsltproc, then you likely automatically also have the xmllintxmllint program, which will perform validation with RELAX-NG schema. Our experience is that it bails out at the first warning, or at least does not process the remainder of the current subtree, and that the error messages are often very misleading. We will not support questions about validation based on output from xmllint.

    The second step is easier, since it is an XSL transform. In other words, it is just another stylesheet, which you run against your source, with a processor like xsltproc. This stylesheet encoding additional restrictions is unique to and will report exceptions that are too difficult to express with RELAX-NG. So validation is two complementary steps. See for the exact syntax for using this stylesheet.

    Schema Browser

    Through the efforts of Jason Siefkin, and other contributors, we have a schema browser that lets you easily and naturally explore the schema through web pages, many with example uses. Look for a link in the Documentation section of the website.

    Do not be intimidated by the list of roughly 300 elements available in the All Tags panel. Many are configuration options, many are special-purpose, and many you will never use. (Someday we will do lexical analysis on a substantial range of texts to see just which elements do get used most frequently). We hope to document elements which have complicated restrictions that cannot be expressed with the parent-child relationships of the schema as part of this tool.

    An excellent way to contribute to is to help flesh out aspects of the schema browser with more, and better, information for all authors.

    Editor Support for Schema

    We collect summary information about editors that make use of schema. See for more specific information, links, .

    Schema Support in Editors Editor Formats Notes Visual Studio Code RNG Validation and completion, open source emacs RNC Schema-sensitive editing, open source XML Copy Editor RNG, XSD Validation, tag completion, open source oXygen RNC, RNG Validation and completion, commercial
    ================================================ FILE: doc/guide/author/topics.xml ================================================ Topics

    This long chapter provides the main documentation for a variety of the features of . Some sections are just stubs and need to be written. Requests for sections to prioritize are welcome, though some sections are waiting for features to stabilize.

    Paragraphs

    Much of your writing will happen in paragraphs, delimited by the simple tag, p. You are reading one right now. They are a basic building block of divisions, and also a basic building block of other structures. For example, an ordered list, ol, contains a sequence of list items, li, and a typical list item might be a sequence of paragraphs. (Do not confuse this element with the anomalous paragraphs subdivision, ).

    Paragraphs are a choke-point of sorts. Many tags can only be used within paragraphs, and many others cannot be used within paragraphs. Notice too, that we do a certain amount of manipulation of whitespace in a paragraph, in ways that you may not even notice.

    The following subsections together contain allowed, or encouraged, markup within a paragraph. Many of these may be used in captions and titles, but some of the more complicated constructions (which appear later here) cannot be used in captions or titles.

    One more comment: typewriters, computer keyboards, and the ASCII character set have together conspired to limit the full range of characters that typographers and printers have used historically. A case in point is the hyphen, which is a single key on a keyboard. However, there are at least three common dashes of differing lengths (hyphen, en dash, and em dash), and in the context of mathematics or a computer program, the hyphen might be the binary operation of subtraction or the unary operation of negation. Another example is the upright, or dumb, quote mark that is a single key on a keyboard, while careful typography will employ smart, or curly, quote marks that have left and right variants. (Sometimes called 66 and 99 based on their shape.) will help you navigate this complexity, but you will want to use keyboard characters or markup appropriately. So if you care about communicating clearly, and making your writing easy for a reader to use, absorb the details that follow and the philosophy they implement.

    We will say it again. is a markup language, and our various output formats (, HTML, EPUB, Jupyter notebooks) in turn employ markup languages. These use different escape characters and give different characters special meanings. Our job is to insulate you from this variety, so you can concentrate on authoring your ideas.

    We begin with some simple grouping elements which contain several excellent examples of the importance and utility of careful markup. There is a plethora of empty tags for individual characters, and these are very important (see ). We defer them to the end of this section, since they are not as instructive, but do not think this means they are an afterthought. They can be extremely critical for successful conversions. Also do not miss in the conclusion of this section.

    Simple Markup in Paragraphs

    Beyond empty tags that translate to various characters, there are relatively simple tags that can call attention to various portions of a sentence, or generate more complicated constructions than described above.

    Most, if not all, of the markup in this subsection may also be used within titles and captions, though they might lose some of their features when used in a title, especially when the title is duplicated in other contexts, such as a Table of Contents.

    <tag>q</tag>, quotes, <q>group</q>

    This is the first of several grouping tags, using characters with left and right variants, and some of the most common markup in your writing. Presentation uses double quote marks that are smart quotes, meaning that they look different in their opening and closing variants. (See blockquote for extensive runs of quoted text that can stand alone, and which can carry an attribution.)

    <tag>sq</tag>, single quotes, <sq>group</sq>

    Perhaps less-often used than q, so a couple more characters to type. Presentation is paired single-quotes, opening and closing.

    <tag>angles</tag>, angle brackets, <angles>group</angles>

    Left and right angle brackets to enclose a phrase. This is not for creating a set of generators in mathematics, use the appropriate mathematics tag and syntax for that. Note also that the characters used here are definitely distinct from the inequality symbols, < and >.

    <tag>dblbrackets</tag>, double square brackets, <dblbrackets>group</dblbrackets>

    Double left and right square brackets to enclose a phrase. This is not for grouping expressions in mathematics, use the appropriate mathematics tag and syntax for that. These are used in the analysis of texts to note various restorations or deletions. Inquire if you feel there should be more semantic markup for this purpose.

    <tag>em</tag>, emphasis, <em>important</em>

    Use this element to surround characters in a phrase that is to be emphasized. This will typically be rendered in italics, though this choice is left to the implementation of a particular conversion. See also, alert.

    If you are new to using a markup language, this is a place to stop and think. As a author you are never able to say, I want this text to appear in italics. Rather, you specify that certain text has a certain purpose or meaning. Emphasis is a way of calling attention to a portion of a sentence or paragraph. A font change (to italic) is a common and effective device. But a particular format might have a better, or different, way to achieve this. Perhaps in an electronic format, the letters are animated and dance up and down. (Just kidding. But you may be reminded of frequent blinking text in the early days of web design, supported by a non-standard blink element.) Seriously, now would be a good time to review .

    <tag>alert</tag>, alert, <alert>critical</alert>

    Use this to heavily emphasize something to a greater degree than just emphasis. Maybe think of it as SHOUTING. Bold italic font, or a bright color, or both, would be normal choices for presentation. Overuse of this tag will dilute its effectiveness.

    <tag>term</tag>, terminology, <term>larvae</term>

    Use this to identify a word or phrase that is being defined, in contrast to actually using a structured definition. Typical presentation is a bold font. Caution: the use of this tag is to communicate a defined term and converters may make use of this interpretation, given the importance of definitions in scholarly work. It would be considered tag abuse to use this tag to simply bold a word or phrase for some other reason, perhaps as an alternative to em or alert.

    <tag>foreign</tag>, foreign words, idioms, phrases, <foreign>Hola</foreign>

    This tag is used to identify words or phrases from a language other than the main one used for the overall document. It is best practice to use a xml:lang attribute to identify the language, since this will assist screen readers and hyphenation algorithms. We may also recognize the need for a different script (font). Usual presentation is italics for languages using a Latin script. This should not be used for entire paragraphs as a way of assisting with a translation of an entire document.

    Note that when we use italics for emphasis and to point out foreign words or phrases, there is a loss of information in our output. In other words, we can no longer reliably (in an automated way) convert our output back to equivalent PreTeXt source from its visual representations. C'est la vie. See again.

    <tag>pubtitle</tag>, <tag>articletitle</tag>, titles of books and articles

    These provide the ability to typographically distinguish the title of another work, and are not a replacement for careful bibliographies and citations. Use pubtitle for longer, complete works, such as books, plays, or entire websites. Use articletitle for shorter, component works, such as a chapter of a book, a research article, or a single webpage.

    Presentation for a longer work will be italics or an oblique (slanted) font, and for a shorter work, the title will simply be quoted.

    <tag>abbr</tag>, <tag>init</tag>, <tag>acro</tag>, abbreviation, initialism, acronym, <abbr>Mr.</abbr>, <init>XML</init>, <acro>SCUBA</acro>

    An abbreviation is a condensed or shortened version of some word or phrase, such as Mr. for Mister. Converters should take care with periods (full stop) inside an abbr as distinguished from the end of a sentence (which may not always be clear given the absence of a tag delimiting sentences). An initialism is an abbreviation read as a sequence of letters, often the first letter of words in a phrase, such as HTML for HyperText Markup Language. An acronym is much like an initialism, but the letters are read as a pronounceable word (which sometimes actually enters the language as a word, such as radar which began as RAdio Detection And Ranging). An example is SCUBA which stands for Self-Contained Underwater Breathing Apparatus. Initialisms and acronyms may be presented in a small-capitals font or as regular capitals reduced in size.

    <tag>delete</tag>, <tag>insert</tag>, <tag>stale</tag>, editing assistance, <delete>gone</delete>, <insert>new</insert>, <stale>old</stale>

    These denote portions of a text that is being changed in some way, presumably as part of an editing process. Conceivably, they could be managed by some other tool acting on your source. Stale text is that which is slated for removal eventually, but is left in place so that it may be consulted. There is no support presently for actually deleting or incorporating text, though that would be a reasonable feature request.

    Red and green, for leaving and entering, are natural choices for presentation. But in consideration of those readers who cannot always distinguish different colors, other devices, such as strikethrough or underlining, should also be employed.

    <tag>tag</tag>, <tag>tage</tag>, <tag>attr</tag>, tag, empty tag, attribute, <tag>section</tag>, <tage>hash</tage>, <attr>width</attr>

    These are tags for when we write about and need to discuss tags, empty tags, and attributes. Given how we design tags the content of these elements should only be the 26 lower-case letters and a dash/hyphen. These should render in ways that make the three types of language elements obvious without much further discussion. Just a bit self-serving, but not unjustified.

    These are not meant for more elaborate constructions. For example, an attribute-value pair should not be authored as <attr>data="/home/data"</attr> and instead I would write set the <attr>data</attr> attribute to the value <c>/home/data</c> Similarly, do not use the tag element for long XPath constructions like <tag>docinfo/prefigure-preamble/line</tag> The c or cd element will likely work better.

    <tag>taxon</tag>, scientific names, <taxon>Escherichia coli</taxon>

    This element may surround a full scientific name, resulting in presentation in italics. There are subelements genus and species which may be used to delineate those components.

    A ncbi attribute on taxon accepts an identifier from the National Center for Biotechnology Information. Feature requests for ways to make this more useful are welcome.

    <tag>fn</tag>, footnotes footnotes

    A footnote can be inserted in a paragraph and a mark will be left behind. Where the content of the footnote goes depends on the capabilities of the output format. Because a footnote allows you to begin a new piece of text anywhere, it can be difficult to handle technically. For this reason it is banned from places like titles and its possible content is limited (for openers, no paragraphs).

    A footnote is the farthest thing from structured writing that we can think of. It can go anywhere. Resist the temptation to use it, and your writing will improve. We frequently entertain the thought of making footnotes impossible in . See the aside element for a possible alternative.

    <tag>m</tag>, mathematics, <m>x^2+y^2</m>

    Simple, inline expressions using mathematical notation may be used in paragraphs, and in titles and captions. The syntax is . See for full details.

    <tag>c</tag>, code, verbatim text, literal text, <c>import</c>

    Short bursts of raw, or verbatim, text can be wrapped in the c element. Strictly speaking, code is a misnomer, as the text may be anything you need to communicate exactly as one would type it at a keyboard or as input to a computer program. Anything longer than a handful of characters, or needing accurate line breaks should consider the cd, pre, program or console tags. If you like to have your source word-wrapped with hard line-breaks (newline characters), we will replace those for you with a space character. This is the only modification made to the content of a c element.

    Presentation is normally a monospaced sans serif font, perhaps of a slightly heavier weight, and designed for the job with features such as unambiguous zeros (versus the letter oh). See for details.

    <tag>email</tag>, email address, <email>nobody@example.com</email>

    Very similar to the c tag, this may be used to get a monospace presentation of an email address, possibly as an active link in some formats.

    Cross-References and Paragraphs

    There are several devices for creating cross-references. Generally, these are unwise (or banned) in titles, and if allowed may be inactive in certain portions of an electronic output format (such as when migrating to a Table of Contents).

    <tag>url</tag>, linking external resources

    This is a cross-reference to some item separate and distinct for your document.

    A Uniform Resource Locator (URL) is, loosely speaking, an Internet address for some item. Capabilities for providing links to such items are provided and take into account usability in different output formats. See for full details on how to use url for links to external resources.

    Note also that this tag is meant for external resources, so see the xref element (below) or for ways to link internally ( within your document).

    <tag>xref</tag>, cross-references

    This is a cross-reference to some item contained within your document.

    Extensive and intuitive capabilities for cross-referencing are a primary feature of . Typical use is an empty tag with the ref attribute specifying the value of an xml:id on the target of the cross-reference. This should work easily without much more instruction, but familiarize yourself with the details in to get the most out of some the available options.

    <tag>idx</tag>, index target

    This indicates that the containing structure (theorem, example, etc.), or top-level paragraph, should be the target of an entry of the index (a special sort of cross-reference). See and for general details.

    <tag>notation</tag>, index target

    This indicates that the containing definition, or top-level paragraph, should be the target of an entry of the list of notation (a special sort of cross-reference). See and for general details.

    Structured Markup in Paragraphs

    There are three categories of items which typically are structured further, and which are almost entirely restricted to appearing in a paragraph. Given their complexity, details are covered in other sections of this guide.

    Lists

    With only one major exception (and three minor ones), a list must appear within a paragraph. See for an introduction and for precise details.

    Display Mathematics

    Displayed mathematics, which is a single equation or a sequence of (aligned) equations, can only be placed within a paragraph. The relevant tag is md. It can hold a single expression or be structured with mrow elements. See for an introduction and for precise details.

    Display Verbatim

    The cd tag, by analogy with the md tag for displayed mathematics, may be used to display one or more lines of verbatim text (such as a series of commands), possibly structured with the cline tag. See for an introduction and for precise details.

    This should not be confused with the pre, console, or program tags, which have slightly different uses, and all of which must be used outside of a paragraph.

    Characters in Paragraphs

    Some keyboard characters are unambiguous, for example, the percent sign, %. Other keyboard characters are poor replacements for several different characters. Is a slash, /, being used to separate information/ideas, or is it a solidus being used to form a fraction such as 34? Other characters, such as per-mille, , are not present on keyboards at all. We organize this section according to these types of distinctions.

    Unambiguous Keyboard Characters

    The keyboard characters `, ~, !, @, #, $, %, ^, *, (, ), _, =, +, [, ], {, }, \, |, :, ;, and , are entered as-is and are only rendered one way. Easy.

    Of course, the fifty-two Latin letters, and ten decimal digits, are also in this category. If you have an international, or bilingual, or country-specific keyboard, then common accented versions of Latin letters (as used in Europe and the Western Hemisphere) may also be used directly from your keyboard.

    Exceptional Keyboard Characters exceptional characters charactersexceptional CDATA

    XML is a markup language, which in part means that some keyboard characters are co-opted to signal the start of markup. For XML this character is the less-than symbol, <. It signals the start of a tag, and then an opening tag ends with a greater-than symbol, >, while a closing tag has an extra / right after the <.

    This begs the question: if a < is used in our XML source to signal the start of a tag, then how did we get one to appear here in this sentence without mistakenly starting a tag? Once a markup language gives some characters special meanings, then there needs to be an escape character. For XML the escape character is the ampersand, &. So to author the < and > symbols, we type escaped versions: &lt; and &gt;.

    I hear you now say, But now we just took the & out of the running and gave it a special meaning. How do we get an ampersand? Easy, use the escaped version: &amp;.

    So the short answer is: never, ever type the < or & keyboard characters in isolation. The very beginning of the processing of XML ( ) will fail fatally on these characters. Instead, always use the sequences &lt; and &amp; and then very early the XML processing will convert them to characters, without interpreting them as signals for aspects of the markup.

    It does not seem necessary to author > as &gt;, though there is no real harm in doing so. The two other characters with escaped versions are the single and double quotes, ' and ", which have escaped version of &apos; and &quot; (respectively). These are only necessary for attribute values, and we have been careful to design so that they are not necessary.

    Excessive Escaped Characters

    If you know another markup language, such as , , Markdown, JSON, or PGML, think about how many characters have been given special meanings, and the subsequent necessity to use escaped versions. And if you want to write about computer languages, realize that each such language also gives certain keyboard characters special meanings.

    XML only has five exceptional characters, and in your daily use, really only requires you to be aware of two, the minimum necessary for a markup language.

    A <init>CDATA</init> Section is Never Necessary

    We hate to mention it, but sooner or later, we need to have an uncomfortable discussion about the misunderstood CDATA section, and risk confusing the rest of this subsubsection. And this is the place. But you can come back later, if you wish.

    You will read other places about very special markup known as a CDATA section. The name stands for character data, which means all characters, no markup. Think of it as switching off the XML processing for a while, so in particular, &, <, > no longer have any special meaning at all. That could be nice, but realize that now there is no opportunity to have any markup present using XML syntax, since it is ineffective.

    A CDATA section is always a convenience and is never necessary.

    When would it be convenient? Maybe you have some inside an md with a large matrix that uses lots of ampersands to separate the entries. Inside a CDATA you can author it with bare & rather than a plethora of &amp; or \amp. But you lose the ability to include an xref in that CDATA, so you need to be surgical about its scope. Perhaps a Tikz diagram in a latex-image has a multitude of <-> or a chunk of Sage code in an input has a lot of finitely-generated algebraic structures authored as R.<x> = ... (which is not even legal Python syntax either!). These places where there is little, or no, markup could be convenient places to use a CDATA. Be sure to read the warning at in before you go all-in.

    Ambiguous Keyboard Characters

    Some keyboard characters have a primary interpretation, and are imitations of other typographic characters. Your output will be of higher quality if you understand these distinctions and employ the proper variant.

    Ambiguous Keyboard Characters and Alternatives Keyboard Primary Notes / (forward) slash solidus is a fraction bar, ' apostrophe rsq is a right single quote, ` backtick lsq is a right single quote, . period abbreviations and end-of-sentence - hyphen See dashes, and arithmetic " upright double quote lq is , rq is

    Note that the four quote marks (left/right, single/double) are meant for the actual characters. Always use the grouping constructions described above ( q and sq) when grouping a phrase with quote marks. Note, too, that there is never a good reason to use the keyboard quote character (") unless you are creating some sort of verbatim text, such as a program listing or describing literal keyboard input.

    When creating print or PDF via a period may get different trailing space depending on location and context, generally being its use in abbreviations or to conclude a sentence. We do not yet have this dual-use under control.

    Extraordinary Characters

    Some characters or symbols are typically not available on a keyboard, so we provide empty elements. Many of these may be entered directly into your source as Unicode characters, and they will do well in your HTML output. However, these may fail entirely if you create print or PDF via using the pdflatex engine. Furthermore, even for HTML output there may be several Unicode characters that are very similar.

    So again, for the best quality output be aware of these elements and use them. Please suggest additions if you do not find what you need and are resorting to Unicode characters.

    <tage>ellipsis</tage>, <ellipsis />, ellipsis

    Typically three low dots with no intervening space, to indicate a continuation. This will always perform better than three consecutive periods.

    <tage>midpoint</tage>, <midpoint />, midpoint

    A small centered (vertically) dot, which can be used to separate pieces of information, especially in displayed text ( outside of paragraphs). Not to be confused with a bullet preceding a list item, or multiplication in mathematics.

    <tage>swungdash</tage>, <swungdash />, swung dash

    Another decorative separator, not to be confused with the keyboard tilde character since it is wider and thicker.

    <tage>permille</tage>, <permille />, per mille

    Like per cent, but now a number expressed as its product with 1000 (rather than with 100).

    <tage>pilcrow</tage>, <pilcrow />, pilcrow, paragraph mark

    Mark used historically to indicate the start of an internal paragraph, and in a more modern use, to indicate a permalink.

    <tage>section-mark</tage>, <section-mark />, section mark

    Used to prefix the number of a section, or other division. (So the word section is being used generically here.)

    <tage>copyright</tage>, <copyright />, copyright

    The symbol used in publishing, legal, or business contexts. For a project, copyright information can be specified within the bibinfo portion of the frontmatter.

    <tage>trademark</tage>, <trademark />, trademark

    The symbol used in legal or business contexts.

    <tage>registered</tage>, <registered />, registered

    The symbol used in legal or business contexts.

    Extraordinary Characters and Their Empty Elements Character Name Element ellipsis ellipsis midpoint midpoint swung dash swungdash per-mille permille pilcrow pilcrow section-mark section-mark copyright copyright trademark trademark registered registered
    Accented Characters

    The second 128 Unicode characters (hex 80 to FF) contain many of the most frequently-used accented characters in Western languages, along with niceties such as the German eszett, ß, or the Scandinavian æsc, æ, an a-e ligature. Like the fifty-two Latin letters (part of the first 128 Unicode characters), these may be used as-is. They may be present on your keyboard, or you may need to learn keyboard shortcuts or specifics of your operating system to enter them as Unicode characters. In a pinch, you can often cut-and-paste a few characters from web pages.

    This table is indexed by the Unicode number, in hexadecimal notation. The first 32 of the 128 (U+0080U+009F) are control codes and U+00A0 is a non-breaking space, so is invisible, while U+00AD is a soft hyphen (which we have not implemented and so is excluded).

    Latin-1 Supplement, Unicode <c>U+00A0</c><ndash/><c>U+00FF</c> 0 1 2 3 4 5 6 7 8 9 A B C D E F 00A_¡¢£¤¥¦§ ¨©ª«¬ ®¯ 00B_°±²³´µ· ¸¹º»¼½¾¿ 00C_ÀÁÂÃÄÅÆÇ ÈÉÊËÌÍÎÏ 00D_ÐÑÒÓÔÕÖ× ØÙÚÛÜÝÞß 00E_àáâãäåæç èéêëìíîï 00F_ðñòóôõö÷ øùúûüýþÿ
    Arithmetic

    If you are writing about technical subjects, then you will want to avail yourself of 's extensive support for mathematics. Otherwise, you may wish to write really simple arithmetic within sentences without extra formatting. Notice that there is no provision for preventing line-breaks in the midst of these expressions.

    So you can author (26)3+1015 = -1, but that is about the limit of the complexity of expressions you should author without using the extensive capabilities designed for mathematics, rather than arithmetic. Note that the spaces around the equal sign have been supplied in the source, but no spaces have been provided around the operators. Also, the minus sign and the negative are slightly different because the subtraction uses the minus element, while the negative answer uses a plain keyboard hyphen/dash.

    Using the m element instead, the above is (2\times 6)\div 3+10-15=-1. Note the more careful spacing, and the appropriate symbols for subtraction and negation, with no special care in the syntax used in the source.

    Note also that the plus sign, + and the equals sign, =, can be provided in text as the unambiguous keyboard characters.

    The degree, prime, dblprime elements support simple coordinates with degrees, minutes, seconds, or temperature, or distance in feet and inches. We parked the car at 36160.83N, 1223547.27W, and since it was 93F, we walked 5053.6 so we could swim in the bay.

    <tage>minus</tage>, <minus/>, minus, subtraction, negation

    For simple arithmetic expressions in text, this symbol may be used. Note that the keyboard hyhpen (or dash) might be acceptable for your purposes, but they are different.

    <tage>times</tage>, <times />, times, multiplication

    For simple arithmetic expressions in text, this symbol may be used. Or it may be used to specify dimensions, as in I bought a 24 at the lumber yard.

    <tage>solidus</tage>, <solidus />, solidus, virgule, fraction bar

    For simple arithmetic expressions in text, this symbol may be used to form a fraction. It should appear to have a significantly shallower slope than the forward slash, /.

    <tage>obelus</tage>, <obelus/>, obelus, division sign

    For simple arithmetic expressions in text, this symbol may be used to indicate division.

    <tage>plusminus</tage>, <plusminus/>, plus-minus sign

    For simple arithmetic expressions in text, this symbol may be used to indicate a tolerance or a choice of two values, one the negative of the other.

    <tage>degree</tage>, <degree/>, degree symbol

    A raised open circle for temperature or for angles used in coordinates.

    <tage>prime</tage>, <prime/>, prime symbol

    A straight mark that is placed like an exponent. For use in coordinates or statements of linear measure in feet and inches. Not an apostrophe, and not mathematics (like, say, not to denote a derivative).

    <tage>dblprime</tage>, <dblprime/>, double prime symbol

    Two straight marks that are placed like an exponent. For use in coordinates or statements of linear measure in feet and inches. Not an apostrophe, and not mathematics (like, say, not to denote a second derivative).

    Separators <tage>ndash</tage>, <ndash />, en dash

    A dash, the width of a lowercase n, or exactly half the width of the em dash. This is typically used to express a range, such as 1955<ndash />1975, with no intervening spaces. It is often expressed as two hyphens when typed. Bringhurst suggests an ndash surrounded by spaces thusly when setting off phrases.

    <tage>mdash</tage>, <mdash />, em dash

    A dash, the width of a lowercase m, or twice the width of the en dash. This is typically used to express a secondary part of a phrase, much like the use of a semi-colon or parentheses.

    Style guides suggest that there should be no spaces, before or after, an em dash, while some allow for a thin space on either side. You should always leave no space around an mdash element in your source. Then a publication file entry can be used to elect the automatic addition of a thin space, should your publisher so desire. See for the syntax of the publisher file entry.

    <tage>nbsp</tage>, non-breaking space

    A space, but which ties two words together and discourages a line break when formatted, such as Summer<nbsp />1967. This can also be used to discourage a period in an abbreviation from being interpreted as the end of a sentence, such as C.R.<nbsp />Darwin.

    <tage>midpoint</tage>, <tage>swungdash</tage>, <midpoint/>, <swungdash/>, midpoint, swung dash

    These can be usedas more decorativeseparators.

    Keyboard Keys keyboard keys keyskeyboard

    If you are writing a software manual, or writing about how to use a calculator as part of a science textbook, then you might want to make it very clear which keys to press on a keyboard. The kbd element can hold content like Z or Caps Lock and your output will have a very nice looking keyboard key with the desired label. For example, Z and Caps Lock. For keys labeled with graphics, like the arrow keys, instead of content, provide the name attribute with a value from the following table. Request additions to this table if you are using this feature (2019-11-22).

    Keyboard Keys Specified by <attr>name</attr> Attribute left right up down enter shift solidus plus minus times left-paren obelus squared inverse right-paren
    User-Interface Icons

    When writing about software, you may wish to call attention to icons used in the interface. Similar to graphical keyboard keys, use the icon element with a name attribute with a value from the following table. See for information about using icons as part of output.

    User-Interface Icons available with <tage>icon</tage> Name Icon Name Icon Name Icon file-save arrow-left media-rewind arrow-up arrow-right media-fast-forward menu arrow-down media-skip-to-start wrench media-stop media-pause gear media-play media-skip-to-end power
    Other Markup in Paragraphs <tage>today</tage>, <tage>timeofday</tage>, <today />, <timeofday />

    Values at the time of XML processing. Useful for marking drafts or other frequently revised material such as online versions.

    <tage>tex</tage>, <tage>latex</tage>, <tage>xetex</tage>, <tage>xelatex</tage>, <tage>pretext</tage>, <tage>webwork</tage>, <tex />, <latex />, <xetex/>, <xelatex/>, <pretext />, <webwork/>

    Conveniences for frequently-mentioned accessories to .

    <tage>fillin</tage>, <fillin characters="5" />, fill-in blank

    A fill in the blank blank. May be used in normal text or within mathematics contexts. The characters attribute may be used to hint at how long the line will be. Here we have set characters to the value 5.

    If used inside math, a fill attribute (in lieu of characters) may be some string of math that will be used to determine width, height, and depth of the blank. In text, the default value of 10 is used for characters. In math, the default value of XXX is used for fill.

    If used in normal text, a rows and/or cols attribute may be present, each a positive integer. When either is greater than one, there will be an indication that the expected content to fill in the blank is a rowscols array.

    <tage>ie</tage>, <tage>eg</tage>, <tage>ca</tage>, <tage>vs</tage>, <tage>etc</tage>, <ie />, <eg />, <ca />, <vs />, <etc />

    A small collection of frequently-used Latin abbreviations, with attempts to handle the tricky periods wisely in output. Strictly speaking is not Latin, but we include it for completeness. Tags are always lowercase, no punctuation, usually two letters.

    TagRealizationMeaning ad anno Domini, in the year of the Lord am ante meridiem, before midday bc English, before Christ ca circa, about eg exempli gratia, for example etal et alia, and others etc et caetera, and the rest ie id est, in other words nb nota bene, note well pm post meridiem, after midday ps post scriptum, after what has been written vs versus, against viz videlicet, namely
    SI Units

    Système international (d'unités) (International System of Units) is a system of measurement used universally in science. has comprehensive support for this system and its notation and abbreviations. See for a short introduction and for detailed descriptions of the relevant elements and their use.

    <doublesharp/>, <sharp/>, <natural/>, <flat/>, <doubleflat/>, music notation

    Notes, chords, and other notation may appear within sentences as part of a discussion. See for detailed descriptions of the relevant elements.

    Understand the Importance of Careful Markup

    There is a lot of detailed information in this section. Much of it is critically important. If you are new to thinking in terms of markup (rather than WYSIWYG tools), it might be overwhelming, a lot to digest, and hard to separate the wheat from the chaff. Careful here means using the necessary markup, not using it for other purposes different than its intent (tag abuse), planning ahead for different output formats, but not becoming a slave to over-doing it.

    So come back here often for a re-read. And keep in mind that is designed around principles (), and that it is markup () which enables multiple outputs () and effective and beautiful online versions ().

    Blocks blocks Introduction to Blocks

    A division (), that is not further subdivided, is primarly, but not exclusively, composed of paragraphs and blocks. We document the types of blocks here, even though we do not intend to ever provide a rigorous definition of the term. Here is a list of characteristics, which is not prescriptive.

    Characteristics of a Block
    • Visually set-off from a run of plain paragraphs. Often earning a number, and ideally provided a title or caption ().
    • Reflowable lines of text, such as an example, or a more rigid, more spatial, more planar object, such as a figure or table.
    • Usually a child of a division (). But see just below.
    • Typically a block does not contain another block, except that the more planar ones can appear as part of a more textual one.
    • When numbered, all blocks generally run consecutively. (In -speak, on the same counter.) Numbering FIGURE-LIKE and PROJECT-LIKE independently is in transition at this writing (2021-07-07).
    • Depending on the output format of your document, some block types may be initially hidden to improve the visual flow. The reader must click on the heading for the block to reveal its contents. You can change this behavior by configuring your publication file. See . We will make note of the elements that are hidden by default for HTML output.

    The following is somewhat general, and we have not extensively cross-referenced to the particular types of blocks, so use the Table of Contents or the Index to learn more specifics.

    Isomorphic Blocks

    The structure of a block is described carefully in the schema (). There are approximately forty blocks that are arranged into ten groups, within which they behave identically, except for their displayed names. An exception is the group of four figure-like items which are very similar, but have differences beyond just their displayed names. These groupings are defined in the xsl/entities.ent file, which we summarize in the next table. The category name is taken from the entities file, and the notes are meant to describe the distinctive capabilities of the category.

    Summary of Blocks
  • REMARK-LIKE

    remark, convention, note, observation, warning, insight

    The most basic, generic, block.

  • EXAMPLE-LIKE

    example, question, problem

    A worked problem meant as exposition. It can be structured with task, hint, answer, and solution just like an exercise or PROJECT-LIKE, but the hint, answer, and solution cannot be electively removed from output, and they do not migrate to collections of solutions elsewhere. Hidden by default for HTML output formats.

  • PROJECT-LIKE

    project, activity, exploration, investigation

    These are similar to an exercise, but the name suggests a slightly different undertaking, and they cannot be placed in an exercises division. The current default is that they are numbered independently from other blocks, but this is planned to switch to elective behavior. The hint, answer, and solution behave more like those for an exercise and can be removed from output, and can migrate to collections of solutions.

  • FIGURE-LIKE

    figure, table, listing, list

    An object that is a container for other atomic objects, which are typically somewhat rigid (not reflowable) or two-dimensional. Typically with a number, and provided with a title or caption. But each is slightly different in what it can contain and how it is rendered. A table can only hold a tabular, while a listing is meant for program and console. A list is not the list itself, but a container for one of the three possible lists (see and especially ). A figure is the most liberal, allowing a wide variety of contents, with image being the prototypical example. These are not designed with the expectation that they can be renamed.

  • THEOREM-LIKE

    theorem, corollary, lemma, algorithm, proposition, claim, fact, identity

    Mathematical results, which can have an (optional) proof. Proofs are hidden by default in HTML output.

  • AXIOM-LIKE

    axiom, conjecture, principle, heuristic, hypothesis, assumption

    A mathematical statement, which does not have a proof.

  • DEFINITION-LIKE

    definition

    A definition of a (mathematical) object.

  • ASIDE-LIKE

    aside, biographical, historical

    Parenthetical content that is structured beyond what a footnote can contain.

  • COMPUTATION-LIKE

    computation, technology, data

    For descriptions of activities or data for use with computers, calculators, or other devices.

  • GOAL-LIKE

    objectives, outcomes

    These are structured primarily as lists, and may only appear early (objectives) or late (outcomes) within a division.

  • Other Blocks

    There are other blocks which can be achieved using just one element. Examples are poem and assemblage. An exercise can take on different behaviors, depending on its placement (see ). One such placement is as a child of a division, which we call an inline exercise, and this would be regarded as a block, very similar to a PROJECT-LIKE. Inline exercises are hidden by default in HTML output.

    A paragraph (p) can appear many places and is a primary component of blocks. But when it is a child of a division, it shares some charateristics with other blocks. There are a number of peers of a p which would then also qualify: pre, blockquote, image, video, program, console, and tabular. None of these can have a title or number, making them less useful, but widening the possibilities for placement.

    Renaming Blocks renaming blocks

    A common desire of authors new to is a new block. Authors extending to add a new one is not supported, and it is not even straightforward for a developer to provide comprehensive support for a new block. One of the reasons for multiple versions of blocks, with common behaviors, is that you can appropriate one for use with your project and give it a new name. So for example, a biology textbook might want to use activity for a laboratory, but rename it to Laboratory. Of course, this means you will forego having any Activity in your book. (But if you are the first to write a biology textbook in perhaps you should talk to us about a real laboratory element that behaves well for all the physical and biological sciences!) Here is the procedure:

    1. Choose a block from that has behavior similar to your intended use, and which you do not forsee using as-is in your project.
    2. In the docinfo section use a rename element. The content should be the new name (Laboratory above), while the element attribute should be the name of the element renamed (activity above).
    3. The xml:lang attribute should be used to specify a value of the code for use with documents authored in languages other than US English. If absent, the default vslue en-US is used. Multiple rename elements for the same element, in different languages, is supported.
    So, continuing and extending our example, an author would use <rename @element="activity" xml:lang="fr-FR">Laboratoire</rename>

    The most popular block to rename is exercise. We have exercises inside exercises divisions, which we call divisional exercises, and exercises inside divisions, which we call inline exercises. It is possible to have one of each that have identical numbers. So in cross-references the former is an Exercise, while the latter is a Checkpoint. If you only have inline exercises, you might prefer that they be called Exercise rather than Checkpoint. For the element attribute of the rename element, use a pseudo-element, in this case inlineexercise. Other pseudo-elements which can be used to distinguish the various types of exercises are: divisionexercise, worksheetexercise, and readingquestion.

    Choose the element you rename carefully, trying to match it to the purpose of your content. It can be useful for other purposes, such as automatic lists (), and you may decide later to use other properties of the element you have chosen.

    (*) Exercises, Inline and Divisional

    Verbatim and Literal Text

    This section expands on parts of . For descriptions of more involved uses, such as program listings and console sessions, see and .

    The tags described here contain only raw characters. By that we typically mean the first 128 characters of the ASCII code. Unicode characters are likely to migrate to HTML output just fine, but results for output will be variable. The restriction to character data has two consequences. First, any markup mistakenly included will have its content silently ignored and dropped. Second, you need to observe the rules on exceptional characters and escaped characters for XML for literal text, which are mercifully simple.

    In your source, use &amp; for an &, use &lt; for <, and optionally use &gt; for >. Otherwise, every other ASCII character will render faithfully across all possible formats.

    See for more detail and explanation.

    Short, Inline, Verbatim Text verbatim text literal text

    The c tag is a mnemonic for code, but is really meant to be any chunk of literal characters that you want to emphasise that way. So a typewriter font of fixed-width characters would be a typical presentation. It is meant for use within a sentence or caption (inline) so its use is limited to those situations, and others that are similar, such as a title or a cell of a table. Typically these pieces of text do not hyphenate words, and so can lead to spillover into a right margin. In these situations, consider options below for longer pieces of text.

    There is also a pf tag, which is a mnemonic for program fragment. It is used in the same way as c, but will apply syntax highlighting so that the displayed text matches the formatting of a program See for more information.

    Longer, Inline, Verbatim Text

    For longer pieces of verbatim text, use the cd tag, which is short for code display, analogous to the md for mathematics. It is used within sentences of a paragraph and will be presented with a vertical break above and below, but without interrupting the paragraph. Because of the display presentation, it cannot be used other places, such as a title, where a vertical gap is not appropriate. All of the previous discussion about exceptional characters applies for this tag.

    You have two options in use. You may author inline with the rest of a sentence, with no extra newlines or whitespace before, after, or within the content. The result will be a single displayed line.

    Or you may structure the content using one, or more, of the cline tag, which is meant to be similar to the line tag used elsewhere. You should still take care to not place any extra whitespace before or after the cd element, but in between the cline you may use as much visual formatting of your source as you wish, especially if you like your source to mirror your output.

    Blocks of Verbatim Text

    If you want to isolate large chunks of verbatim text outside of paragraphs, the pre tag is the one to use. It can be used as a peer of paragraphs (and other structures) as a child of a division, or it can be placed into a listing to receive a caption, title and number.

    You can structure the contents with cline in exactly the same manner as for cd. But you may find this tedious. Instead, you can make the content of pre a sequence of lines separated by newlines. So that you can preserve the indentation of your source, the line closest to the left margin is taken to actually be the left margin, and a corresponding amount of leading whitespace will be removed from every line. This will work well if you recognize two caveats. First, results will be unpredictable if you mix spaces and tabs for indentation. Sticking with spaces is best. Second, if your first characters of content immediately follow the pre tag then there is no leading whitespace and it is as if that line is already at the left margin. Then subsequent indentation may seem too severe to you.

    As previously mentioned, and discuss the console and program tags which are more specific, and hence more capable. Review the possibilities before you decide between pre, console, and program.

    Cross-References and Citations cross-reference citation

    When you read a novel, you would likely read it cover-to-cover (in one sitting?) and then put it away and never read it again. But for a textbook, you may read cover-to-cover, but you may also frequently skip around, especially at exam time. And once read, it might become a reference work for you, since you know it so well. So years later you might come back looking for something. Cross-references help with all this, so use them liberally. Recognize that an index is really just a specialized way to provide an abundance of cross-references.

    Creating a Cross-Reference

    It is a two-step process to make a cross-reference.

    1. Put an xml:id attribute on any element you think you might want to reference later. Be organized about the values of these attributes, and in particular do not number them, as this has no place in your source, and you do not want to maintain the changing numbers over the life of your project. See the advice in about banned characters. Some elements do not accept this attribute because the element has nothing to identify it (no number, no title). Typically these are containerscontainer such as sidebyside, statement, or ol. In these cases, put the attribute on the closest enclosing element.
    2. To make a cross reference, you create an xref element with a ref attribute with the same value as xml:id attribute on the element you want to reference.
    Simple. It is meant to be, so you can use it liberally. But we also know authors want some flexibility.

    Use <attr>xml:id</attr> Frequently

    Use the xml:id attribute liberally, on any object you might want to reference later, and on every division. It is easier to do as you author and will be very valuable later. (Trust us on this one.) Develop a system so you can recall them predictably, but keep them readable. Don't use numbers, they will change. Then make frequent cross-references. They are relatively easy for you and will be incredibly useful for each and every one of your many readers, over and over and over again.

    Text of a Cross-Reference

    By default, a cross-reference will visually be text like Theorem 5.2. Depending on your output format, it may have various devices to help you locate that theorem. Maybe a page number, or it is a hyperlink, or the whole theorem is the content of a knowl. You can change the default look of cross-references by setting the text attribute in docinfo/cross-references. But you can also change the visual appearance of a cross-reference on a case-by-case basis. Add a text attribute to your xref element to override the document-wide setting. The first column of this table lists the possible attribute values, either document-wide, or on a per-cross-reference basis. The second column has live cross-references to a section of an earlier chapter (that is far away). The third column has live cross-references to another section of this chapter (which is close by). For the fourth column, we have placed content (Extra) into the xref element as an override of, or addition to, some of the text for the cross-references of the preceding column. Study the table and then read some more explanation following. Note that type-global is the default.

    Cross-reference visual text styles text Far Away Close By With Content type-local Extra type-global Extra type-hybrid Extra local Extra global Extra hybrid Extra type-local-title Extra type-global-title Extra phrase-global Warning phrase-hybrid Warning title Warning custom Extra

    Note that local/global describes the uniqueness of the number (and is affected by your choice of numbering schemes), while type refers to an automatic prefix of the number. The text of the type will vary according to the document's language. If a cross-reference and its target are close to each other, a number like 5.8.2.4 might be overkill, when just a 4 would suffice. A hybrid scheme will use the shorter number whenever it makes sense. There are two phrase schemes, and it should be clear what text title will produce (though realize there must be a title for the object, possibly a default provided by ). Finally, if desired, the text can be customized with any text you like.

    You can also override the text used in a cross-reference link. You do this by providing content to the xref element. In other words, do not use an empty tag, but put some (simple) text in the element. Generally, this additional text becomes a prefix of a number or a replacement of a type. It is better to use these overrides, since in electronic formats, the text of the override will be incorporated into the clickable portion of the resulting link, making a larger item to hit. Recognize that this extra content will not benefit from automatic internationalization.

    Here are careful examples of providing content inside the xref element, where we have provided the content Division in the live examples. The list is not exhaustive.

    Cross-reference text overrides text Example 'global' Division 'type-global' Division 'custom' Division
    Variations

    There are some variant uses for the xref tag.

    • Replace ref by provisional and give it a value with some simple text like subsection on eagle habitat and you will get reminders that once you write this future subsection you need to link it in right here. This is just a convenience for authors during the early stages of a writing project (see for details).
    • Replace ref by the pair first and last. Provide attribute values just as you would for ref. The code will check that the targets have the exact same tag, and that the order is correct. You will get a link that looks like a range, separated by an en dash. As a link, only first will be used for the linking mechanism (, one link is generated, not two). Experiment with text and content overrides.
    • The ref attribute may be a list of xml:id, separated by commas or by spaces. Then you will get back a list of cross-references. This is meant for a list of citations, producing a look like [5, 9, 22], but it makes no restriction to this case. Use it generally, but it is unlikely to get any more capable. If you want a different list, just use multiple xref and format as you desire.

    You can create many different combinations with the text options and the variants. Here is one example. You want to say Chapters. As a range you use the variant with two references. You would get Chapter out front automatically with the type-global scheme, but a plural form makes more sense. So you use that text as an override. We could use either type-global or global to get the same text, and possibly type-hybrid depending on the place where you built the cross-reference. So possibly, one of these schemes might be your document-wide setting and you do not need to specify it now. Here is what we just used: <xref first="start-here" last="schema" text="global">Chapters</xref>

    You can place a cross-reference into a title element, but a particular conversion is free to simply render it as text, and not as an active link.

    Finally, there is fairly robust error-checking to protect against typographical errors in the attribute values that need to match up for all this to work. Also, there is a check that the xml:id are unique. But all this checking happens at processing-time, not at the validation step. Any suggestions for improvements that make these checks even more robust are welcome.

    Citations citation

    Citations are just specialized cross-references to biblio elements, and so behave the same way as other cross-references. However they will always visually look like [23], and there is no notion of type name.

    Equations

    Similar to citations, references to equations (md and mrow elements) will visually look like (4.2), where the type name is implied by the parentheses. Notice that you cannot cross-reference a bare md element that is not numbered nor an md element structured with mrow (it is just a container, filled with mrow that you can target if you give them numbers). Consult for details about controlling the numbering of equations within an md.

    Lists

    Roughly, you can target a list item for a cross-reference, but not the list itself, since it is a container. See for precise details about using list content as the target of a cross-reference. Note also, that an entire named list may be the target of a cross-reference, see . Here we concentrate on the text of the cross-reference itself.

    First, note that if you cross-reference a list item of an anonymous list, there is a very real possibility that the number will be ambiguous, and there is no option for text will save you, and never can be. See the middle column of for the demonstration. We assiduously try to make it impossible to ever create ambiguous text for cross-references, especially in consideration of print output. Use the feature carefully.

    Take Care Referencing Anonymous Lists

    Cross-references to list items of anonymous lists can easily be ambiguous and then useless for readers of print. Keep such a cross-reference close to its target, ideally within the same list, and/or perhaps using additional, unambiguous clues about location (which you expect will survive later editing):

    1. See of this list.
    2. See in the list appearing in .

    The local option, discussed generally above, behaves differently for a cross-reference to a list item of an ordered list that is contained in a named list. As seen in the table just below, the local portion of the number is the part that comes from the list item, without the part that comes from the location of the list block.

    Cross-references to list items, visual text styles text Named List Anonymous List With Content type-local Extra type-global Extra type-hybrid Extra local Extra global Extra hybrid Extra phrase-global Warning Warning phrase-hybrid Warning Warning title Warning custom Extra

    The hybrid options employ a different definition of when the distance between a cross-reference and its target is close enough that the number can be shortened, without becoming ambiguous. When an xref and its target are part of the same list, then the common part of the number derived from the list is not needed. To illustrate we need to make a small list with cross-references contained within.

    Small test
    1. (type-global) Flowers are not .
    2. (type-hybrid) Fish are not .
    3. (hybrid) Bacteria are not .
    4. (phrase-global) Fungi are not .
    5. (phrase-hybrid) Trees are not .
    6. Mammals.
    Be Rational About Numbering Variations

    With distinct numbering schemes for divisions, theorems, figures, equations, and citations, along with ten different text styles for a cross-reference, plus variants, per-cross-reference settings, and text overrides, there is a huge supply of combinations. Likely you can create some really ugly cross-references. Use the flexibility sensibly.

    Divisions

    A divisiondivision (or more carefully, a structural divisionstructural division) is a structured component of a book or article that would be recognized by most any reader. They are essential to the organization of a project. Notice that we use the generic term division, since a section is just one example of a division.

    Divisions are book, article, part, chapter, section, subsection, subsubsection, and paragraphs. Their use is fairly intuitive, though there are some restrictions, so please read on.

    A book must contain at least one part or at least one chapter, which may contain section, subsection, and subsubsection. A part simply contains a sequence of chapter and functions in two user-selectable ways: structural ( numbering will reset), or decorative (merely inserting a decorative page between two chapters and sectioning the Table of Contents).

    An article is simpler and shorter than a book. It might be really simple and have no divisions at all, or it may have sections. It cannot have chapters, as that would be a book. Within a section, subsections and subsubsections may follow.

    Divisions must nest properly and may not be skipped. So a section cannot contain a chapter and a subsection may not be contained in a chapter without an intervening section.

    A division must contain a title, and may contain one or more index entries (see ), which should appear before anything else. Any division may be unstructured, with just a sequence of top-level contenttop-level content such as paragraphs, figures, lists, theorems, Or a division may be structured, and in this case it must follow a prescribed pattern. There may be a single, optional introduction, filled with top-level content, followed by a sequence of at least one of the appropriate divisions, ending with a single, optional conclusion, filled with top-level content. It is an error to begin with a run of top-level content inside a division and then begin to use divisions. (The solution is to make the initial content an introduction and/or one or several divisions.)

    A book may be structured into parts. After the frontmatter and before the backmatter there may be a sequence of part. These elements may carry a title, and not much else, besides a substantial sequence of chapter. The main effect is to get an extra level of division in the Table of Contents. For print and PDF there is an entire page devoted to the title and number of the part. The default numbering is decorative, which means that the chapters are numbered consecutively from the start of the book and do not reset to one at the start of each part. It is as if the parts were not even there. The alternative is that parts are structural. Now each part begins with Chapter 1. There are other more subtle differences, such as cross-references use a part number if, and only if, the trip from the cross-reference to its target crosses a boundary of two parts. The two approaches to part structure may be set via the publication file, see .

    There are exceptions to the above. For one, paragraphs is an anomalous division, as a sort of lightweight sectioning command. It may appear in any division, at any location within a division, it may not be divided further (it is a leaf of the document tree), it never gets a number, and its title is formatted in a subsidiary way. I especially like to use this in a two- or three-page article that has no other divisions at all. It is also very useful as a way to subdivide portions of the front matter (), such as a preface. Typical presentation has the title in bold, without much change in font size (if at all), inline with the first paragraph, and perhaps a bit of vertical space as it begins and ends. Despite the name, it may contain more than just paragraphs, so may contain any top-level-content that would go in any other division.

    Specialized Divisions divisionspecialized specialized division

    There are six divisions that have specialized functions, and therefore have less generic names than ones like chapter or section. They are exercises, reading-questions, solutions, references, glossary, and worksheet. They have some features in common, such as having a title, but each is different from the other in substantial ways.

    Generally, a specialized division may be placed within any other division (), and it will behave like a subdivision of that division. Some may be placed in the back matter and may behave as a version relevant to the entire document. This section describes the specifics for each type of specialized division.

    (*) References (Lists of Works Cited)

    Glossary glossary

    A glossary is a list, in alphabetical order, of foreign or unfamiliar words, along with definitions.

    A glossary division may be placed inside any main matter division, and at most once in the backmatter. In either event, the Chicago Manual of Style indicates that it should be placed right before a references.

    After a title, index entries, and other metadata, a glossary division may begin with an optional headnote, which can use paragraphs to explain anything unusual about the construction of a particular glossary.

    The remainder of a glossary is a sequence of items to explain. Typically these are words, phrases, initialisms, or acronyms. Each item is a glossary item, enclosed in a shorthand gi element. The element must lead with a title, which is the term being explained. will provide a period after each defined word, so there should not be any punctuation in your source at this location. The term should not have any markup, unless the markup is used in every occurence of the term in the text. Similarly, a term is capitalized only if it is capitalized routinely in the text.

    The explanation itself follows, typically in a sequence of paragraphs, but unnumbered items, such as an image may also be used. It is the author's responsibility to create the list in alphabetical order. Automatic groupss (according to initial letter) are a pending feature request, perhaps especially for a final, overall, back matter glossary, much like an index. See GitHub #1971.

    Many of the preceding recommendations can be found in Chicago Manual of Style . For an example, see the glossary in the back matter of this Guide.

    (*) Worksheets

    Titles title

    Divisions always need titles, you accomplish this with a titletitle tag first thing. Almost everything that you can use in a paragraph can be used in a title, but a few constructions are banned, such as a displayed mathematical equation (for good reason). Try to avoid using footnotes in titles, even if we have tried to make them possible.

    A division will also support a single optional shorttitle and/or a single optional plaintitle. The full title will be used where the division is born, but in other places where the title is used for navigation, such as a Table of Contents, print page header, or HTML summary page, when horizontal space may be at a premium, the shortitle will be used preferentially.

    A plaintitle is similar, but slightly different, so you might want both. In limited situations, markup does not travel well in certain conversions. The best example is mathematics, which might be in a title of a division, and then in a conversion to HTML, will fail to render in the tab of a browser, or the list of open tabs for a browser window. Two examples <title><m>q</m>-crystalline cohomology</title> <title><m>\delta</m>-rings</title> will automatically do a nice job for you with the first, but the second will retain \delta in a browser tab. However, you can add a plaintitle element where the \delta can be replaced by a Unicode delta (U+03B4), which will used preferentially and be fine in HTML output.

    To avoid confusing your readers, use these alternate titles sparingly, and ideally only when you have a really, really, really long title and then use a short title that is easily recognizable as a variant of the long title, or when markup is behaving poorly in situations such as a browser tab. Your first option should be to ask if your long title must absolutely be so long, or if the markup is strictly necessary.

    Many, many other structures admit titles. Experiment, or look at specific descriptions of the structure you are interested in. Titles are very integral to , much like cross-references. Titles migrate to the Table of Contents, get used in page headers for print output, can be used in lists (such as a List of Figures), and can be used as the text of a cross-reference, instead of a number. You might not be inclined to give a remark a title, but it would be good practice to do so. If you use knowls in your HTML output for structures such as example (or if somebody else may someday choose to), then your readers will be spared a lot of confusion if you supply informative titles for each. Your electronic outputs will be much more useful to your readers if you routinely title every structure that allows it (perhaps excepting exercise which can be known by their number).

    If a title is very long, the line element can be used to indicate how the title should appear on multiple lines. Note: does not apply to all output formats. titlevery long line

    Provide Informative Titles Liberally

    Provisions for titles in many situations is a key feature. And then they are used for various purposes to benefit readers. A good example is when the HTML conversion is used to place content in a knowl, a unit of content that begins hidden, but can be revealed (and hidden again) with one click of a mouse. Since a reader cannot see the content originally, we will migrate a title into the clickable text. But we cannot read your mindit is your job as the author to provide a title, and to provide a good one.

    Even if you are not yet sure what a knowl is, and even if you think you do not want to use them, there are other good reasons to have a title (such as automatic lists, see ). Constructing them on-the-fly is much easier than making a big chore out of going back and doing it later.

  • Bad

    Example 5.10

  • Better

    Example 5.10 A cool lizard trick.

  • Best

    Example 5.10 Various colors and markings of a chameleon.

  • Mathematics mathematics

    As mentioned in the overview, , we use syntax for mathematics. In order to allow for quality display in HTML, and other electronic formats, this limits us to the subset of supported by the very capable MathJax Javascript library. Generally this looks like the amsmathamsmath package maintained by the American Mathematical Society at their AMS-LaTeX page. For a complete and precise list of what MathJax supports, see MathJax's Supported / commands. Once you have digested this more general section, be sure to also consult for some very specific suggestions.

    Inline Mathematics

    Use the m to place variables or very short expressions within a sentence of a paragraph, the content of a title, a cell of a table, a footnote, or other similar locations of sentence-like text. You cannot cross-reference this text, nor make a knowl with it. Though you can typically cross-reference a containing element.

    Do not use -isms like \displaystyle to try to end-run the inline nature. It will just lead to poor results.

    Keep Inline Mathematics Short

    Longer mathematical expressions in an m element can lead to awkward line breaks, both in HTML output, and especially in PDF generated from . And complicated fractions or integrals can introduce abnormal line-spacing that is distracting to a reader. As a rough rule-of-thumb, keep an inline expression shorter than a moderately-long regular word and avoid tall constructions. This should allow 's line-breaking algorithms the best chance of success.

    So a simple, short equality such as x=2 should not cause a problem, but if you want to claim that the probability distribution of the normal distribution has the right scaling factors, \int_{-\infty}^{\infty}\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{1}{2}\frac{\left(x-\mu\right)^2}{\sigma}} dx = 1, there is a good chance it will do less harm to your paragraph of you display it \int_{-\infty}^{\infty}\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{1}{2}\frac{\left(x-\mu\right)^2}{\sigma}} dx = 1 using the md element described next.

    One-Line Display Mathematics

    The md element can be used for longer expressions or a single equation. Typically you will get vertical separation above and below, and the contents will be centered. See below about concluding periods (and other punctuation), and alignment. To number the expression, use the number attribute with the value set to yes. And once numbered, the expression can be the target of a cross-reference (xref), if you also add a xml:id attribute.

    A symbolic local tag may instead be requested with the tag attribute, using the same set of symbol names as on an mrow; see . Since a tag stands in for a number, the tag and number attributes are mutually exclusive on a one-line md.

    Multi-line Display Mathematics

    We begin with the md element, but now used as a container. Within the container, content, on a per-line basis, goes into a mrow element. You can think of mrow as being very similar to a one-line md that does not have additional structure. In a align environment, the \\ marks the end of a displayed line. In each mrow delimits a displayed line, and there are no \\s. Use \amp to mark the alignment point. aligned math\amp, math alignment

    On any given mrow you can place the number attribute, with allowable values of yes and no. These will typically be used to override the behavior you might place on the md container, via an overall number attribute, but there is no harm if they are redundant. A given line of the display may be the target of a cross-reference (xref) via an xml:id attribute, though the numbering flexibility means you can try (and fail) to target an unnumbered equation.

    An mrow may have a tag attribute in place of a number attribute. This will create a number on the equation which is just a symbol. This is meant for situations where you do not want to use numbers, and the resulting cross-reference is local. In other words, the xref and its target are not far apart, such as maybe within the same example or the same proof. Allowable values for the attribute are: star, dstar, tstar, dagger, ddagger, tdagger, daggerdbl, ddaggerdbl, tdaggerdbl, hash, dhash, thash, maltese, dmaltese, tmaltese These are the names of symbols, with prefixes where the prefix d means double, and the prefix t means triple. Cross-references to these tagged equations happens in the usual way and should behave as expected. See and for more on cross-references.

    Finally, the default is to not number displayed expressions. If you want every displayed expression numbered, or you find yourself electing to number the majority of the displayed expressions, then there is a global default. In your docinfo element, put a equations attribute on the numbering element, and set its value to yes, rather than the default no.

    Exceptional Characters

    The macros, \amp, \lt, and \gt are always available within these mathematics elements, so that you can avoid the exceptional XML characters &, < and >. See for this same information, but in the broader context of your entire document.

    Text in Mathematics

    Once in a while, you need a little bit of regular text within an expression and you do not want it to look like a product of a bunch of one-letter variables. Use the \text{} macro for these. Only. Other ways of switching out of math-mode and into some sort of regular text will appear inferior, and can raise errors in certain conversions.

    • Do place surrounding spaces inside the \text{} macro.
    • Do not place any mathematics inside the \text{} macro.
    • Do not use the \mbox{} macro as a substitute.
    • Do not use font-changing commands ( \rm) as a substitute.

    For example, <me>f(x) = \begin{cases} x^2 \amp \text{if } x\gt 0\\ -7 \amp \text{otherwise} \end{cases}</me> produces f(x) = \begin{cases}x^2\amp\text{if }x\gt 0\\-7\amp\text{otherwise}\end{cases}. This example amply illustrates the use of macros for XML exceptional characters (twice), appropriate use of the \text{} macro (twice), spaces in the \text{} macro (once), sentence-ending punctuation (see the source, the period is not inside the md element) and yes, we did think twice about the \\ (an exception to the rule).

    Color in Mathematics

    There is a temptation to use color to indicate or highlight portions of mathematics, especially for electronic outputs where color is easy and cheap. But before you leap, how will this work in black-and-white printed output? How will it work for a blind reader using a screen-reader or a braille version?

    With careful use of grouping ({...}) you can make the two behaviors of \color effective. For example, go: {\color{blue}{x^2}}

    Cross-References in Display Mathematics

    A cross-reference is achieved with the xref element, see . You can place an xref inside a mrow, and remarkably, it will do the right thing. This is one of only two XML elements you can mix-in with syntax. A typical use is to provide a justification or explanation for a step in a proof, derivation, or simplification. And it works best with alignment, see below.

    Alignment in Display Mathematics

    Displayed mathematics is implemented with the AMS- align environment. Ampersands are used to control this, so use the \amp macro for these. The first ampersand in a line or row is an alignment point, typically a symbol, like an equality. The next ampersand is a column separator, then the next is an alignment point, then a column separator, then The moral of the story is you should have n alignment points, with n-1 column separators, for a total of 2n-1 ampersandsalways an odd number.

    For example, <md> <mrow>A \amp = B \amp D \amp = E \amp \amp \text{Because}</mrow> <mrow> \amp = C \amp \amp = F \amp \amp <xref ref="txo" /></mrow> </md> produces A \amp = B \amp D \amp = E \amp \amp\text{Because} \amp = C \amp \amp = F \amp \amp .

    Sometimes you want several short equations on one line. Do not use the bare md. Instead use a single mrow inside an md, and use alignment to spread them out evenly.

    For multi-line display mathematics with no ampersands present, each line will be centered. This is implemented with the AMS- gather environment.

    You can fool the alignment behavior by hiding all your ampersands in macro definitions, so there is the optional alignment attribute for the md element, in order to force the right kind of alignment. Allowable values are gather, align, and alignat. The latter is similar to align, but no space is automatically provided between columns. You can leave it that way, or explicitly add your own. For example, this allows you to precisely arrange individual terms of a system of linear equations, especially when terms with zero coefficients are omitted. When using the alignat option tries to count ampersands to see how many columns you intend, since needs this number (we are not sure why). This detection can be fooled too, especially if you have something like a matrix with lots of ampersands for other purposes. So set the alignat-columns attribute to the number of intended columns, if necessary.

    If you have many aligned equation in a single md, but want to add a short sentence or two somewhere in the middle, place it in an intertext element, and keep it simple. Just some words and punctuation, plus maybe some elements like em or q, but nothing like a list. In PDF output constructed via the alignment will be preserved across the break for the intertext (since this feature is inspired by 's \intertext{} macro). Unfortunately, this is too complicated in other (electronic) output formats, so we just do the best we can to preserve your intent. Perhaps some day, MathJax will be more capable, and we can make your source do better.

    Commutative Diagrams

    Commutative diagrams may be authored using the AMS amscd package. While restricted in some ways, such as the lack of sloped or curved arrows, it has one important advantage over more general drawing tools. Support for HTML output comes from MathJax, and hence has accessible versions included in the output.

    Typical use would be within an md element, so starting with \begin{CD}. Despite this being multi-line output, we have not chosen to integrate it within the more general md/mrow structure, but that decision can be revisited.

    Fill-In Blanks in Mathematics

    The other mix-in XML element is fillin. It may use a fill attribute with some math string to determine width, height, and depth of the blank. Or it may use a characters attribute that takes an integer value to hint at the width.

    Page Breaks for Tall Display Mathematics

    For print output, do nothing additional and will do its best to break your display between lines. You can turn this behavior off by setting the break attribute on the md to the value no. Once you do this, you can then selectively allow a page break after a given mrow by setting the break attribute on the mrow to the value yes.

    Your Macros

    These go in the docinfo section, wrapped in a macrosmacro element. Keep them simpleone or two arguments, and one-line definitions. This is not the place to be fancy, and not the place to try to end-run the structural aspects of . The idea is to define something like \adjoint{A} for the matrix A to be a superscript asterisk, and later you can change your mind and use a superscript dagger instead. Keep in the spirit of and use readable, semantic macros. For example, do not use \a{A} for the adjoint of A. Repeating: keep your macros simmple, and to a single line.

    will use your macros correctly for print and for HTML, after erasing whitespace from the left margin, and stripping comments.

    The name of your macros also cannot contain any numbers, otherwise MathJax will silently fail and may not read any subsequent macros you might have. This is important because will place custom macros for you at the end of your own, defined at , to be used. Those would fail to be processed by MathJax if your own macros caused it to stop reading.

    Semantic Macros

    We have resisted using overly-verbose MathML for mathematics, or worse, inventing our own XML vocabulary for mathematics. syntax generally works great, but to work even better within an author needs to take a few extra steps. Your work will translate better to a variety of formats, and will be easier to maintain, with well-designed macros. A well-designed macro will convey the mathematical meaning of the object to a reader of your source, without them looking at your definition of the macro. In situations where a mathematical object might be written with different notation, it should be trivial to change the macro's definition and preserve the mathematical meaning. For example, consider two versions of a binomial coefficient: &{n\choose r} & &\operatorname{C}(n,r) which could both equally well be the realization of \binomial{n}{r}.

    Here we describe some notation which often carries multiple mathematical meanings and/or may be created with in multiple ways.

    Vertical Bars

    Vertical bars are used for a variety of mathematical objects. Paired to create functions of expressions: absolute value, \left\lvert x-1\right\rvert; norm of a vector, \left\lVert \mathbf{v}\right\rVert; cardinality of a set, \left\lvert X\right\rvert; and the determinant of a matrix, \left\lvert A^k\right\rvert. As relations: division, a\mid b; parallel lines L_1\parallel L_2. Sets are another use: E=\left\{x\in{\mathbb Z}\,\middle\vert\, x\equiv 0\pmod 2\right\}.

    \vert, \Vert, \lvert, \rvert, \lVert, \rVert are the delimiters, where l and r refer to left and right, and the capitalized versions are a pair of vertical lines. The qualifiers \left and \right can be used to have the length of the bar grow to match what it encloses. Note that there is a \middle that we have used above with \vert for the set E, and we have added space on either side. \mid and \parallel are relations, used above to indicate divisibility and parallel lines, and so automatically get an extra bit of spacing on either side.

    When using \left or \right in isolation, \left. or \right. can be used to define a group that only has a bar on one end. For example: \int_0^1\,\sin^{-1}(x)\,dx = \left.\frac{1}{\sqrt{1-x^2}}\right\rvert_{x=0}^{x=1} .

    Times

    The times symbol sees many uses that are different: dimensions, multiplication, and more complicated products (such as a Cartesian product of two sets). Macros \product, \times, and by could carry different meanings, even if each one is defined by the \times symbol, \times. For example:

                    Chess is played on an <m>8 \by 8</m> grid, which
                    contains <m>8 \times 8 = 64</m> little squares.
                    
                    If <m>G</m> and <m>H</m> are finite groups, then
                    <m>\card(G \product H) = \card(G) \times \card(H)</m>.
                    
    Punctuation After Display Math

    If a chunk of displayed math concludes a sentence, then the sentence-ending punctuation should appear at the conclusion of the display. (And certainly not at the start of the first line after the display!) But do not author the punctuation within the mathematics element, put it afterwards, where it logically belongs.

    More specifically, place a sentence-ending period (say) immediately after the closing of an md element. will place the period in your output in the right place and in the right way. (By using 's \text{} macro, if you are curious to know the details.) Here is an example. The XML source <md> <mrow>(a+b)^2</mrow> </md>. Now... will render as (a+b)^2 . Now

    This all applies more generally to clause-ending punctuation, such as a comma. Take notice of the requirement that the punctuation must be immediately after the closing tag of the math element, otherwise it will not migrate properly. For example, do not interrupt the flow with whitespace, or an XML comment, or anything else.

    For inline mathematics (the m element) the same authoring principle holds, though you would likely do this naturally. Author the punctuation outside the element, where it will remain.

    Here is a technical subtlety that will demonstrate some of the inner machinery of and our conversions. In your work, locate a theorem that has some numbered display mathematics (md) which is at the end of a sentence, and which you have authored as described above. In HTML output, test a cross-reference (xref) to the theorem and you will see the period for the end of the sentence at the end of the display, where it should be. Now test a cross-reference (xref) to one of the numbered equations. First, the knowl will contain the entire display, to provide context, but it also will not contain the period, since the rest of the sentence is not in the knowl and so the period is not necessary.

    Authoring Punctuation after Mathematics

    Always follow the instructions in about placing all punctuation following mathematics after the math element, not inside it. will do the right thing for display math for you. But furthermore, there are some special situations where the output format is not visual, such as braille or audio, where the placement of the punctuation is both different and important to not confuse reader. You can help ensure your various outputs are of the highest quality by observing these sorts of details.

    Lists of Mathematical Expressions

    It is common to make lists of expressions, equations, or identities. Think of the definitions of trigonometric functions, a collection of antiderivatives, or a compendium of generating functions.

    In these situations, author a list item, li, within an ol or ul, by using only the necessary m element. Do not use an intervening p, and do not include any adjacent text. Whitespace is OK. Then will add 's \displaystyle command to improve the visual appearance of the mathematics, and so you do not need to.

    If you prefer to not have this behavior, insert an intervening p, and output will be identical, but without the \displaystyle.

    Note that any text, other than whitespace, outside the m tag will disable this feature, including punctuation. However, according to the Chicago Manual of Style , Items carry no closing punctuation unless they consist of complete sentences. So that comma at the end of your equation probably doesn't belong there anyway.

    <latex/> Packages, MathJax Extensions LaTeX packages MathJax extensions extensionsMathJax packagesLaTeX

    , which we use as the syntax for mathematics, allows extensive customization through packages, which are enabled through a \usepackage{} macro. Packages also provide extensive customization or control over the document structure. Thus, provides support for additional packages to enhance mathematical content, but does not have any facility beyond this (e.g. to influence or support document structure).

    We use to create PDF and print output. For most other electronic formats, we use MathJax to embed mathematics onto a web page or to make images of mathematics used in EPUB, and so on. MathJax has extensions, which mimic certain packages. For a list of supported extensions see MathJax's TeX/LaTeX Extension List. Note that some of these extensions are technical (not supporting mathematical syntax) and some we load already as part of setting up MathJax, so carefully evaluate how a given package is selected to support certain macros.

    Suppose there is a math-mode macro you would like to use. We will illustrate with the \cancelto macro that is part of the fairly standard cancel package. It will draw an arrow through a mathematical formula, with a replacement value. Conveniently, MathJax has a cancel extension, and this extension also defines the \cancelto macro. You need to check this, as a package and a MathJax extension are not guaranteed to define the same collection of macros. Nor are the two guaranteed to have the same name (though this is best practice).

    To make the \cancelto macro available and active in your mathematical elements (m or md) add the following to your docinfo element: <math-package latex-name="cancel" mathjax-name="cancel"/> Now you may freely use the \cancelto macro in your mathematics, confident that it will render correctly in all output formats.

    Note that both attributes latex-name and mathjax-name must be present. They may be identical (as above, and typical) or they may be different (rare). There are situations where one might be empty. Of course, you can use these macros in other definitions of mathematics macros you might make (). However, we do not guarantee the absence of conflicts with other packages in use, even if employed by . Nor do we support debugging such conflicts.

    If there are macros you desire, but without a MathJax implementation, then there is not much we can do, short of suggesting you write your own extension (not recommended, see A Custom Extension). There are some workarounds which we may document shortly.

    Mathematics in Titles

    Titles are a key feature of , and migrate to various places in different conversions, where they might be mixed with bold text, or where they do not render properly. Please report any substandard situations. A good example of this phenomenon is mathematics in division titles, where we provide a plaintitle alternate. See for a complete discussion.

    Extras

    We were once in the business of supporting extra macros for mathematics, but have discontinued that practice (in a mostly backward-compatible way).

    We are moving away from built-in automatic support for the \sfrac{}{} macro. As of 2023-10-18 you may use this macro, but results will just look like regular inline fractions. However, you can get superior typesetting in PDF output by loading the xfrac package with the following in docinfo: <math-package latex-name="xfrac" mathjax-name=""/> See the for more details.

    Historically, we provided good internal support for the extpfeil package of extensible arrows, even though the version has some severe shortcomings. As of 2023-10-19, it is now an author's responsibility to elect this package, along with the reliable MathJax extension of the same name. And as of 2026-03-04 we have removed all attempts at backward-compatibility. Add to docinfo: <math-package latex-name="extpfeil" mathjax-name="extpfeil"/> See the for more details. Note that this package can have several adverse impacts on the conversion to PDF via .

    Notes

    As mentioned at the start of this section, your use of needs to also be supported by MathJax so that it may be rendered as part of an HTML page displayed in a web broswer. In addition to the information at the start of , this subsection has some notes that may help you navigate this situation.

    1. Generally, MathJax supports commands available in the amsmath package.
    2. You can construct, and use, your own macros, but only for mathematics, not for document structure or document management. See .
    3. Support for loading extra packages is extremely limited. See .
    4. The \matrix{} command, and its friends (such as \pmatrix{}) are not supported by , despite being recognized by MathJax. So use environments like \begin{matrix} and \begin{pmatrix} (with their corresponding \end{}, of course) and you will get accurate results for both formats.

    Mathematics Best Practices mathematicsbest practices

    This section addresses some finer points of authoring mathematics with , motivated in large part by helping MathJax create the most accessible output possible, which in many instances will also create a superior typographical result across all conversions. We try to provide justification and explanation, though that might not be easy in all cases. Some are definitely technical, and we are only aware of them from authors' experience and reports. Many are meant to help in the conversion to braille. This is an incomplete list so additional reports and additions are welcome.

    Large Numbers

    Using a separator to aid in reading a large number should avoid using a space as a separator. So 234{,}766{,}544 or 234.766.544 is preferable to 234\,766\,544. We have used braces around the commas in the first instance, and a thin space, \, , in the last instance.) For 234{,}766{,}544, braces around each comma prevents automatic trailing space that would normally be desirable in a list of numbers. In other words, author as: <m>234{,}766{,}544</m> Here is the version with commas and no effort to distinguish the big number from a list of smaller numbers: 234,766,544.

    Ratios

    If you really intend to communicate a ratio with a colon, keep it super-simple, like 3:2 or a:b. Do not wrap it in parentheses or other decorations, since then the colon will be communicated literally in braille. For example, the index of a subgroup, [G:H], will not be confused with a ratio, due to the brackets. But (4:5) will not be output in a conversion to braille in a way that communicates that it is a ratio. If you keep your ratios simple, braille output will use special syntax designed for ratios.

    Function and Operator Names

    Common mathematical functions, like \sin (\sin) and \det (\det), are built into , well-known, and commonly used. Compare with the versions authored as simple sequences of letters sin and det, which interprets (and typesets) as a product of three individual variables.

    Instead, use the \DeclareMathOperator macro as we will illustrate. Suppose you want to discuss the set of homomorphisms from the vector space U to the vector space V, \Hom{U}{V}. Define the macros \DeclareMathOperator{\homop}{Hom} \newcommand{\Hom}[2]{\homop\left(#1,\,#2\right)} and employ as \Hom{U}{V}, which yields \Hom{U}{V}. Compare with the no-macro, no-special-care, version, Hom(U,V). Grouping Hom as a unit will prevent from rendering it as a product of three variables, use the correct font, and will preserve the meaning in Nemeth braille. Notice that the \homop macro is never used in your source.

    Directly contradicting this general advice, Sean Fitzpatrick reports on 2021-01-06 that the macro construction \newcommand{\foo}{\operatorname{foo}} behaves better in Asymptote diagrams than \DeclareMathOperator{\foo}{foo} So perhaps you need to define a second macro for use in Asymptote diagrams.

    Permutations in Cycle Notation

    The permutation in cycle notation, (1246)(35), is difficult to distinguish from a product of two integers and gets entirely different treatment than intended as Nemeth braille. And when the points of the permutation group involve multiple digits, some other notation will become necessary anyway. Commas work, as in (1,2,4,6)(3,5). Or if commas look too cluttered, then spaces are possible, as in (1\;2\;4\;6)(3\;5), where we have used the medium space, \; .

    Text in Math

    We have discussed this one already, but it is important for a conversion to braille. If you use a word inside of math, such as describing a condition for membership in a set, put any spaces inside of a \text{} macro, not on either side of it. So \text{ and } is preferable to \ \text{and}\ . Similarly, do not put any math inside a \text{} macro. For example, \text{ for -3 \lt x \lt -2 } will lead to poor results due to the inequalties mixed in with the text. A better version would be \text{ for }-3 \lt x \lt -2 and now the numbers will be treated as mathematics. Review for more details.

    Math as Text

    Do not use symbols from mathematics in non-mathematical situations such as the construction 73^\circ to indicate a temperature in degrees, outside of a mathematical or scientific setting, such as in a poem about springtime weather. In this particular case, we provide a degree element that can be used in non-mathematical contexts, so we can get 73, which will behave well in a variety of conversions (and can also be used for latitude and longitude in your poem). Similarly, we advocate writing ordinal numbers with text on the baseline, rather than a construction like 2^\mathrm{nd}. So use 1st, 2nd, 3rd, 4th, etc.

    Avoid Nesting

    It may seem convenient to nest custom macro definitions. For example: \newcommand{\makered}[1]{{\color{red}{#1}}} \newcommand{\MAKERED}[1]{\textbf{\makered{#1}}} The second macro definition uses the first macro. At least one conversion isolates macro defintions for use only on an as-needed basis. So here, if the author used \MAKERED without also using \makered close nearby, it would lead to an issue under that conversion, because \makered would be locally undefined. So we recommend defining each macro from the ground up. In this case: \newcommand{\MAKERED}[1]{\textbf{\color{red}{#1}}} This also contradicts our advice above on operator names.

    Lists list listlabel

    A list is an unusual construction, even if everybody knows exactly what one is. We view the list itself as a container of various chunks of text, while those chunks of text are the list items. Each item has a marker to identify it.

    Markup and processing is complicated by the possibility of a list item containing a list, resulting in nested lists. We simplify this problem by requiring that a list appear within a paragraph (p), see . One of the three exceptions is the possibility to place a list into a block that earns a caption and a number, using the list element, see .

    The final subsection contains some examples that you may wish to consult as you read this section.

    Ordered, Unordered, Description Lists

    An ordered list has items with markers that are naturally ordered (usually numerically or alphabetically). We borrow from HTML, and use the ol tag to construct an ordered list. Some commentators suggest an ordered list should only be used when the order of the content is important. So the steps in a recipe would belong in an ordered list, but the shopping list when you go to the store need not be an ordered list.

    An unordered list has items with markers that have no inherent order and so are usually symbols like circles, disks, squares, We borrow from HTML, and use the ul tag to construct an unordered list.

    A description list has items that have short pieces of text as their markers. We borrow from HTML, and use the dl tag to construct a description list. However, unlike the HTML dl, the items in a description list are tagged with li. A title element within each li provides the term to be described (the dt in HTML terms) and the remaining elemens of the li provides the description (the dd in HTML.)

    Ordered lists are used as part of objectives () and exercises (). Any of the three lists may occur inside the list element (below, ). Otherwise, a list must occur within a paragraph, p. This means that to place a list within a list item of another list, the list item must contain a paragraph.

    List Markers

    Do nothing, and your ordered and unordered lists will get sensible default markers. They are consistent in the following sense. If your list has two items, and each of the two items contains a list, then these two lists will use the same type of marker.

    For a description list, you author each marker as part of each list item, as discussed below in the discussion of list items.

    If you want to change how an ordered list is marked, then you use the marker attribute on the ol, whose value is a format code. This string contains one of five codes (a single character), which may be surrounded by other characters, excluding the five codes. For example marker="(A)" will produce uppercase letters wrapped in parentheses: (A), (B), (C), . The extra formatting works well in a conversion to , but is not possible technically in a conversion to HTML, so it should be considered decorative, and not relied upon for meaning. The formatting does not carry through to the numbers of list items in cross-references.

    If you want to change how an unordered list is marked, then you use the marker attribute on the ul, whose value is a format code. This string contains one of three codes in the table below. Then every item of the list will have that symbol as its marker.

    Ordered List Markers CodeRealization 1Arabic numerals aLowercase letters iLowercase Roman numerals AUppercase letters IUppercase Roman numerals 0Arabic numerals, from zero
    Unordered List Markers CodeRealization discFilled small circle, aka a bullet circleSmall circle squareA square

    Default marker types are assigned to each level of nested lists in the order shown in the table, and cycle back to the top of the table if necessary, though zero-based Arabic numerals will be skipped for ordered lists.

    Start with the defaults, and experiment as needed. See the examples below for some extreme (and unwise) customizations of markers.

    For a description list, possible markers are more varied than what you can express within an attribute. So the list item must have a title element (see below). This should be very short text, and may contain inline mathematics. It is often rendered in bold, so be aware that some markup may get lost. Perhaps for obvious reasons, do not include footnotes, cross-references, or display mathematics. The dl element has a width attribute, with possible values narrow, medium, and wide. The default is narrow. This is a hint about how much text you have in these markers, and in certain presentations may make better use of horizontal space on a page.

    List Items

    So now you have a list all organized as a container. What do you put in it? List items, using the li tag, again borrowed from HTML, and independent of the type of list.

    A list item could be really simple, maybe just one or two words. Then you can use, and conceptualize, an li element as not much different from a p element, and the rules about content are not much different. Even several full sentences, with some intermediate displayed mathematics, is fine.

    But once you want two paragraphs in a list item, then you need to structure the contents of the item. So a list item might have five paragraphs in it, requiring five p elements. Notice that this is how you nest lists. Make a list item, include a paragraph, then put the subsidiary list into the paragraph. Indeed, this is the only way to nest lists. A consequence of this is that the only way to have an unstructured list item is if it is a terminal item, like the leaf of a tree.

    Other items may be interspersed among the paragraphs of a list item, such as a chunk of verbatim text delimited by a pre tag. But anything with a number, such as a figure or remark is banned, in part because the consequences for numbering and organization become too complicated. Imagine a remark, and a paragraph of the remark has a list. Fine so far. But if the items of that list can again contain remarks, the possibilities become endless. You should be able to include non-textual items, like an image, and work is underway to improve this. You can use a sidebyside in a structured list item, which can in turn hold an image, tabular, or similar. But you cannot place items in such a sidebyside that are numbered, so a figure or table is not possible. A general rule is no numbered components in a list item. Computational components, such as sage are also banned from list items due to the difficulty of converting them into electronic computational notebooks with a relatively flat structure.

    A list item of a description list must have a title element, to provide the text of the marker. Now that the list item has some structure, the remainder must also be structured, typically with some paragraphs, as discussed above. In other words, the earlier option of employing an li element just like a p element is not available in a description list. Further, given the complexity of presenting a description list, it can only be a top-level list. It can contain the two other types nested within its list items.

    For ordered and unordered lists, you may optionally include a title when you have structured the li. This will be rendered as a heading of sorts for the list item, though the only distinction might be a change to an italic or oblique font. As an example, this might be a good way to author a Frequently Asked Questions (FAQ).

    Note that a list item holding only an m element will get special treatment. See .

    Cross-References to List Content

    Note that a list is a container, so it cannot be the target of a cross-reference, and so the three types of lists cannot have an xml:id attribute. But you may well be able to point at some other structure (, a remark) with a paragraph containing a list of interest. If this seems overly restrictive, read below about named lists.

    By contrast, a list item, li, is not a container, and does contain content. Further, a list item of an ordered list has a marker that is natural text for a cross-reference. So in this situation, the list item can have an xml:id attribute. But note that the number of a list item of an ordered list, which is nested inside a list item of an unordered list, is not defined, so a cross-reference by number can fail.

    The number of a list item, mostly for the purposes of a cross-reference, is the concatenation of all of the individual markers in the containing lists, outermost first. For example, from the example lists below, the list item with content Walleye has number . These are indivisible, there is no way to get a component, excepting leading subsequences obtained by using an xml:id on a containing list item. Note that the format codes never become part of the number.

    Lists in Columns listcolumns

    You can control the number of columns used to layout an ordered or unordered list (but not a description list). On the ol or ul use a cols attribute with values 2 through 6. (1 is the default.)

    We do not yet (2018-03-28) have enough technical confidence to allow an author to specify a row-major order versus a column-major order for the layout. So understand that this is can be an implementation choice for a particular conversion, and can vary across implementations. If this is critical to conveying meaning, and not an aesthetic preference, then maybe consider using a table or tabular ().

    Use Only a Few Columns for Lists

    Anything more than three columns tends to get very crowded horizontally. Think twice about using more than that, and realize that six columns should be a ridiculously generous upper limit, and not a promise of good behavior in final output.

    Exceptional Lists

    We use the tags for lists in a few situations outside of anonymous lists inside paragraphs and named lists. These include the items within an objectives, subparts of an exercise, and within panels of a side-by-side. See those topics to learn about subtle differences in use.

    Examples of Lists

    To illustrate this section, we offer three too-elaborate examples. Take these as compact examples of what is possible, and not best practice in your writing. We also use these to illustrate cross-references to list items, see .

    We have a paragraph that begins with anonymous list of species that live in water (maybe partially), which necessarily is placed inside a paragraph. The roman numerals purposely do not have any extra adornment in the version (but may for HTML output).

    1. Amphibians

      1. Frog
      2. Salamander
      3. Newt
      4. Toad

    2. Freshwater Sport Fish

      1. Walleye
      2. Bass
      3. Exquisite Fish

        Trout

    3. Saltwater Sport Fish

      1. Salmon
      2. Halibut
      3. Marlin

    Within the same paragraph, we transition to an unordered, two-column, list of some germs:
    • Bacteria

      • Staphylococci
      • Streptococci
      • Salmonella

    • Viruses

      • Varicellovirus
      • Orthopoxvirus

    This sentence concludes our (small) paragraph on small and large organisms.

    A named list, only to test cross-references.

    A two-deep ordered list
      1. A and i
      2. A and ii

      1. B and a
      2. B and b
      3. A Test Title

        B and c

      1. C and I
      2. C and II
      3. C and III

    An example of a description list, anonymously in a paragraph.

  • Red

    The color of the sun at sunset.

  • Blue

    The color of a clear sky.

  • Aqua

    The color of shallow tropical waters.

  • <m>x^2 + y^2</m>

    Definitely not a color

  • Best Practice

    Lists are a very attractive device. Hopefully the discussion above has convinced you that they are more complicated than they first appear. Think carefully before using one, and consider if some other structure (paragraphs, sidebyside, a subdivision) might do a better job of organizing and communicating your meaning. And if a list is really necessary, consider if it should be named or anonymous, heavily-nested or nearly-flat, with columns, or with long or short content in the items. Cross-references from the items of a list to more complicated structures is another device that works well.

    Interactive Exercises interactive exercises exerciseinteractive

    has markup for a variety of interactive problem types, described individually in the subsections to follow. Generally, for a regular HTML build (), these will be interactive, informing the reader when their answer is correct, and providing feedback when their answer is not correct. When HTML is built to host on a Runestone server (), then student progress as part of a course will be recorded on the server. Some features, which will be noted below, such as execution of computer code, is more capable on a Runestone server.

    Generally, an interactive exercise is authored much like a regular exercise () with statement, hint, answer, solution. However, there is also some additional markup which serves as a signal that the exercise is more than a short-answer, or free-response, question. Usually, but not always, this signal is an additional element following statement. One consequence of this is that all but one type of interactive exercise will require a statement element to contain the question text.

    Each type of interactive question has a static version for use in output formats like print, PDF, or braille. Details are given below. Note that since the ability for instant evaluation of a reader's answer means an author provides the solution and other feedback, this can then be incorporated into a static version as an automatically-generated answer and/or solution (in addition to any others an author provides). Note that an author can provide a hint for use in all output formats, but there are not any automatically-generated hint for static versions of interactive problems. Visibility of these solutions can be controlled via the mechanism applicable to all exercises, see .

    Note the opportunity to provide feeback to the reader using a feedback element in various locations. These are generally optional, but highly encouraged as a way to improve the quality of your reader's experience.

    These interactive questions are enabled by software from Runestone Academy () and have extra capabilities when the online version of our output is hosted on Runestone servers. But you must use a label attribute. This is described more carefully next, so that we can make reference to it from other locations.

    Use <c>label</c> attribute for Runestone Components

    Many of our interactive exercises and programming environments are powered by software from Runestone Academy (). Not suprisingly, when you build online HTML for hosting on Runestone servers these components have more features than otherwise. This is managed by locating each component in a (massive) database. And so each exercise needs an identifier.

    You accomplish this by placing a unique value in a label attribute on an outermost element, such as an exercise, task, project, video, program, etc. You should choose these strings carefully, as they should not be changed, lest the database entries become confused. Under the hood, we get the content of docinfo/document-id element, and the edition attribute of document-id, to form a database identifier such as AATA_2_easy-exercise. The document-id distinguishes your book from other books, and the edition allows you some flexibility. In other words, if you declare a new edition, you can change some of your label as part of that process and you will get new database entries while preserving the old.

    Short answer: before hosting your project on Runestone, decide on permanent values for document-id, edition, and all necessary label. (We expect to add a warning for Runestone builds when these values are not set.)

    True/False Exercises true/false interactive exercisestrue/false exerciseinteractivetrue/false

    A True/False exercise must have a statement element, and this element must have a correct attribute, whose value is yes or no (there is no default value). That's it. The presence of the correct attribute is the signal that this is a True/False exercise.

    The text of the statement is the assertion the reader must determine is true or not. The correct attribute is how an author describes if the statment is true (yes) or false (no). This is enough information for a conversion to formulate a version of the question. An optional feedback element may follow the statement, and should provide more than a binary explanation of the exercise.

    Presentation as an interactive element will vary cosmetically, according to the output type targeted.

    A static version gets an automatic answer that is simply True or False. The automatic solution is the same, plus the content of feedback.

    Multiple-Choice Exercises multiple-choice exercises interactive exercisesmultiple-choice exerciseinteractivemultiple-choice

    A multiple-choice exercise is signaled by a choices element (plural) following a statement and preceding an optional hint. The choices element is structured by a sequence of choice elements, whose content is a potential answer for the reader to choose. So the statement is the prompt or question, and the choice are the possible answers.

    At least one choice has an attribute correct set to the value yes. The default value of correct is no. There may be several correct answers, indicated with this attribute. The presentation as an exercise with one answer or many is automatic. However, in the event there is exactly one correct answer, but you wish the reader to consider the possibility of multiple correct answers, you may set the multiple-correct attribute on the choices element to yes. The default value is no.

    Each choice element must be further structured with a statement and a feedback, which each can contain items such as paragraphs (p). In this way, the highly-encouraged feedback can be associated with each correct and incorrect choice.

    The order of the choice as authored, is the order they will be given in a static version. To present the choices in different orders in an interactive version, set the randomize attribute on the choices element to yes.

    An automatic answer for the static version is simply the list markers for the correct choices. An automatic solution has an indication for each choice if it is correct or incorrect, along with the choice's feedback.

    Parsons Problems Parsons problems interactive exercisesParsons problems exerciseinteractiveParsons problems mixed-up blocks exercises interactive exercisesmixed-up blocks exerciseinteractivemixed-up blocks

    Parsons problems are named for Dale Parsons, one of their creators, along with Patricia Haden. They could also be called mixed-up blocks. A reader is presented with a set of blocks containing text, either computer code or natural language, and their goal is to assemble the blocks into a correct order. This could be a computer problem with a stated purpose, or could be a logical argument such as proof, or it could be a procedure such as a recipe. An interactive drag-and-drip interface is a very efficient presentation for a reader.

    Similar to multiple-choice exercises, a statement is followed by a blocks element containing a sequence of block elements. The blocks element is the signal that this is a Parsons problem. The overall exercise element may have several attributes:

    • numbered set to left or right indicates the blocks should be numbered, and on which side the numbers go. The default value is no.
    • language set to natural indicates the text of the blocks is natural language, while the use of a computer language should be indicated by naming the actual language employed. A list of languages will soon be added in . The default is natural.
    • indentation set to hide indicates that a computer code exercise will not include indentation common to each line of a block. In other words, the problem is slightly harder, as the interactive interface will require the reader to adjust the block horizontally to provide common indentation for the block. The default is show.
    • adaptive set to yes enables an adaptive mode: after three incorrect attempts, the problem will offer help. After continued failures, the problem will be incrementally simplified: distractors will be removed, one at a time. For coding problems, requirements for indentation may be removed.

    A block that has natural content is authored as usual, with a sequence of paragraphs (p) or similar. If the content is a computer language, then it should be authored as a sequence of lines, using the cline element, which allows for precise interpretation of indentation and non-standard characters. Include all indentation necessary for each line, no matter how indentation is set. The content of the blocks, arranged properly, should form a syntactically correct program. If the reader is to provide indentation, will strip away the common amount of indentation.

    A block may be a distractor, meaning it is not to be used at all in the solution. Indicate this with a correct attribute on the block set to no (the default being yes). Furthermore, a given block of the solution can be authored with several alternatives, only one of which is correct. Indicate this by structuring a block with a sequence of choice. Each choice should be authored similarly to a block, and the one correct choice should have the correct attribute set to yes (the default being no).

    The blocks should be authored in the correct order and the interactive interface will control the randomization. A block that is a distractor may be placed in any location amidst the other blocks. Each block should have an @order attribute that is a whole number, counting from 1. This is the fixed, mixed-up, order that will be presented in any static rendition. In static versions, sequences of blocks are in lists, which are numbered if the attribute has been set, but the left/right distinction is lostall numbers are to the left. An automatic answer is provided if blocks are numbered, and it is just the block numbers in the correct order. An automatic solution is always generated with the text of the blocks listed in the correct order. For an exercise with computer code, the program element and the exercise's language attribute will produce a syntax-highlighted listing.

    There is no provision for a feedback element. Further explanation may be provided in a hint, answer, or solution. Also, a good interactive interface can provide assistance to a reader by telling them if they have too few or too many blocks, or combining or removing blocks, and so on.

    It is possible to specify a partial ordering of blocks using the name and depends attributes of block. name is used to assign the block a string identifier. depends should be a space-separated list of the name of each block that must precede the current block. The interactive version of the exercise will mark as correct any ordering of blocks that is valid according to the described dependencies. Static versions of the answer will only display the cannonical answer as determined by the order of the blocks in the source document.

    If a Parsons problem that has a language set to a value that is valid for an activecode (), it can be made runnable in interactive versions of the book - when the student completes the exercise, they can run the code they built. To do so, define a program element as a sibling to the blocks. The program can have all of the normal attributes for an activecode, but does not need the interactive attribute to be set. It should have an empty body as the student work will be used as its contents. If it is necessary to add additional code to the program, you can add either or both a program-preamble and program-postamble element as siblings to the program. The program-preamble will be placed before the student's code, and the program-postamble will be placed after the student's code. Both elements can have an indent with some text to use as the indentation for every line in the block; use this to align the added code to the expected format of a correct answer.

    Horizontal Parsons Problems Parsons problemshorizontal interactive exerciseshorizontal Parsons problems exerciseinteractivehorizontal Parsons problems mixed-up blocks exerciseshorizontal interactive exerciseshorizontal mixed-up blocks exerciseinteractivehorizontal mixed-up blocks

    A horizontal Parsons problem is very similar to the traditional vertical problems just described in . Except they are horizontal. Which means the blocks are very short (a word or symbol) and they are rearranged by the reader to form a horizontal bit of text. They are ideal for constructing a single line of computer code, such as a regular expression, or a short sentence. While similar, they have a few features which are different.

    To indicate a horizontal problem, set the layout attribute on the blocks element to the value horizontal. The default value is vertical and so is not necessary for the traditional versions.

    The syntax for blocks is the same, and they are authored in an order that yields a correct answer. The use of an order attribute on each block indicates a rearrangment to be used for a static version. Blocks may be reused. To do this, place an xml:id on a single instance of a block to be reused. Then, to indicate its reuse as part of a correct version, use a ref attribute on a block. Since the duplicate instance is not shown to the reader, the use of order and ref is mutually-exclusive. You can set the reuse attribute on the blocks element to the value yes to force the interface to allow the reader to reuse blocks, even if there is no duplication in the correct version. Otherwise, the interface reacts to the presence or absence of blocks with the ref attribute.

    Distractors may be included in the same manner as for vertical Parsons problems, by setting the correct attribute on a block to the value no. The default is yes. It does not make much sense to indicate a reusable block (in either form) as a distractor, so don't.

    Another option on the blocks element is the randomize attribute. The default value is yes. When the value is set to no, then the blocks are always presented to the reader in the same order, which is the one given by the order attribute.

    As of 2022-11-28, the implemenation of these problems assumes that the blocks rearrange to be computer code. So you can set the language attribute on the exercise element to natural, but it will not have much effect. Markup like em on the text of a block will be unpredictable, as will attempts to use mathematics. And the text of blocks will always be in a monospaced font, perhaps with some syntax highlighting if language is set properly.

    Matching Exercises matching exercises interactive exercisesmatching exerciseinteractivematching

    A matching exercise asks a reader to pair a premise with a response. Similar to multiple-choice exercises and Parsons problems, a matches element follows a statement and this is the signal. The matches element is structured as a sequence of match elements, each of which has a premise element and the matching response element. Since the content of each premise and response is best kept short and simple as a phrase, the elements may also be simple phrases without the additional structure of p elements, or similar. That's it.

    An interactive interface should randomize at least one of the lists of premises and responses, consulting the authored version for the correct pairings. For a static version, an author should put an order element on each match whose value is a whole number, starting from 1. Then the premise will appear in the authored order, while the response will be re-ordered according to the attribute.

    A single feedback element may be given, as a peer of statement, in addition to authored hint, answer, or solution. For a static version an automatic solution presents the problem in the order the match were authored.

    Clickable Area Exercises clickable area exercises interactive exercisesclickable area exerciseinteractiveclickable area select text exercises interactive exercisesselect text exerciseinteractiveselect text

    Clickable Area is a misnomer, assuming an interactive version of this type of problem. Perhaps Select Text would be better. In any event area is not meant to connote a geometric notion, instead this is about a sequence of characters, either in natural language or in computer code.

    A statement is a prompt, describing which sort of areas should be selected by the reader. Such as: Locate all the nouns in the following paragraph. This is followed by an areas element, which is the signal for this type of exercise. The areas element holds either (a) paragraphs or similar, or (b) a sequence of cline, understood to be program code. In the latter case, a language attribute on the areas element will enable the right syntax highlighting in some output formats.

    Within the content of the areas element an area element can be used to surround a run of characters. These cannot cross XML boundaries, such as a cline or p. A correct attribute, with values yes or no, indicates the text is to be selected (clicked on) or that it is a distractor (tempting to click on). The default is yes, so only distractors need to be indicated.

    A single overall feedback may be placed following the areas element.

    Now an interactive version will allow the reader to click on and off the marked areas of text, and provide information about which are correct and which are not, in addition to general feedback.

    Generally, a static version of the problem will not be clickable. wink So your prompt might say something generic like select or locate since a reader might work the problem on paper by circling or underlining the areas. A static version includes an automatic answer which is a list of the correct areas as text, followed by a list of the incorrect areas as text. An automatic solution repeats the text in the areas element, and uses (accessible) visual cues to note the correct and incorrect text.

    Fill-in-the-Blanks Exercises fill-in exercises interactive exercisesfill-in exerciseinteractivefill-in

    A fill-in-the-blank problem allows the reader to submit free text that is evaluated for correctness. The signal for a fill-in problem is a statement containing a sequence of fillin elements with a sibling evaluation element. Randomized elements to appear in the statement and solution and to be used in evaluation of reader responses requires the presence of an additional setup element that is also a sibling to the statement. The presence of the setup provides the ability for the statement and evaluation of the responses to incorporate random, dynamically generated elements.

    The body of the statement is the same as for any exercise-like statement, with the addition of two elements of markup. A fillin is placed at the location a blank would be required for the reader's response. Details for this element are described in the next paragraph. When the question includes a setup, content can reference the string or TeX representation of the object (if defined) by using a eval element, where the name of the object is provided by a object attribute.

    The fillin element is required to have an answer attribute that contains an answer that would be evaluated as correct, in the case that the question has a known, static, valid answer, or an ansobj attribute that contains the variable name of a dynamically generated object representing a correct answer, in the case that the problem has an associated setup. In addition, the fillin is required to have a @mode that characterizes the mode by which the submitted answer will be parsed. Current possible modes are string, number, and math (only for the dynamic implementation). The fillin element may have a width attribute specifying the number of characters for the static-version blank. For questions that involve dynamic evaluation, a name attribute may be used to identify a variable name that will reference the reader's response during dynamic evaluation of other blanks. (A standard ans variable will always be available in the context of each individual response's evaluation.)

    The evaluation block will have a sequence of evaluate elements, one associated with each of the corresponding fillin elements appearing in the statement. By default, the association is by order. If each fillin has an associated name, the association does not need to be in order. Within each evaluate element, there will be a sequence of test elements that define a comparison rule for the test and the associated feedback provided when the test evaluates as true. Default behavior is that the answer or ansobj attribute of the corresponding fillin is used for comparison to evaluate a correct response. If the author wishes to override this default or wishes to provide specific feedback for a correct response which will also be used for the automatic solution for static versions, the author will identify one test element with the attribute correct="yes".

    Within each test, the author needs to specify which type of comparison will be used. For non-dynamic questions, three comparisons are available: numcmp, strcmp, and jscmp. For dynamic questions that include setup, additional options include mathcmp comparisons involving math objects and logic elements to construct more complex boolean tests involving these objects, described later. Feedback that is provided to the reader when the comparison is true, beyond saying the response is correct/incorrect, is provided in a feedback element which can itself contain structured text including eval elements to reference dynamically generated objects.

    A numcmp and a strcmp can specify that the comparison should be to match the provided answer for the corresponding fillin by including the attribute use-answer="yes". Otherwise, these comparisons must specify the value being compared. A numcmp provides this with an attribute value that indicates the matching value. If the numcmp includes the optional tolerance attribute, any response in the range of from the given value plus or minus the tolerance will be accepted. Alternatively, the numcmp can directly provide a min and max attribute to specify an arbitrary interval. A strcmp that does not include the use-answer will have content that defines a matching string or more generally a matching regular-expression. By default, augments the provided string to match the entire response after stripping leading and trailing white space. The attribute strip="no" overrides this behavior so that, for example, the match can look for the presence of a pattern within the response rather than matching the entire response. In addition, the attribute case="insensitive" makes the regular expression ignore case during the comparison.

    A comparison involving jscmp allows the author to provide arbitrary Javascript code that will evaluate to either true/false or a string containing feedback for a valid match, where the reader's evaluated response is available as a variable ans and all of the reader's responses are in an array ans_array. This allows custom evaluation that can allow the evaluation of one blank to depend on what was answered in another blank. The Javascript is evaluated in the context of a local, anonymous function. Nevertheless, the author should take care that no commands are included that invoke mutable side-effects.

    To create dynamic, randomizable versions of a fill-in-the-blank question, a setup element is required as a sibling of the statement and evaluation elements. For the interactive version of these questions, the problem will created with a random number generator initialized with a seed that is stored by the Runestone Component for the reader. This results in the reader seeing the same version the next time they open the question. A button allowing the reader to request a new randomized version changes the seed and regenerates the question. Static representations need to provide consistent versions each time, so the setup requires a seed attribute.

    Within the setup, the author provides statements that will initialize Javascript objects that will be accessible in the statement, solution, and evaluation elements. The author can provide Javascript code within a setupScript child of the setup. It is likely that the script contents will need to be escaped to avoid XML conflicts, for example by individually escaping problematic characters or surrounding the code with <![CDATA[...]]>. In the context in which the script runs, there is an object v representing the dynamic variable namespace. Any object that the author wants to access should be created as a member of that object, such as v.myObject = .... The name myObject could then be used (without reference to v) in an ansobj attribute of a fillin, in an object attribute of an eval or directly in a jscmp comparison.

    To provide randomization, a random number generator based on the current seed is available in the setupScript using the object name RNG. The RNG object includes the following methods for generating various types of random values.

    1. RNG.random(): Uniform random values between 0 and 1.
    2. RNG.randSign(): Random values +1 and -1.
    3. RNG.randInt(a,b): Random integer from a,a+1,a+2,\ldots,b.
    4. RNG.randUniform(a,b): Random floating value a < x < b.
    5. RNG.randDiscrete(a,b,dx,nonzero): Random value x from a,a+dx,a+2dx,\ldots with x \le b. If nonzero=true (optional parameter), then x=0 is excluded.
    Using this generator will ensure that subsequent visits by the reader to the question will see the same version.

    If the author wishes for reader responses to be parsed to assess format prior to evaluating correctness, setupScript should include a declaration of an entry v.types. The value can either be a single parser function applied to all blanks or an array of separate parser functions, one for each fillin. A parser function takes a string representing the response for the blank and returns the parsed object. If there is an error in the structure of the response, the function should throw new TypeError(errMsg), and the errMsg will be provided as feedback for the response without performing any of the tests.

    The Runestone Component that implements interactivity takes the HTML generated from the statement after the setup is processed and performs substitutions of any eval elements. The recomputed HTML is then inserted into live webpage. A postRenderScript entry in setup can be used as a second script that runs as a call-back after this substitution occurs. Such a script would be useful if the script requires access to the actual webpage elements and not just defining objects for the evaluation context.

    Math Objects in Dynamic Problems

    A Javascript library that supports some mathematical objects in the dynamic setup and evaluation of fill-in-the-blank problems. In order to access these objects, an XML-interface is provided to interact with the objects in the setup and evaluation elements. Any fillin elements expecting to parse as mathematical objects should use mode="math" and assign ansobj to the name of a dynamic expression object created in setup that represents a correct answer.

    For the setup stage, a sequence of de-object elements can be used to define mathematical dynamic expression objects. Each de-object will have a name attribute representing the object name. The mathematical nature of the de-object is indicated with a context attribute. Currently supported expression types are to represent numbers using context="number" and formulas using context="formula".

    The content of the de-object element is an XML element that defines the actual expression. The following choices are available, described in the following paragraphs:

    1. de-random: create a randomly generated number
    2. de-number: create a number by providing its value or formula
    3. de-expression: create an expression or formula involving variables by directly providing a formula or by performing a substitution or a derivative on a previously-defined expression object
    4. de-evaluate: create a number by evaluating an expression object by replacing each variable with a specified number value
    As elements are defined in sequence, formulas used at any stage may include the name of any previously generated object as a valid symbol in the formula.

    To define a random number, use a de-random element. The same random number generation routines provided by the RNG object are accessible through this element using a distribution attribute and additional attributes for the distribution parameters, some of which come with default values.

    1. distribution="uniform": Parameters are min=0, max=1 as decimal values. Gives a value from the interval (\mathrm{min},\mathrm{max}.
    2. distribution="sign": No parameters. Gives \pm 1 as possible values.
    3. distribution="integer": Parameters are min, max as integer values. Value is an integer chosen inclusively between \mathrm{min} and \mathrm{max}.
    4. distribution="discrete": Parameters include min, max, by="1", and nonzero="yes". Values chosen from the sequence \mathrm{min} + k \cdot \mathrm{by}, k=0, 1, 2, \ldots that are not greater than \mathrm{max}.
    In practice, all distributions can be obtained using just the uniform and discrete distributions.

    To define a number by formula, including defining rational numbers as fractions, use a de-number element. The content of the element should be a single number or a formula that results in a constant value. Symbols of previously defined numbers as well as mathematical constants like pi or e may be part of the formula. Any undefined symbols will result in an error.

    To define an expression using a formula that might involve variables, use a de-expression with mode="formula". The content of the element can be a mathematical formula that includes both numbers and variables. Previously defined numbers and expressions can be used in the formula by referencing their object name.

    To define an expression that is the partial derivative of another expression with respect to a variable, use de-expression with mode="derivative. Such an expression must have a formula child that contains an object representing the original expression. The content can be either a eval with object to reference a previously-defined object or a separate de-expression defining an expression not saved as a separate object. In addition, the element must contain a variable element with name indicating the name of the variable of differentiation.

    Formula evaluation and substitution follow a similar pattern. Formula evaluation to compute a number is performed with a de-evaluate element, which requires that every variable in the expression is assigned a specific numerical value. Formula substitution is like function composition and allows for any subset of the involved variables to be assigned either number or expression values and uses de-expression with mode="substitution". In either event, the element requires a formula child element to specify a starting expression using a eval element to specify a previously-defined de-object or a de-expression element to generate a new formula expression. For each variable that will be replaced by a value or another expression, we will include a variable with name specifying which variable is being replaced. The content of the variable element can be an eval to reference an existing object or any of the elements that can be used to generate a de-object.

    Automatic reduction and simplification can be applied to elements created by de-evaluate and de-expression by including the attribute reduce="yes". Elements created by de-number always reduce the resulting number. Reductions include reducing arithmetic involving numerical values and simple algebraic identities. The identities that are applied include the following where u and w represent any expression:

    1. u \pm 0 \rightarrow u
    2. 0 \cdot u \rightarrow 0 \rightarrow u
    3. 0 \div u \rightarrow 0 \rightarrow u
    4. 1 \cdot u \rightarrow u \rightarrow u
    5. -1 \cdot u \rightarrow -u \rightarrow u
    6. u \div 1 \rightarrow u \rightarrow u
    7. u^1 \rightarrow u \rightarrow u
    8. u^0 \rightarrow 1 \rightarrow u
    9. 1^u \rightarrow 1 \rightarrow u
    10. u+(-u) \rightarrow 0
    11. u-u \rightarrow 0
    12. u+-w \rightarrow u-w
    13. u-(-w) \rightarrow u+w
    14. -(-u) \rightarrow u
    15. u\cdot(-w) \rightarrow -u \cdot w
    16. u \div (-w) \rightarrow -u \div w
    17. (-u)+(-w) \rightarrow -(u+w)

    For the evaluation block, two comparison elements are accessiblemathcmp for testing whether two math objects are equivalent and logic for constructing compound tests involving simple Boolean logical operations. The mathcmp comparison is performed by numerically evaluating the two expressions being compared over a range of values for each variable present and verifying that they are numerically within a comparison tolerance.

    To compare the reader's submitted response to the provided correct answer with mathcmp, use use-answer="yes". To compare the submitted response to any other object, the mathcmp element should have a single evaluated math object as content, which could include a newly generated expression using de-expression that is based on the submitted responses. To compare two different math objects, the mathcmp should have two math objects. For convenience, there are some implicit representations available as well, illustrated in .

    Possible structures for using <tag>mathcmp</tag> within a <tag>test</tag>. The <tag>de-expression</tag> would be replaced by any valid construction as described for the <tag>setup</tag>. ]]>

    Compound logical structures are created using the logic element in the place of a comparison. To specify which operation is being used, the op attribute is set to one of op="and", op="or", or op="not". The operations are considered n-ary, meaning that the contents should be one or more comparison elements, which might include additional logic. The op="and" will evaluate as true when all of the children comparisons evaluate as true. The op="or" will evaluate as true when at least one of the children comparisons evaluates as true. The op="not" is technically implemented as the negation of op="and", and so will evaluate as true when at least one of the children comparisons evaluates as false. In the absence of any logic, there is always an implicit op="and" so that any sequence of comparisons within a single test, all comparisons are required to evaluate as true.

    Static Representations

    A static version will include an automatic solution which fills in each blank with the correct answer that is provided by the fillin. The feedback text specified in the evaluation that associated with a correct response for each of the fillin blanks are then provided in sequence. Consequently, the author should ensure that the feedback for a test with correct="yes" makes sense in the context of a back-of-the-book solution and not just as immediate feedback in an interactive setting.

    If the author provides an optional solution element, this text will also be included as a solution. This solution may contain eval elements in the same manner as described for the statement element. The automatic solution can be disabled by including include-automatic="no" as an attribute of the solution.

    To build the static version, needs to generate the dynamic substitution rules. Each dynamic question that includes setup is processed using its corresponding static seed to evaluate the potential substitutions. The resulting substitutions are stored in one of the generated files. Using the -CLI, the substitution file is generated using the command pretext generate dynamic-subs -t static-target where static-target is replaced by a static project target such as PDF.

    As of 2022-06-14 a major effort is underway to provide comprehensive markup for fill-in-the-blank problems. Until then, there is transitional markup intended only to supply a migration path for projects originally authored for Runestone servers (). So (a) our documentation is sparse, and (b) there will be no backward-compatible improvements. So in particular, new projects should wait for the new markup. Also, studying examples may be a useful way to augment what is described here.

    A statement is enriched with empty var elements which will render as the blanks in the problem.

    The signal for a fill-in problem is a setup element containing a sequence of var elements. Each var contains a sequence of condition elements that describe possible values (via regular expressions) which might appear in a blank. The first condition describes the correct answer(s), and then the subsequent conditions are descriptions of probable incorrect answers. Each condition has a feedback. So the first condition to match an entry provided via a blank will be noted as correct or incorrect, and its feedback will be relayed.

    The var of the statement and the var of the setup are in a 1-1 correspondence, which establishes how the setup is associated with a blank. The var in the statement may have a width attribute whose value controls how many characters would be visible in the blank.

    A static version will include an automatic solution which fills in each blank with a correct answer, and then duplicates the feedback text, in order.

    Coding Exercises and Projects coding exercises interactive exercisescoding exerciseinteractivecoding

    A Coding Exercise is formed by placing a program element after the statement of an exercise. The main distinction is that this is a signal that the interactivity is provided by the program, and therefore the exercise will not be understood as a short answer exercise (). For this reason, the program should be requested as one of the interactive realizations (, ).

    The identical construction may be used with any PROJECT-LIKE () such as an activity. As of 2022-06-17 this only applies to the form that uses a statement, but will soon also apply to task within PROJECT-LIKE.

    Realize that it is always possible to place a program inside of a statement, and if there is no program that is after the statement (or another signal for an interactive exercise) then the exercise will be classified as a short-answer exercise. It may be instructive to understand that in a static realization, a program at the end of a statement may be visually identical to an exercise where the program is after the statement, even though the former is a short-answer exercise and the latter is a coding exercise (which will render differently for different output formats and hosting platforms).

    Short Answer Exercises short answer exercises interactive exercisesshort answer exerciseinteractiveshort answer free-response exercises interactive exercisesfree-response exerciseinteractivefree-response essay question exercises interactive exercisesessay question exerciseinteractiveessay question

    Short Answer questions might also be known as Free Response questions, or Essay questions. A exercise, or a PROJECT-LIKE that is not structured by task, is implicitly of this nature. But you still need to signal that you wish such a problem to be interactive, typically with a text box where the student can enter an answer. So, similar to other types of exercises, add a response element immediately after the statement. (We expect to add attributes for this element to influence the behavior of the text box.)

    In an online setting, it is a simple matter to provide a place for a reader to type in an answer, response, or essay. But then what? Until artificial intelligence is brought to bear, somebody (not something), such as an instructor for a course of enrolled students, will need to read a response and provide a score and/or comments that can be saved and distributed back to the students. So the first prerequisite is that HTML output is being built for a capable platform. As of 2022-06-15, this means a Runestone server (), but it could easily also be a server.

    An author can also supply an attachment attribute on the exercise element. When set to yes the short answer question will allow the student to upload a single document in support of their answer. This document might be a diagram or an entire essay in PDF format.

    A publisher can control when a response area is created in HTML output (). The default is to only have this area present when it is possible for a response to be graded and scored. However, an option will cause a response box to be created always. A reader can reflect on the question by typing in a response, and the text will be saved on that particular device only. When it is impossible for a response to be graded, placeholder text will warn the reader.

    Timed Assessments timed assessments

    A collection of exercise may be optionally selected to be part of a timed assessment. A timed assessment will show each exercise separately with a navigation mechanism to allow the student to move from exercise to exercise. A student may flag an exercise for later review if they are unsure of their answer. When a student completes the assessment they will receive varying amounts of feedback on their performance, depending on how the assessment is configured.

    To enable this behavior, place a time-limit attribute on the exercises element, with a value indicating the time limit in seconds. In addition you can allow the student to pause the timer by including pause attribute on the exercises element with a value of yes, You can control the amount of feedback provided to the student with two additional attributes. results and feedback. If the results attribute is set to yes, the student will receive a summary of their performance after completing the assessment. If the feedback attribute is set to yes, the student will receive feedback on their answers.

    For books that will be hosted on Runestone Academy, you should include a label attribute on the exercises element to provide a short name for the assessment. This label will be used to identify the assessment in the gradebook. It will also allow you as the instructor to reset the exam for a student to give them another try if they need it for any reason, including some kind of technical glitch with their browser as they are taking the exam.

    Group Work Exercises group work exercises

    A collection of exercise may be optionally selected for work by a group of readers. This behavior is only available when hosted on a Runestone server. We re-purpose a worksheet specialized division for groups of such exercises.

    To enable this behavior, place a groupwork attribute on a worksheet element, with a value of yes. Then all of the contained exercise will be provided by Runestone as group work.

    Exercises and their Solutions

    As described in an exercise can be placed in many different locations, and a project has similar features. It is critical to understand that you want to author any hints, answers, or solutions immediately following the statement of an exercise. If your source is public, and you would like to keep some aspects of the solutions private, then read for some practical advice. See as well for information on creating a standalone Solutions Guide. We concentrate here on techniques for controlling visibility and location of the components of exercises within your primary output.

    Exercises, Original Versions

    In a conversion to HTML, a hint to an exercise renders nicely in a knowl, right below the exercise statement. For a conversion to /PDF/print, you might wish to display a hint, visibly, as part of the exercise, or you may wish to park the hint in a Hints to Exercises division in the back matter. To control visibility of the components of exercises (and projects) there are twenty switches you can use. See for more.

    Exercises, Solutions Versions

    Exercises, and their components may be duplicated easily, to provide a back matter appendix with solutions, or within each division. For example, you can easily create an end-of-chapter division with solutions to every inline exercise throughout the chapter and solutions to all the divisional exercises from each section of the chapter.

    The solutions element will create an entire division, semi-automatically. You can provide a title, an introduction, and conclusion. The remaining content is statements, hints, answers, and solutions to exercises (and projects).

    If solutions is a child of backmatter, then an appendix will be generated, and covering exercise from the entire book or article. If solutions is a child of a division, then a new subdivision is created and the scope is all exercise for the division. So, for example, a solutions placed inside a chapter will render as a division that looks like a section and will include components of all the exercises (at any level) contained within the chapter.

    An optional attribute is scope, whose value is the xml:id of a division. Then it is this division which is scanned for exercises and their solutions (rather than defaulting to the enclosing parent of the solutions). This allows for much greater flexibility. For a simple example, suppose a chapter contains two exercises, and you want to have two solutions within the chapter, each covering just one of the exercises. This can be accomplished with scope, and you can arrange the four divisions (two exercises and two solutions) however you wish within the chapter.

    An author filters the types of exercises, and their components, through attributes of the solutions element. For example reading="hint answer" would cause every exercise within each reading-questions to have its hint and answer displayed, but not its statement nor its solution. These are the attribute names and the possible values.

    Attributes (left) and Values (right) for <tag>solutions</tag> element inline statement divisional hint reading answer worksheet solution project

    Note that the worksheet filter only refers to exercise within any worksheet. This is because worksheets are built around exercise that are slightly different than others, such as allowing workspace, and being allowed in a sidebyside for layout purposes. Similarly, a project (or more precisely PROJECT-LIKE) is a child of a division, and so can appear inside a worksheet, or outside of a worksheet. The project filter applies equally to both instances.

    So, source like <section> <title>Tropical Bird of Paradise<title> ... <solutions worksheet="hint solution" project="hint answer"> <title>Hints and Solutions to Worksheets and Projects<title> </solutions> </section> would generate an entire subsection in the section on Birds of Paradise, containing with hints and solutions to every exercise in any worksheet in the section, and hints and answers for every project, located anywhere (including in subsections, subsubsections, and worksheets). There is a great deal of flexibility, though not every imaginable scenario may be possible.

    An admit attribute specifies some feature of an exercise's serial number to determine whether its components are admitted into the solutions division. (For example, the serial number of Exercise 1.2.3 is 3.) Presently, the only options are odd, even, and the default all. So, source like <solutions divisional="answer" admit="odd"> would generate a subsection with answers to only the odd-numbered divisional exercises.

    Images image Raster Images

    A raster imageraster imageimageraster image is an image described pixel-by-pixel, with different colors and intensities. Photographs are good examples. Common formats are Portable Network Graphics (PNG) and Joint Photographic Experts Group (JPEG, JPG), which will both work with pdflatex and modern web browsers. JPEG is a good choice for photographs since they are compressed on the assumption they will be viewed by a human, while PNG is a lossless format and good for line art, diagrams and similar images (if you do not have vector graphics versions, see below).

    To use these images, you simply provide the complete filename, with a relative path. A subdirectory such as images is a good choice for a place to put them. It is your responsibility to place these images where the output will find them or where the HTML output will find them. Your source would look like:

                ]]>
                

    Typically you would wrap this in a figure that might have an xml:id attribute for cross-references, with or without a caption. There is no height attribute, so the aspect ratio of your image is your responsibility outside of . The width attribute is a percentage of the available width of the text (outside of a sidebyside panel).

    You should also provide a description and/or shortdescription as a child of the image, or else explicitly declare the image to be decorative with an attribute decorative set to yes. A shortdescription should be text-only (but perhaps with var children) and be less than 100140 characters long. A description should be structured with p and tabular elements. For example:

                
                    Five crocodiles partially submerged.
                    
                        

    Five crocodiles are in a pond. Three of them have their eyes above the water line, looking in the direction of the camera. The other two are in the background and only their tails are visible above the water line.

    ]]>

    See for advice on writing effective image descriptions.

    Vector Graphics

    An image is a vector graphicvector graphicimagevector graphic if the file describes the geometric shapes that constitute the image. So a simple diagram would be a good candidate, but a photograph would not. Popular formats are Portable Document Format (PDF) and Scalable Vector Graphics (SVG). You will get the best results with PDF images in output and SVG images for HTML. The principal advantage of these formats is that they scale (big or small) smoothly, along with fonts. This is critical when you cannot predict the screen size for a reader of an electronic version.

    Unless you describe these images with a language (see ), you are responsible for providing the PDF and SVG versions. The pdf2svg utility is very useful if you have PDF images only. To have these different images used for different output formats, you simply follow the instructions above, but do not include a file extension. This alerts the conversion to use the best possible choice for any given output, and to embed it correctly. So presuming you made available the files images/toad-life-cycle.pdf and images/toad-life-cycle.svg, the following example would incorporate the PDF version with output and the SVG version for HTML output.

                
                    

    The four stages of a toad's life.

    ]]>

    Vector graphics images can be created with source code in different languages () or with applications, such as Inkscape (). If you are creating non-technical graphics that have lots of geometric shapes and simple text (a look like a movie poster), then using a tool like Inkscape is a great choice since its native file format is an enhanced version of SVG and a faithful PDF is easy to create.

    Images Described by Source Code

    There are various languages which may be used to describe diagrams, geometric objects, or data plots. A key strategy enabled by is to put these specifications of such images directly in your document's source rather than losing track of them over time.

    So we have various elements which are children of image that hold these source code descriptions. Then provides techniques for realizing these in the best formats for various devices and print. So if you are accustomed to the idea of a source attribute pointing to a file, think of these elements as alternative specifications.

    Asymptote

    Asymptote is a vector graphics language that produces high-quality output in WebGL, SVG, PNG, and PDF formats. You can describe 2-D or 3-D objects, and the 3-D objects are interactive in online output as HTML WebGL files. may be used, and your macros are automatically available for use.

    Authoring is straight-forward. Inside an image include a child asymptote to hold the code. For example:

                    <image>
                        <description>A histogram of Gaussian data.</description>
                        <asymptote label="gaussian-histogram">
                        import graph;
                        import stats;
    
                        size(400,200,IgnoreAspect);
    
                        int n=10000;
                        real[] a=new real[n];
                        for(int i=0; i < n; ++i) a[i]=Gaussrand();
    
                        draw(graph(Gaussian,min(a),max(a)),blue);
    
                        // Optionally calculate "optimal" number
                        // of bins a la Shimazaki and Shinomoto.
                        int N=bins(a);
    
                        histogram(a,min(a),max(a),N,normalize=true,low=0,lightred,black,bars=false);
    
                        xaxis("$x$",BottomTop,LeftTicks);
                        yaxis("$dP/dx$",LeftRight,RightTicks(trailingzero));
                        </asymptote>
                    </image>
                    

    Here is the result. Look elsewhere for examples of 3-D output from Asymptote.

    A histogram of Gaussian data.

    import graph; import stats; size(400,200,IgnoreAspect); int n=10000; real[] a=new real[n]; for(int i=0; i < n; ++i) a[i]=Gaussrand(); draw(graph(Gaussian,min(a),max(a)),blue); // Optionally calculate "optimal" number // of bins a la Shimazaki and Shinomoto. int N=bins(a); histogram(a,min(a),max(a),N,normalize=true,low=0,lightred,black,bars=false); xaxis("$x$",BottomTop,LeftTicks); yaxis("$dP/dx$",LeftRight,RightTicks(trailingzero));

    Notes:

    • Notice the necessity of escaping the less-than in the for-loop. See .
    • Setting a label on the asymptote tag is necessary to have a stable name for graphics files that will be generated.
    • The description is an important part of making your output accessible.
    • Notice the use of for the label on the vertical axis. All of your macros defined in docinfo are available for use, so you can keep notation consistent.
    • You need to produce PDF versions of your diagrams for use in a conversion to .
    • You need to produce HTML versions of your diagrams for use in a conversion to an electronic format based on HTML. For a 2-D diagram these are a thin wrapper around an SVG image. For a 3-D diagram these are interactive WebGL objects.

      It is very important to note that these HTML versions contain the height and width of the diagram and these are queried by a conversion of your document to HTML format in order to compute the aspect ratio. Therefore they need to be available with your other source files (typically in an images directory). So in a very real sense these files become part of your source.

    • You may want to produce SVG versions of your diagrams for conversion to EPUB, and PNG versions for conversion to the EPUB precursor for Kindle format.
    • PDF versions produced by the pretext script will not include the RPC extensions. So rotatable 3D images rendered by the proprietary viewer, Adobe Acrobat, are not created, consistent with our open source philosophy.
    • Colors in Asymptote can be hard-coded using rgb syntax. Colors can also be defined at the top of an Asymptote file, to be referred to later. You may wish to produce PDF in both color (electronic) and black and white (print on demand) formats, and you probably do not want to maintain parallel source for both versions. Rather than writing (for example) pen p=rgb(0,0,.7); in your Asymptote code, you can write pen p=curvepen1;. Then, in the docinfo section of your document, you can add an asymptote-preamble and include the line pen curvepen1=rgb(0,0,.7);. Once you are ready to produce your black and white version, you need only change the definition of curvepen1 in your asymptote-preamble.

      One note of caution: if your preamble includes Asymptote code that only works once certain libraries are loaded, you must include lines to import those libraries in your preamble. For example, to define a material you must first have the line import three;.

    Asymptote may be run as a program installed locally, but the project also has an on-demand online server written by Supakorn Jamie Rassameemasmuang. By default, the pretext/pretext script () will interface automatically with this server to create your diagrams. Furthermore, Asymptote provides a very useful web application written by Pedram Emami. This is a great place to learn, experiment, and iterate as you become more skilled at building high-quality graphics to illustrate the concepts in your document.

    Build 3-D Asymptote Figures

    If your project uses geometric or mathematical objects that are three-dimensional, invest some time in learning the Asymptote vector graphics language. The interactive diagrams for your HTML output produced by Asymptote, in WebGL format, are outstanding and will greatly enhance your project. (And the other static formats are similarly excellent.) The pretext/pretext script will create these diagrams, in the necessary formats, with no extra software by using an online server.

    Images in <latex/> Syntax

    There are a variety of packages for authoring a diagram, plot, or graph. Examples include: TikZ, PGF, Xy-pic, and PSTricks. Generally, the latex-image tag allows you to incorporate this code into your source and realizes these descriptions as images in your output.

    For output the procedure is transparent simply incorporates the preamble information and the image's code in the correct places in the output, scaled to fit whatever space is described on the image element. Then traditional processing will do the right thing. For output to other non- formats, such as HTML or EPUB, we need some help from the CLI to generate other formats. This tool will isolate the image's code and bundle it up with the necessary preamble to make a complete single-purpose file. Once converted by to a PDF version, other tools can convert the image into other formats, such as SVG. In this way, you can use packages for describing images, use mathematically-correct labels in syntax, and use your own macros for consistency in notation, yet also employ the resulting images in more modern output formats. Note that as of 2020-07-24, limited testing indicates that PSTricks needs to be processed with the xelatex engine, and the pstricks-add package might also be necessary. Any updates, especially using pdflatex would be appreciated. Finally, processing with xelatex might be necessary if your labels use Unicode characters.

    Much like the asymptote tag, the latex-image tag is used as a child of image and can be thought of as an alternative to the source attribute of image. Adding a label to the latex-image tag will ensure a stable file name for the graphics files that will be produced. The contents need to be a complete specification of the image. For example, a TikZ image will typically begin with \begin{tikzpicture}. Inside of your document's docinfo you will likely need to employ a latex-image-preamble element to hold necessary \usepackage commands and any global settings, such as the style for tick-marks and labels on axes of graphs. The source code in this next example is greatly abbreviated and mildly edited, see the source for the complete example.

    
                        
                        \usepackage{tikz}
                        
                    
                    ]]>
    
                        RNA Codons Table, by Florian Hollandt
                        
                            

    A table of the RNA codons.

    \begin{tikzpicture} \footnotesize \tikzstyle{every node}=[inner sep=1.7pt,anchor=center] % to_x and from_x styles denote bonds terminating % or starting in labeled nodes. x denotes the % number of letters in the node label. \tikzstyle{to_1}=[shorten >=5pt] \tikzstyle{to_1i}=[shorten >=6pt] \tikzstyle{to_2}=[shorten >=7pt] \tikzstyle{to_3}=[shorten >=8pt] ... \begin{scope}[scale=0.5] % Asparagine \draw[ultra thick,shorten >=2pt,shorten <=2pt] (90-2*5.625:8.2) arc(90-2*5.625:90-4*5.625:8.2); \path (90-3.5*3.625-3:13.3) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_2] (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {} -- +(30:1) node (Cd) {NH$_{\mbox{2}}$}; \draw[to_1i] (Cc.center) -- +(270:1) node (O) {}; \draw[to_1] (Cc.210) -- (O.150); \path (O.center) node {O}; \end{scope} ... \node at (90-55*5.625:4.5) {C}; \node at (90-58*5.625:4.5) {S}; \node at (90-61*5.625:4.5) {L}; \node at (90-63*5.625:4.5) {F}; \end{tikzpicture} ]]>

    This will result in:

    RNA Codons Table, by Florian Hollandt, from ample.net

    A table of the RNA codons, together with the amino acids they encode.

    \begin{tikzpicture} \footnotesize \tikzstyle{every node}=[inner sep=1.7pt,anchor=center] % to_x and from_x styles denote bonds terminating or starting in labeled nodes. x denotes the number of letters in the node label. \tikzstyle{to_1}=[shorten >=5pt] \tikzstyle{to_1i}=[shorten >=6pt] \tikzstyle{to_2}=[shorten >=7pt] \tikzstyle{to_3}=[shorten >=8pt] \tikzstyle{from_1}=[shorten <=5pt] \tikzstyle{from_1i}=[shorten <=6pt] \tikzstyle{from_2}=[shorten <=8pt] \begin{scope} \draw [ultra thick] circle(1cm); \draw [ultra thick] (0:4)--(180:4) (90:4)--(270:4); \foreach \a/\l in {45/A,135/G,225/C,315/U}{ \node at (90-\a:0.5cm) {\l}; } \draw [very thick] circle(2cm); \foreach \A in {90,0,270,180}{ \foreach \a/\l in {22.5/A,45/G,67.5/C,90/U}{ \draw [very thick] (\A+\a:1) -- (\A+\a:4); \node at (\A-\a+11.25:1.5) {\l}; } } \draw circle(4cm) (0:4)--(180:4) (90:4)--(270:4); \foreach \A in {90,180,270,0}{ \foreach \a in {0,22.5,45,67.5}{ \foreach \i/\l in {5.625/A,11.25/G,16.875/C,22.5/U}{ \draw (\A+\a+\i:2) -- (\A+\a+\i:4); \node at (\A-\a-\i+2.8125:3) {\l}; } } } \end{scope} \begin{scope}[scale=0.5] % Lysine \draw[ultra thick,shorten >=2pt,shorten <=2pt] (90:8.2) arc(90:90-2*5.625:8.2); \path (90-0.8*5.625:14.3) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_3] (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {} -- ++(270:1) node (Cd) {} -- ++(210:1) node (Ce) {} -- ++(150:1) node (Cf) {NH$_{\mbox{2}}$}; \end{scope} \begin{scope}[scale=0.5] % Asparagine \draw[ultra thick,shorten >=2pt,shorten <=2pt] (90-2*5.625:8.2) arc(90-2*5.625:90-4*5.625:8.2); \path (90-3.5*3.625-3:13.3) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_2] (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {} -- +(30:1) node (Cd) {NH$_{\mbox{2}}$}; \draw[to_1i] (Cc.center) -- +(270:1) node (O) {}; \draw[to_1] (Cc.210) -- (O.150); \path (O.center) node {O}; \end{scope} \begin{scope}[scale=0.5] % Arginine \draw[ultra thick,shorten >=2pt,shorten <=2pt] (90-22.5:8.2) arc(90-22.5:90-33.75:8.2); \path (90-3.7*5.625:16) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_2] (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {} -- ++(270:1) node (Cd) {} -- ++(330:1) node (NH1) {NH}; \draw[from_2,to_3] (NH1.center) -- ++(30:1) node (Ce) {} -- ++(330:1) node {NH$_{\mbox{2}}$}; \draw[to_1i] (Ce.center) -- ++(90:1) node (N2) {}; \draw[to_1] (Ce.150) -- (N2.210); \path (N2) node {N}; \end{scope} \begin{scope}[scale=0.5] % Serine \draw[ultra thick,shorten >=1pt,shorten <=2pt] (90-22.5-2*5.625:8.2) arc(90-33.75:90-33.75-11.25:8.2); \path (90-7*5.625:12.5) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_2] (zero.center) -- ++(270:1) node(Cb){} -- ++(210:1) node (Cc) {OH}; \end{scope} \begin{scope}[scale=0.5] % Threonine \draw[ultra thick,shorten >=1pt,shorten <=2pt] (90-45:8.2) arc(90-45:90-67.5:8.2); \path (90-45-0.8*11.25:12.5) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_2] (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {} (Cb.center) -- +(210:1) node {OH}; \end{scope} \begin{scope}[scale=0.5] % Methionine \draw[ultra thick,shorten >=1pt,shorten <=2pt] (90-67.5:8.2) arc(90-67.5:90-67.5-5.625:8.2); \path (90-67.5-0.5*5.625:14) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_1] (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {} -- ++(30:1) node (Cd) {S}; \draw[from_1] (Cd.center) -- +(330:1); \end{scope} \begin{scope}[scale=0.5] % Isoleucine \draw[ultra thick,shorten >=1pt,shorten <=2pt] (0:8.2) arc(0:11.25:8.2); \path (1.0*5.625:12.4) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {} -- +(30:1) node (Cd) {} (Cb.center) -- +(210:1) node (Ce) {}; \end{scope} \begin{scope}[scale=0.5] % Glutamic acid \draw[ultra thick,shorten >=1pt,shorten <=2pt] (0:8.2) arc(0:-11.25:8.2); \path (-1.3*5.625:15) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_1i] (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {} -- ++(270:1) node (Cd) {} -- ++(330:1) node (NH) {OH}; \draw[to_1] (Cd.center) -- +(210:1) node (O) {}; \draw[to_1i] (Cd.270) -- (O.300); \path (O.center) node {O}; \end{scope} \begin{scope}[scale=0.5] % Aspartic acid \draw[ultra thick,shorten >=1pt,shorten <=2pt] (-11.25:8.2) arc(-11.25:-22.5:8.2); \path (-11.25-5.625:12) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_2] (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {} -- +(30:1) node (Cd) {OH}; \draw[to_1i] (Cc.center) -- +(270:1) node (O) {}; \draw[to_1] (Cc.210) -- (O.150); \path (O.center) node {O}; \end{scope} \begin{scope}[scale=0.5] % Glycine \draw[ultra thick,shorten >=1pt,shorten <=2pt] (-22.5:8.2) arc(-22.5:-45:8.2); \path (-33.75-1*5.625:12) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \end{scope} \begin{scope}[scale=0.5] % Alanine \draw[ultra thick,shorten >=1pt,shorten <=2pt] (-45:8.2) arc(-45:-68.25:8.2); \path (-45-11.25:12) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw (zero.center) -- ++(270:1) node(Cb){}; \end{scope} \begin{scope}[scale=0.5] % Valine \draw[ultra thick,shorten >=1pt,shorten <=2pt] (-68.25:8.2) arc(-68.25:-90:8.2); \path (-68.25-0.8*11.25:12) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {}; \end{scope} \begin{scope}[scale=0.5] % Glutamine \draw[ultra thick,shorten >=1pt,shorten <=2pt] (-90:8.2) arc(-90:-101.25:8.2); \path (-90.25-5.625:12.5) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_2] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_3] (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {} -- ++(270:1) node (Cd) {} -- ++(330:1) node (NH) {NH$_{\mbox{2}}$}; \draw[to_1] (Cd.center) -- +(210:1) node (O) {}; \draw[to_1i] (Cd.270) -- (O.300); \path (O.center) node {O}; \end{scope} \begin{scope}[scale=0.5] % Histidine \draw[ultra thick,shorten >=1pt,shorten <=2pt] (-101.25:8.2) arc(-101.25:-101.25-11.25:8.2); \path (-101.25-1.2*5.625:15.5) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node(Cc){}; \draw[to_2] (Cc.center) -- ++(108-1*72:1) node (Cd) {} -- ++(108-2*72:1) node (Ce) {NH}; \draw[from_1,to_1] (Ce.center) -- ++(108-3*72:1) node (Cf) {} -- ++(108-4*72:1) node (Cg) {}; \draw[from_1] (Cg.center) -- (Cc.center); \draw (Cc.198+2*72) -- (Cd.198+1*72); \draw[from_1] (Cg.72) -- (Cf.198+4*72); \draw (Cg.center) node {N}; \end{scope} \begin{scope}[scale=0.5] % Arginine \draw[ultra thick,shorten >=2pt,shorten <=2pt] (-90-22.5:8.2) arc(-90-22.5:-90-45:8.2); \path (-90-7.7*5.625:12.3) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_2] (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {} -- ++(270:1) node (Cd) {} -- ++(330:1) node (NH1) {NH}; \draw[from_1i,to_3] (NH1.center)-- ++(30:1) node (Ce) {} -- ++(330:1) node {NH$_{\mbox{2}}$}; \draw[to_1] (Ce.center) -- ++(90:1) node (N2) {}; \draw[shorten >=4pt] (Ce.150) -- (N2.210); \path (N2) node {N}; \end{scope} \begin{scope}[scale=0.5] % Proline \draw[ultra thick,shorten >=2pt,shorten <=2pt] (-90-45:8.2) arc(-90-45:-90-45-22.25:8.2); \path (-90-10.5*5.625:12) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_2] (zero.center) -- ++(150:1) node (nh) {NH$_{\mbox{2}}^+$}; \draw (zero.center) -- ++(270:1) node(Cb){}; \path (Cb.center) -- +(150:1) node (x) {}; \path (x.center) +(170:1) node (Cd) {}; \path (x.center) +(250:1) node (Cc) {}; \draw[to_3] (Cb.center) -- (Cc.center) -- (Cd.center) -- (nh.center); \end{scope} \begin{scope}[scale=0.5] % Leucine \draw[ultra thick,shorten >=2pt,shorten <=2pt] (180:8.2) arc(180:180+22.25:8.2); \path (-90-14.5*5.625:13) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {} -- +(30:1) node (Cd) {} (Cc.center) -- +(270:1) node (Ce) {}; \end{scope} \begin{scope}[scale=0.5] % Tyrosine \draw[ultra thick,shorten >=2pt,shorten <=2pt] (180-11.25:8.2) arc(180-11.25:180-22.5:8.2); \path (180-3*5.625:16) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw (zero.center) -- ++(270:1) node(Cb){}; \draw (Cb.center) -- ++(330:1) node (Cc) {} -- ++(30:1) node (Cd) {} -- ++(330:1) node (Ce) {} -- ++(270:1) node (Cf) {} -- ++(210:1) node (Cg) {} -- ++(150:1) node (Ch) {} -- ++(90:1); \draw (Cc.330) -- (Cd.270); \draw (Ce.210) -- (Cf.150); \draw (Cg.90) -- (Ch.30); \draw[to_1i] (Cf.center) -- +(330:1) node (OH) {OH}; \end{scope} \begin{scope}[scale=0.5] % Tryptophane \draw[ultra thick,shorten >=2pt,shorten <=2pt] (180-22.5-5.625:8.2) arc(180-22.5-5.625:180-22.5-11.25:8.2); \path (180-22.5-1.8*5.625:16) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node(Cc){}; \draw[to_2] (Cc.center) -- ++(108-1*72:1) node (Cd) {} -- ++(108-2*72:1) node (Ce) {NH}; \draw[from_1](Ce.center) -- ++(108-3*72:1) node (Cf) {} -- ++(108-4*72:1) node (Cg) {}; \draw (Cg.center) -- (Cc.center); \draw (Cc.198+2*72) -- (Cd.198+1*72); \draw (Cg.72) -- (Cf.198+4*72); \draw (Cg.center) -- ++(240:1) node (Ch) {} -- ++(300:1) node (Ci) {} -- ++(0:1) node (Cj) {} -- ++(60:1) node (Ck) {} -- ++(120:1) node (Cl) {}; \draw (Ch.0) -- (Ci.60); \draw (Cj.120) -- (Ck.180); \end{scope} \begin{scope}[scale=0.5] % Cysteine \draw[ultra thick,shorten >=2pt,shorten <=2pt] (180-45+11.25:8.2) arc(180-45+11.25:180-45:8.2); \path (180-45+11.25-1*7.625:12) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_2] (zero.center) -- ++(270:1) node(Cb){} -- ++(210:1) node (Cc) {SH}; \end{scope} \begin{scope}[scale=0.5] % Serine \draw[ultra thick,shorten >=1pt,shorten <=2pt] (90+45:8.2) arc(90+45:90+45-22.5:8.2); \path (90+45-11.25+0*5.625:14) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw[to_2] (zero.center) -- ++(270:1) node(Cb){} -- ++(330:1) node (Cc) {OH}; \end{scope} \begin{scope}[scale=0.5] % Leucine \draw[ultra thick,shorten >=2pt,shorten <=2pt] (90+22.5:8.2) arc(90+22.5:90+11.25:8.2); \path (90+22.5-1.2*5.625:16) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw (zero.center) -- ++(270:1) node(Cb){} -- ++(210:1) node (Cc) {} -- +(150:1) node (Cd) {} (Cc.center) -- +(270:1) node (Ce) {}; \end{scope} \begin{scope}[scale=0.5] % Phenylalanine \draw[ultra thick,shorten >=2pt,shorten <=2pt] (90+11.25:8.2) arc(90+11.25:90:8.2); \path (90+1.5*5.625:13) node (zero) {}; \draw[to_2] (zero.center) -- ++(30:1) node (CO) {} -- +(330:1) node [anchor=base] {O$^{\mbox{-}}$}; \draw[to_1] (CO.center) -- +(90:1) node (Od) {O}; \draw[to_1i] (CO.30) -- +(90:1); \draw[to_3] (zero.center) -- ++(150:1) node {NH$_{\mbox{3}}^{\mbox{+}}$}; \draw (zero.center) -- ++(270:1) node(Cb){}; \draw (Cb.center) -- ++(210:1) node (Cc) {} -- ++(150:1) node (Cd) {} -- ++(210:1) node (Ce) {} -- ++(270:1) node (Cf) {} -- ++(330:1) node (Cg) {} -- ++(30:1) node (Ch) {} -- ++(90:1); \draw (Cc.210) -- (Cd.270); \draw (Ce.330) -- (Cf.30); \draw (Cg.90) -- (Ch.150); \end{scope} \node at (90-1*5.625:4.5) {K}; \node at (90-3*5.625:4.5) {N}; \node at (90-5*5.625:4.5) {R}; \node at (90-7*5.625:4.5) {S}; \node at (90-10*5.625:4.5) {T}; \node at (90-12.5*5.625:4.5) {I}; \node at (90-13.7*5.625:4.7) {M / $\star$}; \node at (90-15*5.625:4.5) {I}; \node at (90-17*5.625:4.5) {E}; \node at (90-19*5.625:4.5) {D}; \node at (90-22*5.625:4.5) {G}; \node at (90-26*5.625:4.5) {A}; \node at (90-30*5.625:4.5) {V}; \node at (90-33*5.625:4.5) {Q}; \node at (90-35*5.625:4.5) {H}; \node at (90-38*5.625:4.5) {R}; \node at (90-42*5.625:4.5) {P}; \node at (90-46*5.625:4.5) {L}; \node at (90-49*5.625:4.5) {$\dagger$}; \node at (90-51*5.625:4.5) {Y}; \node at (90-52.3*5.625:4.5) {$\dagger$}; \node at (90-53.3*5.625:4.5) {W}; \node at (90-55*5.625:4.5) {C}; \node at (90-58*5.625:4.5) {S}; \node at (90-61*5.625:4.5) {L}; \node at (90-63*5.625:4.5) {F}; \end{tikzpicture}
    Scaling TikZ Images

    Images authored in TikZ are the most popular. Text (nodes) in a TikZ picture are at whatever the current font size is. The other parts of the picture (lines, circles, rays, etc.; the line art) can be scaled as part of an overall scale factor. The point being, the scale factor will not scale the text simultaneously. It is not unlike a map application on your mobile device. The name of a road is too small to read, so you zoom in on the map, making the street bigger, but the name stays in the same font size and is still unreadable. This means some manual labor is involved when you place a TikZ picture into a document.

    For many authors, the goal is to have the text in their TikZ picture have the same size as the surrounding text, both in a PDF and in HTML. We now explain how to accomplish this consistently.

    Preparation

    Well before designing many TikZ images, answer the following questions.

    1. For your output, what will the overall font size be?
    2. For your output, what will the width of the text block be? Note that this will normally be computed by , dependent on your chosen font size. A larger font will mean a greater width. You can generate the source file and look early in the preamble to see what width is being used. It is also possible that you may be setting this with yourself (). The ratio of line width to font size is always 34:1.

    TikZ in <latex/>

    Every image in may be constrained by width and/or margins, or may be restricted to a panel of a sidebyside with a certain width. So the TikZ code you author will create an image that is then scaled by to fit the constraints (much as any other image is scaled). Except this is done in a way that scales both the font and the line art. Your main goal is to have this scaling use a scale factor of 1.0. Which, of course, sounds like a waste of effort, but it is critical for how the image behaves in HTML (next).

    To accomplish this unit scaling, follow this procedure for each TikZ picture.

    1. Determine the width of the TikZ picture itself, in physical units of length. Typically, the lengths used for larger portions are described in centimeters. But note that an overall scale factor is sometimes applied for convenience (or as a result of poor planning!). Also, the default unit length (centimeters) can be changed. Note also, that text may push out to the right and left, defining the boundaries on the sides, and these lengths can be hard to compute or predict.
    2. Recall the width of your text (above). Recognize that list items will be indented (reducing width), and perhaps there are multiple indents if a list has multiple levels.
    3. Now you want the width of your picture as a percentage of the overall available width. By default, your overall width will be points, and your picture width will be in centimeters. You may be familiar with a big point (or desktop publishing point) which is 72 points to the inch. however uses 72.27 points to the inch, which makes a point equal to 0.03514598 centimeters. Convert to whatever common unit makes sense to you, since it is the dimension-less ratio you are after.
    4. Use this percentage as the width attribute on the image (with a percent sign).
    Now produce a PDF and you will find that the font in the surrounding text, and the font in image, will match identically. I like to check this carefully by zomming in on the PDF and using an on-screen pixel ruler to check the heights of identical letters. KRuler is one such example for Linux, suggestions for other operating systems are welcome.

    Note that in practice you will envision your picture as large or small, and you will begin with some overall physical width in mind, relative to the line width.

    TikZ in <init>HTML</init>

    For HTML output, the goal is to not edit your source. In other words to not change the width attributes that have been so carefully computed and to not edit the TikZ code. But you will want to maintain fidelity with the surrounding font.

    HTML output is designed to behave very similarly (not identically) to how output behaves. In other words, the ratio of line width to font size is 34:1. In this way, line length and font size are such that a long paragraph will usually have an identical number of lines in (at any font size) and in HTML.

    Our tools produce Scalable Vector Graphics (SVG) versions of TikZ pictures for use in HTML output. Being scalable means a reader can zoom in without any pixelation of the images. This is helpful for those with low vision, or if some fine point of a picture needs to be examined closely. It also means an SVG can be scaled by any factor when placed in HTML. However, the work done for a unit scaling for output will continue to provide the correct scaling for HTML! (Provided the text width used for the PDF production is the one automatically computed from the font size via the 34:1 ratio.)

    Case Study: Scaling a TikZ picture

    The source below describes a simple TikZ picture, nd is followed by the picture itself. The rectangle is 8 centimeters wide. The Guide is produced as a PDF with 10 point text and a text width of 6.5 inches. (This is too wide for comfortable reading, and contrary to our recommendations. See .) Normally, a choice of 10 point text would result in a width of 340 point, or about 4.7 inches.

    So we compute the fraction of the available width required, as a percentage: \frac{8\text{ cm}}{6.5\text{ in}} = \frac{8\text{ cm}\left(\frac{1\text{ in}}{2.54\text{ cm}}\right)}{6.5\text{ in}} = 0.4846 = 48.46\% and we use that as the width of the image.

    
                            
                            \begin{tikzpicture}
                            % 1 cm is default unit of length
                            % a rectangle: 8 cm wide, 6 cm tall
                            \draw[draw=black, thick] (4,2) rectangle (-4,-2);
    
                            \node at (-2,  1) {Foo};
                            \node at ( 2,  1) {Bar};
                            \node at (-2, -1) {Baz};
                            \node at ( 2, -1) {Qux};
                            \end{tikzpicture}
                            
                        ]]>
                        

    Some characters for comparison: FooBarBazQux

    \begin{tikzpicture} % 1 cm is default unit of length % a rectangle: 8 cm wide, 6 cm tall \draw[draw=black, thick] (4,2) rectangle (-4,-2); \node at (-2, 1) {Foo}; \node at ( 2, 1) {Bar}; \node at (-2, -1) {Baz}; \node at ( 2, -1) {Qux}; \end{tikzpicture}

    In the PDF version, the text matches between the image and the surrounding text almost identically. We could slide the image right and left by adjusting the margins (the default is to be centered). But if we want the image bigger and smaller, we need to adjust the TikZ code and recompute the width attribute.

    Now for HTML we need to produce an SVG version that is a close match. The HTML version is a close match for built with a computed text width (for any font size). We do not want to change the percentage of the width devoted to the TikZ picture, and we do not want to change the TikZ code itself. If we had not chosen a different text width (the 6.5 inches, versus a computed 340 point), then we could generate the SVG by supplying the same publication file, so as to use the same font size. However, our text width is 38% larger in the version, \frac{6.5\text{ in}}{340\text{ pt}} = \frac{6.5\text{ in}\left(\frac{72.27\text{ pt}}{1\text{ in}}\right)}{340\text{ pt}} = 1.3816 The font size needs to increase by a similar percentage, 10\text{ pt}\times 1.3816 = 13.816\text{ pt}\approx 14\text{ pt} So we generate the SVG image with a different publication file, giving a font size of 14 point. The HTML font in the text may be very different from the font used in the TikZ picture, but their sizes are nearly identical. Note that our use of only supports 8 different font sizes, so it was fortuitous in this example that the 38% increase was so close to the supported 14 point font size. Note also, that since we used a different text width for the PDF, the resulting 40% increase in the font size for the SVG could play havoc with text that has been placed carefully not to overlap other components of the picture.

    There are myriad ways to scale and transform a TikZ picture. You might choose to intentionally use a smaller font size than the surrounding text, as in . Or, fidelity with the surrounding text might not be important to you. Or you might prefer that images perform better in HTML. But hopefully the above discussion and example provide enough insight into how the various constructions behave. The important points are:

    • TikZ uses physical units for the overall width of a picture, and nodes have text using the ambient font size of the file (unless prescribed otherwise).
    • scales a TikZ picture uniformly (text and line art) to fit into constraints given in the source.
    • The SVG version of a TikZ picture is also uniformly scalable and at the same width as the original will have text of the correct font size. However, when used in HTML output, it is scaled on the assumption that the ratio of the line width to the font size is 34:1. This is the default width computed by for all supported font sizes. Changes in this ratio for PDF production requires an equivalent change in font size during SVG construction, via the publication file.

    Images in Sage Syntax

    Sometimes the necessary computations for an image are not part of the capabilities of whatever system is actually realizing the image. We have good support for Sage in other parts of your document, and Sage has an extremely wide variety of computational capabilities, in addition to letting you program your own computations in Python syntax with the full support of the Sage library. Rather than translating Sage output as input to some other graphics program, we simply capture the graphics output from Sage. So if your graphics are derived from non-standard, or intensive, computation this might be your best avenue.

    Use the sageplot element, in a manner entirely similar to the asymptote element and the latex-image element, as a child of image, and containing the necessary Sage code to construct the image. There is one very important twist. The last line of your Sage code must return a Sage Graphics object. The pretext/pretext script () and -CLI () will isolate this last line, use it as the right-hand side of an assignment statement, and the Sage .save() method will automatically be called to generate the image in a file. Like asymptote and latex-image, putting a label on the sageplot tag will determine the name of this file. Note that there are four different file types, depending on if the graphic is 2D or 3D, and the output format of the conversion.

    The variant attribute of the sageplot element may be 2d or 3d, since is not capable of analyzing your Sage code. The default value is 3d so can be skipped for 2D plots. For technical reasons, it is also necessary to specify the aspect ratio of a graphic for the 3D case using the aspect attribute. The value can be a positive real number (decimal) or a ratio of two positive integers separated by a colon. The default is a square (1.0 or 1:1).

    File formats for <c>sageplot</c> images 2D 3D PDF PNG HTML SVG HTML (for iframe) EPUB SVG PNG Kindle PNG PNG

    Note that the PNG images in the 3D case are not very good. This needs help on the Sage side. And since 3D images in HTML output are inserted via an HTML iframe they can misbehave if you do not get the aspect ratio close to right. On the plus side, the 3D HTML images may be manipulated interactively with keyboard arrow keys, a mouse scroll wheel, and by dragging with a mouse using both a left and a right mouse press. Note that EPUB output used to make a Kindle book needs to use PNG images for both the 2D and 3D cases.

    Pay very careful attention to the requirement that the last line of your code evaluates to be a graphics object. In particular, while show() might appear to do the right thing during testing, it evaluates to Python's None object and that is just what you will get for your image. The example below illustrates creating two graphics objects and combining them into an expression on the last line that evaluates to the graphics object that will be created in the desired graphics files.

    
                        Negative multiple of a curve
                        
                            

    Plot of x^4 - 1 and its negative.

    f(x) = x^4 - 1 g(x) = -x^4 + 1 up = plot(f, (x, -1.5, 1.5), color='blue', thickness=2) down = plot(g, (x, -1.5, 1.5), color='red', thickness=2) up + down ]]>

    This will result in:

    Negative multiple of a curve

    Plot of x^4 - 1 and its negative.

    f(x) = x^4 - 1 g(x) = -x^4 + 1 up = plot(f, (x, -1.5, 1.5), color='blue', thickness=2) down = plot(g, (x, -1.5, 1.5), color='red', thickness=2) up + down

    Note the necessity of using the pretext script () to independently invoke Sage, no matter what sort of output is being created for your document.

    Mermaid

    Mermaid is a Markdown-inspired tool for authoring various kinds of diagrams. One kind of diagram - a git commit visualization - is shown below. For a full listing of diagram types, see the Mermaid Documentation. The Mermaid live editoris a great tool for testing the syntax of your mermaid diagrams.

    You can specify global settings for diagrams via an entry in the publication files, see . The available options are the same as the ones available in the config frontmatter section of a diagram. Note that the neutral theme will produce grayscale images, which could be useful for controlling the cost of a print-on-demand version.

    To author a Mermaid diagram, use a image that contains a mermaid element. A label on the mermaid element will be used to construct a filenameyou will want to utilize this feature.

                    <figure xml:id="figure-mermaid-git">
                        <caption>Mermaid Git Diagram</caption>
                        <image>
                            <mermaid label="mermaid-git-image">
                        ---
                        title: Example Git diagram
                        config:
                            theme: default
                            layout dagre
                        ---
                        gitGraph
                            commit
                            commit
                            branch develop
                            checkout develop
                            commit
                            commit
                            checkout main
                            merge develop
                            commit
                            commit
                            </mermaid>
                        </image>
                    </figure>
                    
    Mermaid Git Diagram --- title: Example Git diagram --- gitGraph commit commit branch develop checkout develop commit commit checkout main merge develop commit commit

    Mermaid has two layout enginesthe default and elk. The ELK engine often does a better job with complex diagrams. You can specify it as a default by setting common/mermaid/@layout-engine to "elk", or by using standard Mermaid config frontmatter as shown in below.

    Mermaid Class Diagram using ELK layout engine
    Image Formats Preferred Image Formats

    The best formats for images, in order, are:

  • SVG

    Vector graphics format ideal for HTML output formats. Scalable and compact. Converts to other formats, such as PDF.

  • PDF

    Vector graphics format ideal for print and PDF output formats. Good tools exist to convert back-and-forth between SVG and PDF.

  • PNG

    Lossless and compressible format for raster images. May be used for both HTML and PDF outputs.

  • JPEG

    Compressed lossy format which works well for photographs. May be used for both HTML and PDF outputs. PNG should be preferred when there is a choice, except in the case of a photograph. Converting between these formats is unlikely to be an improvement.

  • Image Archives

    As an instructor, you might want to recycle images from a text for a classroom presentation, a project handout, or an examination question. As an author, you can elect to make images files available through links in the HTML version, and it is easy and flexible to produce those links automatically.

    First, it is your responsibility to manufacture the files. For making different formats, the pretext script can sometimes help (). The Image Magick convert command is a quick way to make raster images in different formats, while the pdf2svg executable is good for converting vector graphics PDFs into SVGs (although now the pretext script uses the pyMuPDF library for these tasks instead). Also, to make this easy to specify, different versions of the same image must have identical paths and names, other than the suffixes. Finally, the case and spelling of the suffix in your source must match the filename ( jpg versus JPEG). OK, those are the ground rules.

    For links for a single image, add the archive attribute to the image element, such as <image ... archive="pdf svg"> to get two links for a single image.

    To have every single image receive an identical collection of links, in docinfo/images place an archive element whose content is the space-separated list of suffixes/formats. <archive>png JPEG tex ods</archive> will provide four links on every image, including a link to an OpenDocument spreadsheet.

    For a collection of images that is contained within some portion of your document, you can place an xml:id on the enclosing element and then in docinfo/images place <archive from="the-xml-id-on-the-portion">svg png</archive> to get two links on every image only in that portion (chapter, subsection, side-by-side, ). The from attribute is meant to suggest the root of a subtree of your hierarchical document. If you use this, then do not use the global form that does not have from.

    You may accumulate several of the above semi-global semi-local forms in succession. An image will receive links according to the last archive whose from subtree contains the image. So the strategy is to place general, large subtree, specifications early, and use refined, smaller subtree specifications later. For example, <archive from="the-xml:id-on-a-chapter">svg png</archive> <archive from="the-xml:id-on-the-introduction">jpeg</archive> <archive from="the-xml:id-on-a-section-within" /> will put two links on every image of a chapter, but just one link on images in the introduction, and no links at all on every image image within one specific section. Again, do not mix with the global form. You can use the root document node ( book) for from to obtain a global treatment, but it is unnecessary (and inefficient) to provide empty content for the root node as first in the listthe same effect is the default behavior.

    Notice that this facility does not restrict you to providing files of the same image, or even images at all. You could choose to make data files available for each data plot you provide, as spreadsheets, or text files, or whatever you have, or whatever you think your readers need.

    Finally, archive may be a bit of a misnomer, since there is no historical aspect to any of this. Maybe repository would be more accurate. Though for a history textbook, it might be a perfect name.

    Copies of Images

    Sometimes you want to use the same image more than once. Putting it in a figure and then making a cross-reference (xref) can work well in HTML output since it will be available as a knowl. However in a static format (PDF, print) the reader will need to chase the cross-reference.

    For a raster image, you can just point to the file again with the source attribute. You are free to wrap it in a figure and thus change the caption. It will get a new number as a new figure, and you will need to assign a new unique xml:id attribute. Maybe appending -copy-2, or similar, to the xml:id will be helpful.

    If you have a figure generated from source code (such as in TikZ) you really do not want to edit and maintain two copies that may not stay in sync. Instead, you can place the code into a file and xinclude it twice. Study carefully, and note that this is an excellent place to take advantage of setting the parse attribute to text (no need to escape problematic XML characters). Notice that when you generate images, you will have two image files with identical contents, but different names. This is no place for false optimization. Bits are cheap and your time is valuable. It is far more important to only maintain a single copy of the source, than to be caught up with the waste of having two copies of the same file (and which are managed for you). We demonstrate this with the sample book, since it is all set up with the xinclude mechanism. See the two plots of the 8-th roots of unity in the complex numbers section of the chapter on cyclic groups.

    Consoles console Content and Placement of Consoles

    A console is a transcript of an interactive session in a terminal or console at a command-line. It is a sequence of the following elements, in this order, possibly repeated many times as a group: input, and output. The output is optional. The content of these two elements is treated as verbatim text (see ), subject to all the exceptions for exceptional characters (see ). A prompt attribute on the input can be supplied to provide a system prompt distinct from the actual commands. The default prompt is a dollar sign followed by a space. If it is more convenient prompt may be supplied on the console, to be used in each enclosed input. If you do not want any prompts at all, just use an empty value for prompt. A continuation attribute may also be supplied at the input or console. If present, it will apply to the start of each input line following the first.

    A console may be wrapped in a listing, see . This will behave similar to a figure, with the caption displayed below, and a number assigned. So, in particular, if your program is important enough to cross-reference, it is an enclosing listing that serves as the target.

    Programs and Program Fragments program Content and Placement of Programs Content and Placement

    A program will be treated as verbatim text (see ), subject to all the exceptions for exceptional characters (see ). Indentation will be preserved, though an equal amount of leading whitespace will be stripped from every line, so as to keep the code shifted left as far as possible. So you can indent your code consistently along with your XML indentation. For this reason it is best to indent with spaces, and not tabs. A mix will almost surely end badly, and in some programming languages tabs are discouraged (e.g. Python).

    The text contents of a program can be surrounded with code, but that is only necessary if you have other elements inside of the program like preamble or tests used by an interactive program (see below for details).

    A program or console may be wrapped in a listing, see . This will behave similar to a figure, with the title displayed above, and a number assigned. So, in particular, if your program or console is important enough to cross-reference, it is an enclosing listing that serves as the target.

    The language attribute may be used to get some degree of language-specific syntax highlighting and/or interactive behavior. The current known languages are:

    • basic
    • c
    • cpp
    • go
    • java
    • javascript
    • lua
    • pascal
    • perl
    • python
    • python3
    • r
    • s
    • sas
    • sage
    • splus
    • vbasic
    • vbscript
    • clojure
    • lisp
    • clisp
    • elisp
    • scheme
    • racket
    • sql
    • llvm
    • matlab
    • octave
    • ml
    • ocaml
    • fsharp
    • css
    • latex
    • html
    • tex
    • xml
    • xslt

    In some output formats, notably HTML, the syntax highlighter can add lines or highlight individual lines of code. Highlighting lines is not supported for output. To display line numbers, set the line-numbers attribute to yes. To highlight particular lines, set highlight-lines to a comma-separated list consisting of individual lines and/or ranges indicated with dashes. Some examples are: 5, 2,5, 2,5-8,10-15,15.

    For interactive versions hosted on Runestone servers, the label attribute is critical, just like for interactive exercises. So be certain to read .

    Finally, when authoring programs, it may be helpful to keep the source code as plain text in separate files. This can avoid the need to manually escape characters that have special meaning in XML and can facilitate testing and updating the code samples. See for how to do so.

    Default Attributes for Programs

    Book-level default values for some program attributes can be set in docinfo/programs. If a value for an attribute is set in that location, it will be used for any program that lacks the corresponding attribute.

    The following attributes can be given default values - some only are applicable to interactive programs (see and ): compiler-args, linker-args, interpreter-args, download, language, linenumbers, and timelimit.

    Program Fragments

    Fragments of a program can be added inline with text using the pf. A program fragment will be displayed similar to a c, but will be syntax highlighted to match a program. The language to interpret the fragment as can be specified with language or by relying on a document level default for programs (see ).

    Interactive Programs, CodeLens

    CodeLens is an interactive version of a computer program, which can be visualized by stepping through the code one statement at a time, watching output, variables, and other data structures change. So it is similar to a debugger, except the reader does not set breakpoints or modify program data on-the-fly. This is possible automatically for several different languages when your HTML is hosted on a Runestone server (). This may also be accomplished in browser when hosted on any old generic web server. The catch is that for a generic server a publisher must generate trace data in advance, typically with the PreTeXt-CLI (). Place the interactive attribute on a program element with the value codelens to elect this behavior (no is the default value). Also, be sure to specify a language from the supported languages: Python, Java, C, and C++. Consult below for a summary of various combinations. When an output format does not support an interactive CodeLens instance, the fallback is a static program listing. The program should have an xml:id that will be used as a unique identifier for the generated trace file needed by the codelens.

    Sometimes, there is uninteresting setup to get through before the portion of the program the author wants to illustrate. The author can use starting-step to specify the instruction number that the interactive should start at. Code before that will be fast-forwarded through and execution will begin at the indicted step. Note that starting-step is a Step number in the execution sequence, not a line number in the source code. You may have to run the Codelens once to find the right step to start at.

    An author may add checkpoints to a Codelens that will ask the user a question when execution reaches a particular line of the program. To do so, add one or more checkpoints. The checkpoint should have a line specifying what line to ask it on and either an answer or answer-variable attribute to indicate the correct answer (see the next paragraph for more on these). The checkpoint must have a child prompt with the question to ask the reader and optionally may have a child feedback element with Simple markup can be used to format the contents of both the prompt and the feedback.

    To determine if the user's answer is correct, the answer or answer-variable will be used. answer will be compared directly to the user response via simple string comparison. An answer-variable will be compared to the current value of a variable in the program. This is especially useful for checkpoints inside a loop or function that will be asked multiple times with a different correct answer each time. To specify the name of a variable, use globals.x (for globally scoped variables) or current_frame.x (for locally scoped ones). More advanced names (array elements, object members, etc...) can be decoded by examining the trace file generated for the codelens. Find the line that will contain the checkpoint, and examine the globals field or the encoded_locals field of the last stack frame in that line.

    For examples, see the Codelens section of the Sample Book on Runestone.

    Interactive Programs, ActiveCode Authoring ActiveCode Programs

    ActiveCode is an interactive environment where a reader may work on code through repeated edit-compile-test cycles. Code can be provided by an author as a complete program to be modified, a partial program to be completed, or nothing at all. One good example is that maybe header files, import statement, and similar are provided, and a skeleton of a main entry-point procedure is also provided. Then a reader can concentrate on the more conceptual parts of the programming. Some languages will be executable in browser on any old generic web server, while others must be on a Runestone server () where a Jobe Server is running to support the execution.

    Place the interactive attribute on a program element with the value activecode to elect this behavior (no is the default value). Also, be sure to specify a language from the supported languages. Consult below for a summary of various combinations. When an output format does not support an interactive ActiveCode instance, the fallback is a static program listing.

    Labels and XML IDs

    Properly placing labels and xml:id's can get tricky for programs. Understanding the purpose of these two different identifiers is important:

    • xml:ids are used to link to a program from other parts of the book source code. Any program that you want to use as the target of an add-files or include attribute in some other program must have a unique (within the book) xml:id.

    • labels are used to provide an identifer for items in the Runestone database. They too should be unique within a book. But a program that is a direct child of an exercise-like element is considered to be a programming exercise. Programming exercises do not need a label as they are included in the database as part of the exercise.

    So best practices are:

    • Every program should have a label attribute unless it is the direct child of an exercise like element. In that case, the label goes on the exercise and the program does not get a label. It is OK to leave a label off of a non-interactive program no other programs try to link to it (e.g. addfiles).

    • Any program you want to link to from other places should get an xml:id. It always goes on the program itself.

    It is perfectly fine to use the same value for both label and xml:id, although xml:ids are more restrictive in terms of what characters are allowed.

    Inside the program of an ActiveCode, you can use the following elements:

  • preamble

    Code that will be part of the program but not available for editing by the user and precedes the contents of code. This code will be visible unless the visible is set to no.

    Note that the contents of this element will be combined with the code before the indentation is adjusted. So any code in this block must be indented to the same baseline as the contents of code.

  • code

    The body of the program that will be editable by the user.

  • postamble

    Code that will be part of the program but not available for editing by the user and follows the contents of code. This code will be visible unless the visible is set to no.

    Note that the contents of this element will be combined with the code before the indentation is adjusted. So any code in this block must be indented to the same baseline as the contents of code.

  • tests

    Tests may take the form of either structured input-output tests (see ) or as a block of code that will be added after the code (as well as any postamble). The assumption is that code in tests is doing unit testing that the user should not see, so this code will be hidden unless the visible is set to yes.

    This code is processed by PreTeXt separately from the code, so indentation does not need to be consistent between it code and tests.

    Some languages have support for unit testing frameworks. If you use one of them, the results of the tests will be parsed and displayed to the user as a visual results table. The following languages have support for unit testing frameworks:

    • python supports unittest
    • java supports junit
    • c and cpp support doctest (which tends to build and run significantly faster) and catch

  • stdin

    If this element is provided, a text box will be created for the user to enter text that will be fed to the program via the stdin stream. If the stdin has text content, that will be provided to the user as a default input. Multiple lines of input are permissable. The text will be sanitized in the same way that the program itself is.

  • Here is a sample of a program with preamble and postamble. For more examples, see the Activecode section of the Sample Book

    There are a wealth of attributes that can be used to control the behavior of ActiveCode. (These are in addition to the standard ones allowed for for program. see for those.) Below is a list of the extra attributes available. Any attribute that lists other elements for inclusion will take a list of xml:ids for those elements.

  • autorun

    If set to yes the program will run on page load.

  • chatcodes

    Set to yes to enable users to talk about this code snippet with others.

  • codelens

    In languages that support Codelens (see ), there will be a button that allows the user to run the program via Codelens. Set this to no to remove it. This may be desireable if you know the code uses features that are not supported by Codelens (e.g. turtle graphics or image).

  • compiler-args

    (C/C++ only) A comma separated list of strings to be passed to the compiler. Ex: -Wall, -std=c++17. A book-level default can be specified - see .

  • extra-compiler-args

    (C/C++ only) A comma separated list of strings to be passed to the compiler in addition to the compiler-args. Mostly of interest to add an argument to a particular program without overriding any book-level default arguments.

  • database

    (SQL only) SQL based programs can make use of an SQLite database file. Use this attribute to specify the file to load as a string relative to the external top-level directory.

  • filename

    For server based programs. What name to use when the code from this file is written to the server. This is generally only required if using the add-files attribute on some other program to make the contents of this program available (as a .h file for example).

  • download

    Set to yes to enable users a download button that triggers downloading of the user code to a file. A book-level default can be specified - see .

  • hidecode

    Set to yes to initially hide the code. When code is hidden, the 'Run' button is also disabled. To run the code, a user either presses 'Show Code', then 'Run'.

    You might use this if you want to put an ActiveCode block in the page in order to include it in another ActiveCode block, but you don't need or want students to see it right away. Or to hide the code of an ActiveCode with autorun where you initially want to focus on the output instead of the program.

  • include

    A comma separated string identifying one or more other ActiveCodes that are to be prepended to this program when it is run.

    This allows you to write examples that build on each other without having to duplicate all the code in each successive block. For example, if you write a function definition in one ActiveCode, you can include it in a later ActiveCode block that has code to call the function without having to visibly include the definition.

  • add-files

    (Server based code only) A comma separated string identifying one or more other programs or Datafiles by xml:id that are to be made available to this code. Each of those elements should have an filename.

    For server based programs, the other elements will be copied into files based on their filename attributes.

    This allows you to split code into multiple files and thus create more complex interconnections than when using include.

  • compile-also

    (C/C++ only) A comma separated string identifying one or more other programs by xml:id that are also to be compiled when this program is compiled. They will be assumed to also be a part of the add-files collection. Each of those programs should have an filename.

  • interpreter-args

    (Python2/3/Java/octave only. Only applies to Python that is run on the server. See .) A comma separated list of strings to be passed to the compiler. Ex: -Xrs, -Xss8m, -Xmx200m. A book-level default can be specified - see .

  • language

    Same options as program. A book-level default can be specified - see .

  • linker-args

    (C/C++ only) A comma separated list of strings to be passed to the compiler. Ex: -lm, -g. A book-level default can be specified - see .

  • timelimit

    A maximum time allowed, in milliseconds, for a program to compile and run. If not provided, the default is 25000 (25 seconds). A book-level default can be specified - see .

  • Tests for Interactive Programs

    There are currently two ways to make automated tests for ActiveCode programs. The first way is to simply provide code in the tests element of the program as described in . It will be assumed this code is unit tests and it will be run automatically with the user's submission.

    Below is an example of unit tested Python. For more examples, see the Coding Exercises section of the Sample Book

    The second way to automatically test code is to provide a set of structured input-output pair tests. For each test, the program will be run and fed the specified input. Then the program output will be compared against the test output to decide if the program handled the test correctly. This mechanism is useful for testing simple programs without functions and for languages that do not have a unit testing framework. A particular program can only have one of these two testing mechanisms.

    IO tests are generally only available for programs that run on a Runestone server. (See for a list of which languages support IO tests.). To preview them, see the Coding Exercises section of the Sample Book hosted on Runestone

    Structured IO tests are added as iotests to the tests element. Each iotest element must have a single input and output element. The input element contains the input that will be fed to the program, and the match element contains the expected output of the program. Indentation for both will be normalized in the same way that programs are (so multiple-line sample output can be indented in your source document).

    When evaluated, the program output and test output will have leading and trailing spaces removed. Other than that spacing, the two must match exactly to be considered a "passed" test.

    Interactive Program Capabilities

    This table lists which types of interactivity are available on various combinations of servers and programming languages. The entry AC + CL means that both ActiveCode and CodeLens instances are available, but the ActiveCode instance will have a CodeLens button enabled. Although tests can be used to append code to any program, only in situations listed as UT below will the test output be parsed and interpreted by the server

    Note that python is generic Python with the standard libraries (version 3.x). On the other hand python3 is a Runestone server installation (only) with a number of additional popular Python packages available, such as numpy and pandas.

    Interactive Programs Language @language Server Generic Runestone Python python AC + CL + UT AC + CL + UT Python 3 python3 AC + IO Java java CL AC + CL + IO + UT Kotlin kotlin AC C c CL AC + CL + IO + UT C++ cpp CL AC + CL + IO + UT JavaScript javascript AC AC HTML html AC AC SQL sql AC AC Octave octave AC + IO AC = ActiveCode, CL = CodeLens, UT = Unit Tests (parsed), IO = IO Tests
    Data Files

    In concert with interactive programs (see ) you can define a file of data that may be employed by those programs. The necessary element is datafile. It requires a label. To allow programs to link to the datafile, it will also need an xml:id (which can be the same as the label). A filename is also required and is the name the file is known by in an ActiveCode program. Do not try to impose any sort of directory structure on this name. Just a filename. In the case of a text file (see below), the editable attribute is optional. The value no is the default, with yes as the other option. The attributes rows and cols are optional for text files, and default to 20 and 60 respectively. Finally, a non-editable text file (only) may have its contents hidden by setting the hide attribute to yes, rather than the default value of no.

    Where might you place a datafile? Lots of places are possible, such as in an example or a programming exercise, close to an ActiveCode program. So, in expository material or in activities for readers to work through. The purpose-built COMPUTATION-LIKE block, data, which will get you a heading, number, title, cross-reference target, etc. (see ), is an option if the file itself needs more prominence or dedicated explanation. Notice that this feature is very powerful, and thus requires a bit of machinery to support. If you just want to point your reader to a file (and leave them to work with it outside of your project), either globally or locally, the read about the dataurl element at .

    Text as Data Files

    Inside of a datafile place an pre element. There are then two options: provide the contents of the text file right in your source file, as you might for other preformatted text, or supply a source attribute whose value is the name of an external text file you provide. The former is appropriate for toy examples, while the latter may be used for serious files with many lines, or with long lines. Note that if you provide the file as the content of the pre element, it can be indented to match your source file indentation, and will undergo some manipulation, such as removing leading whitespace, and ensuring a final newline, but preserving any relative indentation. If provided via a source attribute, there is no manipulation.

    Such a text file may be declared editable by the reader, presumably to allow them to witness the resulting behavior of a some employing program. The rows and cols attributes describe the viewport into the file provided in the HTML output. Typically scrollbars will allow the reader to survey all of a large file. In static outputs, the first few lines are shown, given by the value of rows, and lines are truncated according to the value of cols.

    Images as Data Files

    Inside of a datafile place an image element with a source attribute. As usual, this attribute should be the name of an external file you provide. Most common formats are supported, but it is important to use standard extensions, so the format can be discerned. Now this file may be explored programmatically by opening the file using the name provided in filename.

    Keep the size of the image small, say 300400 pixels in each direction. You may also supply the usual layout controls, such as width, and these will be consulted in the formation of output formats. Ideally, you should use a width that scales the image to look something like its native resolution, since part of an image-processing exercise may depend on this aspect of the input. HTML output uses a 600 pixel overall width, so a percentage can be computed based on this parameter.

    Notes on Data Files

    Some notes that apply to each type of data file.

    • Note that the name of the data file in a source attribute need not have any resemblance to the new name given to the file via the filename attribute. In other words, the reader will never know (or care) what source was.
    • Whenever the source attribute is used, there needs to be an advance step performed by the CLI or the pretext/pretext script () to generate an auxillary file (yes, a third file!) to aid the transistion from an external file to a file that can be used by the reader in programs.
    • For a program to use a data file, it must be able to find the appropriate file. This is accomplished by specifying an add-files attribute on the program element that is a list (separated by commas or space) of the xml:id's for files that are available for use in the program. For programs that run strictly in the browser as opposed to on a Runestone server (see for what languages run in the browser), a program may be able to open a file by name without specifying its xml:id in the add-files. However, for all programs, best practice is to make sure that the xml:id of any datafile a program should have access to is correctly listed in that program's add-files
    • In all cases, for an HTML build the contents of the data file live within an HTML page, as text for a text file, and as a base-64 encoding for an image file. Hence for a non-Runestone build, any employing program must be on the same page, and an author should think ahead about the granularity of how a project might be chunked into pages ().

      In a build for use on Runestone Academy (), the file will be in the Runestone database and usuable throughout.

    Figures

    A figure is the most generic and flexible container for planar content. But be sure to read so you are aware of the other possibilities. A figure has a caption, which will typically render below the content (even if authored early as metadata) and serves to provide an extra description of the content. So it may be several sentences long. There is also a title, which is typically not rendered as part of the figure. Instead it is used for cross-references, or in a list of figures, to identify the figure. So it should be very short and might just be a phrase, such as Life Cycle of a Salamander.

    An image is likely the most frequent content in a figure. But you may also place a video, audio, sidebyside, or sbsgroup. Once completely implemented, an interactive is another possibility. (See for more about the side-by-side construction.)

    A special situation is when a figure is a panel of a sidebyside, which is itself inside a figure. Then the interior figure is subnumbered. For example, the exterior figure might be Figure 4.12, and if a panel of the sidebyside is the second interior figure it will be Figure 4.12(b). For example, <figure> <caption>Salamanders at different life stages</caption> <sidebyside> <figure> <caption>Hatchling</caption> <image source="salamader-hatchling.jpg"/> </figure> <figure> <caption>Juvenile</caption> <image source="salamader-juvenile.jpg"/> </figure> <figure> <caption>Adult</caption> <image source="salamader-adult.jpg"/> </figure> </sidebyside> </figure> could result in the entire figure being Figure 4.12 and then the juvenile salamander photograph would be inside of Figure 4.12(b).

    Tables and Tabulars

    A table is a container that houses a tabular, which is the actual rows and columns of table entries.

    Note that tabular may be constructed using the Complex Table Editor tool online and then exported in syntax. This produces verbose syntax that is usually equivalent to much simpler syntax once you understand the borders and alignment considerations below.

    Tables table

    A table is similar to other blocks in () and is most similar to a figure. It will earn a number, which is likely to be a part of the text of a cross-reference pointing to the table. Rather than a caption, it will have a title. The main difference is that the principal content must be a tabular. Only.

    Tabular tabular

    A tabular is the actual headers, rows, and columns of a table. As discussed above, a typical use is to place it inside a table, though it can be placed all by itself, typically in among a run of paragraphs.

    Fundamentally a tabular is a sequence of row and each row is a sequence of cell, which could also be called table entries.

    Table Cells tablecell tableentry celltable

    A given cell can span multiple columns, by providing the colspan attribute with a value that is a positive number, the cell will extend to occupy additional columns.

    Table Rows tablerow rowtable

    A row of a table is a sequence of cell elements. Each row should occupy the same number of cells, when considering the colspan, as discussed above.

    To achieve column headers, you indicate that a row contains headers. Typically, the contents of every cell in this row will then be rendered in bold, or some other style. The row element accepts a header attribute with possible values of no (the default), yes, or vertical. The latter is useful if space is at a premium (which always seems to be the case with tables), and the cells of a column are narrow and the header is long. Note that only the first (top) rows can be treated as column headers and these rows must be contiguous. If you think you need column headers mid-tabular, maybe you really have two tables?

    Table Columns tablecolumn columntable

    Prior to all of the row within a tabular, there may be a sequence of empty col elements. Having these is optional, but once there is one, then there needs to be as many as the number of columns of the table. These elements do not have any content that appears in the table, but are used to hold attributes that influence the borders or alignment of the cells within a column. These are described below.

    So it should now be clear that, after much consideration, that we have chosen a row first approach to describing a table.

    To encourage good style, we only support row headers as the first column. So this is a property of the entire tabular. So the attribute row-headers on tabular can have values no and yes, with the former as default. Note that major and minor row headers should be accomplished in the first column by using indentation for the minor headers. Please make a feature request if you would find this useful.

    Table Borders and Rules tablerow rowtable tablerule ruletable

    You can view each cell of your table as having four borders. Or you can imagine rows and columns separated by horizontal or vertical rules. These additions to your table do not change the arrangement of information into rows and columns (a doubly-indexed data set), though you may think it makes the presentation clearer. But less is actually more.

    Vertical Rules in Tables

    One of the goals of is to gently guide authors towards good choices in the design of their documents, even if we do not claim to know it all ourselves. Take a close look at . What's missing? No vertical rules. Try living without them, you will not really miss them. If you think you need to divide a table into two halves, maybe you really need two tables (and then see the side-by-side capabilities, ).

    In the documentation for his excellent package, booktabs, Simon Fear gives two rules for what he calls formal tables: (1) Never, ever use vertical rules, and (2) Never use double rules. We have resisted the temptation to enforce the former and have provided an alternative to the second (three thicknesses). He refers to using tables for layout as creating tableau. If you are finicky about the look of your work, the first three pages of the documentation is recommended reading.

    A given cell can have a border on its bottom edge, and on its right edge. This is accomplished with the bottom and right attributes. The possible values are minor, medium, and major, which control thickness. (Not every conversion can produce three distinct thicknesses, so this should be considered a hint to the conversion.) A value of none is the default behavior when the attribute is not used, but can be given explicitly.

    How to get a left border on the first cell of a row? The row element allows a left attribute which will put a border on the left end of the row, which is also the left border of the first cell.

    How to get a top border on a cell? Put a bottom border on the cell above it. But what if the cell is already in the top row and has no cell above it? The relevant col element allows a top attribute which will place the necessary border on the top-row cell.

    Borders and rules verge on presentation, so we are not concerned about which cell a border (or rule) belongs to. So, generally bottom and right can be used in many places, and the exceptional top and bottom maybe used to get the missing border n+1 for a vertical or horizontal sequence of n cells.

    The attributes described for cells may also be used on row, col, and tabular. For example a thick horizontal rule after two rows of headers could be accomplished with <row header="yes">...</row> <row header="yes" bottom="major">...</row> We will not detail all the combinations that are possible, so experiment and you should be able to create any rational look (and some irrational ones).

    Table Cell Alignment tablecell alignment cell alignmenttable

    The horizontal alignment of the contents of a cell can be influenced by the halign attribute with values left, right, center, and for paragraph cells, justify. Similarly the valign attribute will influence the vertical alignment through values top, middle, and bottom. Default alignments are left and middle.

    To align the cells of an entire row, col, or tabular identically, place the relevant attribute on the relevant element. Note that these choices can be overridden by different values on individual consituents.

    Multi-line Cells tablemulti-line cell celltablemulti-line

    A cell of a table may contain more text that fits onto one line. If you know exactly where you want the line-breaks to be, then structure the entire cell as a sequence of line elements.

    Or, if you want the contents of a cell to look and feel more like a paragraph (or several), structure the cell as a sequence of p, which can contain the usual content of a p, excepting larger content such as display mathematics or lists. Now, in this case, you must constrain the width of the cell's column, to force the line-breaking necessary to render a paragraph as several lines. Use the relevant col element, and specify a percentage of the tabular's overall width, like this: <col width="40%"/> A paragraph cell can be right-justified with the halign attribute set to justify. But be aware that if the column is skinny, this can lead to awkward inter-word spaces.

    Breakable Tabulars tablebreakable tabularbreakable

    A tabular may be specified as breakable, inside of a table or not. Use the attribute break set to yes. (The default is no.) This only affects conversions to formats with page breaks, such as PDF. Usually the motivation will be a table or tabular that is too long for a page, but even a shorter table can be allowed to page break.

    As of 2022-07-28 this is effective for simple tables, but introduces some variations for more complex constructions. This is implemented with the longtable package, which suggests it may take up to four passes with to obtain the final version. It is also not effective for a tabular that is a side-by-side panel. Consult the sample article for examples where more progress is necessary.

    Table Philosophy

    The Chicago Manual of Style says:

    A table offers an excellent means of presenting a large number of individual similar facts so that they are easy to scan and compare. A simple table can give information that would require several paragraphs to present textually, and it can do so more clearly. A table should be as simple as the material allows and understandable on its own; even a reader unfamiliar with the material presented should be able to make general sense of a table.

    If you review the twenty tables presented in Chapter 13 of CMOS, that are of the type we implement, you will notice several things.

    • Only the first column is ever used for row headings.
    • Cells do not span multiple rows. (There is no analogue for colspan.)
    • Column headings appear at the top, other than cut-in heads, which have a very particular form. (We have not implemented these, but would entertain a feature request.)

    While our implementation allows for some presentational elements (borders, rules, alignment) our conversions will presume your table hews to the purposes described by CMOS. In particular, it is not a device for spatial layout of complex elements. You might find that the sidebyside and sbsgroup layout devices will suit that purpose better (see ).

    Tables are Difficult

    Width is always at a premium, and then when a tabular has more than a few columns, the width becomes even more dear. When a cell has text that looks like a phrase or a sentence, rather than numerical data or symbols, it can be even harder to pack it all in. A common example is a schedule of talks at a small professional conference where each time slot (rows) might have two or three talks simultaneously in parallel sessions (columns).

    We offer paragraph cells which automatically break lines, but you need to specify a width on the col as a percentage to indicate where line-breaking happens. For manual line-breaking, a cell can be structured entirely by line elements.

    The next complication is that the used for PDF output tends to make columns as wide as necessary and will not break lines without the devices mentioned in the previous paragraph. The HTML output can sometimes be a bit more forgiving and flexible. So we suggest building the output first and getting that right, and then the HTML is likely to follow along and not need much futher refinement.

    In contrast to most of , you may need to experiment, refine your approach, iterate, and maybe do things contrary to usual best practices elsewhere. For example, the clickables for URLs and knowls might need to be short and less-informative in order to save some width. Abbreviations, initialisms, and acronyms can also save some width.

    Summary: Table Reference

    Finally, we summarize the available options for a table witha table. Because it would take too much text to describe fully.

    This table describes how to construct tables via the tabular element. The table element may be used to enclose the raw table, so as to associate a title and get vertical separation with horizontal centering.

    The tabular element contains a sequence of row elements, and must contain at least one. Each row contains a sequence of cell elements and must have the same number in each row (acccounting for the use of the colspan attribute). The contents of the cell elements are the text to appear in entries of the table.

    A sequence of col elements may optionally be used. But if one appears, then there must be the right number for the width of the table. They are empty elements always, and just carry information about their respective column.

    Where the body of the table below has an entry, it means the attribute may be used on the element, and affects the range of the tabular described by the element. Employment of an attribute on elements to the right in the table will supersede use on elements to the left. Generally, every cell has right and bottom borders, but only cells at the left side of the table have a left border and only cells across the top have a top border. Only one cell has four borders.

    Tabular Elements and Attributes (p = potential) Attributes Elements Values tabular col row cell * = default top none*, minor, medium, major left none*, minor, medium, major bottom none*, minor, medium, major right none*, minor, medium, major halign left*, center, right, justify halign p decimal, character header yes/vertical/no* row-headers yes/no* valign top, middle*, bottom colspan 1*, positive integer width percentage colors p p p p
    Program Listings

    A listing is really a specialized type of figure, whose purpose is to hold computer code. It has an optional title which is rendered above the listing. However, the enclosed planar content is limited to a program or console (see and ).

    Named Lists listnamed named list listanonymous anonymous list

    As mentioned above, it is not possible to have a list be the target of a cross-reference. Should an entire list be so important that you need to point to it from elsewhere, then make it a named list by wrapping it in the list tag.

    This element can begin with an optional introduction, then has a single, required list, which may be any of the three types. It concludes with an optional conclusion. It can have an xml:id attribute, which in a way is the whole raison d'être for this construction. It will be numbered when rendered, and so also requires a title. You might think of this as similar to a tablebits of information organized spatially, via indentation and line breaks.

    Since this element associates a number, title, to an entire list, we call it a named list. What should we call a list that is authored within a paragraph and cannot be the target of a cross-reference? We call it an anonymous list when we want to make the distinction.

    Sage

    Until we can expand this section, get some ideas from . We will also collect a few items here, to be cleaned-up later.

    For online output formats, sometimes the output of a Sage command can be overwhelming, and a bit complicated to parse. Many objects in Sage also have a representation, which can be used to create a superior output format (for some purposes). Begin a cell with the magic: %display latex Experiment with the following Sage code on the next line integral(x^9*cos(x), x) Boom! Very nice. Try replacing latex with None, plain, ascii_art, or unicode_art.

    Sage Cell Server Design

    The ability to execute, and edit, chunks of Sage code is provided by a distinct project, the Sage Cell Server. Simplifying somewhat, the Sage code a reader sees (or has edited!) is shipped out to a running instance of Sage (on a server somewhere) and the code is executed there. The results of that computation are shipped back to the reader for display below the code.

    Two implications of this design are

    • It is not within your power to add additional packages for the supported languages.
    • You cannot read a (data) file hosted on your project's site.
    Fortunately, there are workarounds.

    If your code needs a Python package, or an R package, or similar, and it is a standard open source package, then make a request on the Sage Cell Google Group. Likely, it can be added/installed.

    Unfortunately, the ability to read files anywhere on the internet was abused, so this capability had to be restricted to a finite list of servers. These include DropBox and GitHub where you might find it convenient to place files supporting your code. Note that for GitHub, you likely want to use a URL which is a raw file such as for the repository README file, written with Markdown.

    Interactives

    TODO: until then examine copious examples in the sample article.

    Side-by-Side Panels side-by-side panel

    Documents, pages, and screens tend to run vertically from top to bottom. But sometimes you want to control elements laid out horizontally. A sidebyside is designed to play this role. It is best thought of as a container, enclosing panelspanelside-by-side panelside-by-side panelpanel, and specifying their layout. Examples include three images, all the same size and equally spaced. Or a poem occupying two-thirds of the available width, with commentary adjacent in the remaining third. Or an image next to a table. But the most common use may be a single image (with no caption, and hence no number), whose width and horizontal placement are controlled by the layout.

    See the schema for the exact items that are allowed in a sidebyside. To author, just place these items within sidebyside in the order they should appear, left to right. Then you add attributes to the sidebyside element to affect placement.

    Instead of placing a width attribute on each item, instead place this on the sidebyside element. A single width will use the same value for each panel. For different widths, use the plural form widths and provide a space-separated list of percentages. The default is to give each panel the same width, and as large as possible, which will result in no gap between panels.

    The margins can be specified with the margins attribute, which if given as a single percentage will be used for both the left and right sides. You may also specify asymmetric left and right margins with two percentages, separated by a space, in the same attribute. An additional option is to use the value auto which will set each margin to half of the (common) space between panels. This is also the default. In the case of a single panel, the left margin, right margin, and panel width should all add up to 100%.

    Once the widths and margins are known, any additional available width is used to create a common distance separating panels. (Which is not possible when there is just a single panel.)

    Independent of horizontal positioning, individual panels may be aligned vertically. The attribute is valigns and its value is a space-separated list of top, middle, and bottom. The singular version, valign, is used to give every panel the same alignment, using the same keywords. The default is to have every panel at the top.

    We could give lots of examples, but instead it might be best to just experiment. Error-checking is very robust, so it is hard to get it too wrong. OK, we will do just one to help explain. Suppose a sidebyside contains three panels and has layout parameters given by <sidebyside widths="20% 40% 25%" margins="auto" valign="middle"> Then there will be 15% of the width left to space out the panels. The two gaps are each 5% of the width, and the remaining 5% is split between the margins at 2.5% each. And the vertical midlines of each panel are all aligned.

    For a single panel with no attributes, the panel will occupy 100% of the width. A single panel with a specified width will get equal (auto) margins, resulting in a centered panel.

    Captioned itemsside-by-side panelpanelcaptioned item as panels deserve special mention. These will continue to be numbered consecutively, with one exception. If you place a sidebyside inside of a figure, then the figure will be numbered, and the captioned items inside the sidebyside will be sub-captionedside-by-side panelpanelsub-captioned item. In other words, the second captioned panel of a sidebyside inside Figure 5.2 would be referenced as Figure 5.2.b.

    An sbsgroup (side-by-side group) contains only sidebyside, which are displayed in order. However, all of the layout parameters allowed on a sidebyside may be used on an sbsgroup. This might allow a collection of fifteen images to be laid out in three rows of five images each, with widths and spacing identical for each row because the parameters are specified on the sbsgroup element. In this way, simple grids can be constructed. Note that any layout parameters given on an enclosed sidebyside will take priority over those given on the sbsgroup. Captioning behavior extends to an entire sbsgroup.

    Since sidebyside and sbsgroup are containers they cannot be referenced and so do not have an xml:id. However, you can reference their individual contents if they are captioned, and you can reference an enclosing figure.

    Generally, a sidebyside or sbsgroup can be placed as a child of a division, or within various blocks, such as proof for example. See the schema for (evolving) specifics.

    It should be clear now that a sidebyside is more about presentation than most elements, though there is some semantic information being conveyed by grouping the panels with one another.

    Front Matter

    A single frontmatter element can be placed early in your book or article. It is optional, but likely highly desirable. The following subsections describe the items that may be employed within the frontmatter. Most are optional, and some may be repeated. An article differs in that it must contain a bibinfo and titlepage and then may only contain an abstract. Generally, these divisions will get default titles, localized in the language of your document, but these defaults may also be replaced by giving a title element. None of these divisions themselves is numbered, so precluding any content within that might normally be numbered. So, for example, no figure may be included. But you could choose to include an image, perhaps within a biography.

    If a component of the front matter cannot be numbered, how best to subdivide something like a preface? This is a good use of the paragraphs element. It allows for a (minimal) title, but cannot be subdivided further. See the later part of for more about this exceptional element.

    These elements must appear in your source in the order given below, and will appear in your ouput in the same order, which is a generally accepted order used in the production of books. So, for example, even if you author an acknowledgement between two preface, your output may (will?) place the Acknowledgement before the first Preface.

    Exceptions to the above general information are noted below.

    Bibliographic Information

    Required. The bibinfo bibinfo element may contain metadata about your document, including author, editor, credit, date, keywords, edition, website and copyright. Additional elements to capture bibliographic information are planned. This is an exception to the divisions described next, as this is a mini-database of sorts, which contains various pieces of information which get used different ways, but primarly via the titlepage element.

    Authors and editors

    Each author and editor should be described in their own author or editor element, which are structured identically (in output, authors are listed first, followed by editors, sometimes using less prominent formatting). An author can be designated as the corresponding author using the corresponding attribute.

    The name of an author or editor should be enclosed in a personname element. Following this, affiliation information can be provided either by using elements department, institution, and location (each of which can be further structured with line tags), or by enclosing these in an affiliation element. (Grouping affiliation details is useful when an author might have multiple affiliations.)

    An author or editor can also have an email, biography, or support element. The support element can be used to describe funding sources particular to that author as required by some journals. Notice that the support element could also be a child of bibinfo itself, in which case it would appear as applying to the entire document, not just an individual author.

    Keywords

    Many journals require papers to contain a list of keywords or subject classification codes. These are both captured by the keywords element. This groups a collection of keyword elements, each of which is a single keyword or subject classification code.

    To distinguish between author-provided keywords and subject classification codes, the keywords element can have attributes authority and variant. As of 2025-02-18, the values of these attributes that are recognized are given in .

    Recognized keyword attribute values Typeauthorityvariant Author-provided keywords author or none none Math Subject Classification (MSC) codes msc 2020 or 2010 or etc.

    For subject classification codes, to distinguish between primary or secondary codes, the keyword element can have the optional attribute primary (with value yes or no). Put primary="yes" on the first primary keyword, and primary="no" on the first secondary keyword. Alternatively, using secondary="yes" on the first secondary keyword is also acceptable.

    If you are writing a paper that needs a different classification from those currently available, please submit a request.

    Title Page

    Optional, but usually desirable. When present, the titlepage should contain a single empty element titlepage-items, that will collect the appropriate elements from bibinfo to generate a titlepage. So, this is an exception to the following list of divisions, as its production is automatic.

    Abstract

    Optional, and only available for an article.

    Colophon

    Optional; only available within a book. The front colophon. (There is also a back colophon, see ). Sometimes this is also called the copyright page. The colophon element can be given a label to produce a specific file name in HTML builds. The only allowable (and required) child of the colophon is the empty element colophon-items, which will automatically bring in appropriate elements from bibinfo. So, like the titlepage, this is an exception due to its automatic production.

    Biographies

    Multiple biography elements, perhaps one per author. The title can be used in the case of multiple authors to distinguish one from another.

    Dedication

    A single dedication element, that might include multiple dedications (perhaps by different authors). The content is simply a sequence of p, with multiple elementts for multiple dedications.

    Acknowledgements

    A single acknowledgement element (note spelling), that becomes a division, and so can contain paragraphs, lists, etc. The Chicago Manual of Style suggests that if these are short, they may be contained in a preface.

    Forewords

    As of 2021-07-16 the foreword element is not fully implemented. Please make a feature request if you need it.

    A foreword is written by somebody other than the author. The name of the writer of the foreword needs to be includedat the end is a good location.

    Prefaces

    Multiple prefaces are a distinct possibility, and in this case providing a different title for each would be essential. Examples might include: Preface to the Third Edition, How to Use this Book, or To the Student. More ad-hoc material, such as a translator's note, can be handled as a preface.

    Understand the Role of a Preface

    Chicago Manual of Style begins with Material normally contained in an author's preface includes reasons for undertaking the work, method of research, Note that a preface is not introductory content and is not an introduction. It is written from the author's point-of-view, and may include information about why they are qualified to write on the topic of the book. If there are several editions, the prefaces to the newer editions are placed first. See the related .

    (*) Back Matter

    (*) Appendices

    Automatic lists () can appear anywhere, but an appendix is a very natural place to place one.

    (*) Glossary

    (*) References

    (*) Solutions

    (*) Index

    (*) Colophon

    The back colophon, what most authors think of as the colophon. (There is also a front colophon, see ).

    Index

    Continuing our basic discussion from , we discuss some details of making and using index entries. We will begin with how you procedurally author an index entry with syntax, and then move to general principles about how to use these constructions to create an effective index. So these two subsections are intimately linked.

    Syntax and Placement of Index Entries Capitalization of Index Entries

    The headings (entries) of an index are authored entirely in lower-case, unless it is a proper noun (name, place, ) which would normally be capitalized in the middle of a sentence. We are not able to provide any enforcement of this advice, nor any assistance. It is the author's responsibility to provide quality source material in this regard. We do sort entries so that an entry with an initial capital letter arrives at the right location in the index.

    Where you place an idx entry is critical. With output, you will get the traditional page number as a locator in your index. With HTML output we can be more careful. We will look to see which sort of structure contains the idx. Maybe it is an example or a subsection. If so, the index will contain a locator that is a knowl of the example, or a link to the subsection. The distinction is the size of the object, we do not knowl divisions. The exception is a paragraph (p) that is a child of a division, and then the locator is a knowl of the entire paragraph. Remember that a knowl contains an in-context link which can take the reader to the original location of the content in the knowl.

    A lot happens in a paragraph, especially when producing HTML. Sometimes an idx can get in the way. Our recommendation is to put idx entries between sentences, and not at the start or end of the paragraph. They can be authored with each on their own line. If you do not need the specificity of a paragraph, then locate the appropriate structure and author the idx right after the title (or where one would be).

    A cross-reference in an index is a pointer to another index entry. cross-referenceindex indexcross-reference These are rendered as See and See also. You can add see and seealso elements within an idx, so long as it is structured with h. Then it is placed after the last h. A see cross-reference is a direct pointer to another entry in the index. It cannot have a locator as well. When you build the HTML output, we will recognize this situation and produce a warning. A see also cross-reference is an additional pointer, and so it must have a locator to go with it (you will author two idx with identical headings, the first without a seealso to create the locator, the second with the seealso to create the cross-reference. Again, when you build the HTML output, we will recognize a seealso without a locator and produce a warning.

    Follow these directions and will format cross-references for you, in the style suggested by the Chicago Manual of Style for HTML output, and according to 's style for print and PDF.

    (2019-03-04) We have consciously not said anything specific about what to place inside a see or seealso element. At this writing, you need to supply the text. Of course, this is error-prone and you will need to consult CMOS for formatting guidance. But we have plans to do this the way. First, the ref/xml:id mechanism will be used to automatically create the correct text for the cross-reference, both content and format. Second, these will become live links in electronic formats.

    Certain index entries do not sort very well, especially entries that begin with mathematical notation. Our first advice is to avoid this situation, but sometimes it is necessary. The sortby attribute on an h element can contain simple text that will be used to override the content shown to the reader during the sorting of the index.

    Advice on Indexing indexadvice on

    An index is a navigational aid for your readers (and you). We do not assume that a reader remembers where anything is, nor that the Table of Contents is a replacement for part of the index. Some readers of the index may not have even read your book yet, and are looking to get a feel for the range of topics as part of the decision of whether or not to read your book at all, or if it will be useful to have. It should be comprehensive, including everything substantive.

    Indexing is a job for a skilled professional, and most authors produce poor indexes. The tips in this section will help you avoid the most common pitfalls. We follow recommendations from the Chicago Manual of Style , Indexing for Editors and Authors: A Practical Guide to Understanding Indexes , and Pilar Wyman of Wyman Indexing.

    Terminology

    The basic element of an index is an entry, which consists of a piece of information and its locator. For example:

                         normal subgroup,  37
                     

    is an entry indicating that information about normal subgroup can be found on page 37. Indexes are (usually) organized alphabetically, with a main heading aligned with the left margin, and progressively indented subheadings below the main heading.

    Often it is desirable to place the same locator under more than one heading, known as double posting. For example, a desirable addition to the sample entry above is

                    subgroup,  28
                       normal,  37 .
                    

    An alternative to double posting is cross referencing, using see and see also. Typically cross references are used to avoid repeating a large number of entries, or to direct the reader to related topics.

    An index may start with a headnote giving advice about using the index. Typically a headnote is not necessary unless the index has some unusual features.

    Basic principles

    The purpose of an index is to point the reader to information. Point to, not repeat. For example, acronyms should be indexed at the location where they are defined, not at every place they appear, and it is not necessary to define the acronym within the index. People and places should be indexed when information is given about them, not every time they are mentioned.

    A good index has multiple ways to find the same information. Being redundant is desirable, because it increases the chance the reader finds what they seek in the first place they look.

    Indexing is best done after the text has been written. Adding index entries while writing the text may seem to be a labor-saving device, but if you are not an experienced indexer, those entries will only be a small fraction of the final index.

    Topics should be indexed in multiple ways. If a term is defined, you should also think of other words the reader might search for. For example, you may define limit point and consistently use only that term, but an index entry for accumulation point with a see limit point locator would be appropriate.

    Use disambiguation to distinguish identical terms with different meanings. For example

                        isomorphism (of groups),  55
                        isomorphism (of rings),  123
                    

    Both of those entries should also be double posted under the main headings of group and ring, respectively. No disambiguation is needed for those entries.

    Singular or plural forms of nouns should reflect the language in the text. So if a chapter is titled Mammals, then use a heading mammals. And if the chapter is titled The Mammal Class, then use a heading mammal.

    An index is typically as long as 5% of the main text. With many figures, or other structures creating additional whitespace, the percentage may be lower. If your primary output is online, length may not be an issue. For print, there are strategies for pruning an index.

    Once you have finished the text, and then finished the index, it is time for a thorough review of the index. There will be places for consolidation, often due to using variants of particular words. You may wish to remove subheadings which all appear within the range given in the heading. For example,

                    fish, 204-212
                       bass, 208-209
                       salmon, 210
                       trout, 207
                  

    could have all of its subheadings removed, especially if space is an issue.

    Common pitfalls

    Sometimes it takes less than one second to determine that an index is poor. If a quick glance reveals that the index consists mostly of main headings with very few subheadings, then few readers will find it to be useful. Double posting, which may mean more than literally two entries with the same locator, will help readers find what they are looking for. Most of those entries will be in subheadings.

    Another instantly recognizable problem is too many locators in one entry. This entry

                      asymptote,  37, 48
                  

    is probably fine. But once you have three or more locators in an entry, then your index may be improved by adding some subheadings. If the locators in the above example refer separately to horizontal and vertical, then probably two subheadings would be more useful than two undifferentiated locators in one entry.

    An additional problem which can be seen at a glance if you know what to look for, is the absence of any main headings with a large number of subheadings. On almost any subject there are topics which are addressed repeatedly. This should be reflected in the structure of the index. For example, in a group theory textbook there should be several entries under group, examples. In an introductory calculus book the index should help the reader locate the derivative of many different elementary functions.

    Index headings should be nouns, not adjectives. An adjective may be important, and you should use it, but it should not be the entire content of a heading since it is not an idea by itself. But it may be a subheading. For example, suppose you have a paragraph on highland sheep. Then both of the following should appear in your index, since a reader might consult both locations.

                    highland sheep, 45
                  
                    sheep
                       highland, 45
                  
    Notation notation notation list listof notation

    We continue the introduction at . A notation list, like an index, is a specialized collection of cross-references. So some of the philosophy here applies equally well to the idx and index-list elements, and vice-versa. (See .)

    To generate a list of notation employed in a book or article, use the notation-list element. This empty element belongs in an appendix. Likely it is the only content, or you might include some preliminary material. The title of the appendix is up to you and is not automatic.

    Some authors like to make definitions inside of paragraphs, ideally using a term element. This is a natural place for a notation element. So this approach gives an author a lot of flexibility in location.

    Other authors like to make definitions using the definition element, since it creates a heading and number, allows a title, and can easily serve as the target of a cross-reference. So this is another good place for a notation element. But now, associate it clearly with the definition by placing it in the metadata, early on, after the title. And not in some subsequent paragraph. The reason will be clear in just a bit.

    How is a notation element constructed? It has two elements. The usage should be a sample piece of mathematics using the necessary symbols, and wrapped in a single m element. The second element is description and should be a short phrase, or sentence-like material, decoding the sample usage, and may include m elements. The reader sees nothing in the output at the location of the notation element.

    The automatically-generated notation list is then a three-column table, in the order of appearance, with the sample usage, the description, and a locator. For output derived from , such as print or PDF, the locator will be the page number of wherever you placed the notation element. For HTML the locator is much betterit is a knowl, for either a paragraph or for an entire definition. The latter possibility explains why it is better to place the notation element inside a definition, if possible, rather than in a paragraph that is a constituent of a definition.

    Automatic Lists

    Sometimes it is useful to have an automatic list of various elements of one kind in a book, other than the ones already available in a document. The predefined ones include an index (see ) and a list of notation (see ). Examples of lists one might wish to create could include lists figures, computational listings, or theorems.

    There is a very flexible way to make a list of various blocks (or perhaps other items) in your text. Use an empty list-of element as a child of a division. A very natural use would be to create an appendix for the sole purpose of holding one such list. This is why this feature is frequently used in the back matter. But you could place an automatic list many other places.

    We will illustrate with an example. Suppose you know your book has theoretical results only in theorem and lemma elements. So, for example, you never use corollary elements. Then you could author

    
              List of Results
    
              
            
            ]]>
            

    The result will be a link to every theorem and lemma in the entire book, using a clickable with its type, number and title. See for an example. In HTML output the clickables will usually be knowls, which is especially handy. The list will be organized with the titles of the chapters as headings. The divisions attribute can have several types of divisions listed, such as both chapter and section. The empty attribute set to yes indicates that a division heading should be used even if there is nothing on the list contained within. The default for empty is no.

    This feature is best used when the items in the list have been authored with titles, which greatly increases the utility of the list for your reader. Review if this advice is new to you.

    There is a scope attribute, which should be the name of an element which is a division containing the location of the list-of element. Then the list is restricted to items within the specified division. For example, if you have the list-of inside a subsection built for this purpose, and you use @scope="section" then the list will have all the items from throughout the section containing the list.

    There are four types of exercises, based on their location: inline, divisional, worksheet, and reading questions. These may be specified inside elements by the pseudo-elements: 'inlineexercise', 'divisionexercise', 'worksheetexercise', 'readingquestion'. (These are just strings meant for this purpose, and are not real elements.)

    There may be an argument for a ref attribute that would behave similar to scope. Make a feature request if you need it?

    MyOpenMath Exercises myopenmath exercise

    MyOpenMath is a hosted online homework system with hundreds of thousands of prebuilt questions.

    In the web output, the MyOpenMath question will be embedded and interactive though not tied to any student or faculty account. In static output, a static version of the question will be included. Note that there are some limitations on which problems will display correctly in web and static output. Best practices are below.

    To include a MyOpenMath question, you'll first need an account on MyOpenMath.com where you can browse the question libaries and look up the question ID. Then in your PreTeXt document include a myopenmath element with a problem attribute with the MyOpenMath question ID.

    To further control the web behavior of the embedded question, you can optionally include a params attribute containing a comma-separated list of parameters, like maxtries=1,showhints=0, which can include:

  • maxtries

    (default 0): Set to more than 0 to set the max tries on a question part before it gets disabled, and before a scaffolded question will move on to the next part.

  • hidescoreval

    (default 0): Set to 1 to hide the "score: #" that displays after submitting a question. Score markers (check or x) will still show.

  • showansafter

    (default 1, or maxtries if set): Set to have the answer show after this many tries. Set to 0 to have answers never show.

  • showhints

    (default 3): Set to 0 to suppress help features, like hints and video buttons.

  • allowregen

    (default 1): setting this to 1 will show a "Try another version" button after submitting.

  • submitall

    (default 0): Set to 1 for all parts to get submitted, regardless of whether all parts are answered.

  • seed

    (default random): To set a specific seed (1-9999) to force a specific version of the question to display

  • While almost all problems will display correctly in web output and many will display correctly in static output, it is recommended that you avoid using problems with the following features. Note, you can usually make a copy of the problem, edit out the offending feature, and use your substitute.

    • Scaffolded problems
    • Problems with extensive formatting (e.g., use of an html table to control display)
    • Lists containing images or line breaks (<br/>)
    If you really love a MyOpenMath problem that does not display correctly, you might contact support; likely someone knows how to produce a conforming version.

    STACK Exercises STACK exercise

    STACK is an assessment system with online interactive exercioses. This section will soon have instructions on how to embed these exercises.

    <init>URL</init>s and External References URL external reference <init>URL</init>s to External Web Pages

    The url element is used to point to external web pages, or other online resources (as distinct from other internal portions of your current document, which is accomplished with the xref element, ). The href attribute is always necessary, as it contains the full and complete address of the external page or resource. Include everything the URL needs, such as the protocol, since this will be most reliable, and as you will see it never needs to be visible. The element always allows, and then employs, a visual attribute for a provided more-friendly version of the address. Finally, the content of the element, which becomes the clickable text in electronic formats, can be authored with the full range of markup generally available in a title or sentence. A typical use might look like <url href="https://example.com/" visual="example.com">Demo Site</url> This will render as Demo Site. If a url has content, and no visual attribute is given, then the href will be placed in a trailing parenthetical for print versions of PDF, though there will be an attempt to remove standard protocols. Compare <url href="https://example.com/">Demo Site</url> which will render as Demo Site versus <url href="mailto:nobody@example.com">Bouncing Email</url> which will render as Bouncing Email.

    If you do not provide any content for a url element, then the clickable text will be the actual URL with a preference for the (optional) visual attribute, rather than the mandatory href attribute. This should be considered as disruptive to the flow of your text, and so a poor alternative to the content version just discussed (see ). But it might be a good choice in something like a list of interesting web sites. Whether or not a simplified version of the address, via the visual attribute, is desirable will depend on the application. As an example, using the optional visual attribute we have <url href="https://example.com/" visual="example.com"/> This will render as . Note that for the print version of PDF, there is no trailing parenthetical since the visual version is already apparent.

    If you want to squelch the automatic trailing parenthetical for the print version of PDF on a url element with content, you can explicitly set the visual attribute to an empty string as visual="". This signal will inhibit the automatic trailing parenthetical. This should be a very rare occurence, since you are denying readers of some formats from seeing even a hint of the actual URL.

    A url inside a title has been accounted for, but should be used with caution.

    As with the rest of we have taken care to handle all of the exceptional characters that might arise in a url. So author normally, using the necessary keyboard characters, only taking care with the two XML characters, < and &, which need escaping (see ). Use percent-encodingpercent encodingpercent encodingURL encoding (aka URL encodingURLURL encoding) for the href attribute, if necesary, to include special characters, such as spaces. See below for a common need for the ampersand character, and a further caution about percent-encoding of URLs.

    Finally, for conversion to /PDF output it gets extremely tricky to handle all the various meanings of certain escape characters in URLs in more complicated contexts (such as tables, footnotes, and titles), so there may be some special cases where the formatting is off or you get an error when compiling your . We have anticipated most of these situations, but we always appreciate reports of missed cases.

    Data <init>URL</init>s URLdata data URL

    A dataurl element is very similar to the url element just described. The purpose is to point to an actual file that will be of use to your readers. What actual happens when a reader clicks on it is dependent on the format of the output and that reader's environment. Maybe the file will be downloaded, or maybe a particular application will open the file. That part is out of our hands. Use an href attribute in the same way as for url, and the content and the visual attribute also behave similarly.

    The one key differerence is that you can also use a source attribute in place of href and point to a file that you provide as part of your project (not unlike providing a photographic image via the image element). Place the file in your collection of external files (see ) and provide the path to your file from below the directory of external files in the source attribute. For HTML output, will do the rest. For more static formats, you can set a base URL (see ) and you will get a complete URL that points to the instance of your file hosted with the rest of your HTML output.

    Notice that this element provides limited functionality, at best just a hyperlink to a file. For data files that you want a reader's in-browser computer program to process, read about the datafile element at .

    Visual <init>URL</init>s URLvisual

    By a visual URL we mean a version of a URL that is simpler than the real URL, but that provides enough information that a reader can type the URL into some other device with a minimum of effort, and with success. Consider that your project may someday be a print (hardcopy) book, or that your project will be converted to braille for a blind reader. These are some ideas about making a URL simpler. We welcome more ideas.

    • Remove standard/default protocols like http:// and https:// which most browsers will furnish in their absence.
    • Sites like StackExchange list posts with a long identifying number, followed by something that looks like the title. In practice, the number is enough.
    • Experiment with dropping a trailing slashthey are frequently unnecessary.
    • Often a leading www. in a domain name is not necessary.
    • Try providing just a domain name in place of a top-level landing page, it will often redirect to a longer URL.
    • You could use a URL shortener, though some thought should be given to its longevity. Will you remember where your short URLs point once they are no longer functional? Safer to have your long URLs in an href in your source, and use to make them friendlier.

    Craft URLs Carefully

    Your writing will be smoother, and easier on your readers, if you do not interrupt a sentence with a long URL, unless somehow it is really of interest and relevant right there. So provide content (the clickable text) when you use the url element (rather than an empty url). This obligates you to provide a visual attribute, which feels a little like a tedious exercise. But this will be very welcome to some of your readers, those who are unable or prefer not to use electronic formats. Just above (), we provide suggestions for crafting these to be more pleasing, but still useful, versions of URLs.

    Characters in <init>URL</init>s URLquery string

    A URL can have a query string, which has a list of parameters following a question-mark. The parameters are separated by ampersands (&), which will need to be escaped, so as to not confuse the XML processor. So use &amp; anywhere the ampersand character is necessary, such as a source attribute, or a monospace version of a URL achieved with a c element. Also, the question-mark character should not be URL-encoded (%3F) (despite advice just given above), so if necessary edit it to be the actual character. General advice about exceptional characters in XML source can be found in .

    Video video

    A video is a natural way to enhance a document when rendered in an electronic format, such as HTML web pages. It might be additional information that is hard to communicate with text (marine invertebrates swimming), a lecture or presentation that augments your text, or even some artistic work, such as a symphony legally hosted on YouTube, when you could never hope to get copyright clearance yourself.

    supports videos you own and distribute with your source, videos shared openly on the Internet via stable URLs, and videos available on YouTube. Go straight to to the end of this section to see how easy it is to incorporate a YouTube video.

    HTML5 web browsers are able to play video files in three formats, summarized in the following table.

    HTML5 video formats Format Extension Reference Ogg, Theora .ogg Free and open, Wikipedia WebM .webm Royalty-free, Wikipedia MPEG-4 .mp4 Patent encumbered, Wikipedia
    Video Element

    The videovideo element is used to embed a video in output formed from HTML. Subsections below describe the different ways to indicate the source of the video. The video may be placed inside a figure or can be a panel of a sidebyside. The former will have a caption, be numbered, and hence can be the target of a cross-reference (xref). The latter is anonymous, but allows for horizontal layout, and combinations with other panels.

    Size is controlled by a width attribute expressed as a percentage (on the video element when used in a figure, or as part of the sidebyside layout parameters). Height is controlled by giving the aspect ratioaspect ratioaspect ratiovideovideoaspect ratio with the aspect attribute on the video element. The value can be a ratio expressed like 4:3 or a decimal number computed from the width divided by the height, such as 1.333. The default for videos is a 16:9 aspect ratio, which is very common, so you may not need to specify this attribute.

    Options include specifying a start and an end in seconds as integers (no units) if you only want to highlight a key portion of a video. The play-at attribute can take the following values

  • <c>embed</c>

    Play in place (the default action).

  • <c>popout</c>

    Play in new window or tab, at 150% width.

  • <c>select</c>

    Provide the reader the choice of the other two options.

  • In an educational setting, sometimes the preview images provided by YouTube can be distracting, or for an author-provided video you may wish to provide your own preview image. The preview attribute can take on the following values
  • <c>generic</c>

    supplies a Play-button image.

  • <c>default</c>

    Whatever the video playback provides. This is identical to simply not including attribute at all

  • Path to an image file

    Typically, this will be a relative path, starting with images/. This image will be used as preview for the online version and the print version.

  • Author-Provided Videos

    If you own and possess your video content, then you can distribute it with your source, and it can be hosted as part of your HTML output. Then the source should be a relative file name that points to the file containing the video. If you are able to provide more than one of the three formats in , then you can provide the filename without an extension. If a browser cannot play one format, it may be able to play another. will write the code to make that happen, preferentially in the order of the table (more open formats first!). In other words, you can provide files in more than one format and increase the likelihood that a reader's browser will find a format it can playback.

    Network-Hosted Videos

    If a video is shared openly on the Internet, you can simply provide the full URL in the href attribute. All the other attributes are the same as for the author-provided case, above. Read for some considerations when authoring a URL, since there are a few gotchas.

    You can frequently discover the URL of a video by first playing it, and then using a context menu ( via a right-click) to reveal an option to copy the video's location. However, note that there are various techniques sites use to make such a URL temporary, or otherwise unusable. So do some research about potential uses and test carefully. Our example below is provided from a United States government site.

    Also, some video-sharing sites do their best to never make it easy to access the video as a file, so the construction described here will not be successful. Instead, they have links to Share or to Embed which will run their own (proprietary) player in your web browser. YouTube and Vimeo are two popular examples, and we provide explicit support, see for YouZTube, while Vimeo is similar. For other sites, you have limited success with the interactive element, with a construction such as: <interactive iframe="https://www.dailymotion.com/embed/video/x8mc0pr"/> Here is one example of a network-hosted video in MP4 format (from the HTML5 Video Test Page at Tek Eye):

    Jōren Falls, Kano River, Japan
    YouTube Videos

    For a video hosted at YouTube, find the 11-character identification string in the address of a video you are viewing. It will look something like hAzdgU_kpGo. Then, instead of the source attribute, simply provide this identification string as the youtube attribute, such as youtube="hAzdgU_kpGo" That's it. All of the options above are then implemented and realized with YouTube's embedded player.

    This can be a great way to incorporate popular or artistic content, legally, which might be difficult or costly to acquire through copyright clearance.

    The Eagles, Hotel California
    Mozart, Piano Sonata in C Major, K. 545, II

    The pretext script () may be used to download the provided preview images for YouTube videos (only). Filenames will be formed from the xml:id of the video element. These will be used in static versions of output, such as print. Once custom preview images are implemented for author-hosted video, their static representation will improve.

    Additionally, a YouTube playlist can be included in one of two ways. You may set the youtube attribute to be a space-separated list of several video IDs (an itemized playlist). Alternatively, you may set the youtubeplaylist attribute to a YouTube playlist ID (a named playlist). At present, a named playlist will not get a thumbnail image from Youtube, and either the generic thumbnail will be used or you can supply your own preview.

    YouTube Playlist

    Make a feature-request if a scheme similar to the one for YouTube, but for some other video-hosting service, would be useful for your project.

    Note that when a project is hosted at Runestone Academy () a YouTube video becomes an activity that is part of a student's reading assignement. So just like an interactive exercise, it needs a label attribute. See for more.

    (*) Music

    TODO: Scholarly works discussing music may use notes and chords in text, and displays of sheet music are easily supported. (TODO: add some discussion to .)

    (*) Units of Measure

    Unicode Characters Unicode characters

    supports (and encourages) the use of Unicode characters. Here are some relevant comments.

    • Unicode characters will migrate well to any output format based on HTML. Most browsers will have a variety of fonts with glyphs to realize these characters.

    • will not always behave as smoothly. For openers, you definitely will want to use the xelatex engine to build a PDF. Then you need to be sure your system has a font with the necessary characters and you make the font known to xelatex. We are working out the details of the best way to accomplish this.

    • How do you get a Unicode character into your source? In part this is specific to your operating system and editor, so is outside the scope of this guide, but we have hints below for popular operating systems.

    • You can always place a Unicode character in your source using XML syntax. The first thing an XML parser will do is convert this syntax into a character. The number of the SECTION SIGN in hexadecimal is A7, so the syntax &#xA7; is identical to the character §. Of course, this will get tedious fast.

    • The Full Unicode Input utility at www.cs.tut.fi/~jkorpela/fui.html8 will allow you to specify a chunk of 256 consecutive Unicode numbers and then you can click on characters to make a string of several or many. You can cut/paste these into your source, or convert the whole lot to XML syntax all at once.

    • Unicode characters have standardized names. You can find these, and more information, including font support, at the Unicode section of FileFormat.info. If you are struggling to find a specific character, then using this site's name in a search will often quickly locate what you need. Be sure to experiment with the test pages there for browser and font support (including checking your local configuration).

    • Warning: do not use Unicode characters as a way to get mathematical symbols (that is delegated to our use of syntax). And do not use Unicode when we have provided an empty element for a character. These empty elements are conveniences, which spare you from looking up Unicode numbers and make your source more readable. We also sometimes fine-tune these characters in ways that are not possible if you embed them as Unicode. An example is <times />, for use outside of a strictly mathematical setting: I bought a 24 at the lumberyard.

    Unicode Support in OSX

    Mitch Keller reports on 2017-01-12 a way to get some popular characters with OSX. Use the Keyboard preference pane under System Preferences. In there, you can enable Show Keyboard, Emoji, & Symbols Viewers in menu bar Once you activate the keyboard viewer, you get a keyboard on your screen. When you hold down opt, it shows you what other symbol you would get if you push opt+letter. For instance, opt+w gives an upper-case Greek sigma and opt+= gives a not-equals sign (neither of which we can handle when processing the latex version of this guide). To get ä, you type opt+u and then hit a. This is illustrated by the keys for diacritical marks being highlighted in orange while holding opt. The shift key can have an effect to produce variations of some characters, such as quote marks (dumb versus smart).

    (*) Unicode Support in Linux

    (*) Unicode Support in Windows

    Braille Best Practices braillebest practices

    This is an evolving list of best practices for authoring (and publishing) so that a conversion to braille is as useful as possible for the blind reader.

    Many recommendations for mathematics will be useful to any reader, but perhaps even moreso for a blind reader, so read . Recommendations here may also improve your project for all readers. See for more about the mechanics of producing output as braille.

    Division Numbering

    Braille uses various devices to indicate division headings, since font weight, size, and color are not available. These include starting on a new page, centering text, preceding with a blank lines, standard levels of indentation (4 or 6 cells), and combinations of these devices.

    In a conversion from , the text of each heading is the number of the division, followed by the title. So the formatting and the presence of a hierarchical number are together good clues that a new division is starting. And the number of parts in the hierarchical number will also serve as a precise indicator of the depth of the division.

    As a publisher, you can turn off division numbering below some level (). Think carefully about the impact this will have on a blind reader, since lesser division headings will be harder to recognize without a leading number.

    Side-By-Side Layout

    A sidebyside can be a very useful device, but think carefully about its suitability. As of 2022-11-30, we have yet to even handle them carefully in a braille conversion. And if your panels hold images, that is even harder, since we do not have good support for tactile images yet.

    In any event, we will likely unwind a sidebyside into a series of its panels running down the page, rather than across, along with a note about how many panels to expect. So when you author a sidebyside, consider how this alternate presentation in braille will be received by the reader.

    (*) Testing Sage Examples

    Xinclude Modularization

    The xincludexinclude mechanism is not part of , per se. It is of some use for organizing your authoring, so you do not have mammoth files open in your text editor. As discussed in there is very little value in modularizing so much that you have many very small files, and also almost no benefit whatsoever to using directory structure to duplicate the inherent tree-like structure of XML. Many small files, or deeply-nested directories, seem to be of little help and can cause more headaches than they are worth.

    The xinclude mechanism automatically introduces a xml:base attribute, which we need to account for in the RELAX-NG schema (). So we limit which elements may be the root element of an included file. The rough, general rule is that if an element can have a title, then it can be the root element of an included file. So in particular each of the divisions (chapter, section, ) is a candidate.

    One special exception to this restriction is the use of text files, containing absolutely no markup at all. Two good examples are the code child of a program or the latex-image element used to describe an image by source code that understands.

    In both cases you can put the text content of these elements in a separate file, use the href attribute of xi:include to point to the file, and then the twist is to set the parse attribute to the value text. This has two general benefits. First, you now cannot have any XML in the file, so you do not have to have a single root element for the file (and so the schema imposes no restrictions). Second, you do not need to escape any problematic characters like ampersands and angle brackets (), nor use the misunderstood CDATA mechanism.

    There is one caveat about this device. Normal XML processing will normalize line endings. Usually this means XML source edited on Windows will have line endings that are two characters, a carriage return (CR) and a line feed (LF). Effectively, this is replaced by one character, the line feed, which is what is common for Linux and Mac. However, when you use the parse attribute with value text, this is now an unparsed entity and the normalization of line endings does not happen. The likely result may be a lot of extra blank lines interleaved into your content. See End-of-Line Handling in the XML specification for details.

    Additionally, in the case of latex-image you can park unsightly code away in files so you do not have to look at it, or you can create a small driver program to test each one, or even better, you may want to use the same image more than once (maybe in different figures?) and can just include it repeatedly, while only ever editing the single copy.

    Finally, the input and output children of sage, and console as well as the code of program are also candidates for this device. In particular, you may want to have the code for a program in its own file where you can test it easily with an interpreter or compiler. There is one gotcha. If you were to put a newline between code and xi:include there is the very real potential of unwanted whitespace bleeding into your output. Our suggested remedy uses an example from Bob Plantz. Convert

            <program language="c">
                <code>
                    <xi:include parse="text" href="intAndFloat.c"/>
                </code>
            </program>
            

    to

            <program language="c">
                <code><xi:include parse="text" href="intAndFloat.c"/></code>
            </program>
            

    There are some fancy XSLT tricks you can employ to use more complicated content repeatedly. Your source will be less portable, and we do not support or recommend these techniques. But if you want a go anyway, see hints at . Note the reliance on xpointer(), and that the final technique is restricted to DocBook, a different XML vocabulary.

    Localization localization internationalization

    We briefly introduced support for authoring documents in multiple languages in . Here are some more details.

    First, authors are encouraged to write the actual text of their documents using the language of their choice. See for details. For HTML this should be straightforward, for other output formats (especially PDF) the publisher may need to have various fonts installed (see ).

    Localization for itself is restricted to the items names for you. This includes things like theorem, but also items such as the labels of navigation buttons. To have this in your language requires two things, described in the following subsections.

    Localization Files

    The prerequisite is that a localization file for your language exists. Fifteen languages are already supported, such as es-ES (Peninsular Spanish), pt-BR (Brazilian Portuguese), and hu-HU (Hungarian/Magyar); the default language code is en-US (American English). For a up-to-date list of which languages are available, see the localization stylesheet folder on GitHub.

    If such a file does not exist, you will need to create one or find someone to help you do so. Brief instructions for this are in the README file for this directory. These instructions suggest using the en-US file as a template and as a source of more detailed instructions. We highly encourage anyone who creates such a file to contribute it to our growing list of localization stylesheets; see in the Appendices for details.

    Changing the Document Language

    In order to use a localization, simply place xml:lang="es-ES" (with language code as appropriate for your project) as an attribute on your pretext element. For example: <pretext xml:lang="hu-HU"/> Then you can process your source as usual. Be sure to check that the translations look appropriate in your output.

    While processing your source, you may encounter warnings for missing translations, like this: MBX:WARNING: could not translate string with id "hypothesis" into language for code "pt-PT" In this case, the localization stylesheet is missing a translation for this tag, and it will remain in en-US. We welcome contributions to keep stylesheets fully complete; see for details.

    Multilingual Documents

    As of the start of 2023, we are improving support to allow for parts of a document to be in different languages. Much as you place an xml:lang attribute on the overall pretext element, you can place this attribute, with a different supported language onto any element, and all of the content within that element should react according to the new language. A division would be most natural, but perhaps also a block or a paragraph? Development continues, and in particular not every part of an HTML page always reacts.

    Accessibility accessibilty web accessibilty <pretext /> provided accessibility features

    Continuing our discussion from we begin by listing features of our conversion to HTML which happen automatically. These come in part from the recommendations at the Web Content Accessibility Guidelines of the Web Accessibility Initiative.

  • HTML

    Wherever possible we supply HTML elements and attributes that will be interpreted sensibly by a screen reader in the absence of the visual styling provided by CSS. This means we are very careful about the role of headings (h1 through h6) for screenreaders, both for divisions and the block elements they contain. We provide HTML that passes validation checks. And so on. Employing attributes from the Accessible Rich Internet Applications suite of web standards (ARIA) will go a long way to improving accessibility. This work is on-going, as of 2021-11-03.

  • Mathematics accessibilitymathematics web accessibilitymathematics

    MathJax () is the JavaScript library we use to render mathematics within the HTML output. It provides extensive capabilities for screen readers to render the mathematics audibly, and by default your project's output is configured to take advantage of these features. We refer the reader to the MathJax documentation of Accessibility Features for details. But here is a simple experiment you can do yourself right now to simulate how a blind reader could experience mathematics with the combination of , MathJax, and a screen reader.

    1. Find some moderately complicated mathematics, such as in the Mathematics section of the sample article, or your own project, or the sample from MathJax copied below.
    2. Bring up the context menu on that display (a mouse right-click for most).
    3. Turn on the Accessibility > Explorer > Activate menu item. The page will reload, and the Explorer menu item will earn many more menu items. This setting is reasonably sticky, so you should not have to do this repeatedly. Having this on will incur some processing time as part of each page load, so you may want to turn it off later.
    4. Turn on the Accessibility > Explorer > Speech Output menu item.
    5. Turn on the Accessibility > Explorer > Subtitles menu item. (If Subtitles is greyed out, try toggling Speech Output.)
    6. TAB until some mathematics is given focus (a discrete border appears).
    7. SHIFT-SPACE will activate exploration of the mathematics with the Explorer. A subtitle, with an aural rendering of the mathematics, will appear below the display.
    8. You can navigate (explore) the expression tree with the up, down, left, and right arrow keys. The subtitles will change as you do this.

    From the MathJax demonstration page, Maxwell's equations for practice:Maxwell's equations \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\boldsymbol{\jmath}} \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \nabla \cdot \vec{\mathbf{B}} & = 0 \nablagradient operator

  • 3D Images

    Asymptote is a language for describing 2D and 3D images, which we support as much as possible. The 3D images produced are rotatable for exploration via a mouse or finger. For those with motor limitations, the images may also be manipulated with keyboard controls. (Many assistive technologies rely on, or emulate, keyboards.)

  • Skip to Main Content

    Repeatedly pressing the Tab key will move a reader from one location to the next in a web document. Since your Table of Contents in the left sidebar is a series of many links, a reader will need to tab through all of these to eventually reach the interesting content on a page.

    However, we support a common device. The first link on every page is hidden from all readers, but an initial Tab will present a link labeled Skip to Main Content which when executed will take the reader past the Table of Contents and to the start of the content at the top of the page.

  • Links

    Hyperlinks have colors, styles (such as underlining), and effects (such as mouse hover) which are consistent with WCAG recommendations. Rather than being underlined by default, we instead use high-contrast color choices.

  • Colors

    We are sensitive to the fact that some readers have difficulty distinguishing between certain colors. So we do our best to distinguish text, or other elements, without relying exclusively on color. For example, the delete and insert elements may render text with strike-through and underlining (respectively) to show the distinction.

    But you can help as you author. For example, see .

  • Justified Text

    Right-justified text (an even right margin) can sometimes lead to spaced-out text that is difficult for some readers. For print, our use of as an intermediate format, leads to PDF output where right-justified text can be superior to the alternative, ragged right text. For more see and .

  • Watermarks

    If a document has a watermark (), then a screen reader will announce its presence at the beginning of each page of HTML content.

  • Author Provided Accessibility Features

    Here are features which are helps fascilitate, but require your participation as the author.

  • Image Description

    Images you author or supply will be invisible to some readers. Within every image element you can provide both a shortdescription, which will migrate to the HTML alt attribute, as well as a a description element (structured with p and tabular children) that will be provided as a longer description. The content will picked up by screen readers.

    For the shortdescription, make the content clear and concise. Do not use any markup whatsoever, just simple characters, and avoid quotation marks, and limit the text to at most 125 characters. You can learn more at sites such as the one provided by the Web Accessibility Initiative (WAI) at Text alternatives for non-text content.

    We cannot do this one for you, this is for the author only, as image descriptions must take into account author intent and their context. But we can give you the tools do it as easily and as correctly as possible.

    See for further advice on authoring image descriptions.

  • Image Formats

    University offices that provide services for students with disabilities are often interested in the images themselves from a text, as standalone files. For example, they might be able to manufacture tactile versions. You could use the pretext script to produce a variety of different formats and bundle these up in a single archive file for distribution at your book's website. Or you can make each image available through adjacent links placed automatically. We call these image archives. See .

    Futhermore, as described above, a 3D image authored with Asymptote code can be superior for those with motor disabilities. So this functionality begins with an author's choice to employ Asymptote.

  • Cross-References

    describes a variety of ways to customize the look and content of a cross-reference. You can create a larger target for clickable items by making the text as long as possible. So for example an xref authored as <xref ref="theorem-FTC" text="type-global" /> would cause the clickable portion to be something like Theorem 5.16, whereas <xref ref="theorem-FTC" text="global" /> would then cause the clickable portion to be simply the much shorter 5.16. Of course, you can set a default style for your entire document, so it is not necessary to continually provide the text attribute.

  • Link Text

    Default link text, such as Theorem 4.15 has been chosen to be informative. But for internal links (xref) or external links (url) you can choose alternative content for the clickable portion of the text. Think carefully about your choices here and try to avoid text like here or click here. For a url, the default content is the href, which can always be improved by providing content. For formats such as the print version of PDF, the visual is provided automatically as a trailing parenthetical.

  • Hyperlink Underlining in <init>PDF</init>

    In an electronic PDF, hyperlinks are distinguished from surrounding text by color alone, which may be insufficient for readers with color vision deficiencies. A publisher option can add an underline beneath all hyperlinks (xref and url), providing a second visual cue independent of color. (A print PDF does not color links, but a publisher may still choose to underline them.) See for the publisher file syntax.

  • Commutative Diagrams

    Whenever possible, author commutative diagrams using the syntax of the amscd package. Then online and braille output will be more accessible. See for more.

  • Punctuation after Mathematics

    Periods, commas, and semi-colons that follow directly after mathematics are handled differently by for visual formats versus non-visual ones (e.g. braille, audio). But this only happens if you author the punctuation in the logically correct location and let do the rest for you. See and for details.

  • Advice for Writing Image Descriptions Oscar Levin

    Acknowledgement: the following content is based on a presentation delivered by Michael Cantino in December 2022. Michael has served as the BVIS specialist for Oregon's K-12 public schools, an accessibility specialist at Portland Community College, and is a Library of Congress certified Braille Transcriber. Many thanks to Michael for sharing his expertise with the community.

    Accessibility standards dictate that all (non-decorative) images included in websites are accompanied by a text description which a screen reader can read aloud to a non-sighted user. This alternative text (or alt text) is also displayed in place of the image if the image fails to load. Essentially alt text is a brief description of what the image is meant to convey. Of course, determining how to concisely convey information of an image can be a challenge for any image, and this is especially true for images you would find in a mathematics or science textbook. The following suggestions and examples are intended to help an author create quality descriptions of their images.

    First, a few technical considerations. The usual way a non-sighted user will access a pretext book is through a -generated HTML webpage. Screen readers will read the text contained in the alt attribute of the img element on the page. ( uses the text the author provides in the shortdescription element to create this content.) Technical limitations of the alt attribute and most screen reader software mean that descriptions presented in this way must conform to particular specifications.

    The content of an alt-text description must be plain text and should not exceed a total of 125 characters (although the exact character limit is a matter of some debate). Some screen readers will read more than this, but others will simply stop reading at this point. Further, it is more complicated to get screen readers to navigate alt text compared to how they would navigate the rest of text on the page. Since the alt text is plain text, it cannot include text styles, links, MathML, or other markup.

    VS Code, and presumably most modern text editors, will display the character count of selected text in the status bar.

    A separate way to provide information about an image to non-sighted users is to use some sort of long description. There is not wide agreement among platforms on how to implement long descriptions, but generally they are available near the image (not assigned to the image directly). In , long descriptions are authored inside a description element, structured with p (or tabular) children. These descriptions can include basic markup, including mathematics inside m tags.

    In the following sections, we will consider how to write image descriptions that achieve the goal of providing the same information as the image does. Depending on the particular case, this could be done with a short or long description. When a long description is needed, the image should still have a short description that give a brief overview of the image and alert the reader to the presence of a long description. The long description will likely repeat the information from the short description (although this is a bit of a style decision).

    From this point on, we will not distinguish between the types of descriptions and simply consider what content would be appropriate to include in a description.

    Images in Context

    To convey the information of an image requires an understanding of what information the image is intended to convey. Two identical images can naturally have completely different descriptions depending on what the purpose of the image is. For example, consider the following image and think about how you might describe it.

    Graph from Active Calculus graph of function f, a downward opening parabola, with open circle at parabola's vertex, at the point (1,3)

    The graph of a downward opening parabola labeled f, with vertex at the point (1,3). At the vertex, the graph shows an open circle, indicating that the function is not defined at this point.

    The long description I gave to this image was: The graph of a downward opening parabola labeled f, with vertex at the point (1,3). At the vertex, the graph shows an open circle, indicating that the function is not defined at this point. This was informed by what I assumed the author was trying to accomplish with the image: to illustrate various ways that a function might not be continuous. I also know that the textbook has described parabolas as opening downward, rather than having negative leading coefficient or some other standard.

    But what if this same image was in an exercise asking the reader to determine the equation of the parabola? The description above didn't mention anything about axes since that wasn't relevant to the point the author was trying to make. If the reader wanted to find the equation, then we might write a description like the following:

    The graph of a function plotted on coordinate axes. Both horizontal and vertical axes range from -1 to 4. The graph appears to start at the point (-1,1), crosses the vertical axis between labeled values 2 and 3, reaches a maximum value of 3 at x = 1, and then decreases again, crossing the horizontal axis between x = 3 and x = 4.

    Even this might change depending on the context. Should readers be able to identify whether the graph is a polynomial or a line? Or is the goal to be able to identify what the vertical intercept is from the graph?

    Along with the pedagogical context, it is also worth considering the other information that is available to the reader: some of the information in the image may be described in the surrounding text or in the caption of the image. It is not necessary to repeat this information in the description.

    Once you have an understanding of what the image is meant to convey, you can start to write the description itself. The following are some general guidelines to keep in mind.

    • Give an overview. Before describing various elements in an image, give a brief overview. This will allow the reader to determine whether they need to continue reading the description, or jump ahead. It also orients the reader to the image and helps them understand the context of the description.

    • Create structure. A reader will need to piece together all the different components of an image, so anything the author can do to facilitate this is helpful. For example, work from left to right, or clockwise from the top, and say that this is what you are doing. Use the relevant structure of an image to group descriptions of related components: A set of coordinate axes, in which the horizontal axis ranges from -10 to 10 and the vertical axis ranges from -5 to 5.

    • Be clear and concise. After writing your description, read it back and look for ways to improve brevity, clarity, and structure. This needs to be done while still considering the reading level and vocabulary of the target audience. A nice resource of this is the Alt Text as Poetry website.

    • Leverage the reader's specialized knowledge. Again with an understanding of your target audience, you may be able to assume they know what the graph of a particular function looks like. For example, an advanced college math textbook could have as a description, graph of a quadratic function with a vertex at (2, 3) and a y-intercept at (0, 1).

    • Avoid visual shorthand. Sighted authors are used to using comparisons between how things look. Some basic shapes should be okay for most readers: a ball, a cup, U-shaped, etc.

    As an example of the structure of a description, consider the recommendations for describing a chart or graph (data visualization) provided by the Do No Harm Guide: Centering Accessibility in Data Visualization. Chapters 3 and 4 of that guide are particularly helpful.

    Examples

    We conclude with a few more examples of images and their descriptions.

    Venn diagram
    A Venn diagram from Discrete Mathematics: an Open Introduction Venn diagram with two overlapping circles labeled A and B; region in A not overlapping B is shaded.

    A Venn diagram with two overlapping circles labeled A and B, respectively. Each circle contains a region which does not overlap with the other circle, and a region which does overlap. The region contained in circle A that does not overlap with region B is shaded.

  • Short description

    Venn diagram with two overlapping circles labeled A and B; region in A not overlapping B is shaded.

  • Long description

    A Venn diagram with two overlapping circles labeled A and B, respectively. Each circle contains a region which does not overlap with the other circle, and a region which does overlap. The region contained in circle A that does not overlap with region B is shaded.

  • Context

    The image is illustrating how Venn diagrams can be shaded to illustrate set operations. This was the forth Venn diagram in the text, as such the second sentence of the long description is likely unnecessary; readers should understand what a 2 set Venn diagram looks like.

  • Kernel and pre-image
    Kernel and pre-image diagram from A First Course in Linear Algebra Two ovals representing vector spaces containing points representing vectors, with arrows associating points.

    Two ovals representing vector spaces U and V with arrows connecting points in oval U to oval V, representing the transformation T. Oval U is split into 4 roughly equal sections, each with 3 points; arrows point from each individual point to a shared, corresponding point in oval V. Each section's points connect to a different point in oval V, which contains 6 points in total. In each section of oval U, a label appears above the first point and an expression appears to label the section.

    • Section 1: first point is labeled \mathbf{u}_1, section labeled with \mathbf{u}_1 + \mathcal{K}(T), arrows point to point \mathbf{v}_1 in oval V.

    • Section 2: first point is labeled \mathbf{u}_2, section labeled with T^{-1}(\mathbf{v}_2) = \mathbf{u}_2 + \mathcal{K}(T), arrows point to point \mathbf{v}_2 in oval V.

    • Section 3: first point is labeled \mathbf{0}_U, section labeled with T^{-1}(\mathbf{0}_V) = \mathcal{K}(T), arrows point to point labeled \mathbf{0}_V in oval V.

    • Section 4: first point is labeled \mathbf{u}_3, section labeled with T^{-1}(\mathbf{v}_3), arrows point to point labeled \mathbf{v}_3 in oval V.

    The two remaining points in V are labeled x and y.

  • Short description

    Two ovals representing vector spaces containing points representing vectors, with arrows associating points.

  • Long description

    Two ovals representing vector spaces U and V with arrows connecting points in oval U to oval V, representing the transformation T. Oval U is split into 4 roughly equal sections, each with 3 points; arrows point from each individual point to a shared, corresponding point in oval V. Each section's points connect to a different point in oval V, which contains 6 points in total. In each section of oval U, a label appears above the first point and an expression appears to label the section.

    • Section 1: first point is labeled \mathbf{u}_1, section labeled with \mathbf{u}_1 + \mathcal{K}(T), arrows point to point \mathbf{v}_1 in oval V.

    • Section 2: first point is labeled \mathbf{u}_2, section labeled with T^{-1}(\mathbf{v}_2) = \mathbf{u}_2 + \mathcal{K}(T), arrows point to point \mathbf{v}_2 in oval V.

    • Section 3: first point is labeled \mathbf{0}_U, section labeled with T^{-1}(\mathbf{0}_V) = \mathcal{K}(T), arrows point to point labeled \mathbf{0}_V in oval V.

    • Section 4: first point is labeled \mathbf{u}_3, section labeled with T^{-1}(\mathbf{v}_3), arrows point to point labeled \mathbf{v}_3 in oval V.

    The two remaining points in V are labeled x and y.

  • Context

    The image is contained in a section on injective linear transformations in a proof-based linear algebra textbook. The goal of the image is to illustrate the equivalence between images of the linear transformation, their pre-images, and the kernel of the transformation.

  • Combinatorial Graph (unlabeled)
    Unlabeled graph from Discrete Mathematics: an Open Introduction 9 vertices arranged in a circle; edges connect some pairs of vertices. See long description

    Graph with 9 vertices arranged in a circle. Edges connect pairs of vertices. Starting at the top and moving clockwise, the vertices have been numbered in this description 1 through 9 so edges can be detailed in the table below.

    VertexConnected to vertices 12, 4, 6, 7 21, 4, 7 36, 8 41, 2, 6, 7, 8, 9 56, 8, 9 61, 3, 4, 5 71, 2, 4, 8 83, 4, 5, 7 94, 5

  • Short description

    9 vertices arranged in a circle; edges connect some pairs of vertices. See long description

  • Long description

    Graph with 9 vertices arranged in a circle. Edges connect pairs of vertices. Starting at the top and moving clockwise, the vertices have been numbered in this description 1 through 9 so edges can be detailed in the table below.

    VertexConnected to vertices 12, 4, 6, 7 21, 4, 7 36, 8 41, 2, 6, 7, 8, 9 56, 8, 9 61, 3, 4, 5 71, 2, 4, 8 83, 4, 5, 7 94, 5
  • Context

    This is from an exercise in a section on paths in graphs. The question reads, Below is a graph representing friendships between a group of students (each vertex is a student and each edge is a friendship). Is it possible for the students to sit around a round table in such a way that every student sits between two friends? What does this question have to do with paths?

  • Conclusion

    Watching a blind reader navigate a web page can be a very enlightening experience. Or you might even undertake learning one yourself. Here are some suggestions for getting started (current on 2018-05-31).

    • NVDA, , Windows, open source via GPL
    • Orca, , Linux, open source via LGPL
    • VoiceOver, included with Apple's macOS and iOS
    • ChromeVox, , ChromeOS, free from Google
    • JAWS, , Windows, commercial

    Much of the technical work for accessibility is accomplished by developers. But authors have responsibilities, too. So testing can be part of your workflow. One free tool is axe from Deque Systems.

    We have concentrated on making HTML output accessible, since that seems the most natural and best supported. But we are aware of efforts for other formats.

  • PDF/<latex/>

    A PDF may not lend itself naturally to providing an accessible format. But there have been efforts. The Users Group on PDF Accessibility and PDF Standards is an excellent resource to start with. There is also a issue #1046.

  • EPUB

    The International Digital Publishing Forum has information on EPUB Accessibility.

  • Slides slides

    Slideshows may be authored in by using the following tags.

    • slideshow replaces the usual article or book tag to let know you are authoring a set of slides. As usual, you may then define your title, subtitle, and frontmatter.
    • Similar to articles, your content should be organized into several sections.
    • And within each section, a slide represents a full screen of information. Within a slide, you may author content as usual, such as paragraphs (p), lists (ul), and so on.
    • Several elements support setting the pause attribute to the value yes to allow stepping through parts of a slide (e.g. it inserts a Beamer \pause).

    A minimal working example may be found in the Examples folder of the PreTeXt repo on GitHub . See publishing details for various outputs in .

    Literate Programming literate programming

    We continue (and do not repeat) the introduction at . implements the literate programming paradigm with two primary elements, fragment and fragref.

    A fragment is a chunk of code. Almost always it has a xml:id attribute. It begins with a mandatory title. It may have index entries, but see below for advice using the list-of element. Then there is a mix of code and fragref elements. The code element holds the actual text in whatever computer language you are using. Line breaks are respected. Use the XML escape characters &lt; and &amp; if your code needs the < or & characters. Do not try to use XML markup inside the code element.

    A fragref is a reference to some other fragment. This is accomplished via the ref attribute which points to the target via an xml:id. So this is very similar to an xref (), but not enough alike to have the same element name. The most important distinction is that the xsl/pretext-litprog.xsl stylesheet will replace the fragref with the contents of the target fragment. In other conversions, the fragref will be a visual expression of the target fragment, possibly with some active means to visit or examine the target (hyperlink, knowl), more similar to an xref.

    So the xsl/pretext-litprog.xsl stylesheet will course through your fragments converting the tree-like structure given by the references in the fragref elements into a depth-first traversal that will assemble the code elements, and only the code elements, linearly into a program. Notice that it is your job as the author of the program to be certain that this rearrangement results in a syntactically correct program. ( is good, but not that good.)

    If you are with us this far, you are wondering just where the root of this tree is? In other words, just which fragment does this traversal begin with? Good question. At least one fragment must have a filename attribute. Then a traversal will begin here and your program will be output to the file with the name you specify. You are not limited to one file/root, so if your program has multiple source files they may be documented/collected into a single source file. (Notice this implies that every fragment must have an xml:id or a filename.)

    You can place a fragment most anywhere you might place any other numbered block (such as example), though we would tend to place them as children of divisions. The remainder of your document can have all the usual features: a table of contents, a preface, divisions, an index, references, etc. Then a conversion to PDF, HTML, or other formats, will include your code, but in an order that might be more human-readable, and with careful documentation in close proximity.

    Automatically migrating each fragment to an index is a bad idea. (We already experimented.) Instead you can try putting <list-of elements="fragment"/> into an appendix. Perhaps a pointer early on to its existence will help your reader. This list can be subdivided with the use of the divisions attribute. See . Note that you might still want to provide an index, but remember that its construction is a job for an author ().

    Literate programming has been developed to support the authoritative RELAX-NG version of the schema. Since RELAX-NG is a declarative language, the rearrangement of code hunks is not quite as critical. But still, see schema/pretext.xml for a non-trivial example. As of 2020-11-11 there are a few caveats. Start a discussion on the development forum if you have a need.

    • The conversion to a program has no explicit support for languages which interpret indentation meaningfully (e.g. Python). The code element makes no changes, so you could succeed if authored carefully. Some sort of relative indentation attribute might be a good solution.
    • We do not syntax-highlight the code. A language attribute might allow us to recycle existing features.
    • Numbering is serial from the start of the document. Raise a feature request if you think hierarchical numbering is indicated.

    ================================================ FILE: doc/guide/author/webwork.xml ================================================ <webwork/> Exercises exercises Alex Jordan

    With a server (version 2.16 or higher, or ) and a little setup work, you can embed exercises in your project. HTML output can have interactive problem cells or print problems in static form. PDF output will print static versions. And all such exercises can be archived into a file tree to be uploaded onto a server for use in the traditional way.

    Although we expect that version 2.16 and above are supported, we recommend that you use the current (or one previous) version of whenever possible. Should bugs be discovered, it may be difficult to address them with older versions of .

    See for how to configure a course and server to process your problems, and then how to process them.

    <webwork/> Problems

    You must extract content as described in before you will be able to see any content in your output. For most cases, you should be able to do this by running pretext generate webwork to process exercises.

    A webwork tag must be inside an exercise or a PROJECT-LIKE block, optionally preceded by an introduction, and optionally followed by a conclusion.

            
              
              
    
              
              
    
              
              
            
            ]]>
          

    There are several methods for putting content into the webwork. (Note that an empty webwork with no attributes will simply produce the camelcase logo.)

    Using an OPL <webwork/> Problem

    If a problem comes from the Open Problem Library and is accessible from the host course in the usual way using a Library/... path, then you can include it with a source attribute. For example: <webwork source="Library/.../foo.pg"/>

    Not Every PG Problem is Compatible with <pretext/>

    Some problems that work fine within are not compatible with . Typically, these are exercises that use older PG coding techniques. To be compatible with , all of the macros used by a problem must be updated to give output. We have done this with modern PG macros and macros that are frequently used. But still, not every PG problem is compatible with . In some cases, maybe it would be straightforward to train the macros to give output. But in many cases, older macros and problem files are not structured well and is all about good structure. So it could be a significant project to retrofit compatibility.

    If you elect to use a problem that is incompatible with but you don't yet know that, a few things could happen. One is that when you process the problems to gather static representations, you will get an error message that the problem did not return valid XML.

    Or you might coincidentally get valid XML back, but something is just missing or wrong. There's no automated check for that; you should read the output to check that the problem is complete. We recommend reading your PDF output with hints, answers, and solutions exposed, to be sure you are seeing the static version of the exercise.

    If there is an incompatible problem that you would really like to use, you have three options:

    • Author the problem in from scratch as described elsewhere in this section.
    • Edit the code for that problem to use compatible macros.
    • Edit the incompatible macros to be compatible with .
    The last two options may involve contributing to repositories such as the OPL and PG on GitHub, so it is more expedient to use the first option.

    Local PG Source

    You can include PG source for a problem directly, as text content for the webwork element. For example:

        <exercise>
            <webwork>DOCUMENT();
    
    loadMacros(qw(PGstandard.pl PGML.pl PGcourse.pl));
    $pi = Real("pi");
    
    BEGIN_PGML
    Enter a value for [`\pi`].
    
    [_]{$pi}{5}
    END_PGML
    
    ENDDOCUMENT();
    </webwork>
        </exercise>
            

    Note the attention paid here to whitespace. Any indentation or newline whitespace within the webwork will be kept in the PG file that results from this method. Such whitespace may affect the functionality of the problem.

    If you have a problem as a PG file, you can place it in your project's folder tree and use xi:include to insert the PG code as text into the webwork element: <webwork><xi:include parse="text" href="pg/my_problem.pg"/></webwork> Two things to note. The file where you use xi:include has a root element, and that root element needs to declare the xi namespace. So you need to have an attribute xmlns:xi="http://www.w3.org/2001/XInclude" on that root element. Second, the href specifying the path to the PG file needs to be relative to the file you are working in. In the example, there is a folder named pg adjacent to the file we are working in, and the PG file is within that folder.

    Perl-free Problems

    If you'd just like to rattle off a quick question with no randomization, you can do as in this example.

            
              
                
                  

    1+2=

    ]]>

    The exercise above could be given an optional title, introduction, and conclusion. The webwork inside could be given a hint and solution. These are discussed in Subsection.

    In the above example, '3' is the name attribute to a var element. There is actually no variable named 3; we are just using the slot where more complicated exercises would place a Perl variable answer.

    So the above is how to create an answer blank that is expecting 3 as the answer. What you give as a name attribute will be passed to PG's Compute() constructor, so it needs to be valid input for Compute(). Note that you could pass a string encased in quotes, or a perl expression. Just be mindful of the differences. For example:

    • 8**2 will process a perl real using exponentiation and lead to the MathObject Real 64.

    • '8^2' will process a perl string and lead to the MathObject Real 64.

    • 8^2 will process the perl real using bitwise XOR and lead to the MathObject Real 10.

    The default context is Numeric, which understands numerical expressions and formulaic expressions in the variable x. You can activate some other context as in this example.

            
              
                
                  Context("ImplicitPlane");
                
                
                  

    The answer is x+y=1.

    ]]>

    Many special contexts are automatically detected by , and it loads the appropriate macro file into the PG problem. However you may need to explicitly load a macro file as described in Subsection.

    PG code in Problems

    To have randomization in problems or otherwise take advantage of the algorithmic programming capabilities of Perl and 's PG language requires using a pg-code tag. Having at least a little familiarity with coding problems in is necessary, although for simpler problems you could get away with mimicking the sample article in pretext/examples/webwork/. A statement, optional hint, and optional solution follow.

            
    
              
              
    
              
              
    
              
              
    
              
              
    
            
            ]]>
          

    If you are familiar with code for PG problems, the pg-code contains lines of PG code that would appear in the setup portion of the problem. Typically, this is the code that precedes the first BEGIN_PGML. If your code needs any special macro libraries, you may load them in a pg-macros tag prior to pg-code, with each such .pl file's name inside a macro-file tag. However many of the most common macro libraries will be loaded automatically based on the content and attributes you use in the rest of your problem.

    Here is a small example. Following the example, we'll continue discussing statement and solution.

            
              
                Context("LimitedNumeric");
                $a = Compute(random(1, 9));
                $b = Compute(random(1, 9));
                $c = $a + $b;
              
    
              
                

    Compute + .

    Type your answer without using the + sign.

    The sum is .

    + = .

    ]]>

    Within a statement, hint, or solution, reference perl variables using var tags with name.

    Within the statement, a var tag with either a width or form attribute creates an input field answer blank that expects the variable with that name to be the answer.

    A var can have form with value essay, in which case it need not have a name attribute. This is for open-ended questions that must be graded by a human. The form field will be an expandable input block if the question is served to an authenticated user within . But for the cells in HTML output, there will just be a message explaining that there is no place to enter an answer.

    A var can have form with value array. You would use this when the answer is a Point, Vector, ColumnVector, or Matrix MathObject to cause the input form to be an array of smaller input fields instead of one big field.

    A var can have form with value popup, buttons, or checkboxes for multiple choice questions.

    If you are familiar with PG, then in your pg-code you might write a custom evaluator (a combination of a custom answer checker, post filters, pre filters, ). If you store this similar to $my_evaluator = $answer->cmp(...); then the var can have evaluator with value $my_evaluator.

    An instruction is specific instructions for how the reader might type or otherwise electronically submit their answer. Contents of an instruction will be omitted from print and other static output forms. The instruction is a peer to p, but may only contain short text children.

    Some general information on authoring problems can be found in a set of videos at webwork.maa.org/wiki/Problem_Authoring_Videos. Not all of this is relevant to authoring within , but there are parts that will be helpful for constructing the Perl code necessary for randomized problems.

    <webwork/> in an <tag>exercisegroup</tag>

    An exercisegroup is a collection of exercises with common instructions that are put into an introduction. If you put exercises in an exercisegroup, then when the exercises are exported to .pg problem files for use as online homework from a server it makes sense that the instructions from the exercisegroup's introduction should be included in the .pg file. And so they are included there. Note that they are not included when you are building HTML or output for your project. (Rather, the exercisegroup's introduction appears in its normal place.)

    You should be aware of this when you write the exercisegroup's introduction. It impacts the specific language you should use. For example, if you write Differentiate the following functions. or Differentiate each of the functions below., then you have language that doesn't fit the individual problem when it is used for homework on a server. Instead you might write Differentiate the function. It makes sense as common instructions for the exercisegroup as well as the instructions for an individual exercise.

    Metadata

    A webwork without a source attribute can have a plain text description. This should be a summary of what the exercise asks a user to do, including any relevant pedagogical details of the exercise. For example:

            
              
                Add two fractions with distinct one-digit prime denominators.
              
    
              ...
    
            
            ]]>
          

    A longer description may be broken into lines where the lines are plain text.

            
              
                
                  Add two fractions with distinct one-digit prime denominators.
                
                
                  One fraction is always positive, the other always negative.
                
              
    
              ...
    
            
            ]]>
          

    The content of the description will be written into a PG COMMENT command, making the description visible in a Library Browser.

    Reusing a <tag>webwork</tag> by <attr>xml:id</attr>

    If a webwork has an xml:id, then another webwork can copy the first one simply by using a copy attribute whose value is the first webwork's xml:id. The seed of the first webwork is ignored, and the second webwork may set its own seed. For example:

            
              
                
                  $a = random(1, 9);
                  $answer = $a+1;
                
                
                  

    Enter +1.

    ]]>

    The copy attribute should point to a webwork that has -authored source, not to a webwork with a source attribute. (If you want to copy one with a source attribute, just reuse the same source value.)

    Images Using a Local image file

    Planned, not implemented yet.

    Using <c>TikZ</c>

    In a problem statement (or hint, or solution), you may use an image with a latex-image child. See for generalities about using latex-image.

    However, if a latex-image is inside a webwork, you must use \(...\) instead of $...$ to encase any inline math in the image. And if you have display math, that should use \[...\] instead of $$...$$.

    Your latex-image code can use variables that you defined in the pg-code section. Scalar variables may be used simply by using their perl names including the dollar sign sigil. For example, \draw ($a,$b) -- ($c,$d); where $a, $b, $c, and $d are variables. However, any instance of \$ in code will be interpreted as an escaped dollar sign first, so rare situations may require you to be more explicit. The alternative is to include variables just as you would anywhere else in a problem statement, using a var element like <var name="$a"/>. You would also need to use a var element if you would like to insert a perl array, for example <var name="@a"/>.

    In perl, $, @, and % each have special meaning. So you may wonder about using them in your latex-image code. The short answer is that you should use them just as you would use them in a regular document. So when you would like a dollar sign, write \$. For a percent sign, use \%. An at character does not need escaping, so write @.

    As mentioned above, do not use a dollar sign to encase math. If you want to put a comment in the code, you may write it in the usual way like % This is a comment.

    Your project's docinfo may contain a latex-image-preamble element. If so, and if that preamble content should affect the latex-images inside the webwork, then you need to get that preamble content up on the host course. In many cases, you will need to get that preamble content up on the host course for the image to even compile. See .

    See the sample chapter for examples.

    Using <attr>pg-name</attr>

    In a problem statement (or hint, or solution), you may use an image with a pg-name. This attribute's values should be the name of an image created in the pg-code section. For example, an image created using init_graph from PGgraphmacros.pl.

    See the sample chapter for examples.

    ================================================ FILE: doc/guide/backmatter.xml ================================================ Appendices Best Practices Example List of Notation Index ================================================ FILE: doc/guide/basics/README.md ================================================ # Contributing to the *Basics Reference* portion of The PreTeXt Guide ## `xml:id` usage * Add `xml:id`s to all divisions and listings (at a minimum). * Within the *Basics Reference*, please ensure that your `xml:id`s begin with "basics". * Within the *Basics Reference*, use `ch` for chapter, `s` for section, `ss` for subsection, `l` for listing, and `fig` for figure when constructing `xml:id`s. * An `xref` to another portion of the *Basics Reference* can be done via something like ``. ## Cross references to other parts of The Guide * To help readers develop an understanding for the delineation between the parts of the guide, state which part you are making a reference to. For instance, `The Author's Guide () goes into greater detail` is the preferred style of making an `xref` out of the *Basics Reference*. * We encourage contributors to add lots of cross references. The *Basics Reference* is not meant to be the ultimate guide to every feature of PreTeXt. ## Code snippets * Unless demonstrating something such as inline math or a cross reference that must live within a `p`, you are expected to put your code snippet in a separate file with extension `.ptx`. * Follow the model done in existing sections to use `xi:include` twice, once with `@parse="text"` (always within a listing) and once without setting `@parse`. This allows the reader to see how the code is rendered by the PreTeXt converters. ## Index entries * The initial indexing of the *Basics Reference* is being done by Matt Boelkins, Mitch Keller, and Oscar Levin based on extensive conversations with a larger group at the Portland workshop in 2019. **Please do not add additional `idx` tags to existing portions of the *Basics Reference* while this bullet remains in the `README.md` file.** * Code snippets contained in `listing` are required to have at least two index entries. One should have main heading ` code for` and subheading that identifies what it is the PreTeXt code for. The second must have the appropriate main heading to identify what the sampmle code for and subheading ` code for`. * Use `see` and `seealso` liberally in your indexing. Try to think of any other (nontechnical) terms someone might use to look up an idea and put the appropriate `see` entry in the index. For instance, we have "problem" as an index heading with with "as homework" as the subheading. This points the reader to see exercise. * When referring to a PreTeXt tag or attribute in the index, use `` or `` as appropriate. Also ensure that you use `@sortby` in these cases, as otherwise the index isn't sorted correctly. For instance, you might use something like `example` to create a top-level index entry for the PreTeXt example tag. * The various "-like" elements need to be indexed carefully. The main index entry needs to follow the lead of example-like elements, which is presented (in output) as "example-like elements (, , )". When using `` or `` to point to a "-like" category, use only the portion that does not list the tags (e.g., `example-like elements`. For the top-level ` code for` index entry, the subheading for a "-like" element should be comprehensive: ` code forexample-like elements (example, problem, question)`. This allows a user of the index to scan and realize that if they want to create a `` element, then they can copy the listing given for the example-like elements and change `example` to `question`. ================================================ FILE: doc/guide/basics/aside.ptx ================================================ ================================================ FILE: doc/guide/basics/axiom.ptx ================================================ Optional Peano

    Here's the statement of the axiom.

    ================================================ FILE: doc/guide/basics/basics-part.xml ================================================ Basics Reference About This Reference

    This Basics Reference supplements the more formal documentation in other parts of the Guide. Here you will find the basics of the most important and commonly used elements. In most instances, this will be exhibited by showing a chunk of code in a numbered Listing followed immediately by the exact output that code produces. (In some cases, such as with the code that produces a section, it is not practical to do this.) Wherever possible, the sample code and its output are accompanied by cross-references to the Author's Guide in .

    There are some things that are considered beyond the scope of this reference:

    • Many of the possible options that can be used with the different tags. This is a basic reference, and so we want to keep things simple. When you need a more advanced feature not discussed here, follow the link to the . We welcome contributions of intermediate examples to this Basics Reference, but the initial goal is not to be comprehensive in adding such examples.
    • Instructions on converting your XML to another format such as HTML or .
    • Instructions on using in . (This reference does show the most basic of syntax for including a problem from the Open Problem Library. However, it assumes that you already have a project set up to compile correctly with problems, which is an involved task.)

    Basic Formatting

    boldformatting italicformatting fontformatting term formatting emphasis The begin with is a markup language that captures the structure of textbooks and research papers (). By a markup language, markup language we mean that the syntax describes the structure of the document and not the presentation of the document. Thus, does not provide, for instance, a way to make text bold or italic or in a larger font. If an author seeks a specific type of local typesetting, then they need to pause and think about the reason for that typesetting. Is the reason to emphasize a word or phrase? Is the reason to alert the reader to a common mistake? Is it to designate that a word is a new term being defined by the author? There are ways to mark up such structural ideas in , and authors should conscientiously ensure that they use this markup.

    To illustrate some of the key structural markup that leads to formatting, we include the listing and paragraph below.

    Some basic content of a paragraph p code for code forp

    The code in produces the following output:

    Document Structure

    Elements such as chapter, section, and subsection are called divisions. division document structure section sectiondivision subsectiondivision chapterdivision They are the key organizational elements of the structure of a document and all have (essentially) the same syntax. If a division does not contain any other divisions, then its structure looks like what we see in . (Plenty of other things can go inside other than paragraphs, including figures, )

    The general outline of a section as a model division section code for code forsection

    divisioncontaining other divisions introductionof a division conclusionof a division If a division has other divisions inside it, then the structure is a bit more complicated and regimented. In particular, if you want text before your first subdivision (subsection in this example), that text must go inside introduction. If you want to start with the subsection, then the introduction is optional. In the division with subdivisions model, everything must be contained inside introduction, subsection (or whatever your subdivision type is), exercises, references, or conclusion. This is illustrated in .

    A <tag>section</tag> with <tag>subsection</tag>s. section code for code forsection subsection code for code forsubsection introductionof a division code for code forintroduction of a division conclusionof a division code for code forconclusion of a division Limitations on introductions and conclusions introductionof a divisionlimitations conclusionof a divisionlimitations

    There are many tags that are not allowed in introductions and conclusions. In general, avoid things that would have numbers. For instance, one should not put an example or an exercise in an introduction or conclusion.

    Paragraphs: like an un-numbered (sub)section paragraphs paragraphs

    It can be useful to gather a few items and give them a title, but perhaps those items do not merit their own (sub)section. The paragraphs serves that purpose. A title is required.

    This paragraphs contains two ps. Immediately before, and immediately after this paragraphs there are paragraphs which each contain one p. A paragraphs can contain pretty much anything except for a division.

    The role of <tag>p</tag> tags paragraph p

    One of the things you'll need to keep an eye out for is when things must be wrapped in p (paragraph) tags. Notice that title tags do not have their content wrapped in p, which places some limits on the sorts of things that can be contained in a title. If you find text disappearing or displaying strangely, the culprit is likely an unnecessary or or missing p tag. See for information on how to use some additional tools to see if your file is valid in terms of following the structural rules in the schema.

    Mathematics mathematics

    Since was originally called MathBook XML, you will not be surprised to learn that it has robust support for mathematical formulas. mathematicsformula mathematicsequation mathematics formulaequation equation Inside the tags that delimit math environments, your code is basically , with the caveat that you must be careful with < and & since they are special symbols for XML. exceptions: < and & special symbols When typing math in your code, use \lt for <, use \gt for > (not strictly necessary, but good for symmetry), and use \amp for &. In HTML, MathJax is used to render math, so generally supports the things that MathJax does out of the box (with the addition of amsmath) without the need for too many additional packages to be loaded. MathJax

    For inline math, just wrap things in the m tag. equationin-line code for code forin-line equation For example, a^2 + b^2 = c^2 is produced by <m>a^2 + b^2 = c^2</m>. We get displayed equations with the md tag; setting number to yes on the md produces a numbered equation. mathematicsenvironmentsdisplayed equation mathematicsenvironmentsin-line equation equationnumbered

    Displayed equations code fordisplayed equation equationdisplayed code for

    The code in produces the following output:

    For a collection of equations all aligned at a designated point, use md and mrow. Number equations by setting number to yes on the md (or on individual mrow children). mathematicsenvironmentsaligned equation

    Aligned equations code foraligned equations equationaligned code for code formd md code for code formrow mrow code for

    The code in produces the following output:

    Because most of the early adopters of have been mathematicians, there are lots of additional features supported in terms of mathematics. See for further details.

    Lists list enumeratelist

    Lists are important in lots of contexts, and the desire to nest lists has led to some very, very complex discussions on the email lists. We'll keep it simple here. There are a variety of places that lists can live, but a good mental model is that a list must be put inside an element that's similar to p. So for example, you can't put your list directly inside a subsection, but instead must wrap the list in a p.

    There are two common types of lists: ordered and unordered. listordered ordered list (There's also the description list. See for more information.) As in HTML, an ordered list is produced with ol and an unordered list with ul. The items of your list are structured inside li tags. The example in shows that these li tags can contain a paragraph in a p tag but you do not need to. If you're just putting a sentence or two inside your li, no p is required. However, if you also want to put an image or more complicated items inside the li, then the li must be structured with p by placing loose text inside one or more p.puse inside li

    An ordered list listordered code for ordered list code for code forordered list ol code for code forol

    The code in produces the following output:

    markerof ol You can use the marker attributeAs illustrated here, an attribute is something that appears between the < and > of the opening tag. The convention in XML usage is to prefix an attribute name with @ when referring to the attribute outside of the tag. You do not use the @ in the tag itself. on the ol tag to change the default markers. For instance, if the opening tag for the list above were ol marker="A", then the list items would be marked as A. and B. Sensible things to use with marker are i, I, A, a, and 1. Nesting of lists is possible, and there are sensible default markers. listnumbering listmarking numberinglist items

    An unordered list listunordered code for unordered list code for code forunordered list ul code for code forul

    The code in produces the following output: listunordered unordered list itemizeunordered list bulleted listunordered list

    colsof a list You can also use the cols attribute to split a list (ordered or unordered) across multiple columns if the screen/page is suitably wide. listdisplayed in columns The value of this attribute must be an integer between 2 and 6 (inclusive).

    Blocks
    Theorem-Like Elements theorem-like elements (algorithm, claim, corollary, fact, identity, lemma, proposition, theorem)

    The tags theorem, algorithm, claim, corollary, fact, identity, lemma, and proposition have the same structure in , so we will just illustrate theorem here. theorem algorithmtheorem-like elements claimtheorem-like elements corollarytheorem-like elements facttheorem-like elements identitytheorem-like elements lemmatheorem-like elements propositiontheorem-like elements

    A theorem theorem code for code fortheorem-like elements (algorithm, claim, corollary, fact, identity, lemma, proposition, theorem) theorem-like elements (algorithm, claim, corollary, fact, identity, lemma, proposition, theorem) code for proof code for code forproof (of theorem-like element) statementof theorem-like elements

    The code in produces the following output:

    The title is optional and typically used for theorems with names. To give an attribution, one can use the optional creator tag. theoremtitle titleof theorem-like elements creatorof theorem-like elements Cross references (see ) can be made using the name or the number, depending on how the author codes them.

    proof theorem-like elements (algorithm, claim, corollary, fact, identity, lemma, proposition, theorem)proofs of A theorem-like element can contain multiple proof elements. In such instances, it would be useful to use the title tag within your proof. By default, a proof is hidden in a knowl when using HTML output. Click the Proof. heading to expand the proof. Click it again to hide the proof. A proof can also be divided into cases, each of which can have a title.caseof proof Although it has not always been so, you can author a proof all on its own within a division. The structure of such a detached proof is the same as for a proof contained within a theorem-like element.proofdetached proofoutside of theorem-like elementsproof, detached detached proof

    You can use definition essentially like theorem, but a definition does not have a proof. definition You are encouraged to use the term tag to set off the word being defined. termin a definition If you wish to include a list of notation as an appendix as your document, you might also add a notation tag such as shown in . A notation tag has no effect unless you have an appendix with a notation-list in it. notation (to be included in a notation list) notation-list listof notation

    A definition with notation definition code for code fordefinition notation (to be included in a notation list) code for

    The code in produces the following output:

    Example-Like Elements example-like elements (example, problem, question) example exampleexample-like elements problemexample-like elements problemas homeworkexercise questionexample-like elements

    provides three closely-related tags for things that are examples or similar. They are example, problem, and question. They all have the same syntax. The title element is optional, but encouraged as discussed in . example-like elements (example, problem, question)title titleof example-like elements You may either use a freeform example, as shown in , exampleunstructured or an example structured with a statement and zero or more hints, answers, and solutions (in that order). example-like elements (example, problem, question)hint example-like elements (example, problem, question)answer example-like elements (example, problem, question)solution hintto example-like elements answerto example-like elements solutionto example-like elements This is illustrated in . examplestructured Note that for HTML output, if your example has a solution, the solution will be hidden in a knowl by default. See for information on changing this behavior.

    A simple example example-like elements (example, problem, question)unstructured code for exampleunstructured code for code forexampleunstructured code forexample-like elements (example, problem, question)

    The code in produces the following output:

    If you are reading this in HTML with the default processing options applied, the example above will be knowled. This is the default only so that authors know that knowls exist. See for information on changing this behavior.

    A structured example examplestructured code for code forexamplestructured code forexample-like elements (example, problem, question) example-like elements (example, problem, question)structured code for

    The code in produces the following output:

    Axiom-Like Elements axiom-like elements (assumption, axiom, conjecture, heuristic, hypothesis, principle)

    provides several tags that fall into the category of an axiom. They are assumption, axiom, conjecture, heuristic, hypothesis, and principle. The content of these tags is very simple. They allow an optional title, an optional creator, optional idx tags, and then a statement much like a theorem does. axiom assumptionaxiom-like elements conjectureaxiom-like elements heuristicaxiom-like elements hypothesisaxiom-like elements principleaxiom-like elements titleof axiom-like elements statementof axiom-like elements creatorof axiom-like elements

    An axiom axiom code for code foraxiom-like elements (assumption, axiom, conjecture, heuristic, hypothesis, principle) axiom-like elements (assumption, axiom, conjecture, heuristic, hypothesis, principle) code for

    The code in produces the following output:

    Remark-Like Elements remark-like elements (convention, insight, note, observation, remark, warning)

    provides several tags that fall into the general category of a remark. They are convention, insight, note, observation, remark, and warning. The content of these elements is similar to what is allowed inside the statement of a theorem-like element. They allow an optional title, optional idx tags, and then a mixture of p, blockquote, and pre. remark conventionremark-like elements insightremark-like elements noteremark-like elements observationremark-like elements warningremark-like elements titleof remark-like elements

    A remark remark code for code forremark-like elements (convention, insight, note, observation, remark, warning) remark-like elements (convention, insight, note, observation, remark, warning) code for

    The code in produces the following output:

    Project-Like Elements project-like elements (activity, exploration, investigation, project)

    There are four tags that considers to be project-like. They are activity, exploration, investigation, project. We will focus on project here. These four tags allow a general, freeform structure similar to the unstructured example in ; a structure analogous to that of the structured example in ; and the highly-structured introduction, task, conclusion model shown in . examplecomparison to project-like elements project activityproject-like elements explorationproject-like elements investigationproject-like elements

    A project project code for code forproject-like elements (activity, exploration, investigation, project) conclusionof a project-like element introductionof a project-like element project-like elements (activity, exploration, investigation, project) code for

    The code in produces the following output:

    Exercises exercise

    provides a number of ways of collecting things that might be thought of as exercises for students to do. Some might be used for a student to check their ability to perform a skill. Others might be to check the understanding of what a student has just read, perhaps submitting responses to an instructor before class so that plans for in-class time can be adjusted. Another way of collecting exercises might be as a worksheet intended to be worked on during class.

    <tag>exercise</tag> structure

    An exercise can be rather freeform, containing elements such as p, figure, image, etc. However, an author will typically think about an exercise as having an associated correct answer, perhaps with a hint or a detailed solution. has tags to support that sort of content, but it does require that your exercise be structured. This is nearly identical to the structure of a project-like element.

    An exercise exercise code for inline exercise code for code forexerciseinline code forexercise

    The code in produces the following output:

    Note that you can have multiple hint, answer, and solution elements. hintto exercise answerto exercise solutionto exercise exerciseanswer exercisehint exercisesolution But you must put all the hints first, then all the answers, and then all the solutions. There are a variety of options for determining where hints, answers, and solutions appear (at all). Check for information about stringparams.

    An exercise can also have a more complicated structure that assigns a sequence of steps for a student to complete. provides the same task tag that is used in project-like elements to give structure to such an exercise.

    An exercise with tasks exercisewith task code for code forexercisewith task

    The code in produces the following output:

    Inline exercises exerciseinline inline exercise

    You can put an exercise in the middle of a division, intermixed between theorems and paragraphs and figures. In this case, it is labeled as a Checkpoint. See for information on how to use something different than Checkpoint as the name for these. To distinguish these exercises from exercises that are contained in the specialized divisions designed to collect exercises that will be discussed in the next section, we refer to these as inline exercises. checkpointinline exercise inline exercise

    Divisions of <tag>exercise</tag>s

    exercises division You can also put several exercises as part of an exercises element within a division, which is the typical way for creating a collection of exercises together at the end of a division such as a chapter or section. The content of an exercises division is rather limited. It can begin with an introduction (perhaps a set of common instructions), followed by a mixture of exercise and exercisegroup (see ) elements, followed by an optional conclusion. The sample code in illustrates this structure, which is rendered later as Exercises.

    subexercises exercisesgrouping An alternative structure for an exercises division is to use a sequence of subsexercises elements, optionally preceded by an introduction and followed by a conclusion. The content of a subexercises element is identical to what was described above for an exercises element, but we emphasize that a strong rationale for using subexercises (as opposed to exercisegroup) is that a subexercises element can begin with a title, providing a clear way of organizing the exercises for the reader.

    <tag>exercisegroup</tag> exercisegroup exercisesgrouping

    Sometimes you have several exercises that should all have a common set of instructions, which is when you will use the exercisegroup tag. exercisegroupinstructions An exercisegroup can only be used as part of an exercises element or a subexercises element, however! The portion of this section headed as Exercises is produced using the code in .

    Using an <tag>exercisegroup</tag>. exercisegroup code for code forexercisegroup

    colsof an exercise group If you want the contents of an exercisegroup to be put in multiple columns, you can add a cols attribute to the exercisegroup with value (for example) 3. The integer value of cols must be between 2 and 6 (inclusive). exercisegroupcolumns columnof an exercise group

    The code in Listing produces the output seen in Exercises.

    Reading questions

    Another specialized division, reading-questions, can be used to house exercises designed to test or guide a reader's comprehension of the material in that division. The structure of a reading-questions element is similar to an exercises element, but without the grouping options of subexercises and exercisegroup. The portion of this section headed as is produced using the code in .

    Structure of <tag>reading-questions</tag>. reading-questions code for code forreading-questions
    <webwork/> Exercises exercise exercise

    It is possible to embed exercises into a document. It is possible to build an HTML version in which readers can answer these exercises and find out if their answer is correct or incorrect. And if the book is hosted by Runestone, the reader's success can be recorded and incorporated into grades. Because content belongs inside an exercise, you can include exercises in any of the elements that can contain an exercise such as a worksheet and reading-questions. There's some configuration required to use . Please see and for more details. There is a Sample Chapter available elsewhere, with copious examples and output in multiple formats.

    Worksheets worksheet

    page layoutin worksheet A worksheet is a specialized division that can be a child of most divisions and can contain most tags. The general idea, however, would be to assemble a sequence of exercises or project-like elements with some interspersed p, figure, and sidebyside. One of the few times that allows you to manipulate page layout in terms of giving blank space and specifying page breaks is in the worksheet tag. A worksheet is also the only place you can put an exercise inside a sidebyside. The sample code in is not meant to demonstrate everything you can do, but rather to give you a skeleton to start exploring. The rendered output from the listing appears immediately after it.

    Structure of <tag>worksheet</tag>. worksheet code for code forworksheet
    Renaming Elements rename porismrenaming another tag to obtain

    rename code for code forrename docinfo The preceding sections have provided a lengthy list of tags that behave interchangeably. Perhaps you don't like one of their names. For instance, suppose your project will not involve any algorithms, but you need another theorem-like tag whose name you would like to have rendered as Porism. To do this, you need to add a rename element to the docinfo element of your code. For our example, the necessary code would be <rename element="algorithm">Porism</rename>. A rename element generates a global change; it is not possible to rename a single instance of an element or to define your own tags (without writing your own XSLT code.

    We have included this rename code in this guide's docinfo, and as such, we can do the following.

    A porism generated using <tag>algorithm</tag> and <tag>rename</tag>

    The code in produces the following output:

    A special note about renaming <tag>exercise</tag>s inline exerciserenaming exerciserenaming renamefor exercise

    Because of the range of divisions that can contain an exercise element with different names displayed (such as Checkpoint for an inline exercise), one cannot simply use element with value exercise in a rename element. The value of element to rename an exercise is as follows:

    • divisionalexercise for an exercise inside exercises, subexercises, or exercisegroup with default Exercise
    • inlineexercise for an inline exerise with default Checkpoint
    • worksheetexercise for an exercise contained in a worksheet with default Worksheet Exercise
    • readingquestion for an exercise contained in a reading-questions with default Reading Question

    Figures and Friends
    <tag>image</tag> image

    figurewithout captionimage imagewithout caption It is possible to include an image without a number or caption, centered on its own line by using image.

    graphics formats SVG (Scalable Vector Graphics) format PDF formatas image PNG image format The gold standard for graphics to include in documents is, well, complicated. If you're only working with HTML or EPUB output then SVG is what you want. If you're producing PDF by using , then you'll also want PDF graphics files. If you plan to produce an ebook that can be read on Kindle devices, you will need PNG graphics files. Fortunately, it's not too hard to convert between these formats on the command line. Since conversion is a rare task, it may be easiest to do in a cloud environment like CoCalc. In order to produce HTML, PDF, and Kindle, you will need to always have three files available. We recommend that you consistently pick PDF or SVG to be the one that you edit and then convert to the other format. Otherwise, you might have parabola.svg and parabola.pdf and parabola.png contain three different graphics, and then the different output formats for your project will have different images in them! PNG and JPEG are supported by modern web browsers, , and Kindle, so that's a good option when vector graphic formats like SVG and PDF are not available or appropriate.

    Code to include an image without a number or caption image code for code forimage descriptionof image

    widthof image Use of width on an image must be a percentage, and for an image as in this example, the percentage is of the current line width. The code in produces the following output:

    descriptionfor accessibility accessibilityThe example in also illustrates the use of description. We admit to not using a description for most of the other images in this Guide, but doing so is strongly recommended for accessibility reasons. A reader who is unable to see the visual element of your book can use assistive technology to have the description read to them. As much as is practical, authors should endeavor to include descriptions for their images.

    file extensionsfor graphics extensionsfile extensions graphicsfile formats imagefile formats Note that the path to the image file does not include the file extension. When you process your source, the output format you're generating will determine what gets added on so that the right file is used. If your browser says it can't find the image file, make sure that the SVG file is in the correct location relative to the HTML file. Here, we need a directory called images that lives next to our HTML files with a file called small-graph.svg inside that directory. If using a PNG or JPEG file across HTML, /PDF, EPUB, and Kindle, put the extension in the filename so that the file is used for all. Many authors have an images directory that lives in the same directory as their source files and then produce the .tex file or HTML files in another directory. When doing so, you need to copy the images directory to be in the same directory as the .tex file before generating a PDF or in the same directory as your many .html files before viewing your HTML files in a web browser.

    <tag>figure</tag> figure

    To provide a number and caption for an image, the figure element is used. Notice that the caption is authored at the beginning of the figure but is displayed below the figure's content.

    Code to include a figure figure code for code forfigure captionof figure imageinside figure code for code forimage (inside figure)

    The code in produces the following output:

    <tag>sidebyside</tag> sidebyside page layout

    One of the more complex pieces of code in , by most accounts, is that used for positioning objects (frequently image and tabular, but also p) next to each other. If you've tried to do this in , you know that it can be challenging on a good day. Fortunately, does the heavy lifting for us.

    We include two examples here. The first places the sidebyside directly in the current division and places a figure with a caption inside the sidebyside. The second puts the sidebyside inside figure and then uses an image not contained in a figure to include the graphic. It's possible to do all sorts of nesting and get nice subnumbering automatically. More information on the capabilities of sidebyside can be found in .

    Code to place things side by side sidebyside code for code forsidebyside figureinside sidebyside pinside sidebyside sidebysidecontaining figure sidebysidecontaining p

    The code in produces the following output:

    A few more bells and whistles for <tag>sidebyside</tag> sidebyside code for code forsidebyside figurecontaining sidebyside sidebysideinside figure

    The code in produces the following output:

    side-by-side group side-by-side groupsbsgroup For a layout with multiple rows (but the same widths for each row, provides the side-by-side group using sbsgroup.

    Use of <tag>sbsgroup</tag> sbsgroup code for code forsbsgroup

    The code in produces the following output:

    <latex/>-generated images using to generate images

    TikZ pretext script graphics formatsgenerating from source makes it straightforward to embed code that produces images (such as TikZ) into your source files. The -CLI basically just dumps your code out to your file so that it compiles nicely. However, for HTML display, you will need SVG graphic files. This is where the pretext/pretext script comes in. Running the pretext/pretext script frequently requires patience, particularly on Windows, so settle in with an experienced user before attempting the steps in this section. See for complete details.

    latex-image-preamble docinfo TikZloading in latex-image-preamble Our example here just illustrates using TikZ to make a simple figure (the Hasse diagram of a poset), but lots of other graphics packages can be used. One step required is to put the following three lines in the docinfo tag of your main file. latex-image-preamble is used to set up the preamble that should be used for making SVG images from your source. Macros that you wish to use more broadly should be put inside macros inside docinfo.

    <latex-image-preamble>
    \usepackage{tikz}
    </latex-image-preamble>
    
    How to use <tag>latex-image</tag> to invoke TikZ latex-image code for code forlatex-image TikZinside latex-image

    The code in produces the following output:

    Well, that's not 100% true for HTML. If you just run pretext build web, your terminal will display a few warnings about not generating assets such as images. To generate the assets, we have to use the -g flag. To generate the assets before building, on the command line we run the following command (on a single line). (Omitting the web target will, by default, use the first target) in the project.ptx file.) pretext build web -g

    Tables table

    After sidebyside, getting tables to lay out consistently between HTML and PDF is probably the second biggest headache that takes care of for us behind the scenes. Considerable effort has been taken in order to fix some of the challenges inherent to working with the tabular environment in , and so if you author in , you should be able to forget the hacks you had to learn to make nice tables in .

    tablenot for visual layout tablenot for visual layoutside-by-side groupTables should only be used to display data. Too often in other authoring systems, tables are used as a crutch to facilitate the visual layout of a page. Do not do that when authoring . A good question to ask yourself before using a tabular is Do the xy-coordinates of a cell have semantic meaning in terms of my data? If the answer is yes, then make an array of numbers with tabular. If not, find a more suitable tag. (Perhaps sidebyside and/or sbsgroup.) One of the many reasons for this is that screen readers used by individuals with visual impairments read tables in a very specific way that assumes the xy-coordinates of each cell are contributing to the meaning. Individuals who use screen readers will find a document that uses tables to do something other than present tabular data very confusing and frustrating.

    Similar to , provides a table tag and a tabular tag. The tabular tag is used for producing the array of data, while the table tag provides the number and title.

    Code to produce a table table code for code fortable titleof table captionof tabletitle tabletitle tabular code for code fortabular rowof a table cellof a table entry of a tablecell

    The code in produces the following output:

    tablewithout title or captiontabular tabularwithout title or caption Much like image, you can use tabular on its own to lay out a table of data, centered on a line, between (for instance) a couple of p elements. In many cases, the sort of data layout generated using tabular functions more as a figure than a table according to the definitions in the Chicago Manual of Style (CMOS), which attempts to follow in the absence of other guiding principles. The quote below from David Farmer on the pretext-dev Google Group provides guidance on deciding if your tabular should be contained in figure or table.

    tabledeciding when to use instead of figure

    There is an entire chapter on tables in CMOS, so I'll try to summarize how those are distinct from many uses of grids of numbers in PreTeXt. Some approximate quotes about tables from CMOS:

    • facts that are easy to scan and compare
    • a reader unfamiliar with the material should still be able to make sense of the table
    • tables are numbered and have titles (and not captions)

    My take-away is that a CMOS table is a supplement to what is written in the text and at any one time only a small amount of the table is relevant. Rephrasing: a CMOS table is not intended to be integrated with the narrative of the book, and the reader is not supposed to pore over a large fraction of the table when it is first encountered.

    David Farmer

    In reality, the tabular in really should be contained in figure (and then the title must become a caption). Perhaps someday we will come up with an example tabular that meets the CMOS definition of a table to use instead.

    columnof a table See for more information about how to make more complicated tables including formatting columns and vertical and horizontal rules.

    SageMath Content
    SageMathCells SageMathCellinteractive SageMathCellfor static imagessageplot interactive SageMath codesage

    input output Including computational SageMath cells is pretty easy with sage, input, and output. The last tag is useful for producing formats intended for offline reading so that they can include the result of the code's execution.

    SageMath cell sage code for code forsage

    The code in produces the following output:

    SageMathCells on a single HTML page are automatically linked so that a cell can use the results of computations done in earlier cells on the same page.

    <tag>sageplot</tag>

    Sometimes you don't want to provide an interactive SageMath environment in the middle of your book (or a chunk of code) but you would like to produce a figure to include in your project by using SageMath. The cleanest way to do this his to put the SageMath code right in your project and use the pretext script that we discussed in to produce the image files required for your chosen output formats. This is accomplished by using sageplot with the script. (The pretext script is fully discussed in , but at least see the aside in about the additional packages that must be installed and configured to use it properly.)

    <tag>sageplot</tag> to produce a graphic sageplot code for code forsageplot

    pretext script We need to run the pretext script to actually make the image files required. If you want to make both HTML and PDF via , you'll need to run it twice. The first command below (again, enter on one line) makes the SVG to use on the web, and the second makes what you need for . There is an all option that can be passed after -f instead of svg or pdf, but that is more likely to raise errors because some source code cannot produce certain output formats. It's best to stay away from error-producing steps until you're comfortable with debugging your system.

    /path/to/pretext/pretext/pretext -c sageplot -f svg -d ./images /path/to/yoursource.ptx /path/to/pretext/pretext/pretext -c sageplot -f pdf -d ./images /path/to/yoursource.ptx

    The code in produces the following output.

    Small, But Useful

    The topics in this section are not terribly structural or critical, but they fall in the category of little things you want to do right from the outset.

    Cross references cross referencein text internal cross reference linkinternalcross reference

    \labelxml:id ref xml:id provides a robust set of features for internal cross referencing. If you're familiar with , the equivalent of \label is to use an xml:id. For example, the opening tag for this section is section xml:id="basics-s-xref". Instead of the \ref used by , we use xref in . So we can type xref ref="basics-s-xref" to create a reference to this subsection: . There are lots of options to control what text and number appear when you use xref. The default is text with value type-global, which produces something like Subsection 3.3 or Theorem 3.1.4. The type is Subsection or Theorem, and the global number is 3.3 or 3.1.4. (Global is in contrast to local, which would be just 3 or 4, respectively, for these examples.) goes into greater detail about how to change settings for how cross references appear, which you can do for your entire document as well as for individual cross references that require different treatment.

    External links external link linkexternal hyperlinkscross reference hyperlinksexternal link

    url href If you want to provide a link to a resource outside of your project, you will want the url tag. The code <url href="https://pretextbook.org" visual="pretextbook.org">PreTeXt</url> produces PreTeXt. Note that in a print PDF version, a trailing parenthetical with the content of visual is automatically created.

    Extensive details are provided in .

    Footnotes and asides footnote footnotelongaside fn

    Footnotes are not too hard, just use fn, but note that for the time being, what can go inside a footnote is very, very restricted. This is a sample footnote, just so you can see how one looks. For instance, you can't put a p (and thus you can't put lists) inside a footnote. Also, no displayed math via md. There's a lot of care being taken because of the prospect of footnotes inside footnotes inside footnotes. footnoterestrictions

    Because of the restrictions on footnotes, it is important to keep them short. A good alternative for longer things that are somewhat digressional is the aside, aside which comes in three flavors: aside, biographical, historical. historicalaside biographicalaside margin noteaside Each of these allows an optional title and then a variety of tags such as p, figure, and sidebyside (and many more).

    A sample <tag>aside</tag> aside code for code foraside

    The code in produces the aside A Sample Aside. A less contrived example of an aside can be found in .

    Index entries index entries index entries code for idx see reference in indexsee

    h subheadings (in index) code forindex entries code foridx does a good job of supporting index generation. You still need to tag everything that should get an index entry by hand, but then the index is produced automatically. For a simple index entry for the word group, you just use <idx>group</idx>. If you need an index entry involving subheadings, such as normal under subgroup, use <idx><h>subgroup</h><h>normal</h></idx>.

    see seealso cross referencein index It is also possible to use see and see also entries for indices. For instance, in , we use <idx><h>font</h><see>formatting</see></idx> to create an index entry for font that instructs the reader to see formatting. A see also can be created using the seealso tag instead of see.

    sortby sorted index entries alphabetized index entries If the index entry is in danger of being alphabetized incorrectly, you can specify how it should be sorted with the sortby attribute. For example, to give an index entry to \Sigma in the s section, you would use <idx sortby="sigma"><m>\Sigma</m></idx>. Note that if the index entry has h tags, the sortby attribute should go there, not on idx.

    If you generate PDF output from , the index is automatically generated.

    Quotations quotations free standing quotationblockquote

    quotation marksingle quotation markdouble quotationsinline quotationslongblockquote To ensure that quotation marks are properly typeset, it is important to use the correct code. To set something off in double quotes, use the q tag around what should appear in quotes. It will supply both the opening and closing quotation marks, as in: This is a quotation. If you need single quotes, use sq. Because the content of q and sq is quite restricted, you may find yourself needing to explicitly access the left and right single and double quotation marks. They are, quite sensibly, lq, rq, lsq, and rsq.

    Longer quotes are best set off using blockquote

    A sample <tag>blockquote</tag> blockquote code for code forblockquote

    The code in produces the quotation below.

    Modular Source

    Once a project gets big, you may find yourself wishing to break your source into multiple files. This is well documented in , so we refer you there for more details.

    ================================================ FILE: doc/guide/basics/blockquote.ptx ================================================
    Lorem ipsum

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Anonymous
    ================================================ FILE: doc/guide/basics/definition.ptx ================================================ \binom{n}{k} binomial coefficient

    The binomial coefficient \binom{n}{k} is the number of k-element subsets of an n-element set.

    ================================================ FILE: doc/guide/basics/example-simple.ptx ================================================ Differentiating a polynomial

    The derivative of the function f(x) = 3x^5-7x+5 is f'(x) = 15x^4-7.

    ================================================ FILE: doc/guide/basics/example-structured.ptx ================================================ Differentiating a polynomial

    Differentiate the function f(x) = 3x^5-7x+5.

    f'(x) = 15x^4-7

    We use the power, sum, and constant multiple rules and find that the derivative is f'(x) = 15x^4-7.

    ================================================ FILE: doc/guide/basics/exercise-task.ptx ================================================ A structured exercise

    Here is where we give the student the background information required to start accomplishing tasks.

    The first step to do.

    A little hint.

    Just the answer.

    All the glorious details about how to do the first step.

    The second step to do. We'll be lazy and just include an answer.

    Just the answer.

    A little wrap up.

    ================================================ FILE: doc/guide/basics/exercise.ptx ================================================

    statementof an exercise exercisestatement The statement is mandatory when any of hint, answer, or solution is included as a child of exercise, otherwise it may be omitted.

    hintof an exercise exercisehint Optional. Just an suggestion of what to try.

    answerof an exercise exerciseanswer Optional. Just the final answer.

    solutionof an exercise exercisesolution Optional. All the gory details.

    ================================================ FILE: doc/guide/basics/exercisegroup.ptx ================================================

    Here's where you put the common instructions.

    First exercise. statementof an exercise exercisestatement You can add all the usual bells and whistles after, but we'll keep it short here. (The statement may be omitted if none of hint, answer, or solution are present as a child of the exercise.)

    Second exercise.

    The statement for this exercise is necessary because we have included at least one of hint, answer, or solution (namely, hint).

    Third exercise. (No statement necessary here because no hint, answer, or solution.)

    This exercise is not inside the exercisegroup.

    ================================================ FILE: doc/guide/basics/figure.ptx ================================================
    A small graph (from Applied Combinatorics by Keller and Trotter)
    ================================================ FILE: doc/guide/basics/image.ptx ================================================

    A graph on five vertices. One of the vertices is isolated, while the other four form a path on four vertices.

    ================================================ FILE: doc/guide/basics/md-bare.ptx ================================================

    \frac{d}{dx} \int_1^x \frac{1}{t}\, dt = \frac{1}{x} \int_a^b f(x)\, dx = F(b) - F(a)

    ================================================ FILE: doc/guide/basics/md.ptx ================================================

    x \amp = r\cos\theta y \amp = r\sin\theta

    ================================================ FILE: doc/guide/basics/ol.ptx ================================================

    1. First item.
    2. Second item, showing can wrap content with p.

    ================================================ FILE: doc/guide/basics/p.ptx ================================================

    This is a new piece of terminology. Here is a word we have chosen to emphasize. This is an alert to the reader! This is a piece of code typeset in a different font.

    ================================================ FILE: doc/guide/basics/porism.ptx ================================================

    This is a short little ditty that follows immediately from the previous proof.

    We'll still include a proof though.

    ================================================ FILE: doc/guide/basics/project.ptx ================================================ A structured project

    Here is where we describe what the reader will accomplish in the project.

    The first step to do.

    A little hint.

    Just the answer.

    All the glorious details about how to do the first step.

    The second step to do. We'll be lazy and just include an answer.

    Just the answer.

    A little wrap up.

    ================================================ FILE: doc/guide/basics/reading-questions.ptx ================================================ Check your understanding!

    Here is a spot to explain the purpose of these questions. It's optional, like most introductions.

    Here is a question.

    A little hint.

    Just the answer.

    All the glorious details about an answer.

    A second comprehension question. We don't bother with answers or solutions.

    A little wrap up, perhaps giving guidance or encouragement if the student struggled with the questions. Optional like most conclusions.

    ================================================ FILE: doc/guide/basics/remark.ptx ================================================ A little remark

    Remarks have restricted content, but they can be used to call out lots of important things for your readers.

    ================================================ FILE: doc/guide/basics/sage.ptx ================================================ 2+2 4 ================================================ FILE: doc/guide/basics/sageplot.ptx ================================================
    A cubic plotted by SageMath on [-3,2]

    A cubic function on the interval [-3,2]

    f(x) = (x-1)*(x+1)*(x-2) plot(f, (x, -3, 2), color='blue', thickness=3)
    ================================================ FILE: doc/guide/basics/sbsgroup.ptx ================================================

    A longer piece of text. It goes on and on and on. And on and on and on. And eventually we will let it end, but we want to show the width.

    Another little snippet of text. This time a bit longer so that it will wrap.

    We're going to keep this paragraph shorter.

    Here is some text in a row where we have overridden the widths specified above. Isn't this grand?

    Super duper narrow. Look at me!

    ================================================ FILE: doc/guide/basics/section-sub.ptx ================================================
    Mandatory

    Introductory text. (Optional.)

    Mandatory

    Subsection content.

    Mandatory

    Subsection content.

    Concluding text. (Optional.)

    ================================================ FILE: doc/guide/basics/section.ptx ================================================
    Mandatory

    First paragraph.

    Second paragraph.

    ================================================ FILE: doc/guide/basics/sidebyside.ptx ================================================
    Small graph with the caption only associated to the image.

    We can put a paragraph here. Yes, a paragraph. Isn't this the most exciting paragraph that you've ever seen? It goes on and on and on and on and on and on. We want to put enough here to make it wrap, really, is all. Let's hope that this is enough.

    ================================================ FILE: doc/guide/basics/sidebyside2.ptx ================================================
    A graphic next to a paragraph of text with the caption assigned to both.

    We can put a paragraph here. Yes, a paragraph. Isn't this the most exciting paragraph that you've ever seen? It goes on and on and on and on and on and on. We want to put enough here to make it wrap, really, is all. Let's hope that this is enough.

    ================================================ FILE: doc/guide/basics/table.ptx ================================================ A simple table Variable x Variable y Conjunction x\wedge y Disjunction x\vee y T T T T T F F T F T F T F F F F
    ================================================ FILE: doc/guide/basics/theorem.ptx ================================================ Optional I. Newton

    Here's the statement of the theorem.

    You don't actually need a proof, but put it inside the theorem. You can actually put another proof right after this one if you want to.

    ================================================ FILE: doc/guide/basics/tikz.ptx ================================================
    A figure generated with TikZ in \begin{tikzpicture} \draw (0,0) -- (0,1); \draw (1,0) -- (1,1) -- (1,2) -- (1,3); \draw (0,0) -- (1,2); \draw (0,1) -- (1,0); \draw [fill] (0,0) circle [radius=0.1]; \draw [fill] (0,1) circle [radius=0.1]; \draw [fill] (1,0) circle [radius=0.1]; \draw [fill] (1,1) circle [radius=0.1]; \draw [fill] (1,2) circle [radius=0.1]; \draw [fill] (1,3) circle [radius=0.1]; \node [left] at (0,0) {$x$}; \node [left] at (0,1) {$b$}; \node [right] at (1,0) {$a$}; \node [right] at (1,1) {$y$}; \node [right] at (1,2) {$c$}; \node [right] at (1,3) {$d$}; \end{tikzpicture}
    ================================================ FILE: doc/guide/basics/ul.ptx ================================================

    • First item.
    • Another item.

    ================================================ FILE: doc/guide/basics/worksheet.ptx ================================================ A Skeletal Worksheet
    • Something really cool
    • A less important thing you'll learn

    It can be helpful to say what the point of the worksheet is.

    Here's a first exercise in this worksheet. Notice how we set the workspace in inches.

    A second exercise, this time structured with tasks. The workspace specification is assigned to each task.

    Here's the first task.

    Why not give a hint here, we're nice authors, right?

    The second task. No hint this time!

    OK, we're now onto a second page, one of the few times you can force this.

    Just a little figure

    Only inside a worksheet can you put an exercise in a sidebyside!

    Sure, you can have an answer here.

    Here's the second column. We also could have just put a figure here if we needed for layout.

    One more exercise to do.

    Final thoughts

    Put something here because you might run out of time.

    ================================================ FILE: doc/guide/developer/code-style.xml ================================================ Code Style
    Indentation

    Indentation of XSL, and indentation of Python, is four spaces per level of indentation. Please do not be stubborn and suggest that you should be allowed to behave differently. With many contributors it is more important that every developer does it the same, than for one developer to suggest that their personal preference is better. Oh, and never tabs (see ).

    Whitespace

    When a change has a lot of whitespace changes, or trivial re-formatting, please isolate those on a separate commit. Then suggest to the committer that the full 40-character hash of the commit (once finalized) be added to the .git-blame-ignore-revs file to keep git blame functional. To learn more, see Rob Allen's post, and .

    ================================================ FILE: doc/guide/developer/coding.xml ================================================ Coding Conventions
    Author and Publisher Input

    When an author or publisher provides input to regulate some change in how their content is realized follow these procedures.

    • String parameters (which are discouraged anyway) should default to an empty string initially when defined. For technical reasons, this makes them easier to deprecate later.
    • Input should produce a global variable, whose possible values are known exactly. This variable should be set in one location, with other similar variables, and then it should be used later. There should be no need to further error-check this variable later. In other words, do not mix error-checking input and employment of that inputrigorously separate them (like separating content from presentation!).
    • Use a xsl:choose inside a xsl:variable that first parrots legitimate input. Next check for attempts to set the input to something invalid. Use xsl:message to report:

      • the name of the input being checked
      • a description of valid values
      • , not followed by the invalid value supplied (via xsl:value-of typically)
      • Using the default value, followed by that value

    • Then don't forget to actually set the default value, either due to no input, or erroneous input.
    • Done right, this variable will usually meet the requirements above.
    • If input is binary, have the variable just described take on one of two values. Only. Then construct a new boolean variable based on these two strings. Name the variable with a b- prefix. This will be more reliable to use later.

    Run-Time Messages

    XSL provides a xsl:message element, which writes to the console (the stderr stream really, I believe). This makes it useful for debugging (like a print statement in another language). A mix of text, xsl:apply-templates, and xsl:value-of works well. Include delimiters (colons perhaps) so you don't get fooled by unexpected empty strings that are part of your problem anyway.

    But our point here is to discuss messages broadcast to an author or publisher.

    • Use xsl:message to communicate with authors and publishers as described above in while negotiating their input used to control their content.
    • Otherwise, during actual processing, use xsl:message only when there is the potential for a real disaster in the output, such as a file that will not compile at all, meaning more than simple recoverable errors.
    • Do not duplicate parent-child relationships that are expressed in the schema. There are good validation tools for that job.
    • Consider using our auxiliary validation-plus stylesheet for detecting more complicated relationships that the schema cannot, or does not, detect.
    • See the advice above () about checking author and publisher input and providing a safe result so there is no danger of creating broken output and thus less temptation to use xsl:message at all.
    • Reserve adding terminate="yes" for extreme situations where there is absolutely no hope of recovery. This should be a last resort.
    • Place terminate="no" (the default) in your code only when some future removal of deprecated code means this message will transition to terminate="yes". Include clear code comments describing the situation.
    • Prefix messages with

      • PTX:WARNING: for advisories
      • PTX:ERROR: for recoverable problems
      • PTX:FATAL: for case when processing terminates
      • PTX:BUG: for situations that are unexpected (and problematic)
      and align the start of messages in column 14 (so they all line up).

    • There is a template with mode="location-report" you can use to provide standardized assistance for an author or publisher looking for the place to correct a problem (in lieu of line numbers, which are not available).

    Locating Other Nodes

    Should you need to locate a node some other place in a document, via some sort of a reference by an identifier, be sure to use the interface provided by the id-lookup-by-name named template. It accepts a string (the value of the identifier in the reference) and returns an xml:id value that can be used with the XSL id() function to return the desired node (as a node-set). Use a pattern such as the following, paying particular attention to the name of the variable supplied to the id() function.

    
                    
                        
                    
                
                ]]>
            
    Documentation

    Careful documentation must accompany new features. You cannot leave this task for somebody else to clean-up after you, and writing the documentation is likely to cause you to revisit your code to introduce small improvements or squash bugs.

    New language elements are described briefly in the overview at . This should make new authors aware of what elements are available, and maybe have enough instruction to get them started. Then the topics at should have full details. These two sections should link back-and-forth to each other. Examples are welcome, but should be short and succinct. Elaborate examples should be contributed to the Showcase Article.

    New options for publishers should be detailed very tersely in the reference section, . This section is organized lexicographically with respect to the XPath expressions describing the entries of the publication file. Then a more careful description, with examples if necessary, should appear in one of the chapters of the publisher part () according to which aspects of a conversion are affected. These two sections should link back-and-forth to each other.

    Here are some conventions to follow, which will help authors and publishers have a better experience wandering through the Guide. Please observe them in your own contributions.

    • The Guide

      We usually just say the Guide or in this Guide, with no additional formatting, and just the capital G indicative of a formal title.

    • Modularization

      When an author's source is modularized () we refer to the outermost, or main, file as the top-level file. This is the one file that has the overall pretext element in it.

    • Git Branches

      Reference the primary branch of a git repository as main.

    ================================================ FILE: doc/guide/developer/debugging.xml ================================================ Debugging
    Debugging Parameters

    There are a variety of command-line string parameters () for use by developers testing new code or diagnosing problems. As of 2021-02-14 we are collecting their definitions in the pretext-common.xsl stylesheet early on. Search on debug. to find them. Elsewhere the names might be a bit more variable until we get them all rounded up in one place, but usually the name contains debug somewhere. No documentation here, these are not documented (or stable), and only intended for authors as a stop-gap measure before being replaced in function. Read the code for more, while some more permanent versions will be mentioned in this chapter.

    Testing Procedures

    When developing a new feature or trying to fix a bug, it can be helpful to test a before version of some output format versus a current or after version. Sometimes you can lay the groundwork for a new feature by adding some code which has zero effect, but leaves a place where a small addition enables the feature. Then you can be somewhat confident your additions will also not ruin existing (desirable) behavior. Here are some suggestions for doing this with .

    • Make a before version before you start. Or do a git stash save to put away uncommitted changes and then make that initial version. Use git stash pop to bring the changes back. You can also temporarily git checkout 1234abcd some commit, and git checkout topic-branch to come back. You can have sample-article.tex.old around to compare with a new and constantly updated sample-article.tex. I routinely remove *.tex between tests, so the *.tex.old version is named so it does not get deleted.
    • The sample-article.xml document is meant to have one of most everything and lots of extreme examples. If your changes affect chapters, and other aspects of a book, then the sample-book.xml document can also be used.
    • Be careful about adding new content since you can get a lot of automatically-generated id's that change, making it hard to see real changes. By managing location (early in a list of commits) and building at specific commits you can test new code that needs new sample uses.
    • output is one big file. Use the debug.chunk string parameter, set to 0 to get one big HTML file.
    • Use the debug.datedfiles string parameter set to no so that file headers (knowls!) do not all have spurious changes.
    • git diff sample-article.tex.old sample-article.tex works well, and oftentimes it works even better with --word-diff. You really want your test output off in some scratch directory. If not, be careful, and you may need the --no-index option so you are not fooled by no apparent changes. (Those options need a double-dash to lead, they look like one right now.)
    • Having <today/> and <timeofday/> in your test document you can be sure there is always at least one or two changes, and prevent some confusion due to mistakes.
    • When testing HTML output, especially for chunking or knowls, putting two versions in different parallel directories will allow git to compare the entire directories with git diff /tmp/before /tmp/after.
    • Every number is hard-coded in HTML output, so changes to numbering are best tested there. The conversion may react differently (a mix of hard-coded and automatically-generated numbers), so should also be tested.
    It can be very surprising how many subtle bugs can be revealed by very small, or very few, changes discovered by these procedures.

    ================================================ FILE: doc/guide/developer/git.xml ================================================ Git
    Getting Started

    Todo: preliminary list as of 2019-04-26:

    • Install git.
    • Learn to use git at command-line, front-ends will ruin your life.
    • GitHub is not git, but we use it to advantage. Explain the difference.
    • Point to Git for Authors.

    Commit Messages

    Commit messages are a critical tool when locating and reviewing changes to the project. In a way, they are like an index of a book. We take great care to have useful and concise commit messages, and to this end, we are likely to edit yours. But you can help by doing some simple things, so we do not have to.

    • Begin with a capital letter.
    • Do not end with a period.
    • Do not repeat information available by examining the commit itself. Bad: Changes in foo.xsl
    • No longer than roughly 60 to 70 characters, and never onto multiple lines.
    • You can find lots of advice about phrasing commit messages with action words, or in ways that describe how the code will be different. These make for good reading, but we do not adhere slavishly to any one formulation.
    • For whatever reason, we isolate and prefix messages with the name of a relevant conversion such as HTML:, or other areas, such as Guide: or Schema:. Scroll the list of commit messages to see the range.
    • For pull requests we will append (PR #nnnn). (This provides a permanent record somewhat independent of GitHub, and GitHub will utilize this number.)

    Whitespace whitespacein code

    Whitespace refers to those pesky characters that you really cannot see visually, but which are definitely (different) bytes in your source code. Spaces, non-breaking spaces, tabs, newlines (carriage return? Enter?). Here is the problem. Somebody else left a blank space at the end of a line mid-sentence, perhaps because they manually added a newline there to make a line shorter and more readable (especially if it is code). Now you open that file with your editor, which is set to strip trailing whitespace from lines. Maybe you make an edit, realize it was not what you needed and remove the edit. The rest of your work is off in some other file. But now the original file has a single one-character deletion, and that will be carried forever in the git history as a change you made to the work of the previous manual-line-breaker.

    Solution: the original space introduced at the end of the line in mid-sentence should never have been part of a commit, and should never have been merged in the first place. The fault is really not yours, and having your editor strip trailing whitespace is probably a good thing. But if you find these sorts of mistakes, they should be on a commit of their own, clearly labeled as fixing whitespace (see ). But do not be the person who introduces the spurious whitespace in the first place! We will likely ask you to clean it up before your pull request is merged.

    Whether or not a newline is the last character of a file seems to be a common correction that editors make routinely. Let us say that a newline should be there, so feel free to add such newlines (on its own commit).

    When I do git diff at the command-line, extraneous whitespace (trailing characters, blank lines that are really not at all blank) are shown as bright red rectangles. Can't miss 'em. Find a similar tool that works for you. Or grep with a pattern like $ (that's a space and a dollar-sign.) And learn to configure your editor to do the right thing routinely (and no more).

    Tabs whitespacetabs

    A tab is the worst sort of whitespace! (See .) There should never ever be any tabs present in any contribution to . The problem: the width of a tab is different for each person who opens a file. Two spaces, four spaces, eight spaces, you name it. So if indentation is accomplished with a mix of tabs and spaces, there is a good chance it might look right to you, but looks wrong to many other developers. I hit the tab key on my keyboard all the time. But my editor is set to supply four spaces as a result. See if your editor will behave similarly.

    Reviewing Pull Requests

    A pull request (PR) is a way that developers suggest and contribute new code to a git repository. The next section describes how to make one, and might be interesting reading after you finish this section (but not now!). Here we will describe how you can test out a pull request, in order to help with evaluation, or if you are simply curious.

    You will need a clone of the repository where the pull request resides. If you have a fork (see next section) that is fine, too. We will illustrate with a real PR, GitHub #2029.

    1. At a command-line, with a working directory at the top-level of the pretext repository, issue git fetch origin pull/2096/head:andrew-pointer-css-2096

      • git is the command-line git executable.
      • fetch means we are going to grab a collection of commits from somewhere. This is not a pull and that will be incorrect here right now.
      • origin is the somewhere, a repository that has the commits we want. This name translates to the repository hosted on GitHub, which is where you obtained your clone or fork. This is known as a remote, and you can have several with different names that you have assigned to them. git remote -vv will list all your remotes for you.
      • pull/2096/head locates all the commits for PR #2096. Don't let the use of pull fool you.
      • andrew-pointer-css-2096 is a pointer, internal to my clone, that helps me identify the PR, especially when I have many in play at the same time. In git it is known as a branch. Andrew wrote it, I have a reminder of the topic, and I find it helpful to have the actual identifying number around. You are free to do anything you like here for a name of the branchwhatever works for you.

    2. Now you have one, or more, commits on your system, and a name that helps you locate them as a branch. Presuming you are on your main branch (master here, but possibly main) you will want to switch to the branch with these new commits as a putative change to the code for you to experiment with. Easy: git switch andrew-pointer-css-2096
    3. Now you will want to use the pretext/pretext script () to produce whatever output you want to test or examine. The point is, you now have the proposed modifications available to you for use.
    4. Optional. The PR could be several days old, or maybe it has been weeks or months. So it may be a branch off the state of the code from the past, and the code has moved on and evolved (through accepted pull requests). While you have andrew-pointer-css-2096 as your active branch you can go: git rebase master This will move the branch to be a deviation from the most recent version of the code. (I say to myself as I type, git rebase ONTO master.) It is possible this is not what the original author of the PR intended, but for this is rarely an issue. It is also possible that the movement creates contradictions (conflicts). Don't panic if this happens, just go: git rebase --abort and it will be like it never happened.
    5. When you are finished, return to the master branch with git switch master and then delete the branch with git branch -d andrew-pointer-css-2096 Aah, git will not let you do that. It is not clear if this might be important work and you really should not be deleting it. git cannot tell if this is something original you just created or something that is just a copy of what is safe and sound on GitHub. So, go: git branch -D andrew-pointer-css-2096 using the semi-dangerous -D flag. Now your clone is back to its original state.

    This is the procedure described on StackOverflow: How can I check out a GitHub pull request with git?. On an open pull request within GitHub you can find command line instructions. These suggest making a (empty) branch in your repository, then doing a pull from the fork belonging to the author of the pull request. This means the second step will be very different every time since it uses the fork and also a branch name devised by the pull request author. Functionally equivalent, but we find it more complicated.

    When you learn more about the use of git you will discover there are many additional things you can do to modify and experiment with pull requests. Here we are concentrating on the first step: getting a pull request onto your system so you can employ it.

    Creating Pull Requests

    Contributions to the code repository are accomplished with a pull requestpull request. The short version is that you have a copy of the repository and you make a collection of changes on your copy. Then you make a request to have your changes pulled into the official (main, canonical) repository. A pull request is a concept independent of GitHub, but one of GitHub's advantages is that it makes a pull request very easy to create and manage.

    One-Time Initial Setup

    1. Make an account on GitHub if you do not have one already. A username that bears some correspondence to your real name or favorite email name is helpful.
    2. Log into your (new) account.
    3. Go to the official repository for . Find a button labeled Fork, roughly in the upper-right corner. Click on it. This will make a copy (a fork)fork of the official repository in your GitHub account. This repository is called a fork since you are going to make improvements there and your version will diverge from the official version. The fork will know where it came from.
    4. Install a command-line version of Git on your local computer. Heed the advice above about using front-ends.
    5. You are now going to make a local copy of your fork. Think of it as a mirroryou will do your best to keep the copy and the fork in-sync. Git calls this a cloneclone. In your fork (i.e. in your account, find a green button partway down the right side. Clicking on it will bring up a textbox with a URL you can copy. Now at the command-line, execute something similar to git clone https://github.com/mjsmith/pretext.git Your clone will also know where it came from.

    6. That finishes setup. You can check that all is well by running git remote -vv and the response should be something like origin https://github.com/mjsmith/pretext.git (fetch) origin https://github.com/mjsmith/pretext.git (push) upstream https://github.com/PreTeXtBook/pretext.git (fetch) upstream https://github.com/PreTeXtBook/pretext.git (push) origin is an alias for the location of the repository you cloned. And upstream is an alias the fork uses to know the location of the official repository.

    Preparing Your Changes

    The following all happens on your local computer, using your clone, at the command-line.

    1. Create a branch for your work, and switch into it. git checkout -b my-big-improvement The name you choose will not ever be part of the official repository, but it will be part of the record on GitHub. So you do not have to be too careful, but it should be informative.

    2. Use a text editor to make changes to existing files, or to create and populate new ones. As you save the affected files, you can type git diff to see the changes to existing files. See the rest of this guide for particulars about the code.
    3. When finished, you will package up your changes as a commit, the fundamental unit of a git repository. Throughout this process (and at any other time), you can type git status to see how your repository is changing.

      If you have created new files, you need to stage them. You can see these files' status changing if you run git status before and after. To stage a new file, git add xsl/pretext-esoteric-format.xsl

      You do exactly the same thing for existing files you have changed. Run git status before and after. git add xsl/pretext-common.xsl xsl/pretext-latex.xsl

      Running git status should now show that all affected files (changed, new) are now in the staging area, and no files with changes are left behind. You can preview the commit with git diff --cached If you need to edit some more, go ahead, and be sure to add your new changes into the staging area. Now you are ready to make your commit. git commit -m "Create a new conversion to an esoteric format"

      Now git status should show something of a clean slate. You can also run git show-branch to get a pictorial version of your branch.

    Creating the Pull Request

    Now you will communicate your changes (on a branch on your local computer) to GitHub as a request for incorporation into the official repository.

    1. First, push your branch to your fork on GitHub. Recall that this repository is known as origin. On your local computer, at the command-line, git push origin my-big-improvement

    2. Now move to your web browser and your fork on GitHub, which now has a copy of the my-big-improvement branch. You should see a prominent message about your new branch, and a green button labeled Compare & pull request. Click on it.

    3. Now you have a screen titled Open a pull request, where you can describe the purpose of the new code. Then click on the green button labeled Create pull request.

      That's it. The developers responsible for approving pull requests will be notified automatically and receive your code in a way they can test and review it in their own forks/clones of the repositories. You can see the pull request in action at the appropriate area of the official repository. Pretty slick.

    Pull Request Verification

    It is often advisable to add an example of any new markup, new situation, or bug-provoking content into the sample article as part of a pull request. Please do so, as appropriate. However, because we do rolling releases, all code gets thoroughly tested. For this reason please put all changes to the sample article, and only changes to the sample article, onto a first commit. Code should then follow on subsequent commits. This makes a big difference in our ability to test quickly and accurately. Thanks. (Ask if you need help rearranging your commits to achieve this, or see .)

    Modifications to a Pull Request

    To Do: describe how a pull request might iterate to approval/merge.

    Cleaning Up

    1. At any time after pushing your branch to your clone you can/should switch to the default branch (dev now, but changing to master later). git checkout dev

    2. Your pull request ends when the lead developers mergemerge your branch into the main branch that everybody uses. The commit will have your name on it, as part of the permanent record. But the commit may have changed slightly between initiating the pull request and its subsequent merge. You will want to remove your original branch from your clone on your local computer. git checkout dev git branch -d my-big-improvement git branch -D my-big-improvement The second command will fail, as a safeguard against deleting branches with temporary (but important) work on them. The capital D is a forced deletion so should be used with care! But it is the right thing to do here, since your work has been incorporated into the official repository.

    3. But, of course, you want your new improvement like everybody else. So you are now going to pull it from the official repository into your clone on your local computer. Remember that the official repository is known as upstream. git checkout dev git pull upstream dev

    4. Technically, you could now totally trash your fork (making your clone disconnected), and make a new fork and clone for your next contribution. Instead, you can sync your clone with the fork. git checkout dev git push origin dev Now all three repositories (clone, fork, official) look the same and have your contribution. Before your next contribution you will want to pull from upstream into your clone, and then push that into origin (your fork).

    Forming Logical Commits

    There is an art to making a pull request that is easier to review, and which will be useful to others later (such as when using git bisect to isolate the introduction of a bug). Here are some notes:

    • Always rebase your sequence of commits onto master before creating a pull request. Any (rare) conflicts should be your responsibility. If we delay in getting to a review, then maybe conflicts are our responsibility.

    • Make logical commits. Changes to common templates, HTML-specific templates, -specific templates, etc. should all be on separate commits. Contributions to the Guide, and examples for testing in the sample article, should follow (even if testing examples may have been an early commit on your branch during development). Make schema changes last since it will be easier for us to manufacture derived files as an add-on to your work.

    • Do not put partial work on two disjoint files into one commit, come back later, add a second commit with more work in each file, and call it good. Likely there should be two commitsrelevant code in one file, related code in the other file. This is a general suggestion: a stream-of-consciousness commit history is of no benefit to anybody, even you.

    • Do not make a mistake (typo, whitespace, logical error) in one commit, and then fix it several commits later as part of the same pull request. If you made a mistake, learn how to make the change/fix so it looks like it never happened. You do not want other developers to think you make mistakes, do you?

    • Done right, a pull request with no changes will be merged as-is with no changes to the commit hashes. Consider that a goal, and we will congratulate you when it happens the first time (and expect it from then on!)

    Alright, those are high expectations. How do you make a well-formed sequence of commits? This is not a git tutorial, but we will make some suggestions. git has what is called a staging area where you can gradually place a collection of changes before making them part of a single commit. The command git commit -a is a bad habit and breaking yourself of it will help you learn to be more flexible about how you package changes into a commit via the staging area. Finally -m is a useful option for making (or changing) a commit message without being thrown into an editor.

    • If your most recent commit (or only commit!) is lacking you can add new changes into it by adding them to the staging area and using git commit --amend to introduce them into the commit.

    • git reset HEAD~n will return your files to a state as if you have made no commits (presuming you had n of them in the first place). Your edits will all be available (this is not a hard reset, and forget that we even mentioned such a possibility). Then you can selectively stage portions of your work with tools like git add <file> or git add -p and build up individual logical commits in the staging area. Of course, you do not always need to reset all of your commits on a branch, perhaps only a few will need reworking. Caution: do not reset so many commits that you blow past branch pointers and lose them, such as master.

    • You can do an interactive rebase with git rebase -i HEAD~n. This unwinds n commits on the current branch, makes a little script for replaying them in the proper order, and throws you into an editor with the script. Exit the editor and the script runs. With that description/process nothing interesting happens. What is interesting is that you can edit the script to affect the replay.

      You can rearrange the order of the commits. But this only works if you know that interchanged commits do not build on one another. For example, I often start developing a new feature by designing the markup and making an example in the sample article. But once I am all done, I move it to be later than the code, as an example of how the new code will behave (ansd I do not leave the sample article in a broken state).

      Suppose you have ten commits on a branch, and you discover that the third-newest has a small mistake. Correct the mistake and make a throw-away commit with just that correction on it. Now, do an interactive rebase with the newest four commits (you just added one), git rebase -i HEAD~4. Edit the script to place the throwaway commit just after the commit with the mistake, and do not leave it as pick, but edit that action to fix (an f is all you really need). Be sure to remove the line that has the original version of the throwaway commit. Exit your editor. Poof! Three commits and the mistake is corrected. (Do not use the squash action, that accumulates commit messages, which we do not want.)

      This is analogous to git --amend except it is needed for the times when you see a change that needs to be made several commits ago.

    • The git cherry-pick <commit> command allows you to recycle existing commits onto new branches. Suppose your current branch ends up having two very different projects on it. Make a new branch and cherry-pick the commits for one project onto it. Now do an interactive rebase on the original branch and remove those commits from the script. Of course, this assumes you know the two sets of commits are independent of each other.

      Here is a different solution to the same problem. Do a git reset of the entire branch, as described above. Build up the first project into a set of commits. Now do git stash save to put all the remaining edits for the second project into the stash temporarily). Switch to master, make a new branch, git stash pop to get all the edits back, and start building up the second branch. Note that this assumes the second project does not build on the first project.

    • Be bold! But maybe make backups first? You can often abandon things that are not going well. If git rebase master has conflicts you can look around at the files affected, and then you can give up with git rebase --abort. There are other bail-outs for other commands.

    • The commands git log, git diff, and git status are your friends. It is never a mistake to use them more than necessary.

    Blame

    The command git blame is simultaneously funny, useful, and powerful. A line of code you do not understand can be traced back to its originating commit. We maintain a list of commits (in .git-blame-ignore-revs) that have no real new code and make just cosmetic changes, so you may want to use this feature. To use: git blame --ignore-revs-file .git-blame-ignore-revs birds.xml You can also make this happen every time with a local configuration change, to wit: git config blame.ignoreRevsFile .git-blame-ignore-revs

    To learn more, see Rob Allen's post, and .

    ================================================ FILE: doc/guide/developer/localization.xml ================================================ Contributing Localizations

    We rely heavily on those fluent in other languages to provide translations of terms like Chapter and Example. See for more about this feature. This chapter is meant to help you get started if you would like to contribute to development in this way.

    Some notes:

    • We know it is hard to translate subtleties of one language into another. Do the best you can! Something is better than nothing. And somebody may come along later with an improvement. See the en-US file for explanations, this is the only documentation about each term that gets translated.
    • Do not copy the documentation from the en-US file into your file. Add comments if you feel your work needs some explanations. Do try to keep the order and organization the same.
    • When we add new features, sometimes new translations are needed. We appreciate maintainers who regularly come back to add in more. But anybody can hop in and add new translations to an existing file. We try to be careful to have all the missing translations commented-out so it is easy to see what needs work.
    • Explore the files in xsl/localizations, including the README file, which should provide you enough to get started.

    Thanks in advance for continuing the great work that allows us to support readers, authors, and publishers in many parts of the world!

    ================================================ FILE: doc/guide/developer/pretext-script.xml ================================================ The <c>pretext</c> Script pretext script

    Note that this entire chapter documents a lower-level tool for producing output from source. Most authors and publishers should be using the -CLI, see .

    XSL is a very powerful language for text processing. However, it cannot do everything. The pretext/pretext script is a Swiss Army Knife of sorts to operate on parts of your document and manage processing that requires the application of external programs, such as and Sage. It can also produce entire documents in different output formats. Its principal routines are shared with the -CLI.

    Running <c>pretext/pretext</c>

    pretext is a Python program (aka script), so you will need to have the Python 3 interpreter on your system (version 3.6 or better expected as of 2021-05-21) which you can run at a command-line (aka terminal, console, command prompt). So your first step is to install Python (see ) or check your installed version and the exact name of your executable (see ).

    The pretext script is located in a directory of the distribution also named pretext. So we often refer to it as the pretext/pretext script to avoid confusion with all the other places we say . As a simple check on your ability to run the script, with a suitable path you can run /path/to/pretext/pretext -h to get a summary of the commands. Since the command lives in the pretext directory, you may prefer to change to that directory for your first attempt. On a Unix-like system (Linux, Mac) you may need to go ./pretext since the program is not on your PATH. Thus, depending on your executable name (), whether the script is in your path, and whether you have made the file executable, you might need to run python /path/to/pretext/pretext -h or python3 /path/to/pretext/pretext -h

    Some of the processing may take a long time, or you may experience trouble. There are two switches to enable more verbose output in your terminal or console. pretext -v [command arguments] will provide progress indicators, which may be comforting for long runs, while pretext -vv [command arguments] will provide progress indicators along with additional technical information that will help you or a fellow author to discern where a problem lies. If you ask for help, please include all of this output, from start to finish, including the command you use and the current directory, and do not assume you know exactly which part is the relevant part.

    Overview

    Generally, you use the pretext/pretext script by supplying a component (-c) and a format (-f), along with your source as the very last argument. The component may be some limited subset of your document that needs specialized treatment, such as an image described by the Asymptote language (-c asy). Or it could be the entire document (-c doc) being converted to some format as a final output form. So -c asy -f svg would produce Asymptote images in SVG files, while -c all -f latex would produce the entire document as a file.

    Example Use

    Here is a typical example of using pretext/pretext. You have several (or many!) diagrams and figures in your source, all authored in the TikZ language, and so packaged up within latex-image elements. Your /PDF output looks beautiful, since simply inserts the TikZ code into the right place in the generated *.tex file, and you have done this several times until your figures look just right.

    Now you need to generate the SVG versions of your images that will accompany your HTML version of your book and provide nice scalable graphics. This is exactly the sort of chore the pretext/pretext script was designed for. You might run (all on one line) pretext -vv -c latex-image -f svg -d ~/books/aota/images ~/books/aota/animals.xml Here -c is specifying the component of your book to process, and -f is specifying the format of what is being produced. The -d argument specifies a directory where the output ends up, in this case a collection of SVG files, one per image. Note that the file, animals.xml in the above example, is the main source file for the document. The script should be run on the entire document, even if all the images are in one file.

    Strategy

    Much like the build advice at the end of , the pretext/pretextpretext script collects necessary bits into a system-created temporary directory, does its work, and copies out the desired results. So in the example of the previous section, each chunk of TikZ code is isolated, your macros are copied from docinfo, and a syntactically correct file is produced (one per image). Then pretext calls your system's executable on each of these files to produce a one-page PDF. This is then cropped and converted to an SVG version, which at the end is copied to the location specified in the -d argument.

    Some insight into failures can be found in the temporary directory where all this processing happened. (We leave the directory, and its contents, behind for the system to clean-up next time the system is rebooted). Early in the -vv doubly-verbose output, this directory is reported after the string temporary directory:.

    Some notes:

    • If you have modularized your source across more than one XML file, then be sure to provide your top-level file as the final argument to the script, just like you would for an invocation of xsltproc. It is important to understand that your source is one huge source tree and your file-by-file modularization is never respected or recognized in any way. In particular, use of the xinclude mechanism is handled by the script, and you should not apply the script to each of your source files individually. If image production (or some other task) takes a long time, see for a way to have the script restrict its action to only a portion of your project.
    • Do not place the script, or configuration files, anywhere else (except as recommended for your personal copy of the configuration file). The locations are critically important for locating other files, such as the stylesheets used to isolate parts of your project for processing.
    • Much of the work of this script happens in the temporary directory described above. We leave a lot of intermediate work behind in this directory. Often, exploring this directory is helpful when debugging problems, or a failure to finish successfully. For an example, see .

    Debugging Image Generation

    A principal use of the pretext/pretext script is to isolate source code from latex-image sections, package them up as proper *.tex files, run to make cropped PDF versions, and then convert these to other formats such as SVG or PNG.

    Much of this activity happens in a temporary directory, and it is similar for Asymptote images and other options of the script. If you use the -vv switch described above, then these temporary directories will be noted in the debugging output requested, and a complete list will be the last line of output. In this case, and if the script encounters an error prior to successful execution, then these directories will be left in place. Looking to see what files end up there, and what those files contain, is often useful in determining the step where the script fails, and maybe even why.

    With no chatter requested, or just progress indications (-v) these temporary directories will be cleaned out as the last part of successful execution.

    Another option is to ask for the actual source files (*.tex, *.asy, etc.) as the output of a run. This is accomplished with the -f source option when invoking pretext/pretext. If the right packages or macros are not being employed in these files, this is an easy way to get at the source files for inspection and analysis, and is a good first check on problematic execution.

    It is possible to design an image whose dimensions exceed the page size of typical output. An example is an image you might use only for some HTML output, such as a slideshow. In this case, construction and conversion to an output format like SVG may fail. There is a string parameter, latex.geometry, that allows you to provide options to the geometry package which influence page size. At a minimum, you need to override the page size, plus it might be best to override the printable area as well. (See for more on string parameters, which will be obsolete in the future.) Here is a sample addition to a call to the pretext script. Note that you cannot put the -x switch last, so it must precede some other option. -x latex.geometry "paperwidth=21in,paperheight=21in,total={20in,20in}" Since the image will ultimately be cropped, there is little harm in making the overall page grossly oversized. However, if the code you are using employs lengths like \linewidth or \textwidth (which we will claim is not a good practice), then your image might be very sensitive to how you set the page geometry. Note that restricting the scope () might be useful if this accommodation is only needed for one image.

    Configuring External Helper Programs

    Our main processor, xsltprocxsltproc, is not a general-purpose compiler, and does not call external programs. That is the raison d'être of the pretext/pretext script. You will see a configuration file, pretext/pretext.cfg, as part of the distribution. Read the comments at the top of this file, but foremost, realize that you are not meant to edit this file. It is a template, and any changes you make will be overwritten with an original version when you update. Instead, make a copy and place it as user/pretext.cfg within the distribution. For instance, if your distribution is in the pretext directory, then the commands cd /path/to/pretext mkdir user cp pretext/pretext.cfg user/ would be appropriate. The script will look for the user copy first, and if not found, then fallback to the generic version.

    The entries of this file are the names of executable files that perform certain tasks as part of the script's functions. If it seems that certain helper programs are not being found, you can provide full path names, and that may solve the problem.

    Python Prerequisites for the <c>pretext/pretext</c> script

    There are several external programs that the script relies on that are again Python packages. See for instructions and a list.

    Publication Files, String Parameters

    A publication file () can be used to control various options that are independent of the authoring process, or for some conversions may be necessary. And the managed directories scheme requires use of a publication file (see ). Use the -p switch to specify this file, using a path that is relative to your source (or an absolute path if it seems to be ignored).

    Sometimes you might have need to pass string parameters to the script, though this will eventually be something an author will rarely do, and is more likely necessary for developers. This is accomplished with the -x flag, followed by a space separated list of (stringparam, value) pairs. Do not use parentheses, just separate with spaces. But note that -x cannot be the last option passed to the script since it makes it hard for the script to see the filename for your source.

    For example: pretext -vv -x debug.datedfiles no debug.chunk 0 -f html -c doc -p ~/books/aota/pub.xml -d /tmp/aota-html ~/books/aota/animals.xml

    Extra Stylesheet

    There are situations when an extra XSL stylesheet is necessary for processing your XML source. A good example is the supported method for styling PDF output, described at . Historically, various customizations have been supported by thin XSL stylesheets (), but as certain themes have become apparent we have moved these customizations to simpler techniques (e.g. publication files, ). Other than styling PDF, you should think carefully about if an additional stylesheet is necessary.

    The -X-X (--XSL--XSL) switch is used to specify an extra XSL stylesheet that will be applied to your source. Note that it is now possible to do anything you want to your source and so can create run-time failures at any point in the process. Here are the simple mistakes to avoid.

    • If you are expecting HTML output because you used -f html, then your stylesheet supplied in the -X argument will certainly import the base xsl/pretext-html.xsl stylesheet. When you understand this, then you will understand that perhaps we should call this an alternate stylesheet. This advice applies equally well to extending the base xsl/pretext-latex.xsl stylesheet.
    • The import just described will behave better for others (meaning co-authors, or authors who fork your project) if the import uses a relative path, meaning relative to location of the extra stylesheet. We therefore suggest using a user directory, placed as a peer of the xsl directory, as described in .
    • So a common mistake is to use -X to point to an extra stylesheet someplace close-by your project's source files, when you have sensibly setup a relative import of the base stylesheet, and instead should point to the copy you have placed in user so that the import is effective on everybody's system.

    As of 2021-08-04, this technique is only effective for HTML, PDF, and outputs. It may be natural for some other output formats (e.g., EPUB), and perhaps possible for others (e.g., braille). Make a feature request for expanding applicability.

    Restricting the Scope

    The -r-r (--restrict--restrict) switch deserves special mention. It is followed by the value of an xml:id attribute present in your source XML file. Then whatever action the script is asked to perform, it will only act on a subtree of the hierarchy, rooted at the element with the given xml:id value.

    So if your images are complex or numerous (or both!) and take a long time to process, you can restrict attention to whatever part of the document you are actively editing, and you can even restrict to a single image and so produce just a single graphics file.

    Methods

    The -M-M (--method--method) switch is used in some cases to specify the method by which some process is achieved. Supported situations and values are listed below. Defaults are listed first, in brackets.

    PreTeXt Script Methods Situation Values -c asy [server], local -c latex-image [xelatex], pdflatex -c doc -f pdf [xelatex], pdflatex -c preview [fast], slow

    For generation of preview images for interactive elements, fast is the default of a 5 second timeout to allow the page to load; if the interactive element is taking longer to load, using slow will double the timeout.

    Output

    If you use the script to make a single file, such as your complete project as a PDF or an EPUB, then you can use the -o switch to specify this file, otherwise the file will land in the current working directory.

    If your output consists of many files, such as all the HTML for your complete project, then you can specify a directory with the -d switch. Again, the default is the current working directory.

    If you specify one of the components in and you are using a publication file to specify directories that are managed () then the multiple files for that component will automatically be placed into necessary directories by default (rather than in the current working directory). Of course, you can override this behavior by specifying a directory with -d. For example, for many operating systems, by using -d . you can have the results land in the current working directory. (Note there is a necessary period there.)

    In the early stages of a project, you might rebuild your images regularly. But you may not always want those results landing within directories under revision control. Later in a project, your images may be relatively stable, and you want to distribute them with your source, perhaps so others can re-purpose them in handouts or other materials. To accommodate this, make two publication files, and in one make a relative path for the generated components that is outside of the main directory that is under revision control. Likely you will need some file path syntax for a parent directory, such as ../ on Unix-like systems. Then you can switch from testing to distribution, and back, easily.

    <c>pretext/pretext</c> Capabilities <c>pretext/pretext</c> Capabilities

    Again, the command pretext -h will remind you of the various options for the script and is the most likely list to be correct and up-to-date. The following is a brief summary, in general terms, of what is possible.

  • Complete Conversions

    With -c doc and various choices of the format (-f) the script will execute a complete conversion. In some cases, this is a convenience compared with just using the xsltproc processor. In other cases the conversion is very complex and multiple (arcane) output files must be packaged up in very specific ways and no author would want to manage it all. Conversion to EPUB is one example ().

  • <latex/> Graphics

    has a variety of languages for specifying images, such as xypic, pgfplots, and TikZ. By including the necessary packages or setup commands in docinfo/latex-preamble, these can all be generated at once, in the manner of the example earlier.

  • Asymptote

    Images described by the Asymptote language can be processed in a manner entirely similar to that for images described with graphics languages. By default an online server will be used for the image generation, or you may elect to use an asy executable on your system and locatable via the pretext.cfg configuration file.

  • Sage Plot

    If you have a version of Sage installed on your system, you can specify the path to the executable and obtain images described by Sage code. See for more information.

  • All Formats

    If you desire images in a wide variety of formats, the option -f all will oblige.

  • YouTube Thumbnails

    For each YouTube video (or itemized playlist) you specify, the script will go the YouTube site and grab a thumbnail image for that video (or first video from the itemized playlist). These get used in static formats, such as PDF.

  • Preview Images

    Like a thumbnail for a YouTube video, other interactive content can benefit from a still image for use with static formats. Our strategy is to render the content with a headless web browser and capture an image automatically. For example, you might write some custom Javascript to allow a reader to interact with a graph, and you would like an image of the graph, along with its interactive sliders and checkboxes, to appear in the PDF version of your text. Recognize that this image will necessarily be the content at its initial start-up. Get a screenshot manually if you want something better.

    Note that for all this to work, you need to properly serve your project's HTML output with the interactive content. (A local server may be a possibility, but we have not tried. See . Or you can try a temporary public server, see ). Then you need to announce the location of this hosted HTML, which is accomplished via a base URL in a publication file. Start at for details on this publisher variable. Note that the chunk level in your publication file used in this process must match the chunk level used when you build your HTML output, and mismatches for other publisher variables could have some ill effects.

    The automatic screenshots will then be managed by the Python playwright package, which you will need to have installed in your Python virtual environment (see ).

  • Mathematics Representations

    Conversions to EPUB, braille, and other formats require creating conversions of mathematics elements locally as part of the conversion. This requires having MathJax installed locally, see . Structured files of these representations can be obtained by setting the component with -c math. Possible formats (-f) are svg, mml (MathML), braille and speech.

  • <webwork/>

    Various conversions of problems are facilitated using either a server or a local copy of the PG repository. See for the details of this procedure.

  • ================================================ FILE: doc/guide/developer/xsltproc.xml ================================================ Processing with <c>xsltproc</c>

    The executable program xsltproc xsltproc implements Version 1.0 of the eXtensible Stylesheet Language (XSL) XSL. This is a declarative language that walks the hierarchical tree of an XML source file, and for each element describes some output to produce before, and after, recursively processing the contained elements. (That is a simplified description.)

    xsltproc is typically installed by default on Linux systems and as part of Mac OS. See the website for details for Windows systems. The most basic operation is to provide xsltproc with an XSL stylesheet from the distribution and an XML document of your creation that is valid . This is done at the command-line, inside of a terminal or shell. Describing command-line operations, along with file and directory management, is beyond the scope of this guide, so consult another resource if this is unfamiliar. So here is a hypothetical simple example:

    xsltproc xsl/pretext-html.xsl ~/books/aota/animals.xml

    By default, xsltproc writes output to stdout (the screen), which you could redirect to a file, or you could use the -o switch to send the output to a named file. However, automatically writes to a file whose name is derived from the xml:id attribute of the top-level book or article tag. If no such attribute is given the filename will be derived from book-1 or article-1. All output is produced in whatever the current default directory is, so you will likely want to set this beforehand.

    The xsl subdirectory of the distribution contains a variety of XSL stylesheetsXSL stylesheet, which I will also refer to as converters converter XSL stylesheet or conversions conversion XSL stylesheet . The ones that you will use as an author all have filenames of the form xsl/pretext-XXX.xsl, where XXX is some indication of the output produced. Conversions to or HTML output are the two most mature converters.

    Note that authors are not responsible for creating XSL stylesheets. Stock conversions are part of the distribution, and anybody is welcome to assume a source document is valid and create new conversions to process it to existing, or as yet unimagined, formats.

    Setup

    There are two components to processing your document, the stylesheets and the xsltproc program. We work at the command-line command-line inside of a terminal terminal or console console. If you do not know what this is, it will seem very primitive at first. Sometimes the old ways are the best ways. This will be called a Command Prompt in Windows or a Terminal on a Mac. In Linux it may be known as a console or a shell. A tutorial, which is Linux-specific, can be found at Ryan's Tutorials and certainly others exist.

    The operating system on a Mac is built on Unix, which is very similar to Linux, so most of the directions here will be little changed between the two. Procedures can be very different in Windows ( , ). One alternative is CoCalc which provides a full Linux computer for free in your web browser, so that may be an excellent place for initial experiments.

    Step 1: <pretext />

    You need to obtain the stylesheets, which are the main part of . Since you are reading this, it may be possible that you have this already. You can use git to clone the from the GitHub repository, and then be sure to checkout the dev branch to have the latest version. This is the best way to go, and you should only download the repository as a zip file once for an initial experiment, and then switch to using a clone instead.

    Once you have a clone of the repository, you can issue git pull, and git will update your local copy with any recent changes. You should do this regularly meaning on the order of daily. See the FAQ entry for more about why we expect you to do this.

    See the site for details and commands for this step, right on the main page.

    Step 2: <c>xsltproc</c>

    This is the command-line program which takes your document and a stylesheet to together produce output. On Linux or a Mac you probably already have it installed as part of system software. On Windows it is not so simple.

    In either case see the website for details abut verifying you have this, or how to install it.

    Processing

    At a command prompt in your terminal or console adjust the path names for the two files and execute: xsltproc /path/to/pretext/xsl/pretext-html.xsl /path/to/quickstart.xml In the current working directory you should now find the file article-1.html which you can view in a web browser. (You will want an internet connection since various parts of the page come from the network. Someday we will create output for the offline situation.) It will look very plain, but you should be able to read the sentence.

    Now, try the following, again with adjusted paths, and all on one line: xsltproc -o quick.tex /path/to/pretext/xsl/pretext-latex.xsl /path/to/quickstart.xml

    In the current working directory you should now find the file quick.tex which you can process with pdflatex or xelatex at the command line as below. If you do not have installed on your system, you could process this file within a variety of online services, and CoCalc would be an obvious choice. pdflatex quick.tex In the current working directory you should now find the file quick.pdf which you can view or print with standard PDF viewing software. You could even send it to a print-on-demand service to get nice hardback books, though I suspect sales will not be great.

    Note that if your project includes multiple files you will need to pass the -xinclude flag to xsltproc, though this is not needed for this simple example. An example of this is the command xsltproc -xinclude /path/to/pretext/xsl/pretext-html.xsl /path/to/index.xml For more on this see and .

    That's it. You now know all the basics of authoring with , since you have produced two radically different output formats with identical content from the exact same structured input, via two different command lines. Everything you need to author a complete article or textbook, and produce it in many different formats, is just an extension or variation on what you just did. Let us look at a few simple extensions right away before being more methodical.

    Modular Source Files

    If you use the xi:include mechanism for modular source files, you must process your source slightly differently.

    Add the switch -xinclude to your invocation of xsltproc, just after xsltproc, but before the filenames for the stylesheet and the top-level source file. Note that for some versions of xsltproc it might be necessary to use two dashes for the switch, --xinclude. So now a typical invocation (using one dash) might look like xsltproc -xinclude xsl/pretext-html.xsl ~/books/aota/animals.xml

    It is easy to forget the -xinclude switch. Empty output, or cryptic error messages, are your first clue to this simple, but common, mistake.

    String Parameters

    To pass string parameters to xsltproc, use a command like the following (possibly with --xinclude).

    xsltproc -o animals.tex --stringparam latex.font.size "20pt" /path/to/xsl/pretext-latex.xsl ~/books/aota/animals.xml

    You can use as many stringparam as you like on the command-line (or in your scripts). The quotation marks are not strictly needed in this example, but if the value of the parameter has spaces, slashes, etc., then you need to quote-protect the string from the command-line processor, and either single or double quotes will work (and protect the other kind).

    Extra XSL Stylesheets

    If you want to use a custom XSL stylesheet, as described in , it is a simple matter of using that custom as the XSL file fed to xsltproc. That is, enter something like the following.

    xsltproc -xinclude -o animals.tex ./xsl/custom-latex.xsl ~/books/aota/animals.xml

    Note that using this method, it is necessary to import the stock XSL using the href instead of pretext-href, as in xsl:import href="path/to/pretext/xsl/pretext-latex.xsl". You need to specify the full path to the pretext/xsl directory, or else put your custom XSL in the pretext/user directory and use a relative path (../xsl/pretext-latex.xsl).

    Publication File

    To employ a publication file using xsltproc you use a string parameter () named publisher. This should have a path that is relative to the main file for the document. For example, assuming pod.xml and fauna.xml are in the same directory xsltproc -stringparam publisher pod.xml pretext-html.xsl aota.xml This file should reduce the many other string parameters in use, and reduce the need for extra XSL files ().

    Images Described in Source

    As we discussed in , there are many advantages to describing images directly in the source of your document. However, these must be processed with various helper programs such as asy,pdflatex, and sage.

    The issue with this is that XSL is not a general purpose programming language, and so in particular, cannot call the helper programs. The general strategy is to use XSL to identify and isolate the parts of a document that lie in the elements designed for graphics languages. A Python script, the pretext script, employs these XSL stylesheets and then feeds each image file to the appropriate helper program.

    This script has a variety of options, so we document it fully in .

    Author Tools

    The authors-report.xsl stylesheet, found in the xsl/utilities directory, will report all of the provisional cross-references and all of the properly prefixed todo-comments. The report is organized by all of the divisions in use in your project. It is meant to be simple in appearance, just text.

    Apply this stylesheet just like you would any other:

    xsltproc -xinclude path/to/pretext/xsl/utilities/authors-report.xsl path/to/main.ptx
    Keeping Your Source Up-to-Date

    This section describes a tool you can use to automate the process of adjusting your source when there are deprecations. Generally, there is an XSL stylesheet which will convert your XML source to another XML source file, fixing many of the deprecations automatically. However, it is the nature of XML processing that your source file will undergo some cosmetic changes. For example, the order of attributes is never relevant, so an XML-to-XML conversion is free to re-order the attributes of an element, perhaps different from how you like to author them.

    So you have two choices:

    • Process your source with any of the provided conversions and edit by hand until the warnings all disappear.
    • Run the deprecation-fixing conversion and accept the changes in XML formatting. (Read on for more specifics about these changes.)

    You perform this conversion using xsl/utilities/fix-deprecations.xsl on an XML source file in the usual way. By default, output appears on the console, so you will want to specify an output file, for example with the -o flag of xsltproc. You will discover a safety measure that requires you to also use a parameter, which you can pass in to xsltproc with the -stringparam command-line argument.

    One choice of the parameter will result in just copying your source file and making all the cosmetic source format changes (we refer to this here as normalization normalization). This might be a useful thing to do first, all by itself, either as a first step, or an exploratory experiment. The other value of the parameter will actually make changes, and report some information about progress.

    Here are some notes:

    1. Be sure to experiment on copies of your source in a scratch directory. Send your output to another directory. When finished, use a diff tool to inspect the actual changes made. You can record your eventual changes using revision-control. (See Git for Authors .)

    2. Do not enable xinclude processing or else your several files will all be merged into one as output and any modularity of your source will be lost.

    3. Every single bit of indentation and whitespace in your source will be preserved, except perhaps for some blank lines near the top of your source files, and limited exceptions noted below.

    4. Attributes will likely be re-ordered, with normalized spacing between them.

    5. Empty elements will have any spaces removed from the end of the tag.

    6. Elements with no content may be written with a single empty tag.

    7. CDATA sections will be converted to text acceptable to the XML parser. In other words, the CDATA wrapper will be removed and dangerous characters (&, <, >) will be replaced by equivalent entities (such as &amp;). If you have many matrices expressed in and wrapped in a CDATA, this might be a big change. See for background.

    8. The output files will be labeled as having UTF-8 encoding.

    9. It could be necessary to run this conversion more than once if deprecations build on one another. In other words, we do not update specific conversions, but rely on regular use to keep source up-to-date.

    10. It should be safe to run this conversion repeatedly, even after new deprecations are added. In fact, it is encouraged.

    11. The source file examples/sample-errors-and-warnings.xml is intentionally full of lots of bad stuff. You can experiment with it, should you want to see interesting things happen. We have already performed the normalization step, so you can concentrate on substantive changes.

    To process a directory with multiple source files, I would proceed as follows. First make three temporary directories, /tmp/original,/tmp/normal,/tmp/clean, and copy my source files into /tmp/original. Then, using a BASH shell, and inputting the command all on one long line.

    for f in *.xml; do xsltproc -o ../normal/$f -stringparam fix normalize /home/rob/pretext/xsl/utilities/fix-deprecations.xsl $f; done

    This will loop over every XML file in the current working directory, /tmp/original, running the normalization conversion on each file, with the output files using the same filename, but now being placed in the /tmp/normal directory. If you change to the /tmp directory, then you can compare the results. I like to use the diff utility provided by git.

    git diff original normal

    Or, try this for a view that might be more informative.

    git diff --word-diff original normal

    You may only do the above once, on your first use of this conversion stylesheet. You will see how your style of authoring XML will undergo some minor changes. We can repeat the above to actual make the changes necessary due to deprecations. Make /tmp/normal the working directory.

    for f in *.xml; do xsltproc -o ../clean/$f -stringparam fix all /home/rob/pretext/xsl/utilities/fix-deprecations.xsl $f; done

    And as above, you can now compare the normal and clean directories to see actual changes. If you are satisfied with the changes, you can copy the files in the clean directory back onto your source files. If you are using revision-control (you are, aren't you?) then you can make a commit that holds these changes. (See Git for Authors .) Or maybe even make two commits, one from the normalization step, and a second with the substantive changes.

    File Management

    , at its core, is the formal specification of the XML vocabulary, as expressed in the DTD (). We have provided converters to process source files into useful output. However, we have not yet built a point-and-click application for the production of a book. So you need to take some responsibility in a large project for managing your files, both input and output. We have tried to provide flexible tools to make an author's job easier. The following is advice and practices we have successfully employed in several book projects.

    Source

    I am fond of describing my own books with an initialism formed from the title. So A First Course in Linear Algebra becomes FCLA, and in file and directory names becomes fcla. So I have a top-level directory books and then books/fcla, but this directory is not the book itself, this is all the extra stuff that goes along with writing a book, much of it in books/fcla/local. The actual book, the part everybody sees with an open license, lives in books/fcla/fcla. This subdirectory has files like COPYING, which is a free software standard for license information, and README.md which is a file in the simplistic Markdown format that is picked up automatically by GitHub and displayed nicely at the book's repository's main page. Subdirectories include src for the actual XML files, xsl for any customizing XSL (), and script for shell scripts used to process the book (see below).

    I do not use any additional directory structure below src to manage modular files for a book, since the XML and the --xinclude mechanism manage that just fine. I see little benefit to extra subdirectories for organization and some resulting inconvenience. I do typically have a single subdirectory src/images for raster images and other graphics files.

    I believe it is critically important to put your project under revision control, and if licensed openly, in a public GitHub repository. So the books/fcla/fcla directory and all of its contents and subdirectories is tracked as a git repository and hosted on GitHub. Because this directory is source I try very hard to never have any temporary files in these directories since I do not want to accidentally incorporate them into the git repository. As a general rule-of-thumb, only original material goes in this directory and anything that can be re-created belongs outside.

    A tutorial on git would be way outside the scope of this guide, but Beezer and Farmer have written Git For Authors, so perhaps look for that.

    Image Files

    Some images are raster images ( photographs) that are not easily changed, and perhaps unlikely to be changed. Other images will come from source-level languages via the pretext script. For your convenience, this script has a command-line option that allows you to direct output (graphics files) to a directory of your choice.

    In the early stages of writing a book, I put image filesimage produced from source code in a directory outside of what is tracked by git. It is only when a project is very mature that I begin to include completed graphics files into the src/images directory for tracking by git.

    Build Scripts

    When you have a mature book project, the various files, processing options, and a desire for multiple outputs can all get a bit confusing. Writing simple scriptsscript is a good idea and the investment of time doing this early in a project will pay off through the course of further writing and editing. The particular setup you employ is less important.

    I have fallen into the habit of using the make program. It allows me to define common variables upfront (such as paths to the distribution and the main directory for the project it applies to). Then I can easily make targets for different outputs. So, for example I typically go make pdf or make html to produce output, and have simple companion targets so that I can go make viewpdf or make viewhtml. Other targets do things like checking my source against the DTD (). I have split out the variable definitions in a way that a collaborator can join the project and simply edit the file of definitions just once to reflect their setup, and still participate in future upgrades to the script by pulling from GitHub and not overwrite their local information.

    My use of make is a bit of an abuse, since it is really designed for large software projects, with the aim of reducing duplicative compilations and that is not at all the purpose. You could likely have exactly the same effect with a shell script and a case (or switch) statement.

    My general strategy is to assemble all the necessary files into a temporary directory (under /tmp in Linux) by copying them out of their permanent home, copy customizing XSL into the right place (typically pretext/user), run the pretext script as necessary and direct the results to the right place, and finally copy results out of the temporary directory if they are meant to be permanent. Interesting, an exception to staging all these files is the source of the book itself which is only read for each conversion and then not needed for the output. So you can just point directly to a top-level file and the xinclude mechanism locates any other necessary source files.

    A good example of this general strategy is the use and placement of image files for HTML output. It is your responsibility to place images into the location your resulting HTML files expect to locate them. By default, this is a subdirectory of the directory holding the HTML files, named images. You will want to copy images, such as photographs, out of your main source directory (src/images?). But you may be actively modifying source code for diagrams, and you want to re-run the pretext script for each run, and make sure the output of the script is directed to the correct subdirectory for the HTML output. Running the pretext script frequently can get tiresome, so maybe you have a makefile target make diagrams that updates a permanent directory, outside of your tracked files in the repository, and you copy those files into the correct subdirectory for the output. That way, you can update images only when you are actively editing them, or when you are producing a draft that you want to be as up-to-date as possible. As a project matures, you can add images into the directory tracked by git so they are available to others without getting involved with the pretext script.

    We did not say it would be easy, but we feel much of this sort of project management is outside the scope of the project itself, while in its initial stages, and existing tools to manage the complexity are available and documented. (We have been encouraged to create sample scripts, which we may do.) Just remember the strategy: stage necessary components in a temporary directory, build output in that directory, copy out desired semi-permanent results, and limit additions to the source directory to that which is original, or mature and time-consuming to reproduce.

    Doctesting Sage Code

    Adding computer code to your textbook is a tricky proposition. You can propose that it is merely an illustration, and not meant to have all the necessary details, or you can make it exact, correct and executable, and then risk inevitable changes to render your code obsolete. At least you have the option of editing and reposting online versions quickly and easily.

    One of our main motivations for this project was mixing in code from the powerful, open source, mathematical software project, Sage (). When you add example Sage code to illustrate mathematical ideas, you are then encouraged to also include expected output in the output element. Here comes one of the powerful advantages of XML source and XSL processing.

    The pretext/xsl/pretext-sage-doctest.xsl stylesheet, used in the usual way, will create one, or several file(s), in exactly the format Sage expects for automated testing. So all your words are gone, and all your Sage input and output is packaged so Sage can run all the input and compare the results to the expected output. See for details on obtaining more than one file.

    We have many years' experience testing hundreds of non-trivial Sage examples from textbooks, for linear algebra and abstract algebra. Roughly every six months, we discover ten to twenty examples that fail. Frequently the failures are trivial (usually output gets re-ordered), but some are significant changes in behavior that leads us to re-word surrounding guidance in the text, and in a few cases the failures have exposed bugs introduced into Sage. It has been relatively easy to do this maintenance on a regular basis, and if it had not been done, the accumulated errors would be enough to greatly degrade confidence in the accuracy of the examples.

    Exact details for this process can be found in . Note that Sage is really just a huge Python library, so it might be possible to test pure Python code with this facility, but we have not tested this at all. Similar support for other languages can be considered if requested for use in a serious project.

    ================================================ FILE: doc/guide/frontmatter.xml ================================================ Robert A. Beezer Department of Mathematics and Computer Science University of Puget Sound beezer@pugetsound.edu David Farmer American Institute of Mathematics farmer@aimath.org Alex Jordan Department of Mathematics Portland Community College alex.jordan@pcc.edu Mitchel T. Keller Morningside College Oscar Levin University of Northern Colorado 20132019 Robert A. Beezer, David Farmer, Alex Jordan, Mitchel T. Keller Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License. ================================================ FILE: doc/guide/generated/asymptote/gaussian-histogram.html ================================================ workspace_1 ================================================ FILE: doc/guide/generated/asymptote/vimodes.html ================================================ workspace_1 ================================================ FILE: doc/guide/generated/qrcode/joren-falls-video-url.xml ================================================ https://pretextbook.org/doc/guide/html/joren-falls-video.htmlhttps://pretextbook.org/doc/guide/html/topic-video.html#joren-falls-video ================================================ FILE: doc/guide/generated/qrcode/mozart-piano-sonata-url.xml ================================================ https://www.youtube.com/watch?v=1Yv_AINhVn4https://pretextbook.org/doc/guide/html/topic-video.html#mozart-piano-sonata ================================================ FILE: doc/guide/generated/qrcode/topic-youtube-video-8-2-url.xml ================================================ https://www.youtube.com/playlist?list=PLGRecdYLYDNdX5NEkS3KH-ZtCqc2f8lJ_https://pretextbook.org/doc/guide/html/topic-video.html#topic-youtube-video-8-2 ================================================ FILE: doc/guide/generated/qrcode/tutorial-videos-video-url.xml ================================================ https://www.youtube.com/watch?v=w_Wu5ysIiPQhttps://pretextbook.org/doc/guide/html/tutorial-videos.html#tutorial-videos-video ================================================ FILE: doc/guide/generated/qrcode/video-hotel-california-url.xml ================================================ https://www.youtube.com/watch?v=YW4dzWE1SUs\&start=12https://pretextbook.org/doc/guide/html/topic-video.html#video-hotel-california ================================================ FILE: doc/guide/generated/qrcode/windows-cli-3-3-url.xml ================================================ https://www.youtube.com/watch?v=tAtdzyVBcZAhttps://pretextbook.org/doc/guide/html/windows-cli.html#windows-cli-3-3 ================================================ FILE: doc/guide/guide.xml ================================================ The <pretext /> Guide Introduction Author's Guide Publisher's Guide Developer's Guide ================================================ FILE: doc/guide/guideinfo.xml ================================================ Best Practice Tip Porism \usepackage{tikz} \DeclareMathOperator{\homop}{Hom} \newcommand{\Hom}[2]{\homop\left(#1,\,#2\right)} ================================================ FILE: doc/guide/introduction/start-here.xml ================================================ Why <pretext />?

    Welcome to the Guide for . You are likely eager to get started, but familiarizing yourself with this chapter should save you a lot of time in the long run. We will try to keep it short and at the end of early chapters we will guide you on where to go next. Not everything we say here will make sense on your first reading, so come back after your first few trial runs. When you are ready to seek further help, or ask questions, please read the in .

    Philosophy

    is a markup languagemarkup language, which means that you explicitly specify the logical parts of your document and not how these parts should be displayed.

    This is very liberating for an author, since it frees you to concentrate on capturing your ideas to share with others, leaving the construction of the visual presentation to the software. As an example, you might specify the content of the title of a chapter to be Further Experiments, but you will not be concerned if a 36 point sans-serif font in black will be used for this title in the print version of your book, or a CSS class specifying 18 pixel height in blue is used for a title in an online web version of your book. You can just trust that a reasonable choice has been made for displaying a title of a chapter in a way that a reader will recognize it as a name for a chapter. (And if all that talk of fonts was unfamiliar, all the more reason to trust the design to software.)

    You are also freed from the technical details of presenting your ideas in the plethora of new formats available as a consequence of the advances in computers (including tablets and smartphones) and networks (global and wireless). Your output just works and the software keeps up with technical advances and the introduction of new formats, while you concentrate on the content of your book (or article, or report, or proposal, or).

    If you have never used a markup language, it can be unfamiliar at first. Even if you have used a markup language before (such as HTML, Markdown, or basic ) you may need to make a few adjustments. Most word-processors are WYSIWYG (what you see is what you get). That approach is likely very helpful if you are designing the front page of a newspaper, but not if you are writing about the life-cycle of a salamander. In the old days, programs like troff and its predecessor, RUNOFF (1964), implemented simple markup languages to allow early computers to do limited text-formatting. Sometimes the old ways are the best ways.

    is what is called an XML applicationXML applicationXML applicationXML vocabulary or an XML vocabularyXML vocabularyXML vocabularyXML application (I prefer the latter). That is, the source you write is marked up as XML, with specific tags that describe the semantic structure of your document. Authoring in XML might seem cumbersome at first, since some content will require more characters of markup than of content. Much of this markup can be quickly produced with a modern text editor, but it can still be overwhelming. We believe you will eventually appreciate the long-run economies, so keep an open mind. And if you are already familiar with XML, realize we have been very careful to design this vocabulary with human authors foremost in our mind.

    Principles

    The creation, design, development, and maintenance of is guided by the following list of principles. These will become more understandable as you become more familiar with authoring texts with and should amplify some of the previous discussion.

    <pretext /> Principles
    1. is a markup language that captures the structure of textbooks and research papers.
    2. is human-readable and human-writable.
    3. documents serve as a single source which can be easily converted to multiple other formats, current and future.
    4. respects the good design practices which have been developed over the past centuries.
    5. makes it easy for authors to implement features which are both common and reasonable.
    6. supports online documents which make use of the full capabilities of the Web.
    7. output is styled by selecting from a list of available templates, relieving the author of the burden involved in micromanaging the output format.
    8. is free: the software is available at no cost, with an open license. The use of does not impose any constraints on documents prepared with the system.
    9. is not a closed system: documents can be converted to and then developed using standard tools.
    10. recognizes that scholarly documents involve the interaction of authors, publishers, scholars, curators, instructors, students, and readers, with each group having its own needs and goals.
    11. recognizes the inherent value in producing material that is accessible to everyone.
    Understanding Your Source

    Almost all of your time authoring in will be spent editing your sourcesource files. We now briefly describe what these files will look like and how to edit them.

    File Format and Text Editors

    Your source will be plain text ASCII filesASCII file, which you create and edit with any number of text editors. Files can be saved with the .ptx extension, which might tell your text editor what sort of file you are editing and will provide syntax highlighting and code completion, among other features. If your editor does not recognize .ptx, then you can use the .xml extension which has wider editor support (but with fewer -specific features).

    Popular text editors include Visual Studio Code, Sublime Text, vi, emacs, Notepad, Notepad++, Atom, TextWrangler, and BBEdit. But in particular, you should not use word processing programs like Word, LibreOffice, Google Docs, WordPerfect, AbiWord, Pages, or similar programs. Sometimes these editors are known as a programmer's editorprogrammer's editor (though we will be doing no programming). Support for writing HTML sometimes translates directly to good support for XML.

    Visual Studio Code has support for PreTeXt documents via a free extension, and the editor is open source and cross-platform (Windows, OS X, and Linux). The developers of have also had a very good experience with Sublime Text, which is cross-platform, and can be used for free, though it has a very liberal paid license if you want to avoid nagging.

    There are XML editorsXML editor, which might be too complex for authoring in . They do have some advantages and XML Copy Editor is one that you might find useful.

    Some text editors (like VS Code) have spell checking extensions. More generally, recommendations for a spell checker can be found in .

    Structure of your Source

    If you start to think about the structure of a document (like an article or book) you will quickly realize that components are like blocks, stacked inside or next to other blocks. From the outside to inside, a book will have a number of chapters (next to each other, but all inside the book), and each might have sections (adjacent but inside the chapter). In the section, there will be a title, paragraphs, images, examples, theorems, and so on. Examples will themselves contain paragraphs. A theorem might contain a statement, which contains some paragraphs, which might contain some displayed math, and adjacent to the statement, there could be a proof, itself containing paragraphs, etc.

    The hierarchical nature of XML is perfect to capture the hierarchical nature of a scholarly document. Consider the start of a document shown in .

    Source of a simple <pretext /> book project. Hello world! Getting Started

    Welcome to PreTeXt!

    ]]>

    The first line is boilerplate that lets various programs know the rest of the file is XML, and the line start <!-- is an example of a comment that won't appear in the output. Besides this, you can start to see how the structure of the book is laid out.

    Whitespace and Indentation

    The term whitespacewhitespace refers to characters you type but typically do not see. For us they are space, non-breaking space, tab and newline (also known as a carriage return and/or line feed). Unlike some other markup languages, does not ever use whitespace to convey formatting information.

    However, it can be useful to use whitespace to indent the different levels of the XML (and document) hierarchy. Use two (or four) spaces for indentation; a good editor will visually respect this indentation, and help you with maintaining the right indentation with each new line. Line up opening and closing tags at the same level of indentation, and your editor should let you fold the code to visually hide blocks.

    Whatever you do, use a style and stick with it. You could put titles on a new line (indented) after creating a new chapter or section; some people like them on the same line, immediately adjacent. You could put a single blank line before each new paragraph, but not after the last. And so on. The choice is yours, but consistency will pay off when you inevitably come back to edit something. You have put a lot of work and effort into your source. You will be rewarded with fewer problems if you keep it neat and tidy.

    In some parts of a document, every single whitespace character is important and will be transmitted to your output, such as in the input and output portions of a sage element. Since Sage code mostly follows Python syntax, indentation is important and leading spaces must be preserved. But you can indent all of your code to match your XML indentation and the entire input (or output) content will be uniformly shifted left to the margin in your final output.

    Never use tabs, they can only cause problems. You should be able to set your editor to translate the tab key to a certain number of spaces, or to translate tabs to spaces when you save a file (and these behaviors are useful). Most editors have a setting that will show whitespace as a small faint dots or arrows, so you can be certain there is no stray whitespace anywhere.

    Learn to Use Your Editor

    Because XML requires a closing tag for every opening tag, it feels like a lot of typing. The VS Code extension comes with many snippets (code completions) that can fill out lots of the markup for you. More generally, any editor should know what tag to close next and there should be a simple command to do that (for example, in Sublime Text on Linux, Alt-Period gives a closing tag). Not only is this quick and easy, it can help spot errors when you forget to close an earlier tag.

    If your editor can predict your opening tag, all the better. VS Code can recognize what tags are allowed at a given position. Sublime Text recognizes if you already have a section elsewhere, so when you start a second section, you very quickly (and automatically) get a short list of choices as you type, with the one you want at the top of the list, or close to it.

    Invest a little time early on to learn, and configure, your editor and you can be even more efficient about capturing your ideas with a minimum of overhead and interference.

    Revision Control

    If you are writing a book, or if you are collaborating with co-authors, then you owe it to yourself and your co-authors to learn how to use revision controlrevision control, which works well with since the source is just text files. The hands-down favorite is git. To fully understand it is beyond the scope of this guide but some information is provided in which has hints on how to best use git together with a project.

    If you use the workflow recommended in the using GitHub's codespaces, you will get revision control via git automatically, and VS Code provides a graphical user interface for all the basic operations you need.

    Converting Your Source to Output

    Once you have content created in files (i.e., XML files), you will want to convert these files into a output format such as HTML, to be viewed in a web browser, or a PDF. Instructions for doing this will be discussed in , and in even more detail in . Here we provide an overview of how the conversion works to help you understand what is possible.

    With installed (on your computer or in the cloud), converting XML into a full HTML website can be as simple as typing pretext build html in a terminal, or hitting Ctrl+Alt+B in VS Code. Behind-the-scenes, these commands read through your XML and use XSL 1.0 (eXtensiible Stylesheet Language) to transform the XML source, using a number of XSL stylesheets that come with .

    The recommended workflow for processing your source uses a python program we call the -CLI (CLI is command line interface). There are also a number of other free tools that can processes XML with XSL. For example, xsltproc is a command line program that is usually installed by default on Linux systems and MacOS. This was the recommended method in the early days of , and still works. Documentation for how to use xsltproc with can be found in , but unless you are helping with the development of or are trying to do something fancy, you probably don't need it.

    Some features of , such as the inclusion of images described in source, or including exercises, requires the use of an additional processing, done in python. Some of these also require additional software (such as or Sage). The -CLI does this automatically when building (and regenerates these assets if they have changed since the last build). There is also a python script that can accesses these functions directly for use in development. See if you are curious.

    Where Next?

    To start playing with right away, work through the . It will guide you through a cloud-based setup (no software install required) and you will create, edit, convert, and deploy your first document.

    If you would like a general, high-level overview of features skip ahead to .

    In-depth, comprehensive use of features is in .

    If you have an existing project authored in you may be interested in the conversion process described in .

    ================================================ FILE: doc/guide/introduction/tutorial.xml ================================================ Getting Started Tutorial

    At the end of this tutorial you will have...

    • Created a free GitHub account.

    • Created a GitHub Repository and Codespace for authoring in your web browser.

    • Learned the first steps to editing a document.

    • Converted your document to both -generated PDF and accessible HTML.

    • Deployed your HTML to the web via GitHub Pages.

    This chapter serves as a tutorial for quickly getting started with in your web browser using free services provided by GitHub. (Advanced users who'd prefer to install our free and open-source software to their own machine may choose to skip ahead to .)

    The community does its best to keep this guide updated, but for even more up-to-date advice, join us at our regular Zoom drop-ins announced at our Google group or watch a recording posted in .

    Using <pretext /> online

    It is possible to write documents using nothing more than a web browser. This approach does not require you to install any software (other than a web browser), although it does require you have internet access. Options for installing on your own computer are discussed in .

    What is GitHub

    GitHub is a freely-available service owned by Microsoft for authoring, sharing, and deploying documents and source code. It uses the free and open-source Git software for version management.

    There are other services such as CoCalc and GitLab for managing documents online, as well as other ways to write that don't require anything besides installing the free and open-source software onto your own device (see to learn more).

    We will use GitHub for this tutorial as it the most popular way to share and disseminate documents, and provides the easiest pathway to getting started writing in the language.

    To create your free GitHub account, follow the instructions on GitHub's sign-up page . You can also log into an existing GitHub account if you already have one. Be sure to note your GitHub username and password in your password manager (or however you usually keep track of login credentials).

    Tip!

    Educators and non-profit researchers can get many of GitHub's paid features for free. While this is not strictly required for the rest of the tutorial, it's a useful way to increase GitHub's free Codespaces usage quotas, and allows you to use GitHub's free web hosting even for private repositories.

    Apply at Education.GitHub.com to unlock these features. In our experience, applications are usually processed quickly for .edu email addresses, but you do not need to wait for approval to continue on with this tutorial.

    Three GitHub concepts

    This tutorial uses three GitHub services:

  • Codespaces (<c>github.dev</c>)

    The Codespace for your project is an application run in your web browser that gives you access to a virtual computer with all the software recommended to author installed for you automatically. This Codespace is private to you, and lives at an address like https://username-random-words-abc123.github.dev.

  • Repository hosting (<c>github.com</c>)

    The repository for your project represents the history of its edits that have been committed and synced from your Codespace to it. This repository can be public or private (though we encourage public repositories as they help the community provide support for each other), and lives at an address like https://github.com/username/reponame/.

  • GitHub Pages (<c>github.io</c>)

    The GitHub Pages service provides free hosting for websites such as the HTML generated from a project. This website is public, and lives at an address like https://username.github.io/reponame/.

  • Broadly speaking, you author within your Codespace, which you periodically commit and sync to your repository, and then occasionally deploy to your public GitHub Pages website.

    Creating your repository and Codespace

    Follow the instructions at to get started creating your repository and Codespace. You'll have the option to make your repository public (recommended if you want support from the rest of the community) or private. Either way, those instructions will also walk you through creating your private Codespace for authoring.

    This takes a few moments, but is a one-time process. Take note of the github.com URL your new repository lives at so you can find it the next time you want to work on your project. (You can always access your github.dev Codespace link from there via the Code menu.) Then you'll be ready for .

    Your First PreTeXt Document

    At this point, you should have a project set up as a github.com repository with a github.dev Codespace. You can use the Code menu on the repository webpage to pull up the Codespace environment in your web browser if you haven't already.

    When you first created your repository from the template, there were very few files included. The first thing you will do when you open your Codespace is to create a new project. As the directions in the repository indicate, you can do this by selecting the PreTeXt: New Project command from the command pallette (which you can open with CTRL+SHIFT+P, among other options).

    You should be presented with a dialog asking for what sort of project you would like to create (article, book, course, slideshow, etc.). For purposes of this tutorial, you should select article or book. You will then be asked where you would like to create the project, and selecting the default suggested location is fine.

    The window should now refresh and you will see a bunch of new files, including a folder called source that contains your main.ptx file. Now you are ready to build it!

    Building for web

    You can build your entire project in a few different ways.

    • Click the PreTeXt button in the center left of the bottom toolbar of the VS Code window (see ). A dialog will pop up asking which command you want to run. Select Build default target, or choose Build another target... to get a menu of options to select a target to build (choose web).

    • You can use the keyboard shortcut CTRL+ALT+p (replacing CTRL with CMD if you have a Mac) to get the same dialogs. Or to build in one step, use CTRL+ALT+b.

    • Select a command from the VS Code command palette, which you can access by clicking the icon in the bottom left of the VS Code window. You can also access this by typing CTRL+SHIFT+p (again, replacing CTRL with CMD if you have a Mac). Start typing pretext to get a list of commands available.

    • If you are comfortable entering commands in a terminal/command prompt, you can access one in your Codespace using CTRL+`. Then you can run pretext build web to build your project.

    The resulting HTML files will be available in the output/web directory of your project. However, to view it, you should NOT navigate there and open the files. Instead, read on.

    PreTeXt commands in Codespaces

    Screenshot of VS Code PreTeXt button in Codespaces

    Viewing

    You can preview these HTML files you just built using the View command. Again, you can access this in multiple ways: button in the toolbar, CTRL+ALT+p, etc. Select View from the dialog. You may be given options on how to view the document, depending on what VS Code plugins you have available to you. Try one or another until you're able to view your web build in either a new tab of your browser or a tab within VS Code.

    The VS Code Live Preview is a good option, but it is buggy when used inside Codespaces. It seems to help to use the VS Code command palette to run Live Preview: Show Preview (External Browser), then close the tab that opens, and start the process over. You may need to do this a few times before it works.

    Now is a great time to try to make edits to your source files (maybe change the title). Note that these changes aren't updated live in your preview: you will need to build again, and then refresh the preview window to see them. Note, you do not need to run the View command again unless you stop the preview server.

    Building for print

    To produce a PDF from your source, repeat the above instructions with the print target. If you use the button in the toolbar, select Build another target... and then print. Alternatively, you can enter pretext build print in a terminal. The resulting PDF will land in output/print/main.pdf, and can be downloaded by right-clicking in the VS Code file explorer, or previewed using a View command.

    If you would like to see the intermediate source files, you can add a new target to the project manifest (project.ptx) with a format of latex. See .

    Saving your work

    Using Codespaces will keep all your files in the cloud, saved automatically as you edit. As long as your Codespace is active, your files will be saved there for your private use. However, inactive Codespaces are periodically cleaned up by GitHub (as of writing, this happens after one month of inactivity), so you'll need to periodically commit & sync your work to your repository where it will never be deleted.

    Recall that your Codespace lives at github.dev, while your repository has a github.com address like https://github.com/username/reponame). This repository serves as a backup of your work in the Codespace, and has the added benefit of allowing collaborators to access your files as well. As a bonus, if you made your repository public, members of the PreTeXt community who watch the PreTeXt-support Google group can create their own Codespace based on your public repository and easily answer any questions you have.

    While Git and GitHub have a lot of features, there's a very simple way to use them via Codespaces. As you edit files, you'll notice that their filenames will turn orange, and new files will appear green. Likewise, a blue number will appear in the left sidebar.

    Filenames changing color as they are edited in Codespaces

    Screenshot of VS Code sidebar in Codespaces

    This blue badge is next to the Source Control view. You will notice a list of files that were changed; you can click on any of these to see what the changes are.

    A Git diff showing changes in a file

    Screenshot of VS Code Git diff in Codespaces

    Type a message describing the changes you've made then click the green Commit and Sync button. If it just says Commit, use the drop-down menu to choose Commit and Sync. (If you forget to type a message describing the changes you've made, then a new tab will open: COMMIT_EDITMSG where you can type the message. When you are done, close the tab.)

    Committing and syncing changes

    Screenshot of VS Code source control in Codespaces

    To see that this is successful, return to your github.com repository webpage. You should see your files with all your committed/synced changes. (That is, most of them: many files, such as log files and temporary build files that appear in gray within your Codespace, will not be synced. This is no problem: they are created during a build automatically and don't need to be, and really shouldn't be, saved or shared with others.)

    Generating assets

    If your document contains certain elements, you might need to generate their assets for use in certain output formats. Depending on your build target, these include:

    • latex-image
    • sagemath
    • asymptote
    • youtube
    • webwork
    • codelens

    Starting in CLI version 1.7, these assets will be automatically generated whenever you build your output. If you change the source of these assets, they will be regenerated when you build.

    Regardless of which version of the CLI you are using, you can generate assets as a separate step in much the same way you run a build. You will see a Generate option in the command dialog, just below Build. Select your target and wait for the process to complete, then Build once more to incorporate your generated assets.

    Deploy

    So you have worked tirelessly to prepare course notes or a book, built and previewed, synced changes to your git repository, and now you are ready to share the results of your efforts with the world. It's time to deploy your project!

    From the PreTeXt Commands dialog, select Deploy. This will automatically take the most recent build of your web target and host it through GitHub Pages. Watch the output pane for a link to your published site; unlike the preview link you've been using on github.dev which is private to only you, this github.io link is ready to share with the world. (It can take a few minutes for the site to get set up or updated; there should be another link to view the progress of the GitHub action that reports the progress.)

    By default, doing a deploy will just publish your web target. It is also possible to deploy multiple targets along with a landing page directing a visitor of your site to the different versions of your project. See for more information.

    Using this guide and advanced features

    The rest of this guide will help you on your way. However, keep in mind that this guide is the work of many volunteers over many years, and certain sections may assume the reader is using mechanisms for writing that have been around for much longer than the Codespaces environment recommended for this tutorial.

    In particular, there are two advanced mechanisms used by many authors: the PreTeXt developer script (i.e. the pretext/pretext script) and the PreTeXt CLI .

    Under the hood, the PreTeXt CLI is what you're using in Codespaces, and it also has the ability to call the PreTeXt developer script as well. If you ever want to use a PreTeXt CLI command, you can open a Terminal in your Codespace using the menus, or by pressing Ctrl+` (the backtick key, found in upper left of many keyboards).

    From the terminal, you can type in any PreTeXt CLI commands directly. For example, typing in the CLI command pretext build web and running it by pressing Enter builds the web target.

    Using the PreTeXt CLI with a Codespaces terminal

    Screenshot of using the PreTeXt CLI within Codespaces

    The CLI should be sufficient to do nearly everything you want to do for your project, and using the developer script should be exercised with caution. Nonetheless, to access a pretext/pretext developer script feature, you can use pretext devscript. For example, if the documentation suggests a command like pretext/pretext -foo bar, you could try running pretext devscript -foo bar.

    Installing PreTeXt

    The browser-based GitHub Codespaces workflow described in is a quick and easy way to use without needing to install any additional software. If you prefer to have a local setup of PreTeXt, we recommend one of the following three setups.

    Option 1: Installing a Docker container

    The closest thing we have to a single click installer is to use a Docker container that includes all the software needed to run PreTeXt. In fact, the setup described in this section results in an identical environment to the one used in GitHub Codespaces, but it is all locally running on your own computer. The directions for all operating systems are the same (since the two programs you need to download and install are available for Windows, Mac, and Linux).

    The one downside to this approach is that you will need a fair amount of disk space (around 5 GB all together), and some of that space will be used to install tools like and SageMath that you might already have installed anyway.

    Here are the steps required to use this option.

    1. Download and install Visual Studio Code. This is the desktop version of the text editor used in Codespaces (and is great for all your text editing needs, not just PreTeXt).

    2. Download and install Docker Desktop. Once installed, start Docker Desktop and agree to the licensing terms. You should not need to create an account.

    3. Download the PreTeXt Codespace zip file and extract it to a location of your choice.

    4. Launch Visual Studio Code. Use the File menu to select Open Folder... and navigate to the folder where you extracted the zip file in the previous step. Select that folder and click Open.

    5. You will likely get a popup in the lower right corner of the window asking if you want to install the devcontainer extension, or if you want to open the current workspace in a devcontainer. You do want to do both of these. If you don't get this message, you can install the Dev Containers extension from the Extensions view (click the square icon on the left sidebar) and then use the Command Palette (CTRL+SHIFT+P) to run the command Dev Containers: Reopen in Container.

    The last step will take a few minutes the first time since it must download the container image.

    Upon completing the steps above, you can create a new project and build/view/deploy just like described in .

    Whenever you work on a project locally, you will want to open it in the container (but next time it will boot up much faster since you will already have the container image downloaded).

    Option 2: Installing the <pretext /> CLI and Additional Software

    The CLI is a Python package that can be installed on your computer. This option is more lightweight than using a Docker container, but it does require you to install several prerequisite programs (including Python itself).

    Detailed instructions for installing the CLI with PIP are available in . If you know what you are doing, you can just run `pip install pretext[all]` to get all the python and core parts of .

    This option is great if you already have a lot of the software that would be duplicated in the docker image from Option 1. In the following list, only python is strictly required, but many features of will not work without the other software.

    • Python (version 3.10 or later); required.

    • Node.js (version 18 or later); required to build custom themes for HTML and to build Braille and some epub targets.

    • Git; required to store your project on GitHub and use the `pretext deploy` command to host your project on GitHub Pages.

    • PreFigure; required to build prefigure images. You can get this as part of the CLI installation, if you install the cli with pip install pretext[prefigure], although you might need some additional system libraries installed. See PreFigure's website for more information.

    • (any standard distribution, including TeXLive, MiKTeX or TinyTex will work); required to build PDF output and if your document includes TiKz images (in a latex-image element).

    • SageMath (version 10.0 or later recommended); required to build SageMath output and if your document includes sageplots (in a sageplot element).

    While you can use any text editor you like for authoring documents, Visual Studio Code is highly recommended due to the availability of the pretext-tools extension which provides syntax highlighting, autocompletion, and other features that make authoring documents much easier. You can install this extension from the Extensions view in Visual Studio Code (click the square icon on the left sidebar) or by searching for pretext-tools in the Extensions Marketplace (it is automatically installed if you use the Docker container from Option 1).

    Option 3: Running <pretext /> <q>from source</q>

    For advanced users, especially if you want to contribute to the development of , you can run without the CLI. To do this, you will need to clone the PreTeXt repository and install the required dependencies manually. This is required if you want to run the script or even just use xsltproc to process your documents. Additional information is available in the linked sections.

    Some context for experienced Python developers: is an open-source XML language primarily powered by XSLT and Python tools. PreTeXt development is primarily split over two GitHub repositories: PreTeXtBook/pretext for the core functionality of PreTeXt, and the more recent PreTeXtBook/pretext-cli that packages up these resources into a Python package with several UX enhancements such as a simplified command line interface and project management that does not require the use of custom makefiles. Instructions for developing with the CLI are available in its repository's README file.

    If you're interested in potentially contributing back to PreTeXt someday, please feel free to request to join our developer Google Group and say hello!

    Videos

    Occasional Getting Started with PreTeXt tutorials are offered to the community via Zoom. For updates on when these are available, subscribe to the PreTeXt announcements Google Group.

    The most recent recording of this tutorial is provided here for your reference.

    Getting Started with PreTeXt, 2023 July
    ================================================ FILE: doc/guide/preface.xml ================================================ Introduction

    This part is the place to begin if you are new to . is the introduction, overview, and philosophy. Then intends to get you started quickly by showing how to set up a authoring environment and converting a document to HTML and output formats. Notice that there are three parts which target different roles: the Author's Guide (), the Publisher's Guide () and the Developer's Guide ().

    Author's Guide

    This guide will help you author a document. So it serves as a description of the XML vocabulary, along with the mechanics of creating the source and common output formats. is meant to be a short overview of the majority of 's features, which can be skimmed to get a sense of 's capabilities. Or it can be read quickly as you begin authoring and you can return as you need certain features. The roughly parallel is much more comprehensive and is the first place to go for details not addressed in the overview. Note that the Author's Guide is not concerned with publishing your document, which is described in the Publisher's Guide.

    Basic Reference

    This part provides a quick overview of the minimal syntax for a variety of key features. Unlike the sample article, which is designed to demonstrate and stress test all aspects of , this guide will illustrate only the key elements of some of the most universally-used features of the language. In many cases, in addition to features not discussed, there may be alternative structures that are not given here.

    Publisher's Guide

    Even if you intend to distribute your document with an open license, and you are both author and publisher, it is still helpful and instructive to understand, and separate, the two different steps and roles. So visit this part of the Guide to learn how you can present, distribute, and maintain what you have authored.

    Developer's Guide

    This part provides advice, suggestions, and conventions for contributing to . For anything not answered here please use the pretext-dev Google Group. Make a membership request and it will be processed quickly.

    Appendices

    In addition to the usual items you might expect in the back matter, such as an open license, glossary, references, and an index, there are numerous more specialized additions, mostly describing the installation of, or effective use of, various technical tools that are independent of (but useful or necessary).

    ================================================ FILE: doc/guide/project.ptx ================================================ html guide.xml publication.xml output/html latex guide.xml publication.xml output/latex pdf guide.xml publication.xml output/pdf latex pdflatex xelatex asy sage convert pdftops node file2brl ================================================ FILE: doc/guide/publication-styled.xml ================================================ letterpaper,total={6.5in,9in} ================================================ FILE: doc/guide/publication.xml ================================================ letterpaper,total={6.5in,9in} ================================================ FILE: doc/guide/publisher/ancillaries.xml ================================================ Ancillaries

    Similar to an Instructor's Version, for a textbook, or other work, a publisher might wish to provide ancillary documents with additional, or repackaged, material.

    Solution Manual

    An author may include a hint, answer, and/or solution as part of each exercise or project. Some of these may be designed for the reader, while some may designed for the instructor. A separate conversion is available to make a PDF containing just these items.

    To use the CLI, first create a small XSL file, called solution-manual.xsl, in the xsl folder at the root of your project, containing the following lines.

            
            
                
            
            ]]>
            

    Then add the following target in your project manifest.

            
                custom
                source/main.ptx
                publication/publication.ptx
                xsl/solution-manual.xsl
                output/solutions
            
            ]]>
            

    Then you can build the solution manual with the -CLI using pretext build solutions.

    Or using xsltproc, execute xsltproc -xinclude pretext-solution-manual-latex.xsl fauna.xml with suitable paths in front of the stylesheet and the source file. The result will be a file like fauna.tex, which can be processed with a engine such as pdflatex. By default, the result will include all statement, hint, answer, and solution for every exercise or project anywhere in your book. Note that this conversion is explicitly designed only for book, so send a request for support for an article. Division headings (chapter, section, ) will be present, if and only if they have content. Page headers will help locate chapters and sections. Exercise numbers will be complete, to make it easier to locate individual problems. In other words, Exercise 3 from Exercises 5.6 will be labeled as 5.6.3, not just 3, as in the original text.

    Any cross-reference that exists inside a solution will be honored and displayed faithfully. By that, we mean that if the author includes an xref as part of a solution to, say, Theorem 10.6, then that cross-reference will be rendered visibly as Theorem 10.6 in the solution manual. However, it will not be live (clickable) since the target (the theorem itself) is not part of the solution manual. We have not, and do not expect to, determine if a cross-reference points to part of another exercise which is visible in the remainder of the solution manual and then elect to make it live/clickable. In other words, all cross-references are static, even if there is the possibility to be more dynamic for a select few. If this is a severe shortcoming, consider producing an Instructor's Version (), enhanced with additional solutions, where all cross-references are live, and targets are more likely to be available.

    A set of switches allows a publisher to control including statement, hint, answer, or solutionfor inline exercises, divisional exercises, worksheet exercises, reading questions, projects, and tasks within exercises and projects. So there is a total of 4\times 5 = 20 yes/no switches, for 2^{20} = 1\,048\,576 supported scenarios. Start at for more on these settings. The preamble is the same as for the full document, so besides being excessive, it should support any of the styling options.

    In practice, you will discover that the conversion will reproduce all of your frontmatter and backmatter exactly as if it was part of the entire text itself. The reason for this is that you may actually want a little bit of front matter, perhaps some back matter, and maybe a new title page that makes it clear that you have created a solution manual. Best practice would be to have your project already organized so that each of your chapters is in its own file, and incorporated into your document via a top-level file using the xi:include mechanism. (Read about modularity in if this is new to you.) So now make an additional top-level file for the solution manual, maybe with a new title, a new preface, and acknowledgements of any help creating exercises and solutions. Be sure to include all of the main matter, even if you know some parts may not have any exercise. You want numbering to be correct for your cross-references and this means having all the content available to be counted, even if it is not visible in the end product. This new top-level file is really the only overhead involved in getting a quality, reliable solution manual together.

    The philosophy behind this conversion is that a publisher may wish to create a different range of solutions for instructors, for limited distribution in ways that students are unlikely to find. Thus, we have tried to produce a functional document by default, without too much attention to making a beautiful document. Of course, improvements and suggestions are always welcome, though here the priority will be ease-of-use.

    Digression

    This conversion illustrates some advantages of including all the content of your project in one source document, and then selecting a subset of that content for different audiences. The advantage of authoring hint, answer, and solution in close proximity to the statement should mean a higher probability that changes to one part of an exercise will be reflected in the other parts. And with standard processing tools, and provided switches, an author and publisher can easily decide which parts to show, and when.

    By including all of your project's content in one monolithic source document, it is possible to confidently reference supporting parts of the main text via cross-references from solutions. When a new edition is released, any variations in numbering will automatically be reflected in a new solution manual, created with no additional editing or proofreading.

    Private Solutions File

    Suppose an author distributes a textbook with an open license, and so makes the source available publicly (perhaps as a condition of the license). Perhaps the author also intends hint provided with exercise to assist students, and having them available as knowls in HTML output is a great way to make them easily available, but not immediately visible. But the author has also written some, or many, solution for the exercise, but these are only meant for instructors, and not for students. See the discussion at for more background.

    One approach is to distribute an Instructor Version or Solution Manual only on request, and only as a PDF. The ability to provide a watermark on every page (see ) allows you to include a personalized message such as Issued to Charles Darwin. Do Not Copy.It would be a trivial technical exercise to remove this, but perhaps the moral imperative (in an extra preface as well?) would dissuade most from distributing further?

    But with an open-source project, how can you distribute the exercise without distributing the solution? After multiple unsatisfactory experiments, we have arrived at the following solution. You author a separate document with hint, answer, and solution that you wish to keep private. You might put this in a different, private, git repository that you only share with your co-authors. Here is how you can construct and employ this file. Here we use the word solution generically to mean any of hint, answer, or solution.

    Private Solutions File solutionsprivate private solutions
    1. Start with an exercise that you wish to provide private solutions for. Give it an xml:id, which you will need for . Be sure the exercise is structured with a statement so a private solution may be appended.

    2. We recommend leaving a comment inside the exercise to remind you that there is a private solution that may need editing if the problem statement changes.

    3. Create a new file to hold the private solutions, presumably located away from your other source files (see ). Call it something like privatesolutions.ptx, which is what we will use below.

      The first two lines of the file must be: <?xml version="1.0" encoding="UTF-8" ?> <pi:privatesolutions xmlns:pi="http://pretextbook.org/2020/pretext/internal"> (pi is the internal namespace.)

    4. Now add as many hint, answer, or solution as you like, in any order you like, authored in the usual way. The missing piece is that you must link each solution back to the exercise it belongs to, with a ref attribute whose value is the xml:id you used to label the exercise in .

      For example, if there is an exercise with xml:id having value very-hard-problem, you might author: <answer ref="very-hard-problem"> <p>42.</p> </answer>

    5. Finish the file by closing the overall pi:privatesolutions element.

    6. Now you can have all of these private solutions incorporated into your source by specifying the filename in your publication file (). The private-solutions attribute of the /publication/source element should be set to this filename (). So you would have <publication> <source private-solutions="path/to/privatesolutions.ptx"/> ...

    7. The private solutions file should be available to any conversion, but most likely you will be using it with the solution manual conversion (see ).

    For a large project you may have many private solutions and one big file is unwieldy. The solution is to modularize the file as described in . Then you can organize your file of solutions into multiple files, perhaps organized by chapter or section. The carch is that the include facility requires each separate file to only have a single top-level (root) element. For this purpose use the pi:privatesolutionsdivision element, which is designed for only this purpose. You can nest this element arbitrarily deep.

    Note that an exercise or task may be authored with no solutions and then does not need a statement. Now, if you add private solutions to such an exercise or task, the markup will be incorrect. As of 2020-06-24 we make no extra effort to warn, or fix, this situation. A likely consequence will be that these private solutions are not rendered (but you might see a problem number where they should appear). Similar advice applies to task, and especially to non-terminal task which can never hold solutions.

    You will have noticed that you have a lot of freedom to make a completely disorganized private solutions file, or even many disorganized files. There is no structure to prevent thisyou are on your own. Ourselves, we would keep the solutions in order of appearance, modularize a big project logically, and use comments liberally. But you can always search on the common value of xml:id and ref to locate the pieces.

    Keep Your Private Solutions Private!

    If you are using git (and why wouldn't you?) it could be an easy mistake to include your private solutions in a public repository accidentally with a careless commit. We would place our private solutions in a directory close to our source tree, but not within the material tracked by git. And we would build our solutions manual with private solutions by copying the necessary files to some scratch directory, where they get deleted later, after the PDF result has been preserved for use.

    Private Solutions with Git

    (2020-06-06) We no longer advocate this approach, and find easier and more robust. This section is no longer maintained and may be removed.

    Suppose an author distributes a textbook with an open license, and so makes the source available publicly (perhaps as a condition of the license). Perhaps the author also intends hint provided with exercise to assist students, and having them available as knowls in HTML output is a great way to make them easily available, but not immediately visible. But the author has also written some, or many, solution for the exercise, but these are only meant for instructors, and not for students. See the discussion at for more background.

    One approach is to distribute an Instructor Version or Solution Manual only on request, and only as a PDF. The ability to provide a watermark on every page (see ) allows you to include a personalized message such as Issued to Charles Darwin. Do Not Copy.It would be a trivial technical exercise to remove this, but perhaps the moral imperative (in an extra preface as well?) would dissuade most from distributing further?

    But what about publicly available source code? After several unsatisfactory experiments, we have arrived at the following solution. Again it involves an intermediate understanding of the revision control software, git. And again, this is an outline.

    • Create a private repository for authors, and other trusted contributors. In other words, if shared, read access is controlled via passwords or something similar.
    • Create a branch off of master called solutions.
    • Do all editing of private material, and only editing of private material, as commits to this branch. So a typical commit might just be solution elements inside existing exercise. Any script or top-level file for producing a solution manual might also be part of this branch.
    • Do all authoring in this private repository, mostly as commits on master.
    • Periodically, while the solutions branch is checked out, merge master to bring in new changes to the main content.
    • Never ever merge solutions into master. In other words, solutions is a long-lived branch which never dies and is never merged into another branch. (Never rebase this branch if you have collaborators sharing the private repository.)
    • Push and pull both master and solutions to and from the private repository by setting up tracking branches.
    • Create a public repository which is a strict duplicate of the master branch. Periodically push the master branch of the private repository to the master branch of the public repository. Only. Its only purpose is for the next item. Use commands or a setup which makes it impossible to accidentally push solutions to this public repository.
    • The commits in the public repository will be identical to those on master in the private repository. So anyone can clone or fork this repository and make pull requests, which authors can apply and mange via the private repository. But solutions will never be part of the interaction with this repository.

    ================================================ FILE: doc/guide/publisher/braille.xml ================================================ Conversion to Braille braille

    There is a conversion to braille which works very well, while also needing further improvements. Conceptually, it is not very different than the EPUB conversion (), except for the additional necessity of the liblouis library for the translation of literary text (see ). MathJax and Speech Rule Engine provide Nemeth Braille from your authored mathematics. There is the option of embossable braille (designed for a physical paper page) or electronic braille meant for an electronic device like a one-line reader with mechanical raised pins. It is worth the effort to first make sure an EPUB conversion is successful, and then extend to the braille conversion.

    Some extra care needs to go into the authoring of a project that creates the best possible output as braille. Some aspects are obvious, such as not being overly-reliant on video or interactive demonstrations. We can accomodate some constructions like a sidebyside in a way that makes sense to the reader. An allied project hopes to make it easy for authors to create diagrams that work well for both sighted and blind readers (tactile graphics). But constructions like abusing an m element to get a superscript th will just lead to confusion for a braille reader. With experience, we are collecting suggestions for authoring in .

    Please be in-touch in the discussion groups if you have a project you would like to convert. Of course, we want to improve the process and the result, but we are especially interested in the experience of blind and low-vision readers who can point us to areas that need improvement.

    ================================================ FILE: doc/guide/publisher/conversions.xml ================================================ Conversions, Generally

    A main goal of is to provide a language for describing a scholarly document by its structure, with contained content, and with no description of the presentation. It then becomes possible to use software to produce different formats, where the presentation takes advantage of that format and enhances the meaning of the content through the expression of the structure.

    But different output formats have different capabilities. For example, a conversion to HTML can take advantage of knowls to organize smaller chunks of content, while a conversion to PDF can take advantage of page numbers for cross-references. And in these two examples, the capability of the one output format is mostly impossible or silly in the other. Look here in this chapter for notes about options that are largely independent of the particular conversion. Subsequent chapters contain notes about options that are largely specific to a particular conversion.

    Publication File publication file publisher filepublication file

    A key concept when using to describe your writing project is that an author should concentrate on content and then later a publisher can concentrate on presentation. (Of course, many authors are also their publisher, making this distinction more difficult than when a professional publisher was a necessity).

    We isolate these publisher decisions in a file we call a publication file. Generally, use of this file will change how words look, or are arranged, on the page, but will not change the author's words themselves. some software might call this a configuration file, but we think it is very important to indicate its role in the publication process.

    In tnis section, we describe how to create and employ this file. Details on actual options can be found throughout this guide, with terse comprehensive reference material in .

    Create a separate XML file the same way you always would. Include the usual XML declaration as the first line. Now, instead of the overall element being pretext, use publication. That's it. Various elements within publication will be used to specify options, typically attributes. Name the file something that reminds you of its purpose, such as pod.xml for a print-on-demand version. Avoid using spaces in the filename, even if your operating system encourages it.

    Entries that control aspects of the output are often attributes of various elements, but may also be the content of elements. When you read the reference material in be aware that we use a sort of shorthand to describe these entries, modeled on a specification called XPath. For example, if we say to set /publication/foo/bar/@bazz to possible values of yes, no, or maybe then the following will be the guts of a legitimate publication file that would somehow adjust your output in some way. In particular, note that the at sign, @, indicates an attribute of the preceding element.

    
                    
                        
                    
                ]]>
            

    When using the CLI (), the path to a publication file must be specified in the project manifest in the publication element for each target.

    Levels Explained levels

    Every document has a hierarchy, even if it might not be very deep. As an extreme example, for a sub-sub-section of a book, the subsubsection is contained in a subsection, that subsection is contained in a section, that section is contained in a chapter, and that chapter is contained in the book. Each division of a document has a level, and the overall root element is always at level 0 (the book in the example). Each other division is at some depth, computed by counting from the root. So the subsubsection in the example is at level 4.

    Many aspects of the different outputs produced can be customized, typically via the publication file (), based on how much of the hierarchy is used or made visible. A good example is the Table of Contents. If the level of the Table of Contents of a book is set to 2, then the Table of Contents will be two-deep or have two levels of entries. More precisely, there will be titles (and maybe page numbers) for every chapter and every section.

    When hierarchical numbering is customized by specifying a level, the number of an object will have as many separators (periods, typically) as the level given. Here's why. Suppose equations are set to be numbered at level 2. Then two levels of the hierarchy will be used to create the initial part of the number. So in an article, Equation 5.2.34 will be in Subsection 2, of Chapter 5, and then will be the 34th equation of that sub-section. Two levels: one separator to describe the division, one less that the number of levels (this is the structure number) and a second separator to set off the count within the division (the serial number). So, (2 - 1) + 1 = 2 separators. See more on numbering at .

    Notice that you make no assumptions or decisions in your source about the depth of the Table of Contents, nor the numbering of equations. At any time, right up to the completion of your project (or later!), you can change this aspect of your output with nearly trivial edits in the publication file. Nice.

    Numbering Explained numbering

    targets the production of structured scholarly documentsnot novels, not magazine articles, not menus, and not travel brochures. (Though a novel could work well?) A research monograph might only be consulted for a portion of its content. A good textbook should be useful to a reader after a course is over, and it should be easy to locate certain portions of the material. A good textbook will foreshadow later material, and reinforce earlier material. So we provide tools that lead to a quality index, reduce the overhead of making an accurate cross-reference, and make an automatic Table of Contents. Page numbers can be a useful way to locate information for print output, but are less useful in an electronic PDF with hyperlinks, and are totally useless for online HTML and reflowable EPUB. So we rely on copious hierarchical numbering to assist with locating discrete pieces of content.

    A document, like most any scholarly document has a hierarchy of divisions. These are always numbered to reflect that hierarchy. So Subsection 4.7.2 of a book is the second sub-section of the seventh section of the fourth chapter of the book. It is possible to specify that the numbering stops at some level, but that will limit how you can number smaller units of content.

    Blocks are units of content held in a division. An example is a good example. These are always numbered, so that cross-references are as useful as possible in all output formats. The number begins with a structure number that is the number of a division. The division will contain the block, but does not need to be the closest containing division. For example, Example 5.2.65 of a book has structure number 5.2, indicating it is in Section 2 of Chapter 5. But this section might be structured as a sequence of sub-sections and Example 5.2.65 would be contained in one of these sub-sections. But if we started counting all the examples in this section we would find Example 5.2.65 as the sixty-fifth numbered block of the whole section, even if it might only be the twenty-second example of its sub-section. This final number is known as the serial number. The granularity of the structure number may be configured. This is a good place to suggest the complementary on the meaning of the term level.

    Numbering of equations and footnotes may be configured in a manner entirely similar to that of blocks. See for details on how to control this.

    As mentioned above, a number is a kind of locatorit should help a reader locate content, via a cross-reference, an index entry (a specialized cross-reference), or a Table of Contents. It should also help a reader (teacher) tell another reader (student) where to find content, perhaps as part of a citation to a smaller item within a larger work. How would you locate Example 5.2.65? A Table of Contents, in any output format should get you to Section 5.2 quite easily. We claim that the remark immediately preceding Example 5.2.65 should be Remark 5.2.64. In other words, it will easier to scan the section and quickly home in on the example if the serial numbers count all the numbered blocks, rather than having one sequence of serial numbers counting examples, and a second sequence counting remarks. Not convinced? Suppose there were two such sequences of serial numbers. When you see Remark 5.2.23, should you move forward or backward in your search for Example 5.2.65?

    If it is so important to not have separate sequences of serial numbers, then why do equations and footnotes get their own sequences? These items are substantially different visually, and even their numbers are formatted quite differently, so scanning for blocks or equations or footnotes should be very distinct visually. Notice that it is their distinctive appearance that is the criteria for an independent sequence of serial numbers.

    We have implemented some flexibility for figures and tables, and for projects. This work is in flux, so we have not yet documented the possibilities. Our view is that figures and tables can be considered visually different enough to merit a separate sequence of serial numbers.

    Divisions that are chapters, and only chapters, may begin with a number other than one. Primarily this is to accommodate books that need to be printed in multiple physical volumes, so numbering in a second (or subsequent) volume can be correct. We also understand the instructive value of a computer science text that wants to start counting from zero. We do not mean to encourage a Chapter 0 that is an introduction (go ahead and title Chapter 1 Introduction) or background preparatory material (make that an appendix). Understand that a preface, or multiple prefaces, is the place to talk about how, or why, you wrote your book, and/or a place to instruct a reader or instructor about the best ways to use your book. See for details on how to accomplish this.

    Use Chapter Zero Carefully

    Chapter numbering may start with a number other than one, and zero is a popular choice. This should not be simply because the first chapter is introductory or preparatory, nor should it be a replacement for a preface, which has a well-defined purpose (see ).

    Exercise Component Visibility

    The statement, hint, answer, and solution elements are collectively the components of exercises, projects (and similar), and tasks they may contain. When you author an exercise, you may only want to have a solution appear at the end of a book, or in a solution manual, and not right where the exercise is born. There are twenty yes/no settings (four components for each of five types of exercises), which control visibility at the location where the content is born. The default value for each is yes, which means the component is visible. See for complete details.

    This is a good example of settings you may wish to employ differently for different output. Since HTML output automatically puts these components into knowls (), you may be less concerned about having them visible as part of the exercise itself. Conversely, for PDF/print output, you may wish exercise components to only be visible at the end of a book. Note that migrating solutions to another location is accomplished with a solutions specialized division ().

    Finally, these settings are observed by the stylesheet which creates a solution manual (see ). This might explain why controlling the visibility of a statement is of interest.

    Watermarks

    Output can contain a watermarkwatermark, which is prominent text in the background of a document. You might use it to make a draft version (with a date?), or a CONFIDENTIAL version, or a document intended for limited distribution, such as an instructor's solution manual.

    In PDF output this text will render as large, light grey text, at an angle across the page. HTML output will have repeated SVG images of the text below/behind the usual text.

    To use, a publication file entry can be used to specify the text itself, along with a scaling factor that can be used to fill the page and prevent overruns. Note that the text is assumed to be simple (e.g.no markup) and when used with output certain characters (e.g.a percent sign) may cause problems. Make a feature request if the handling of this text needs to be more robust. See for exact syntax.

    Here is an example of a specification in the publication file. <common> <watermark scale="1.2">DRAFT 2034-05-25</watermark> </common>

    ================================================ FILE: doc/guide/publisher/cover-design.xml ================================================ (*) Cover Design

    Notes: Rationale (promotion). Procedures for print-on-demand (generally). Tools (Illustrator, GIMP, Inkscape). ISBN placement. Capable students can do design for you.

    Covers can be modified for use in an electronic PDF produced from the conversion, see .

    ================================================ FILE: doc/guide/publisher/custom-versions.xml ================================================ Custom Versions custom versions versionscustom

    An edition would be a copy of your project, different than one produced at some other time. For example, you might elect to make annual editions, with corrections, additions, and deletions. By contrast, a version is a copy of your project that shares content with another version, but differs in minor or substantial ways. We provide mechanisms for minor differences in and for substantial differences in . Be sure to read about both mechanisms first, and understand their purposes, before committing to one or the other.

    Customizations customizations

    The customization feature allows you to create two or more versions of your text for slightly different audiences. To do this, an author defines custom elements that find their translations in a file specified in the publication file. Multiple customization files can then be used to build different versions of the text. For example, we might want to create two versions of our AOTA book, one for zoologists and one for laypeople. For the zoologist edition we want animal names to be scientific names, but in the edition for laypeople we want to use common names. The rest of the text is identical. To execute this, we make every animal name a custom element and create a customization file for each of the two versions.

    Say we want to write a sentence that reads The IUCN red list classification of the western lowland gorilla is critically endangered in the layperson’s edition and The IUCN red list classification of the Gorilla gorilla gorilla is critically endangered in the zoologist’s edition. We begin by writing the sentence in the source and creating a custom element as a place-holder for the name of the gorilla:

            The <init>IUCN</init> red list classification of
            the <custom ref="gorilla-name"/> is critically endangered.
            

    Then the file of translations will contain a custom element, with a name attribute that has value gorilla-name, and whose content is the translation.

    Once you have placed custom elements in your source, you need to create one or more files of translations. To stay organized you might choose to place them in a directory of their own. The customization file opens with a special element and then contains a definition for each customization.

    For the example above, here is the beginning of the customization file we might name customizations/zoologist.ptx.

            <pi:customizations xmlns:pi="http://pretextbook.org/2020/pretext/internal">
              <!-- Name of Western mountain gorilla -->
              <custom name= "gorilla-name">
                <taxon>Gorilla gorilla gorilla</taxon>
              </custom>
            </pi:customizations>
            

    Note that employing a common value for the name attribute and the ref attribute makes the association for the replacement in the source. Next, we would also create a customization file named customizations/layperson.ptx that looks like the following.

            <pi:customizations xmlns:pi="http://pretextbook.org/2020/pretext/internal">
              <!-- Name of Western mountain gorilla -->
              <custom name= "gorilla-name">western lowland gorilla</custom>
            </pi:customizations>
            

    Once the customization files are created, the element <custom ref="gorilla-name"/> can be used throughout the text and will populate automatically depending on which customization file is specified in the publication file.

    When choosing names to use as values for the ref and name attributes, develop a consistent scheme that will make sense to other authors. Do not use spaces or capital letters. This name will never be visible to readers but should be easy for developers to understand. Placing careful comments in one main customization file can help other authors create new customizations that are accurate.

    Note that this functionality is limited when it comes to irregular plurals and capitalization. Take care with the placement of custom elements: they will not, for example, capitalize automatically at the beginning of a sentence.

    See for the mechanics of specifying a file of customizations via the publication file.

    Versions versions

    A version is formed by including or excluding content coming from your source. This could be optional content, or it could be content that varies between versions. See for specific examples.

    Marking Your Source

    The component attribute is used by an author to identify elements in the source. The value of the attribute is any name that makes sense to a publisher. Examples might be videos, labs, genome, or color. There is a (huge) un-component which is the collection of all elements not contained in an element that is in some named component. You can think of it as a default component, or an un-named componentit is content that will be in every version, no matter what.

    Forming a Version

    Now, a publisher can elect to include or exclude all of the content of each component. This is accomplished with the include attribute of the source/include element inside a publication file. The value of this attribute is a space-separated listing of some of the component names in use. An example minimal publication file could look like the following example. See for the specifics.

    
                        
                            
                        
                    ]]>
                

    This attribute is interpreted according to these rules:

    • An element whose component value is in the list in include will be included in the source that will be converted.
    • An element whose component value is not in the list in include will not be included in the source that will be converted.
    • If there is no include attribute in the publication file, the indication of the components are ignored and the entire source is processed. This would be the same as listing every component name in include.
    • Setting include to an empty value (include="") achieves the opposite effect and excludes every component from the source that will be converted.
    You can nest one component inside another. But understand that once a element is excluded because the version in play does not include a certain component, then all of that element's contained source is gone and never coming back. In other words, an element nested inside an excluded element cannot be influenced by whatever other component it may be assigned to. However, the converse is possible: include an element via a component, and exclude contained elements via a different component.

    Types of Versions

    Here are three typical use cases for versions.

    Additional Material

    Some material may not be desired for every output format. Some interactive material might not make sense in a printed book. Or perhaps certain types of exercises are included at the end of each chapter, or not. By putting these elements in components, they may be included or excluded via a publication file. The idea here is that some versions contain a subset of all the available, authored material. For example, a version might include content in the videos and labs components, but exclude content in the genome component.

    An annotated Instructor's Version can be accomplished with additional material, perhaps in a selection of commentary elements looking like like <commentary component="instructor">

    Alternate Treatments

    It may be possible to present a topic in two logically correct orders, but with substantial differences in how subtopics are treated. An example is the early or late treatment of transcendental functions in calculus. If the rearrangement is cosmetic, then an alternate main file can simply include divisions (chapters, sections) from separate files in a different order via the xi:include mechanism. See for details.

    When the two pathways through the material have common and distinct material, then two components can be employed and the publication file would always include exactly one component.

    Or for excluded material you might create some sort of placeholder text indicating what is missing. So all video elements might be excluded by placing them into the videos component. But you might want to indicate that there is a video available in some other format and include an indication of its title or topic. So you could write a short paragraph next to the video and place it in a novideos component. Now you would typically include exactly one of videos or novideos within each publication file in use. If your video live in numbered figures, you could exclude the figure and use a numbered block, such a remark as the alternate and perhaps preserve numbering of later items.

    Alternate Presentation

    This is an example similar to one Sean Fitzpatrick uses. His docinfo configures the way color is used in his TikZ diagrams. But instead he has two configurations, one for full color (HTML, electronic PDF), and another for black-and-white (printed hardcopy). The former is in the color component, and the second is in the nocolor component. If his project has color photographs, he could make careful gray-scale versions with specialized tools, and then place the resulting pair of image into each of the two components separately.

    Releasing Material over Time

    Many authors are simultaneously publishers, and some are also instructors. And a few author-publisher-instructors like to release their material over time. This could be accomplished with versions. First there will be some base material like the front matter, back matter, and a preparatory Chapter 1. Now, mark Chapters 2 and 3 each with the component week1. Mark Chapter 4 with component week2. Mark Chapters 5, 6 and 7 with component week3. And so on.

    Then the publisher file can be edited each week, or there can be multiple publisher files (one per week), which successively accumulate more components to include. For example, <version include="week1"/> <version include="week1 week2"/> <version include="week1 week2 week3"/> Note how the numbering of older material will not be affected by the addition of newer material, you will just want to be careful about forward cross-references from released material into un-released material. Of course, this example just uses chapters as the granular unityou could use other divisions, or a mix.

    Caveats for Creating Versions

    There are some subtleties when you get fancy with manipulating your source this way, and we cannot protect you from every pitfall. You may get warnings for some of this. If you find new gotchas the hard way, please let us know.

    Numbering

    It is very possible that material that is common between versions ends up with different numbers. An exception is if you subset by excluding material at the end of a division. This may be very natural for optional material. Then elect a numbering option that resets at the next division. In this way later higher numbers go missing, and it does not affect the sequence of earlier smaller numbers.

    Cross-References

    Do not create a cross-reference into content you might exclude, there may not be a target for the xref. You should get a warning about this. When you have alternate versions, you will need to think carefully about xml:id and xref for your two versions. It is possible that what you think is common material might really need to go into two components because an xref points at a target that actually resides in two different components.

    Identifiers

    Allied with cross-referencing, be careful not to create source that had duplicate identifiers that are meant to be unique. You may get warnings about this situation.

    Generated and External Files

    Some portions of your source get manipulated into additional files in particular formats (generated). Examples would include images given in or Asymptote syntax, and trace files for Runestone CodeLens environments. Depending on what you include or exclude in different versions, these files could have different characteristics. As one example, suppose you define different color palettes for use in images described using the TikZ language (inside a latex-image element). And then you employ the two different palettes by using versions and components to control which palette is used for each version. If you want to save these images (say, by commiting to a repository) rather than repeatedly regenerate them, then you need to save two different collections of generated images.

    Versions are given by a publication file (), and the publication file allows you to specify which directory has these generated images () so you can easily coordinate the generation and employment of these images with a coherent publication file.

    You also sometimes bring external files to your project, such as JPEG images, which are not derived from your source. As in the example above, you could have color images for a version used to produce electronic formats and grayscale images for a version produced for physical printing. Again, the publication file could be used to employ a different collection/directory of external images for different versions via the options described in .

    ================================================ FILE: doc/guide/publisher/epub.xml ================================================ Conversion to EPUB/Kindle epub kindle

    EPUB is the standard format for electronic books. Books in EPUB format can be read using applications on a variety of platforms. (Apple Books across the entire Apple ecosystem. Calibre is open source and cross-platform for desktop usage. Android devices have options as well.) Amazon's Kindle devices use a proprietary format that is derived from EPUB. Through much experimentation, the team has determined that SVG mathematics, generated by MathJax offline tools, works well in all ebook readers other than Kindle apps and devices. For Kindle, MathML is the best format. (Apple's MathML implementation is very poor as of July 2021, and so we cannot recommend math formatted using MathML for situations where readers may use the Apple Books app.) Thus, we provide two pathways for production of electronic books. These formats are useful as an offline version, which is superior to a PDF in some ways, such as font face and font size being controlled by the software in an e-reader device. However, it is inferior to the online version (), since many interactive features cannot function within the EPUB version.

    Prerequisites

    There are a handful of prerequisites to build an EPUB version of a book.

    • You must use either the -CLI or the pretext/pretext script, since creating an EPUB file is a multi-stage process; building with xsltproc is not supported.

    • You must have node and npm must be installed. See for more on node and npm.

    • You must use a publication file (referred to below as publication.ptx) with source/directories/@generated and source/directories/@external so that images can be located and bundled (these are included by default if you use pretext new or pretext init for your project).

      To use a non-generic cover image, the publication file must also have epub/cover/@front attribute that points to the cover image (JPEG or PNG, 2048 pixels tall, 1280 pixels wide). Absent an image provided, there will be an attempt to create a simple, generic cover image. See for details about specifying a cover image.

    If you use the pretext/pretext script, you will need to generate any source-defined images in SVG format for standard EPUB, and PNG format for Kindle. Furthermore, Kindle processing requires PNG resolution to be at least 200 DPI, and 300 DPI is a good recommendation (from Mitch Keller). See Kindle Help topic G202169030 for more.

    Finally, if you are using the pretext/pretext script, you must install a local version of MathJax (the CLI will try to do this for you). We provide a bash script in scripts/mjsre that automates this process. See for instructions. As updates to the EPUB conversion are released, you may occasionally want to update your local copy of MathJax. Simply use the script referenced above.

    To use the CLI, you will need to create a new target in the project manifest (project.ptx). The target should look something like the following.

            
                    epub
                    source/main.ptx
                    publication/publication.ptx
                    output/epub
                
            ]]>
            

    The name can be whatever you wish, but the format must be epub or kindle. You won't be able to tell the output files apart, so if you want both an epub and a kindle, name the output directory differently for each.

    Converting and validating

    First we will describe how to convert to epub or kindle using the CLI. Assuming you have added a target with name ebook and format epub, simply run:

    pretext build ebook -g

    If instead, you wish to use the pretext/pretext script, make sure to first generate images into the correct format (SVG for regular EPUB and PNG for kindle). Converting to EPUB with SVG math (used everywhere other than Kindle), run as a single command-line /path/to/pretext/pretext/pretext -c doc -f epub-svg -p publication.xml -d /path/to/output /path/to/yourmainfile.ptx For an EPUB file destined for Kindle, use the single command-line /path/to/pretext/pretext/pretext -c doc -f epub-kindle -p publication.xml -d /path/to/output /path/to/yourmainfile.ptx

    If you would like to name your output file something other than the name inferred from the root xml:id, you can use -o path/to/output/filename.epub instead of the -d option.

    For the standard EPUB conversion, any standard EPUB reader should work. MacOS users will find the Apple Book app is likely their default. Calibre is useful for an alternative view and works on Windows and Linux as well. For the Kindle conversion, you will need to get Amazon's Kindle Previewer app (macOS and Windows only). For reasons we do not understand, some books crash the Kindle Previewer app, in which case you should try loading the EPUB file into the Amazon KDP web interface, which also offers a preview. (This preview is the only option for Linux users.)

    Many EPUB marketplaces are strict about requiring that your EPUB file pass validation by the open source epubcheck validation tool. You may be able to install a command-line version of epubcheck using your operating system's package management tool. A free Java-based GUI version released by Pagina might be useful. There is also a (slow, limited) online version. More pointers can be found at the W3 EPUBCheck site. Please report validation errors and oddly-formatted electronic book output to the pretext-support Google group. Some aspects of have not yet been fully implemented for EPUB, but we will endeavor to support them as demand arises.

    Distribution

    Because the EPUB file built for Kindle is different than what we build for all other readers, you must distribute the Kindle version of your book through Amazon's KDP. Because Amazon and Kindle have the overwhelming majority of the electronic book market in the United States, if your readers are mainly in the United States, we highly recommend that you get your Kindle version in good shape.

    Distribution of the EPUB file produced by the epub-svg conversion can be done through electronic book aggregators. There are many options available, and they all take an additional commission on top of what the electronic book marketplace through which a reader buys your book takes, but using such a service can save you from needing to post your electronic book on a variety of marketplaces. Do not allow an aggregator to distribute your book to Amazon, as the math will not render properly. It is as simple as not checking the box for Amazon when signing up with an aggregator to opt out of having the aggregator send your book to Amazon.

    ================================================ FILE: doc/guide/publisher/further-customizations.xml ================================================ Further Customizations customization

    The publication file is our primary vehicle for substantially affecting the way a project is produced, see for more. Varying small portions of text (on the order of a phrase) is accomplished with customizations to make different versions, see . Producing different versions by including, or excluding, large portions of text, on the order of paragraphs, blocks, and divisions, is accomplished with support for versions, see . Arranging material in different orders can be accomplished with thoughtful use of modularizing source files, see .

    In this chapter we describe two other ways to influence output, which are in some ways are techniques a developer might need to be familiar with (), though a publisher might also find them useful. An author should not have any need for these techniques.

    String Parameters string parameters stringparam

    The majority of the conversions that supports are accomplished via an Extensible Stylesheet Language (XSL) stylesheet. This language has a parameter feature which allows an external value (as a small chunk of text) to be provided to the stylesheet externally. In this way, a single stylesheet can produce small changes in output in reaction to a parameter value, without the need for creating multiple stylesheets. We say that the stylesheet is parameterized by the parameter. These are often called stringparam since that is the command-line switch used by the xsltproc executable for the external communication ().

    The conversion to source, as a precursor of PDF output is a good example. A string parameter specifies the size of the font, which causes small changes to the source file in the appropriate ways. Similarly, a PDF should be different if it is meant to be become a hardcopy printed book, or if it is meant to be viewed on an electronic screen. This dichotomy is reflected by a simple string parameter (with values yes or no) and then a single stylesheet can produce two outputs that are different in substantial ways. Note that a publisher is insulated from any of this discussion for these two examples as the publisher file () handles all the logistics. See the publisher file options at and .

    Some string parameters are just for internal use, especially when multiple stylesheets are chained together to accomplish a complicated conversion, such as to EPUB () or braille. Others are used to allow developers to optionally test-drive some new featuresthese usually have debug in their name. We once used string parameters directly to accomplish publisher customizations. As of 2022-10-24 we are well along to moving these to the publication file, though we mention this here since this transition is not 100% complete.

    The method for supplying an (external) string parameter to the processing of a project varies depending on the tool used for processing.

    • -CLI,
    • pretext/pretext Python script,
    • xsltproc binary executable,

    Extra Stylesheets extra stylesheets stylesheetextra

    String parameters () are an easy way to effect global changes in the presentation of your writing. But putting ten of them on every command-line gets old and cumbersome fast.

    You may also wish to customize your output in some stylistic way. This might be especially true for /PDF/print output. For example, you might wish to have every chapter heading of your book in a nice shade of light blue, with the title flush right to the margin, countered by a thick solid rule extending all the way right, to the edge of the paper. Notice that this does not affect your content, it is strictly presentation. This is our approach for styling output, much as CSS is used to style HTML output ()

    We have done several things to encourage such customizations. We have tried to put as much stylistic information as possible in the preamble and keep as much as possible out of the body. (There is always room for improvement on this score, please be in touch if you have a need.)

    You can start with a new small XSL file. You then tell the -CLI to use that XSL file instead of the standard one provided by through the xsl element in a target of the project manifest.

    Assume that you have an XSL file called custom-latex.xsl located in the folder xsl inside the root of your project. In your project.ptx manifest file, use <xsl>xsl/custom-latex.xsl</xsl> as an element in the corresponding target.

    The custom XSL file should import the stock file for the type of output you want to create. This is done using the line <xsl:import href="./core/pretext-latex.xsl"/> which should be placed near the top of the file; everything after it will redefine the various rules imported from the stock XSL. Note the href attribute's value starts with ./core/. This works because the CLI copies all the standard XSL to a subfolder core of the temporary directory holding your custom XSL so that you do not need to know the path to its location on your system.

    See to see how to use such a stylesheet with the pretext/pretext script.

    The easiest thing to put in this file is elements like <xsl:param name="latex.font.size" select="'20pt'" /> . Values given on the command-line supersede those given in an XSL file this way.

    You can augment the preamble with as much code as you like in the following way.

            <xsl:param name="latex.preamble.late">
                <xsl:text>% Proof environment with heading in small caps&#xa;</xsl:text>
                <xsl:text>\expandafter\let\expandafter\oldp\csname\string\proof\endcsname&#xa;</xsl:text>
                <xsl:text>\let\oldep\endproof&#xa;</xsl:text>
                <xsl:text>\renewenvironment{proof}[1][\proofname]{\oldp[\scshape #1]}{\oldep}&#xa;</xsl:text>
            </xsl:param>
            

    There are a variety of things you can do generally, by overriding the imported XSL templates to change behavior, but such modifications are beyond the scope of this guide.

    ================================================ FILE: doc/guide/publisher/instructor-version.xml ================================================ Instructor's Version

    Once your content is in place, you can begin thinking about various useful derivative versions. A natural example for a textbook is an Instructor's Version, enhanced with additional material to help an instructor understand your organization and intent, or to provide advice and counsel about teaching the material.

    Solutions

    Philosophies about the purpose and use of exercises varies among authors and instructors. Some think hints, answers, and/or solutions, should be universally available to students to use responsibly. Others like to assign exercises to be graded as part of a course grade. Some are resigned to solutions that are distributed in a limited fashion eventually becoming public, or that some groups of students will distribute their own solutions, possibly not uniformly. Wherever you place yourself in this debate, distributing solutions to only instructors is one approach, and some instructors may find this a very helpful aid when they teach material new to them.

    There is flexibility in which of hint, answer, and solution can be included or excluded in your text, which can be included or excluded in an Instructor's Version, and which can be included or excluded in a Solution Manual (see ). You can choose to author these or not, and then decide which to include in the student version, and which to include in an independently-produced Instructor Version, and which to include in a Solution Manual.

    Read (and ) for some practical advice about limiting distribution of solutions.

    Notes and Commentary

    The commentary element is designed primarily for the purpose of adding material to a document to make an enhanced version (see ). It is similar in many ways to a paragraphs in that it can be placed within any division and must be titled.

    Other distinctions are:

    • Since it is often elective, you need to be careful about cross-references to and from a commentary. It is highly likely that you will want to make cross-references within a commentary pointing to other portions of your text, and this is always a good idea. You will want to avoid making cross-references to a commentary from other parts of the text, with the exception of a cross-reference that originates within some commentary.
    • Numbered items are prohibited within a commentary, such as a figure or a theorem. Doing so would disrupt consecutive numbering in different versions, with or without, commentary included. Numbered equations are not prohibited in the schema, but should definitely be avoided anyway.

    Adding or Removing Divisions

    For an Instructor's Version you might wish to add additional material into the front matter (a specialized preface perhaps), or remove some material from the back matter (an appendix with solutions that duplicates solutions now placed within the exercises themselves). There may also be parts of each chapter you do not find necessary to include.

    Modularizing your source files would allow for a different top-level XML source file to include different portions of the frontmatter or backmatter, perhaps just making a different title page. See for more on modularization.

    Additional, minimal, XSLT stylesheets can be used to selectively kill portions of your source, such as every Additional Reading at the end of each chapter residing in a references. Consistent use of elements, leading strings in xml:id, and/or leading strings in title, can make it a single-line exercise to selectively remove multiple portions of your source without removing other portions. See for more about additional XSLT stylesheets.

    Think carefully about the effect of removals and additions on numbering. In HTML output all numbering is hard-coded and will be based on counts of the entire XML source file. So selectively killing content will not change numbering, but cross-references may point to divisions for which there is no content to serve as the target. Using a different top-level file can impact numbering throughout. Significant portions of the output rely on 's automatic numbering via mechanisms like \label{} and \ref{}. So if portions of the text are killed, then the \label{} of a cross-reference may never be defined. A technical solution would be to provide an option to hard-code all numbering in output.

    Generally, removing portions of each division will have the least ill-effects on numbering if the portions removed are at the end of a division and no cross-references point there. So, for example, a references at the end of each chapter can be safely killed with no ill-effects if there are no cross-references elsewhere to the particular biblio contained in that references.

    When a division is killed through the use of additional XSLT, knowls and index entries will still be generated as usual for that division as part of the conversion to HTML. Thus, some care may need to be taken if certain knowls should not be uploaded to a server. Using a consistent scheme for the values of the xml:id might make this easy to script. The idx elements could be killed in a manner similar to the division with a use of the ancestor axis in a filter. Of course, the conversion to will not create knowls, and the index-creation process does not suffer from the shortcomings of the creation process for HTML.

    Instructor's Notes

    The commentary element, as described above, can be used effectively by an individual instructor to customize a personal version of a book. This is not as fine-grained as highlights or annotations, so is not meant as a replacement for tools that support more localized personal additions.

    The ideal way to do this would be with a text having source distributed as a git repository, and with notes managed by git. Here is a rough outline, assuming a solid understanding of git.

    1. Clone the author's repository to a local, personal, location.
    2. Make a long-lived notes branch off the author's master branch.
    3. Add commentary with commits on the notes branch.
    4. Regularly pull master from the original repository to receive updates and fixes from the author.
    5. Regularly merge master into notes so the enhanced version gets the author's changes without changing master.
    6. Produce personalized output from the notes branch via as normal, with the switch enabling display of the commentary.

    ================================================ FILE: doc/guide/publisher/jupyter-notebook.xml ================================================ (*) Conversion to Jupyter Notebooks

    TODO

    ================================================ FILE: doc/guide/publisher/latex-fonts.xml ================================================ <latex /> Fonts

    Part of a book's style is the choice of fonts. As of 2019-11-09 we have a better understanding of the use of fonts in to the point where we can design interfaces that will make it simpler for you to experiment with different choices and preserve various features that enables.

    The first thing to understand is that the xelatex engine is much more capable of employing modern fonts. was built in the late 1970's when computer resources were at a premium, and the idea of mixing mathematics with non-Western languages and scripts may have been fanciful. The pdflatex engine is rooted in this history. We now have the Unicode standard, thoroughly integrated into web browsers, and companion scalable OpenType fonts. In contrast to , was designed to work better with a multitude of fonts. So we organize this section by this distinction.

    Processing with <c>pdflatex</c>

    Fonts used by come in encodings. The original encoding is known as OT1 and organizes glyphs (shapes of individual characters) 128 at a time. Since this puts regular Latin letters in one group, and accented letters into another group, this makes automatic hyphenation impossible if accented letters are used (as in many European countries and much of the Americas). The 1990 Users Group (TUG) meeting in Cork, Ireland, formulated new and improved encodings. The T1 encoding is one result, and so it is known as the Cork encoding (and also as EC). It groups 256 glyphs together at a time. So you need only know that a T1 encoding is better than an OT1 encoding. If you want to know more (much more), locate font encodings by Mittlebach, Fairbairns, & Lemberg.

    The Font Catalogue is a great resource for locating different fonts. The fonts and their packages are likely already installed (this information is provided), or there is enough information about how to install the package in a standard way. Each gives exact directions on how to enable the font for a document. For example, Iwona, a sans-serif font with support for mathematics, can be employed as the document font simply by including the following in the preamble: \usepackage[math]{iwona} \usepackage[T1]{fontenc} This suggested use of fontenc package (not to be confused with the fontspec package) indicates the availability of a T1 encoding.

    Note: when the Font Catalogue says OTF or TTF available then the font can also be used with xelatex. When it says OTF or TTF only then the font cannot be used via pdflatex. Read on.

    Processing with <c>xelatex</c>

    TrueType fonts (TTF, *.ttf files) have been improved upon by the creation of OpenType fonts (OTF, *.otf files). The main difference is that OTF fonts have a variety of features which can be selected or not. It is also easier to directly select a particular glyph (realization of a character) by specifying its numerical code point as a Unicode character. For the remainder, we will reference OTF fonts only, but nearly everything applies equally well to TTF fonts.

    The main difference with xelatex and OTF fonts is that xelatex expects the font files to be part of the system software and are managed by the operating system and its tools. So, for example, in the example above installing the iwona package will place files into your texmf tree, where they remain unknown to your operating system. So you will need to learn how to use your operating system to locate and install OTF files (or make them known to your operating system). With luck, popular fonts may be easy to install using your system's package manager.

    So installing fonts into a system is a bit of a hurdle, and as a style writer, you are reliant on authors who use your style to understand this requirement.

    Locating an <init>OTF</init> font

    Since I have the iwona package, I can expect the OTF version of the font to be somewhere. I know I have the package by using a TeXLive tool to search for the style file. kpsewhich iwona.sty will return the full path to that file.

    On my Linux system, with TeXLive installed via a Debian/Ubuntu package, I can locate the main OTF file for the Iwona font by exploring the relevant directories (fonts/opentype looks promising), or I can use the system find utility to search for filenames with iwona or Iwona in the name. There it is: /usr/share/texlive/texmf-dist/fonts/opentype/nowacki/iwona/Iwona-Regular.otf

    You can simultaneously determine if you have a font, and if it is known to your system with the fc-list command from the fontconfig utility. The produces a lot of output, with one line per file, but it includes file names and the human-readable name of each font. You can pipe the output through grep to find what you are looking for, for example fc-list | grep "Latin Modern"

    Making an <init>OTF</init> font known to the system

    On my Linux system, I need to copy this file (and its companions) into the system directory /usr/local/share/fonts and reboot, or rebuild the font cache with fc-cache -f -v Finally, I can check that the font is known to the system with fc-list

    On a Mac, we have several reports for how to do this.

    • Mitch Keller reports on 2019-01-02 that I opened the directory on my hard drive containing the OTF file, double clicked on the font (opens the macOS application Font Book, which comes with the OS), and then clicked the Install Font button.

    • Karl-Dieter Crisman reports on 2019-07-01 that I was able to use some fonts already existing in TeXLive with a symbolic link to the Font Book, as suggested at Ask Different: ln -s /usr/local/texlive/2018/texmf-dist/fonts/opentype/public/lm/ '/Library/Fonts/Latin Modern' where 2018 indicates when I updated my Live distribution.

    Information about an <init>OTF</init> font

    To learn more about this particular font TeXLive provides an executable, otfinfo, which I can use as (omitting the long directory path here for clarity) otfinfo -i Iwona-Regular.otf The first part of the output is Family: Iwona Subfamily: Regular Full name: Iwona-Regular PostScript name: Iwona-Regular The critical piece of information here is the font's name: Iwona-Regular. I can also learn which OpenType features are available $ otfinfo -f Iwona-Regular.otf aalt Access All Alternates c2sc Small Capitals From Capitals cpsp Capital Spacing dlig Discretionary Ligatures dnom Denominators frac Fractions hist Historical Forms kern Kerning liga Standard Ligatures lnum Lining Figures numr Numerators onum Oldstyle Figures ordn Ordinals pnum Proportional Figures sinf Scientific Inferiors smcp Small Capitals ss02 Stylistic Set 2 sups Superscript tnum Tabular Figures zero Slashed Zero This will all be useful shortly.

    Using an <init>OTF</init> font with <c>xelatex</c>

    Depending on the package, now it can be as simple as simply including \usepackage{} in your preamble and the font can be used with different weights and shapes, and certain features are enabled. However, sometimes you want more control, or you want to use more than one font in a document. Now the fontspec package is your tool of choice.

    The simplest example of using fontspec would be to recall the font name from above, and in your preamble use \setmainfont{Iwona-Regular} This font name has the hyphen in lieu of a space, but names with spaces are just fine. An optional argument will let you customize the use of the font, such as turning on some of the features. Read the fontspec documentation for all the finer points. Hopefully this has given you a start.

    Note that fontspec has a Path= option. A tempting shortcut is to just point to the *.otf file in your texmf tree. But as a style writer, this is a really bad idea, since other authors who use your style may have their font files in a different location. Better to employ the font by name and require authors to understand (or learn) their system software.

    Create a file (from scratch) containing some Myanmar (Burmese) characters. The Kermit Project UTF-* Sampler is a great source for these sorts of experiments. The Noto font is a project to make a huge collection of harmonious fonts for much of the world's languages. Use what you have learned here to render your sample using a Noto font via both pdflatex and xelatex. Extra credit if you can explain the name Noto.

    Plans, as of 2019-11-09

    We have experimental code in place to allow a style writer to place font information into the preamble in the right place. We are adding font-changing commands into other configurations in the preamble, so that pieces of a document (e.g.the page header) will automatically use a particular font easily.

    We have long been using the polyglossia package to manage multiple languages in one document, and will continue to do so, perhaps. This package relies heavily on fontspec. We intend to hide the details of polyglossia from authors and from style writers, relying on just the specification of xml:lang attributes to control font changes.

    Font Notes Dyslexic Font

    There is an OTF font, with an open license, that purports to help readers with dyslexia.

    • Website is .
    • In Debian/Ubuntu it is available in a package called fonts-opendyslexic.
    • When used with xelatex the relevant names of the font are OpenDyslexic and OpenDyslexicMono.

    LaTeX Font Configuration (Ubuntu/Debian Linux)

    Actual font installation is missing here, since I (RAB) cannot recall just when or how certain fonts arrived on my system. Certainly they were almost all via Ubuntu/Debian packages, though they could have been specific to Live. Specifically, the texlive-fonts-recommended and texlive-fonts-extra are two packages that will make many fonts available to / on an Ubuntu/Debian system. The following is offered in the hope that it will be useful to other publishers on other Unix-like systems.

    There is a system directory /etc/fonts/conf.d with a wide variety of configuration files for various fonts, or collections of fonts. Here I find files (symlinks, really) 65-fonts-lmodern.conf 65-fonts-texgyre.conf The first points to the extensive Latin Modern fonts, which are an improved version of the original Computer Modern fonts, and are 's default font for out-of-the-box . We have never had a report of these not being available in an author's distribution. The file indicates that the fonts can be found at /usr/share/texmf/fonts/opentype/public/lm /usr/share/texmf/fonts/opentype/public/lm-math The second configuration file points to multiple fonts from the TeX Gyre Collection of GUST: Polska Grupa Użytkowników Systemu . Examining the file indicates these fonts can be found at: /usr/share/texmf/fonts/opentype/public/tex-gyre /usr/share/texmf/fonts/opentype/public/tex-gyre-math

    As of 2019-11-09 these were the only fonts known to my system in OTF format. This despite having directories full of fonts at: /usr/share/texlive/texmf-dist/fonts/opentype /usr/share/texlive/texmf-dist/fonts/truetype and more. You might have similar directories with the year of your version of Live as a directory. The solution is to create a new file (as root) named /etc/fonts/conf.d/09-texlive-fontconfig.conf with contents <?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <dir>/usr/share/texlive/texmf-dist/fonts/opentype</dir> <dir>/usr/share/texlive/texmf-dist/fonts/truetype</dir> </fontconfig> and then running fc-cache -f -v to update what fonts are known to the system. It is possible that you can put this file somewhere in your home directory if you do not have administrative access, but we have not tested that approach. Note that some versions of the above file that you might find online will include a type1 directory. It is best to not include this directory, since these fonts are best used only with pdflatex and if known to the system they can mistakenly be incorporated by xelatex, with disasterous results. Typically you will get an unusable PDF and your xelatex run will have the error message xdvipdfmx:fatal: pdf_ref_obj(): passed invalid object near the very end of the command-line output.

    Apparently, the texlive-fontconfig.conf file is not distributed with Debian Linux as this search will demonstrate. Please report any change in this situation.

    When installing the Open Dyslexic font via an Ubuntu package (2020-04-28), xelatex became confused by the presence of Web Open Font Format (WOFF) versions which were installed along with the OTF versions. The solution is to create a new file (as root) named /etc/fonts/conf.d/70-no-woff.conf with contents <fontconfig> <selectfont> <rejectfont> <glob>/usr/share/fonts/woff/*</glob> </rejectfont> </selectfont> </fontconfig> and then running fc-cache -f -v to update what fonts are known to the system. See the tex.stackexchange.com post.

    ================================================ FILE: doc/guide/publisher/latex-styling.xml ================================================ <latex /> Styles styleprint

    Print and PDF output is created when outputs a file, which can subsequently be easily converted to PDF with engines like pdflatex and xelatex. There are many ways to influence the style (look, appearance) of this output, enhancing the content, but without changing it. This chapter is directed at publishers who desire to create an attractive and consistent design for their books or articles.

    Please read this chapter thorougly once before embarking. Certain important points are made in certain contexts, yet are universally applicable. If you cherry-pick, you will miss them. Note also that some simple changes, like font size, are described in .

    Preparation

    We do not encourage authors to make small adjustments in style, especially if they have few skills in book design. Instead, they should choose a design built by others that will fit their needs and desires. We do encourage publishers with design skills to create complete and harmonious designs, and to donate these back to with an open license, for use by all authors. This chapter assumes you are such a publisher. Further, it assumes you have certain technical skills. Specifically

    • Good familiarity with basic and .
    • The ability to debug compilations gone bad.
    • Willingness to study several packages that may be new to you.
    • Willingess to mimic and experiment with basic eXtensible Stylsheet Language (XSL).
    Fortunately, it is easy to start small, get good results, and expand your skills further.

    Begin by creating a file that is a new XSL stylesheet. You can likely safely copy a mature one from the xsl/latex directory. Be certain to keep the first few declarations. The xsl:import is critical, since it will pull in all the basic code for the conversion to . You will be overriding and appending to that code (which has made straightforward). You can start with an absolute path from your filesystem root, but once public a relative path will be necessary. Remove all of the xsl:template elements, leaving a hollow shell to begin working with.

    What we are doing here is similar to the discussion of extra XSL stylesheets in , only thicker. String parameters are also described in this Guide, at .

    Overview

    Some changes in style are effected by setting string parameters that exist for use at the command line. However, the more flexible features come from the selection by of certain packages. These have been chosen for their flexibility, maturity, and stability. They should be part of a full installation, especially one based on TeXLive. We presume each author has a similar installation. Please let us know of any exceptions. Please try to avoid requiring new packages as part of your style, and if necessary, be sure they are mainstream ones. Start a discussion on the development forum if you think it is warranted or necessary. It may be difficult and error-prone for you to employ and integrate an obscure package, and it will cause problems for authors who want to use your style.

    This is an incomplete list of the primary packages we employ, and their general purpose. They, and their documentation, can be easily found at the Comprehensive Archive Network, aka CTAN.

    Principal <latex/> packages used for styles geometry Specification of the sizes of paper, margins, headers and footers titleps Headers and footers (part of titlesec) titlesec Titles of divisions tcolorbox Boxes, colors, for example, remark,
    Page Shape

    Various dimensions of a printed page, including the page itself, may be adjusted using the geometry package, so study the documentation of this package to explore possibilities. The options of this package may be also set on the command line. To make options part of your style, place the xsl:param declaration in your stylesheet as follows (note the two sets of quotes): <xsl:param name="latex.geometry" select="'foo'"/> This will have the effect of placing the following line into the preamble of the resulting output file, in the right place: \geometry{foo} Of course, you will want to use something meaningful, such as <xsl:param name="latex.geometry" select="'a4paper,total={16cm,25cm}'"/> to produce in the output \geometry{a4paper,total={16cm,25cm}}

    This is typical and illustrates two important universal points. First, puts surrounding infrastructure in place. In this case the geometry package is loaded, and in an order that does not cause conflicts, plus the \geometry{} command itself is placed and output by . As a style writer, you simply provide the package options you desire. Second, garbage in, garbage out. It is very easy to make a typo in your style, and have the compilation fail. This is why we assume you are comfortable with compilation and debugging, and not every author should be a style writer.

    Set the document font size first, for this will influence later choices. The string parameter, latex.font.size (which has pt as part of the value) will set an optimal line width. This line width should translate to about 75 characters per line, at the upper end of recommendations for an optimal width. It will also match closely (but not exactly) to line lengths in HTML output. You can look into the output before you experiment to see the value used when the stock \geometry{} command is issued. You are certainly able to override this width, but read the next paragraph carefully.

    This raises two important more universal points. You should expect to repeatedly examine the output as you develop a style. And most importantare you tempted to use a small font, and increase the line width so as to cram more material onto the page, so your book is shorter, and sells via print-on-demand for $7 rather than $8? Then you misunderstood that there are time-tested recommendations for the optimal number of characters per line for human readers, and we just counseled you that is already at the high end of these recommendations. You have a certain freedom as a style writer. Use it responsibly. Enhance the content provided by authors, don't degrade it.

    This is the place to think about headers and footers on the page, since you will want to make room for them, and with spacing away from the primary content. See .

    Headers and Footers

    The titleps package cooperates with traditional divisions, such as \chapter and \section, and the titlesec package, to pick up the titles of divisions automatically and migrate them to headers and footers on a page. The ps is short for page style, and the documentation is a PDF file within the distribution for the titlesec package. Primarily, we let manage the selection of its page styles for various pages of an overall document: empty, plain, headings, and myheadings. does some management in the front matter. As a style writer it is not your concern where these styles are employed, but you do influence what information they contain and were it is placed on a page.

    Add an xsl:template to your stylesheet that begins with <xsl:template match="book" mode="titleps-style"> This would then set a collection of commands from the titleps package for a book, which will be placed in the correct place in the preamble. (See .) You can renew existing page styles or create new pagestyles. However you should always make your last line a declaration of the overall page style, for example, \pagestyle{headings} Note that a book may use the empty and plain styles for some pages, so you may need to renew those styles to be harmonious with other changes you have made.

    The definition of this template will override (replace) the definition given in any imported stylesheet. You can replace the value of the match attribute with article to make your style apply to a article. If your style will be used for both books and articles, and you want the style to be identical for both, you can expand the match attribute to have the value article|book. To have different styles for a book versus an article, make two separate templates.

    The titleps package allows at least twelve options per page style: even-numbered page versus odd-numbered page with two-sided printing; left, center, right; header or footer. There are semi-automatic customizable rules, variable widths allowing hanging styles, choices of marks (division at page-start versus division at page-end versus new-division-mid-page, including combinations at the same time), and more. Note that the system of \markleft and \markboth has been abandonded. (Did I hear you say, Good riddance!?)

    Some care must be taken with using \thechapter to get the chapter number, since strange things happen in the frontmatter and backmatter, where chapters are numberless. One solution is to use \ifthechapter{}{} which allows you to control the behavior dependent on whether there is a current chapter number. For example, if you wanted the center of the even-numbered pages to contain Chapter 3: Derivatives you would use \sethead[][\ifthechapter{Chapter \thechapter: }{}\chaptertitle][]{}{}{} which would then just put Index in the index, and nothing at all in the preface. A similar approach could be used to deal with section numbers and titles in the case that the introduction of a chapter is multiple pages, using \ifthesection{}{}.

    Note also that the macro \chaptertitlename will resolve to Chapter or Appendix as necessary.

    Titles of Divisions

    The titlesec package cooperates with traditional divisions, such as \chapter and \section, to style the start of each division, containing its title and in most instances, its number. If a division is credited to (multiple) author, then that information can be styled, and there are plans (2018-09-30) for epigraphs.

    manages numbered versus unnumbered divisions, the correct level for one-off divisions like a preface or appendix, and the specialized divisions such as exercises and references. A style writer creates two styles at each level of the hierarchy, for a numbered variant, and an unnumbered variant. titlesec uses a numberless key to indicate the latter. A named template, such as <xsl:template name="titlesec-section-style"> would produce text containing complete titlesec commands \titleformat and \titlespacing in both numbered and unnumbered variants.

    There are five macros created by at the start of each division. For example, \authorsptx is a comma-separated list of the content of all the author elements for the division, in the order given. Look in the output to find the others nearby. A robust style will include this information, even if the first use of the style may not have any divisions credited to others.

    The table of contents and the index are created by a single macro. This creates a small technical challenge, since never has a chance to write the contents of the heading and must take what it is given. The upshot is that the \titleptx macro will be wrong or empty. So instead, use the titlesec device of using the macro parameter #1 for the title in the correct argument of \titleformat. We have enabled this possibility through the package's explicit option. We believe the numberless variant of a chapter of a book, and the numberless variant of a section of an article, are the only places this is necessary. 2019-09-30: we will contemplate if this should be the rule and the \titleptx macro will go away. Advise if you see a good answer, either way.

    2019-09-30: these templates are highly likely to break into two modes (format and spacing), with a match that can react to chapter, section, , perhaps differently for books versus articles. The change will only imply some minor editing to achieve the same end result, so don't hold back waiting.

    Environments and Blocks

    Objects like example and remark are almost invariably children of a division, numbered, and work best with a title. tcolorbox is a massive package, that we have taken to as a solution to many under-the-bonnet technical problems, such as a hanging indent for numbers of exercise or laying out the panels of a sidebyside. But it also allows an incredible variety of styling options for these intermediate chunks of text. Think of variable placements of numbers and titles, borders and boxes, and colored backgrounds. With freedom comes responsibility! With a light touch, you can help your reader navigate the inherent structure of your source.

    Whatever you call them: environments, blocks, or information objects, almost every one can be styled separately (2019-09-30: not captioned items yet, such as figure). For example, <xsl:template match="example" mode="tcb-style"> <xsl:text>colback=pink,</xsl:text> </xsl:template> would cause the background of every example to be light red in color. To make every element that is a variant of an example look identical, use one of the entities defined in xsl/entities.ent, <xsl:template match="&EXAMPLE-LIKE;" mode="tcb-style"> <xsl:text>colback=pink,</xsl:text> </xsl:template> . This would affect example, question, and problem, and future-proof your style when there is a demand for illustration as a new kind of example-like.

    There is only one mode, but it can handle a variety of elements in the match. The text produced by the template will be supplied in a named tcolorbox style via a \tcbset{} command. It is marginally more complicated than that. will manage certain aspects of creating a tcolorbox, such as forming the tcolorbox title to be a string like Example 4.5 The Chain Rule., or just Example 4.6 when an author does not include a title. As a style writer, you can change the font, color and placement of that string, but not the use of the type-name, the number, the title, or their order. The text of your template is additive, meaning it is in addition to what the stock conversion provides. Your options come last, so will be new and effective, or will replace what the base conversion to does. So in the example above, the base conversion to has colback=white (rather than the default gray!), and this will be overridden since pink will come later.

    Preamble and Experimentation

    Two hooks are provided to allow for arbitrary additions to the preamble. It should go without saying that this is for experimenting with new features and is no way supported, including, but not limited to, interactions with current packages in use, or those added in the future.

    Arbitrary text () used as the values of the string parameters latex.preamble.early and latex.preamble.late will be added to the very beginning, or very end (respectively), of the generated preamble.

    <init>XSL</init> 101

    If you have read this far, and read carefully, you have been exposed to several key principles of writing XSL. Basically you are creating templates which the base conversion will call in exactly the right place. In a procedural language these might be called hooks. Besides a smooth integration with the rest of there are several advantages:

    • A template using a match can apply narrowly or broadly. Witness the example above for example versus &EXAMPLE-LIKE;. This attribute is similar to a this pointer in an object-oriented language and the modal template is not dissimilar to a method.
    • has a discovery phase when it constructs the preamble. If your source has no example in it, then there will be no associated tcolorbox style added to the preamble, and the example environment will not be defined. So the preamble is exactly what your document needs, and no more (mostly). The match attribute makes this possible.
    • You have seen named templates, which will feel familiar if you know procedural languages. While perhaps comfortable, they are way less powerful, and we noted that we may get rid of them.
    • The xsl:import mechanism allows us to keep base definitions and override others. So as you develop your style, you do not need to start from scratch.

    Be aware that every single character that you put inside the xsl:text element will get copied literally into the preamble of your output, including newlines and spaces you use to indent in your XSL. Conversely, any whitespace inside your template, but between the xsl:text elements is ignored. So we like to use multiple xsl:text elements (except we were a bit lazy getting this out the door initiallydo as we say, not as we do) and explicitly create newlines with the &#xa; character. Your goal is to have a preamble with no blank lines and no unintended indentation. We often create comment lines (with two leading % characters to aid with readability.

    See the website for recommendations for books on XSL if you are encouraged to learn more.

    Testing and Debugging

    The sample article tries to have one of everything, plus a few torture tests. It is a good place to test initially, especially with the tcb-style templates. The sample book is less haphazard, but does have most of the structure a typical book would have. So if you are designing for a book it is a good place to test page styles, headers and footers, and division titles. (2019-09-30: it is possible part has not been tested thorougly enough yet.)

    When things go bad, such as a non-obvious compilation, it can help to stop working with source, and instead edit the generated until the problem is understood.

    We do not expect to provide great support for this process. First, because new code and basic support already keeps us busy, and second, because you have the freedom to really make a mess, and thus you should take responsibility for the problem. When you are certain that has done something wrong or inadvisable, please, please do post in the development forum with a careful explanation and a (minimal) example. It will happen. Just don't use the forums as a replacement for this documentation or a bit of sleuthing through the that you are now creating. With freedom comes responsibilty. Thanks.

    Justified Text

    We employ the package, microtype to enhance 's algorithms for spacing text. See for some explanation. The package admits a great deal of fine-tuning, and we make it easy to pass in options via a template included as part of the styling.

    If you were using pdflatex you might include in your styling: <xsl:template name="microtype-options"> <xsl:text>protrusion=true,expansion</xsl:text> </xsl:template> This would have the effect of putting \usepackage[protrusion=true,expansion]{microtype} into your output file. Study the microtype documentation for possibilities.

    Planned Additions

    Some items to include, as of 2019-09-30:

    • Color schemes, so an author can use a style and just change the colors with a very simple stylesheet.
    • Font control, so a style writer has simple instructions that navigate 's procedures.
    • Flexibility with the building blocks of a title page.
    • Cover design and placement.

    ================================================ FILE: doc/guide/publisher/online-html.xml ================================================ Conversion to Online HTML

    This chapter describes way a publisher can adjust the presentation of content in an inline format, without actually changing that content. Similar to the case for conversion () there is a variety of options which may be configured. As of 2022-10-24 we are transitioning away from string parameters () to using a publication file (), which is simultaneously being documented carefully. During the transition you can explore xsl/pretext-html.xsl by searching on the use of xsl:param at the outermost level (i.e. starting in column 1).

    HTML Publisher Options <c>index.html</c> Page index pageHTML HTMLindex page

    The conversion to HTML always creates a file named index.html. We do this because if a reader requests the URL platypus.mammal-institute.org/aota/html then most modern web servers will automatically return the page platypus.mammal-institute.org/aota/html/index.html So you can advertise the shorter version to potential readers. What is in index.html? Simple code to redirect to another one of your pages. Which one? Any one you like!

    Within the publication element of your publication file () include an html element, with a child element index-page having an attribute ref. The value must be the xml:id of a division which is rendered as an entire web page at the requested level of chunking. See for details on specifying this option.

    For example, if a book is being chunked into chapter, and your source has <chapter xml:id="birds"> then you can set ref="birds" and the page for that chapter will be the default page for the shorter URL. In practice, you probably really want a page that looks like the front matter or a Table of Contents.

    The default is to first have index.html redirect to a page for the frontmatter, and if this is not possible, then it will redirect to a page for the top-level of your content. If your document is short or simple, you may just have a single web page. You could choose to not distribute the index.html file and then just use a concise and descriptive xml:id for your top-level element (e.g. article) to fashion an attractive URL that points to your shorter work.

    Banner Contents HTMLbanner content

    The top of page banner normally features the title, subtitle, and author. If the subtitle or author list are long, or not particularly relevant for a given work, the publisher may wish to not render them at the top of each page. Of course, this information will still always be available at least once in places equivalent to a title page in the front of your document. See for details on specifying what to display.

    Embedded Calculator calculatorembedded in HTML

    You may elect to have an embedded online calculator in each page of your online version. It will appear in the right margin, and will stay there as a reader scrolls the page up and down. A button near the masthead can be used to contol visibility. By default no calculator is available, so you need to explicitly request this feature. As of 2020-05-30 there are four calculators available from the GeoGebra Project. See for details on specifying this option.

    HTML Favicon Configuration favicon

    A favicon is a graphical element (icon) that identifies a website. Perhaps its most recognizable use is its appearance in every browser tab open at that site. As publisher, you can associate an icon for your project to the HTML output of your project.

    See for details on this specification. When the attribute value is none (the default), then your pages will not have a favicon.

    If you set the attribute to simple then you must provide two versions of your icon, in PNG format, in pixel sizes 1616 and 3232, with exactly the two filenames below (respectively), in the directory of provided external files (). favicon/favicon-16x16.png favicon/favicon-32x32.png There are other ways to specify a favicon and some browsers expect different files. Try this scheme first, as it appears to have been sufficient since 2018. But if a new scheme needs implementation, we can consider a feature request.

    ActiveCode Programming Windows ActiveCodewindow in HTML

    A window that allows for entering, and executing, computer programs can be made available for every page. The reader can click on a pencil icon to activate this window. Some languages can run in a web browser as part of any HTML output, while some other languages require infrastructure on a Runestone server to execute, and so are only available when you specify that hosting option. Note that the publisher will select a single language for use with the entire document. See for details on specifying this option.

    Base URL base URL URLbase

    The base URL of a hosted version of HTML output may be specified as an entry in a publication file. Then certain aspects of other output (typically PDF/) will link to corresponding aspects of the HTML output. See for the specifics of this entry. Examples of use include links from Asymptote graphics (), and URLs pointing to locally-hosted data files ().

    Privacy Options for Video Embedding videoHTML privacyvideo

    When videos are embedded in HTML from sites like YouTube or Vimeo, they come with whatever tracking cookies these sites want to include. Some of these can be helpful; for example, to let the viewer keep track of what they have watched. Others are designed to target advertising, and load when the page loads, rather than when the video plays, which can increase the time it takes for your book to load.

    Currently YouTube offers an enhanced privacy mode that disables tracking cookies on page load. The assumption is that publishers will want to protect their readers' privacy and optimage page load time, so this mode is turned on by default for YouTube videos. It is not known to be available for other platforms, but can be added if this changes. Note that the behavior and appearance of your videos may change slightly depending on which option you choose.

    Within the publication element of your publication file include an html element, with a child element video having an attribute privacy. The value must be either yes (use enhanced privacy, if available), or no (allow all tracking cookies). If your publication file does not have this element (or you do not have a publication file) you will get a warning message, and the default will be used. See for details on specifying this option.

    Links to full-size versions of Asymptote diagrams Asymptote linksHTML HTMLAsymptote links

    Asymptote diagrams are embedded in HTML as a canvas element within an iframe. Unlike image elements, web browsers will not provide the option to view image, and clicking on the image will not enlarge it. Since 3D Asymptote diagrams are interactive, a reader may wish that they could interact with a larger version of the graphic.

    You may elect to place a Link to full-sized image link below each Asymptote diagram. Clicking on the link will open the Asymptote HTML file directly, and the digram will be displayed at a much larger size.

    See for the specifics of this entry. This feature is off by default.

    HTML Feedback Button HTMLfeedback button feedback buttonHTML

    You can elect to have a Feedback button in the footer of your HTML pages. You must provide a URL via an attribute. But where that URL points, and what happens there, is your responsibility. In other words, is no more help here, you just get a functional button pointing somewhere of your choosing or design. An example use case may be that you want to make it very easy for your readers to submit reports of small errors, like typos. So you setup an online form with a free service, which will help you manage this communication. Or maybe you want to run a reader survey via a form, so you point to that.

    The default text on the button is Feedback, which will be in the language in effect for the page. You can override this choice (e.g., Bug Report), but it needs to be raw text (no markup) and then it will not react to language changes for your document. See for precise details.

    HTML Navigation Asymptote linksHTML HTMLAsymptote links

    There are publisher file entries to control how navigation between pages behaves. The Up button may be turned on and off. An entry for the logic of these buttons can be set to the values of linear (the default) or tree. The former causes the Previous and Next buttons to behave as if the divisions are arranged as in a printed book, i.e. linearly. The latter option means that when a reader comes to the last subdivision of a division, the Next button will be not be active, and they will need to return (up the hierarchy/tree) to the division and move to the next division. Turning off the Up button while electing the tree model is likely to lead to a frustrating navigation experience.

    The HTML target offers two views of the Table of Contents (ToC). The default is to fully expand the ToC to the depth indicated by the the common Table of Contents level publisher setting. There is also a focused view that uses an expandable ToC and only initially fully expands the path to the current page.

    See and for the exact syntax of these options.

    Knowled Content

    A knowl is a feature of the online conversion. It is text that you can click on, and nearby some content is revealed. You can click it again to hide that content. You can find a variety of examples in the Sample Article, or other projects.

    Knowls come in two different types:

    • A born-hidden knowl or born-as knowl is content that is contained in a knowl at the location where it first appears. Typical examples are footnotes, hints to exercises, or proofs of theorems. In other words, these small units of content are hidden behind knowls in the location where they naturally belong. Some content (e.g. footnotes and exercise solutions) are always knowled, while other content (e.g. an inline exercise) can be knowled, or not, as a choice made by the publisher via the Publisher's File (). For exact details on influencing knowlization see the reference material in .

      An author does not need to be conscious of knowls. The structure and content of the document should not be aware that there will be knowls in the online output. But instead the publisher has control over whether or not certain medium-sized pieces of content (examples, exercises, figures, etc.) are born as knowls or not.

      Note that some of these switches are for broad categories of items, for example, choosing to knowl theorems will also knowl lemmas, corollarys, facts, and more. See for precise details. This choice applies document-wide, there is no plan to support electing this on a case-by-case basis.

    • By contrast, a cross-reference knowl or an xref knowl is content that is a duplicate of some other content, in another location, as a result of an author making an xref cross-reference in their source. So a cross-reference in Chapter8 to Example4.6 will open the content of the example in the knowl, rather than transporting the reader backwards four chapters. If the reader does want to see the example in its original context in Chapter 4, then the knowl finishes with an in-context link that functions as a traditional hyperlink. Almost every cross-reference is a knowl, except when the target is a divisionthen a traditional hyperlink is used, since rendering an entire division as a knowl is unwieldy. Should knowls not be desired, there is a publisher level switch to render all xrefs as traditional links. See for details.

    The presence of the in-context link is one way to tell the difference between the two - born-hidden knowls will not have an in-context link, while cross-reference knowls will. Locators in the index () are mostly cross-reference knowls. Knowls are used a few other places, such as in a list of notation.

    Permalinks

    If you place a mouse pointer in the left margin, to the left of a heading for an item, then an icon with two links of a chain will appear. This is a link to the item. Instead of a doing a right-click for a context menu that has an option like Copy Link Location, rather do a normal (left-) click. This will copy the heading (Example 4.5 Chameleon Colors), and also the link itself, to your clipboard, along with some formatting. You can then paste this into course materials, or email it to a reader who had a question.

    You might want to make this feature known to your readers, perhaps via a preface explaining some of the more novel features of the HTML version of a document.

    Lists

    Lists with several columns are rendered in row-major order, as of 2018-02-28. In other words, the first list items (li) in your source will populate the first row.

    Index Style

    Start at to learn how to create an index. The realization of the index for online output is implemented within . We have made certain stylistic choices, in addition to taking advantage of certain features of the online format.

    • A one-column format.
    • Indented subheadings (not run-in).
    • Maximum two levels of subheadings.
    • Word-by-word sort order on headings.
    • Locators for divisions are hyperlinks.
    • Locators for smaller units are knowls.
    • Page ranges use the initial location.
    • No running heads (yet).
    • A headnote can be accomplished with an introduction.
    Some of these choices would be easy to adjust or extend as the result of a feature request.

    Also, there can be significant differences between how implements the index for HTML and how the imakeidx package creates an index for . See and .

    Styling styleHTML

    The conversion to HTML creates standard HTML elements, with styles controlled by CSS via class names (and not so much via the element names). As evidence of this, building HTML without the accompanying Javascript and CSS renders in a readable fashion, albeit quite plain (as one would expect).

    This HTML is styled with CSS to create the output that a reader sees. There are multiple themes that a publisher can choose from to render the pages in different styles. Below are samples of available themes. See for the syntax for specifying a theme and options like the color palette to use.

    Themes

    There are multiple themes that define different appearances for HTML output. Currently available themes include:

    default-modern An updated version of the traditional PreTeXt theme.

    Screenshot of the default-modern theme

    tacoma A theme with minimal decorations and colors. A minimalistic presentation of the contents.

    Screenshot of the tacoma theme

    denver A theme that uses bolder structural elements and colors.

    Screenshot of the denver theme

    greeley A theme designed for short documents like academic papers.

    Screenshot of the greeley theme

    salem A theme that is optimized for displaying wide interactive elements (such as Active Code and Parsons).

    Screenshot of the salem theme

    boulder A minimal theme designed to mimic a LaTeX pdf for academic paper (no masthead).

    Screenshot of the boulder theme

    Development

    Please join us on the pretext-dev discussion group if you want to create alternate themes.

    Analytics analytics

    makes it as easy as possible to have services provide data about visitors to the HTML version of your book. We support Google Analytics and StatCounter.

    In each case, use is similar. Begin at the service's site and follow their instructions for enabling data collection for your book's site. We will not document those instructions here. Do not copy the identification numbers from another projectbe sure to obtain your own for your project. When completed, you can request (or will be shown) sample Javascript code to add to pages on your site. Except, is going to do that part for you. You only need to provide the unique identifiers used by the service that identify your project. Because these sign-ups are dependent on your site, this is a publisher activity, and hence configured with the publication file (), see for details.

    StatCounter uses two identifiers, a project ID and a security code. Do not copy the identification numbers from another projectbe sure to obtain your own for your project. You can find them in your Project Config under Settings. Or the code provided will contain lines such as var sc_project=11538430; var sc_invisible=1; var sc_security="72e1390a"; In which case your publication file would have an element under html like <analytics statcounter-project="11538430" statcounter-security"72e1390a"/>

    Google Analytics comes in several flavors. We once supported Classic and Universal, but no longer, so we do not provide documentation here. For the replacement, Google Global Site Tag is a single ID. Do not copy the identification numbers from another projectbe sure to obtain your own for your project. Google once called this a tracking ID, which may also be called a property ID; these looked like UA-6836004-1. Google has now switched to Google Analytics 4 and is exclusively using the form of a Google Tag ID/Measurement ID which will look similar to G-CQG9X37H61; you will need to upgrade your analytics if you used the older style tag. In any case your publication file would have an element under html like <analytics google-gst="G-CQG9X37H61"/> If you use both services, you can elect to use just one analytics element with several attributes.

    We would be happy to provide support for additional major services. Just make a feature request.

    Native Search searchnative

    Client-side search is supported natively by a Javascript library. Search results are tuned to leverage the structure of your project. As such, development and support will favor this approach over our legacy support for an online service ().

    There are two tunings of search.

  • Textbook

    This is the default. Results are presented in order of appearance, on the assumption that a reader is following the text in a linear order and knows their current location. Visual clues will reflect the relevance of each result.

  • Reference

    This assumes a document is more like a reference work and is accessed randomly. Results are not in order of appearnce, but rather early results will likely be more relevant.

  • Employing a switch in the publication file will provide search boxes (top banner, lower-right corner) and all the supporting infrastructure. See for details.

    Google Search searchGoogle

    Note: as of 2022-10-27 we have search supported by an online service from Google and a client-side (native)version supported by Javascript (). Development and support will favor the latter.

    Search facilities can be enabled through Google Custom Search EngineGoogle Custom Search Engine. Please, please report any discrepancies in the following instructions as the setup interface at Google changes out from underneath us. These instructions have been updated as of 2020-10-01.

    Besides being useful for search facilities, setting up a search engine might be a good way to alert Google of something newly available, and initiate your book's rise up the search results rankings.

    Configuring Google Custom Search
    1. Create an account with Google (GMail, YouTube, ) and make sure you are signed in.

    2. Visit GCSE and add a new search engine via New Search Engine.

    3. Provide a URL for the top-level domain name/directory for your book/document. Everything below this will be indexed. We have taken some care to mark knowl content in a way compatible with the search facility, but there is more work to do here.

    4. Give the engine a GCSE-specific name, so you can tell later which one it is when you have several.

    5. Under Edit Search Engine in the Basics tab locate Search engine ID which has a string that uniquely identifies your new search engine. Save this, you'll need to make it part of your document.

    6. Under the Users tab add co-authors or trusted backup personnel.

    7. Fiddle with Edit Search Engine > Look and Feel at your own risk! Only the defaults are tested and supported.

    8. Provisions for removing advertisements for non-profit sites seem to have changed. If your university already contracts with Google, you should investigate having a SuperAdmin at your institution so this setup for you, and make you a trusted collaborator. Then it should be an easy matter to turn off advertisements.

    Configuring <pretext/> for Google Search
    1. Because these sign-ups are dependent on your site, this is a publisher activity, and hence configured with the publication file (), see for details.

    2. The Search engine ID you saved from above is referenced in Google's code as a cx number. An example looks like 482cf73dc05bed674 (older examples looked like 002673997130187229905:qjo2y0jplyu). In which case your publication file would have an element under html like <search google-cx="482cf73dc05bed674"/>

    3. The search/@google-cx attribute will alert the conversion and fully enable and implement search. You are done, and everything should just work. You should see a Google-branded search box to the top right of each of your pages. (We have no control over the branding.)

    4. Time to rebuild your HTML output and make the improved version available.

    Single Page HTML

    Sometimes you would like a shorter work to be a single file in HTML format. Perhaps it is something self-contained, like a course syllabus, or you desire to attach it easily to an email or other post. This section contains advice and procedures you can use to achieve this.

    The primary mechanism for limiting the number of files in an HTML build is to set the portable attribute of publication/html/platform to "yes" (see ). This will automatically take care of the following.

    • Use hosted (CDN) versions of the CSS and javascript files rather than including them in your output directory.

    • Embed generated SVG images in the HTML (anything from prefigure or latex-image).

    • Embed the search code in the HTML (if you are using the )

    • Set all xref knowls to behave like links (same as setting /publication/html/cross-references/@knowled to never).

    • Produce a single file will all your chapters/sections/subsections in it (the same as setting /publication/common/chunking/@level to 0).

    • Prevent the generation of most extra standalone pages (such as for most interactive elements and worksheets).

    • Not produce the standard index.html file that is otherwise used to redirect to the main page.

    Keep in mind that if your document has external assets, or uses generated assets that are not converted to SVG, these assets will still be needed in your output (regardless, you will get external and generated directories for your assets, but these might be empty or not needed). Additionally, some interactive elements work by creating an iframe that loads an HTML file, and these cannot be avoided currently.

    Finally, depending on the purpose of your document, you might consider using a simpler theme. The boulder theme is designed to look like a -produced PDF; it doesn't have any masthead, which makes sense for a single page document. Other style options are described in .

    For very small documents, you might also consider turning off the table of contents by setting /publication/common/tableofcontents/@level to 0 (see ).

    HTML in an LMS

    If you are using to author course materials, you may want to include the resulting HTML in your LMS (Learning Management System) course shell. While uploading PDFs can also be useful for students to print from, many universities require the documents to also be made available in accessible formats, so HTML is likely your best option.

    Depending on which LMS you use, and possibly what settings have been applied to your course shell, you may be able to upload a portable HTML file, as described in . This seems to work with Moodle, but not with Canvas, which blocks javascript inside uploaded files (the Javascript is required to render the MathJax math content). In this case, you have two options:

    1. Host your HTML output on a web server (such as using pretext deploy to publish your files to GitHub pages) and then link to the content or embed it in your LMS using an iframe. To make embedding easier, you can turn on an embed this page button by setting /publication/html/@embed-button to yes in the publication file (see ).

      Once your page is published, click on the button and copy the code to your clipboard. In the LMS, create a page in your course shell. There is likely an embed code button in the editor interface of your LMS where you can paste what you copied from the page. When you save the page in your LMS, you should see just the inner content of the pretext page (no table of contents or navigation). However, the page should be fully functional, including interactive elements and MathJax rendered math (so it will be screen reader friendly).

    2. If you need to keep your document private to your course (for example, maybe it is a set of exam solutions you don't want to publish on the open web), you can produce a SCORMSharable Content Object Reference Model archive of your document. To do this, in your project.ptx manifest, set compression to scorm for the HTML target you want to build.

      will produce the HTML inside a .zip archive which will also include a SCORM manifest that tells your LMS how to display the content. You can then upload this SCORM file to your LMS and add it as a page. In Canvas, you can do this by adding SCORM to your course navigation in settings and then clicking the upload button on that page. Brightspace (D2L) lets you upload SCORM files from a page-creation menu. See the documentation for your LMS for additional help.

    ================================================ FILE: doc/guide/publisher/open-licenses.xml ================================================ Copyright and Licensing

    The legal issues described here are based on the authors' experiences and study, which necessarily reflect the laws of the United States. But the Berne Convention, which dates to 1886, has 172 parties, so law and practice are very similar the world over. The United States acceded to the convention in 1988.

    Copyright

    Copyright is a monopoly granted by the government. It gives the author control over reproductions, translations, adaptations, performances, communications, of their work for a fixed time. Since 1978, it has not been necessary to register a copyrightit is automatic. So for example, every web page, no matter how simple or unrefined, is copyrighted by its author.

    The phrase All Rights Reserved is used to assert that the copyright holder intends to exercise all the rights granted by copyright. It is not required to mark a document with the copyright symbol () but in case of disputes, it can be helpful.

    So in you can go <frontmatter> <colophon> <copyright> <holder>Thomas Jefferson</holder> <year>1776</year> <minilicense>All Rights Reserved</minilicense> </copyright> </colophon> </frontmatter> to assert a traditional copyright and the recommended information will then appear on the page after the title page.

    In academic publishing, authors have usually transferred, or sold, their copyright to a publisher in return for distribution of their work, or for the promise of financial gain.

    Open Licenses

    Copyright allows an author to place a license on their work, granting others greater freedoms, sometimes along with certain specific obligations. So it is important to understand that copyright allows an author or publisher to be very restrictive, and it also allows an author or publisher to be less restrictive. A license makes these less restrictive terms explicit, and the ability to control these terms is made possible by copyright.

    Generally an open license allows unlimited copying. It often allows the creation of derivative works, and the mixing of material from a variety of openly licensed documents. A viral license obliges the author of a derivative work to grant the same license to the derivative work, rather than asserting more restrictive terms. The licenses are usually perpetual, so they do not expire at a fixed term.

    It is easy to get distracted by legal jargon, obtuse arguments, and misunderstandings. We view an open license as statement of intent. The work is free to use forever. It will not go out of print. If you send the author a correction, suggestion, or contribution, it can be incorporated and enjoyed by others freely. And should an author lose interest in a project, or become unable to continue working on it, another individual may take it up and continue to maintain it.

    Creative Commons Licenses

    We describe the Creative Commons (CC) licenses first, since they have various options, which are a convenient way to compartmentalize and describe the features of other open licenses. They are known by abbreviations, so a license might be shortened to something like just CC BY-SA.

    Creative Commons Options
  • Creative Commons, <c>CC</c>

    All Creative Commons licenses allows unlimited copying, forever. Unless restricted, derivative works are allowed with no obligation.

  • Attribution, <c>BY</c>

    A derivative work must make clear the contribution of the original author.

  • Share Alike, <c>SA</c>

    A derivative work must be licensed with the same license as the original.

  • Non-Commercial, <c>NC</c>

    Bans commercial uses. (Without this clause an open license would allow the sale of copies.)

  • No Derivatives, <c>ND</c>

    Derivative works are not allowed.

  • Source versus Output

    Creative Commons licenses are designed for a variety of media, and so are very popular. For example, images are often licensed with a Creative Commons license.

    However, consider the case of a document distributed as a PDF which has been created from source, such as or or Markdown. An author may put a CC BY-SA license on the PDF while retaining traditional copyright on the source file(s). While the license allows modification, how practical is it to modify a PDF? Worse, we have seen this situation for projects described as open source. This explains our use sometimes of the term openly licensed content.

    If you are serious about your project being open source, and you want to send that signal to your readers, then mark your output with a CC license and mark your source files as also having the same CC license. This is usually accomplished by a statement at the top of each source file asserting copyright and then stating the license. Or this statement can point to a top-level text file, often named COPYING or LICENSE, with more precise license information. See the distribution for examples using the GPL software license.

    Commercial Consideration

    It is natural to consider that you have devoted considerable time and effort to your project, and with an open license you will now be donating it to the world to read for free. So you might think, Why should somebody else profit? Thus, the NC option is alluring. But think about it for a minute.

    Suppose a commercial publisher hires an experienced copy editor to go through your book, correcting errors and tightening the prose. Then the publisher prints the improved version of your book in a nice hardback version, and sells the book for $250. If you simply put the BY-SA options on your license, that publisher is obligated to (a) give you credit for authoring the original version of the book, and (b) make the copy-edited version available again with a CC BY-SA license. Now there is a business opportunity for anybody in the world: make a print-on-demand version of the copy-edited version, and sell it for $200. Then it is a race to the bottom. Eventually the price will come down to the cost of manufacturing, plus some small compensation for managing the relationship with a print-on-demand service . Just how much profit potential is there really available for others?

    We assume you have written a book because you have something to say, and chosen an open license because you want to be read. If you do place an NC option on your CC license, then you have made it impossible for anybody else to help you distribute your book in physical forms. A CC BY-SA license already makes your work unattractive to a commercial publisher who wants to charge an unreasonable price, and adding an NC clause simply chokes off some distribution options, limiting the reach of your work.

    This discussion is meant to explain why we call it the CC-NC mistake.

    Derivative Works

    Will your monograph on the reptiles of the Mongolian steppes ever become a screenplay? As exciting as the topic is to you, we think Hollywood feels otherwise. An ND option probably makes little sense for scholarly works. An conversely, if you get hit by a pie truck tomorrow, it will be a lot easier for an enthusiastic reader to take over custody and maintenance of your project, and they will be required to continue with the same license if you have employed the SA option.

    So in you can go <frontmatter> <colophon> <copyright> <holder>Steve Jobs</holder> <year>1984</year> <minilicense>Creative Commons BY-SA</minilicense> </copyright> </colophon> </frontmatter> for a CC license with the Attribution and Share-Alike options. If it was not obvious already, this is our recommendation for scholarly work if you choose to use a Creative Commons license. This is an example of what is known as a copyleft license.

    <acro>GNU</acro> Free Documentation License

    The GNU Free Documentation License (GFDL) is a license designed for documentation of open source computer programs licensed by the GNU Public License (GPL). However, it explicitly mentions textbooks as one possible use. (GNU is a recursive acronym for GNU's Not Unix and is the software project that originally built all the utilities which complement the Linux Kernel to make up an operating system.)

    The GFDL is similar to a CC BY-SA license. It allows unlimited copying, forever. Modified versions that are distributed must acknowledge the original contributions and must also carry a GFDL license. So this is a viral license, always. And another example of copyleft.

    However, the GFDL does not employ options like a Creative Commons license. More importantly, the GFDL is very explicit about source (transparent copies) and derived output (opaque copies), and the license applies to both versions. So the GFDL would say source is transparent, and a resulting PDF is opaque, and the license largely treats them identically.

    Because the GFDL has the essential characteristics of CC BY-SA, and is so explicit about simultaneously licensing document source authored with a markup language along with output formats, it is our choice for textbook projects.

    So in we might go something like <frontmatter> <colophon> <copyright> <holder>Richard Stallman</holder> <year>1985</year> <minilicense>GNU Free Documentation License</minilicense> </copyright> </colophon> </frontmatter> The GFDL is also explicit about including the complete license with your document. You can find various places a version formatted for inclusion in a project, including as part of the source for this document.

    Public Domain

    Stating that your work is in the public domain basically means you relinquish all the rights you receive via your automatic copyright. So it is a very different situation from using copyright to provide an open license. Creative Commons uses CC0, No Rights Reserved to indicate this choice.

    Remixing and License Compatibility

    It is popular to describe the potential of remixing parts of open educational resources. For example, a literature professor might collect a variety of openly licensed poems into a reader for students in a course. When the licenses are viral, and different, there arises the problem of what license to put on the collection. Worse, one license might prohibit commercial uses, and another allow it, meaning the licenses are incompatible.

    So some thought should go into the choice of a license when the work has the very real potential to be included in another, such as would be the case with a photograph. One solution is to provide more than one license (nothing about copyright prohibits this). Another solution is to avoid licenses with overly restrictive terms, such as restricting commercial use or derivative works.

    Remember too, that in addition to multiple licenses, as the copyright holder you may offer your work to another project on different terms. So another author might ask if a chapter of your work may be included in their project, which might use a different license than yours (more or less restrictive), and yu can grant permission for that use under that license. Now there are two versions of your chapter, which could diverge over time if derivatives are allowed, available to others on different terms.

    For mathematics books, we do not concern ourselves too much with the potential for remixing. Notation and dependencies make it hard to collect parts of various textbooks and assemble them into something new (and coherent).

    Creative Commons maintains a matrix showing compatibility between their own licenses at their FAQ question, Can I combine material under different Creative Commons licenses in my work?, illustrating just how complicated this can become.

    Finally, recognize that you can begin with a restrictive license and as you become more comfortable with the idea, change it to a more liberal license that applies to the work at the time of the change. Further, you can always change your license to a more restrictive version, but invariably, you cannot revoke an open license once granted. You could even stop offering an open license all together, and return to traditional copyright as you continue to improve your document. But the version that existed when you made that decision is still available for anyone to use, and possibly improve, independent of your own closed version.

    After a while, you realize that openly licensing your writing project gives it an independence and freedom all of its own. It seems to be owned by everybody, and by nobodyat the same time.

    A Final Comment

    These discussions remind us of a letter by Thomas Jefferson, the principal author of the United States' Declaration of Independence, writing about another monoply granted by governmentspatents.

    If nature has made any one thing less susceptible than all others of exclusive property, it is the action of the thinking power called an idea, which an individual may exclusively possess as long as he keeps it to himself; but the moment it is divulged, it forces itself into the possession of every one, and the receiver cannot dispossess himself of it. Its peculiar character, too, is that no one possesses the less, because every other possesses the whole of it. He who receives an idea from me, receives instruction himself without lessening mine; as he who lights his taper at mine, receives light without darkening me. That ideas should freely spread from one to another over the globe, for the moral and mutual instruction of man, and improvement of his condition, seems to have been peculiarly and benevolently designed by nature, when she made them, like fire, expansible over all space, without lessening their density in any point, and like the air in which we breathe, move, and have our physical being, incapable of confinement or exclusive appropriation.

    Thomas Jefferson Letter to Isaac McPherson August 13, 1813
    ================================================ FILE: doc/guide/publisher/pdf-print.xml ================================================ Conversion to PDF and Print print optionLaTeX, PDF electronic optionLaTeX, PDF LaTeXprint option LaTeXelectronic option PDFprint option PDFelectronic option

    This chapter describes ways a publisher can adjust the presentation of content for a print format, or an electronic facsimile (i.e. PDF).

    Electronic versus Print

    The stylesheet pretext-latex.xsl can produce two very similar outputs. Each is a file in syntax, which can be converted to a PDF with a executable (engine). However, there are two purposes for such a PDF. The first is a document which is meant to be read on a screen. We call this an electronic PDF. The second is meant to be printed as a physical book, so it would be the file you provide to a copy shop, campus bookstore, or print-on-demand service (see ). We call this a print PDF. So as you read this, keep in mind that the conversion is really two-converters-in-one.

    To illustrate the difference, an electronic PDF will contain cross-references that are active, and colored to be obvious to the reader. For the print PDF the same cross-reference will be black, inactive, and by default contain the page number of the target. Another difference is the print PDF will include trailing parentheticals with the content of visual when using url. This allows readers of the print version to visit a URL that has clickable text in other formats.

    A wide figure, table, list, or listing will be presented horizontally by default, but including a landscape attribute whose value is yes will rotate these blocks by 90 in print PDF output (only) to take advantage of the full page height. This is presently only supported by images given by a source and with an extension provided in the filename.

    The publication file entry latex/@print controls the selection of the two output modes of this single stylesheet. The default is no for the electronic version, and yes will change to the print version. See for the specifics of this entry.

    In this chapter, we describe both of these two conversions together, since they are only slightly dissimilar.

    Traditional Publishing

    Suppose that you have engaged a publisher to help you manufacture a physical copy of your book or research article. Publishers vary greatly in their expectations for what you provide to them. (And maybe you are your own publisher, see .)

    If your publisher wants to run with camera-ready copy from you as a PDF, you should be in good shape. With the print option (versus electronic, see ) and a bit of effort to control widows, orphans, and figure placement, you should be able to produce something very good by yourself.

    In mathematics, computer science, physics, or economics, a publisher might want to work from your files, which they will assume you have written from scratch. And they may expect to be able to swap in their house class or style file to achieve the look they want. A file will look a bit unusual, see . On 2022-11-22 we have a report of a very extensive research article written in and uploaded to the arXiv preprint server, where it was successfully processed by pdflatex on the server, with only minimal hand-edits to the intermediate file. We can always improve in this area, so we welcome reports, good and bad, about the robustness of our output when delivered to publishers.

    Text Block Alignment

    is engineered around placing boxes on the page. Characters in boxes are built up to be words, then words in boxes become lines, and then lines in boxes become pages. Or something close to that. As a consequence excels at right-justified text. For this reason, and also because we think it looks more like a commercial published book and therefore more professional, right-justified text is the default. If your opinions on this come from experience with some other word processor, keep an open mind. Note too, that paradoxically, sometimes a ragged-right alignment can lead to greater amounts of hyphenation.

    Similarly, can make the bottom of the text block always land at exactly the same place. This is especially pleasing if you are targeting two-sided printing, since you can have the two text blocks on either side of a single piece of paper match up exactly. But this comes at a costsometimes a page can have huge gaps between paragraphs just to place the bottom edge of the last paragraph at the bottom of the space meant for the text blocks. Further, defaults to a flush bottom or ragged bottom, depending on if the document is a book or an article, or if it is one-sided or two-sided. Instead, we default to a ragged bottom for better out-of-the-box formatting, with an option to elect a flush bottom when you understand the risks and can watch out for them.

    See details on specifying these options at . See for greater control over some aspects of right-justified text and also read about justified text in .

    One-Sided or Two-Sided

    An electronic PDF will default to page layout appropriate for a document printed single-sided, which makes the most sense for a document that may not ever be printed, or which possibly might be printed on a personal printer.

    A print PDF will default to page layout appropriate for a document printed two-sided, which makes the most sense for a document that may be sent to a print-on-demand service or printed on a printer that will print on both sides of a sheet of paper.

    These defaults may be overridden with the publisher entry latex/@sides switch with values one and two. See for the specifics of this entry.

    One-sided layout will default to symmetric left/right margins, and page headers with the page numbers always placed in the upper-right corner as part of default page headers. There will be no blank pages between chapters of a book.

    Two-sided layout will have asymmetric margins with the ratio of inner (adjacent to spine) to outer at 2:3. You need some extra space at the spine to compensate for the binding, but when a book is open, the two pages are separated by two inner margins, so these do not need to be as wide as the outer margin to give some distance between the pages. And readers will want more space to write in the outer margins, perhaps providing simple proofs of important results. (This ratio may be changed with the hmarginratio key of the geometry package.) Page headers will have page numbers on the outside of the page, with odd numbers on the right-side page. Chapters will possibly have a blank page between them, so they begin on a right/odd page. Behavior is similar in the front matter and back matter.

    Font Size

    The overall (document-wide) font size may be given as one of eight different values, ranging from 8 points to 20 points. The default is 10 points. These values influence multiple settings within itself, and will also adjust some default values, such as the line-width (in order to preserve an optimal number of characters per line for reading ease). See for precise details.

    Page Shape

    The conversion to defaults to US Letter paper with reasonable margins. However, the geometry package has numerous options for paper sizes and margins. The publication file can be used to insert any configuration the package supports. See for the exact syntax.

    Note that if you change the paper size, you may want to change the text width computed by , and the more changes you make, the more default settings you may need to adjust. However, if you are producing your book for print-on-demand () getting the page size and margins just right is a key step of the process.

    Note also that when you use the geometry element of the publication file, the content of the element (text between the opening and closing tags) will be duplicated exactly into a source file. Being careless here is a good explanation for the compilation step to fail.

    Here is an example: <latex> <page> <geometry>a4paper,total={16cm,25cm}</geometry> </page> </latex> twhich will produce in the output \geometry{a4paper,total={16cm,25cm}}

    An electronic PDF may be printed on physical paper, but perhaps you want to make a version that works well on a portable device that naturally supports a portrait orientation, such as an Android tablet, an iPad, a Kindle (device or application), smart phone, Sony Digital Paper, or a ReMarkable tablet. Aspect ratios vary across these devices, but once you settle on a target ratio, we have had good luck with the following algorithm and parameters:

    1. Specify 10 point text
    2. Text width of about 4.5 inches
    3. Add quarter-inch left/right margins to compute text width
    4. Use aspect ratio to compute an overall height (about 6.5 inches)
    5. Subtract quarter-inch top and bottom margins to obtain text height
    Then you can provide the geometry package the overall size as the papersize and the text width and text height as the total size of the body, resulting in equal (tight) margins all around, and good use of limited screen real estate. These parameters create a PDF that is very legible on a larger smart phone, and for fine detail, rotating the device to landscape works well. Really.

    Suppose you are a publisher, or an author who is also your publisher, and you wish to manufacture a paperback copy of your book in a 6-inch wide by 9-inch tall version. It is unlikely your printer has paper of this size. Use the geometry option above to specify the logical size of the paper for your book and then set margins, etc. to determine exactly how the text block sits on the page. Then there is a crop-marks option available though the publication file. You set it to a paper size describing the paper in your printer, likely letter (US) or a4 (Europe). Then your logical page will be centered on the physical page, and indications in each corner will describe the boundaries of the page.

    To see this in action, you need to explicity set a smaller page size. So the value of the geometry could be set to paperwidth=6in,paperheight=9in,total={5in,7in} Do not forget to turn off any page-scaling in your printer configuration before printing onto paper. See for the exact syntax of how to enable crop marks.

    Crop marks may be requested by a publisher, when it is understood that you are providing camera-ready copy. Or you may find it useful for visualizing how your text and margins will look at a smaller page size. The crop package has other useful options, such as framing the entire logical page. You can hand-edit these into your file, or make a feature request.

    Avoid Too Much Text on a Printed Page

    With freedom comes responsibility. Resist the temptation to pack in as much text on the page as you can. varies the width of the text in reaction to the font size and is already very close to the maximum number of characters per line for comfortable reading by humans. Similarly, very narrow margins can be uncomfortable for reading (or holding a printed book).

    Page Breaks

    A publisher can insert page breaks beyond those that creates automatically. This might relieve some awkwardness that 's otherwise excellent page breaking failed to relieve. The publisher should identify each source element for which they would like a page break to happen before that element appears in output. For each such element, there must be an xml:id. Bring these xml:id values together in the publication file, using whitespace to separate them. For example: <latex> <insertions pagebreaks="xmlid1 xmlid2 ..."> </latex> You may use multiple insertions elements to help organize page breaks by chapter, section, etc. For example: <latex> <!-- chapter 1 page breaks --> <insertions pagebreaks="xmlid1 xmlid2"> <!-- chapter 2 page breaks --> <insertions pagebreaks="xmlid3 xmlid4"> </latex> At time of writing, the allowable elements which may be preceded by a page break using this feature are divisions, numbered blocks, and the following unnumbered elements: answer, aside, audio, biographical, assemblage, blokquote, console (when not a child of a sidebyside), hint, historical, image (when not a child of a sidebyside), interactive, list-of, p, paragraphs, poem, pre, program (when not a child of a sidebyside), sage, sbsgroup, sidebyside (when not a child of a sidebyside), solution, tabular (when not a child of a sidebyside), and video.

    Note that over time, the precise size of many things in your PDF output may change. This may be because of an underlying change in how builds PDFs. It may be because of change in the distribution. And of course, it may be because the source content and publisher specifications (like font) change. So all manually specified page breaks may need to be monitored over the life of a project.

    See .

    Asymptote Links

    An image described by an asymptote element will produce standalone HTML files as part of the convversion to HTML output. For 3D images, these are interactive (rotate, scale). If you set a base URL for your project () and request this feature through a publisher switch, then each image in an electronic PDF () will be a link to the HTML version. See for the specifics of this entry. This feature is off by default.

    Cross-References

    In an electronic PDF, cross-references will be hyperlinks that take the reader to the target. Color is used to make them visible, in addition to whatever indication a PDF viewer will provide on hover. The publication file entry controlling the use of numbers in cross-references () is by default no in this case, but may be set to yes to include the page number of the target in the cross-reference.

    In a print PDF, cross-references will not be active hyperlinks and will be the same color as the adjoining text. The publication file entry controlling the use of numbers in cross-references () is by default yes in this case, but may be set to no to not include the page number of the target in the cross-reference.

    See for the syntax of specifying the use of page numbers in cross-references.

    For accessibility, an underline can be added beneath all hyperlinks (cross-references and URLs) to supplement color as a visual indicator. See .

    Page Number Fidelity

    If you produce a print PDF, perhaps as a precursor to producing a physical book, the page numbers may be important to you and your readers. Thus, you may desire that an electronic PDF have faithful page numbers. And together we might consider this a canonical numbering of the pages of your project. (Long-term we hope to migrate these page numbers into other formats, such as braille. See GitHub #1020.) Fundamentally, a PDF destined to become a physical book will be built with two-sided pages, while an electronic PDF will have one-sided pages. The two-sided version will often leave a page blank at the end of a division (e.g. parts or chapters), so a subsequent division begins (opens) on an odd-numbered page, also known as a recto page. We have publisher options for print versus electronic (), which subsequently provide (different) defaults for sidedness ().

    Suppose you wish to have your electronic (one-sided) PDF have identical pages (i.e.identical content) with identical page numbers as your print (two-sided) PDF?

    First decision point is: what do your cross-references look like? If every cross-reference looks like Section 5.2, then presumably a reader of print (or embossed braille) can locate the target. But if you have used a cross-reference that looks like Fermat's Theorem then you have exhibited a preference for electronic formats at the expense of readers of physical formats. To remedy this, we allow for the automatic insertion of page numbers as part of every cross-reference (see ). But all these page numbers will increase the length of your physical version and pages will never match up. So that your cross-references are workable in all output formats, or you should elect to have page numbers in every cross-reference, for each PDF produced.

    Now a further complication is that a two-sided version will always start some larger divisions (parts, chapters, appendices) on an odd-numbered page, the recto page (versus the verso page). This sometimes requires an additional blank page on the verso side. But a one-sided version has no need for this practice, so the two-sided version will eventually have different (larger) page numbers on the identical content. The solution is to use a publisher option, which is only effective when a one-sided version is produced, that creates these blank verso pages or skips the page numbering ahead by one when there would have been a blank page. The result is that major divisions will always open on an odd-numbered page, matching the two-sided version. See for details. (Note that this is not the default and so must be a conscious choice.)

    Nested Lists

    can fail if lists are nested too deeply. Maximums may be up to four nested ordered lists, and up to six overall (mixing in unordered lists). If you hit these limits, ask yourself if your situation is really that complicated, or ask us to consider a feature request adding a technical fix.

    Multi-Column List Order

    Lists with several columns are rendered in column-major order, as of 2018-02-28. In other words, the first list items (li) in your source will populate the first column.

    Footnotes

    Footnotes are the farthest thing imaginable from structured authoring. You can put them anywhere, and conceivably they can contain anything. But they do work great in HTML presentations as knowls. However, we do not let the tail wag the dog, and so have to make some compromises for footnotes output in print formats.

    • As of 2019-01-04 we are fairly restrictive about content. No paragraphs, more like a few sentences, max. If you have more content, consider the aside element, and send feature requests for that.
    • Many blocks, such as example and remark, are implemented with the tcolorbox package, to make styling and layout much more capable and reliable. But footnotes get trapped within these boxes and render at the end of the box (not the bottom of the page) and have a different scheme for the marks (letters, not numbers). We have mitigated much of this behavior, but the cost is that these footnotes are delayed until the box finishes. So if you have a 4-page example, and use a footnote early, it may appear at the bottom of a page that is 3 or 4 pages away.
    • Another consequence of the above is that hyperlinks in electronic PDFs, from the mark to the text, need to be disabled (they will never work within a tcolorbox). Cross-references to a footmark's text will still be active in an electronic PDF.

    Cover Images PDFcovers LaTeXcovers coversPDF coversLaTeX

    The publication file may be used to specify the filenames of a front-cover image and a back-cover image. The image must be a single-page PDF, and it will be scaled to fit an entire page. So it is your responsibility to supply an image which has the correct aspect ratio and sufficient resolution. These are only supported for the conversion. See for exact syntax. Implementation is via the pdfpages package.

    This is meant to help you create a professional electronic PDF. A print-on-demand service () will likely want a standalone image (possibly with the front and back, plus a spine, all rolled into one wrap image). So build your real cover images first (), and then modify them for this use.

    Icons

    The icon element is built around the Font Awesome 5 font collection. The fontawesome5 package contains all the necessary font files (for use with both pdflatex and xelatex), and a style file that interfaces, in a semi-elaborate way, with the font files. If you have installed this package, and the fonts still seem unavailable, figure out how to adjust your setup or your system configuration. Simply installing a font file, such as the more recent Font Awesome 5 is not going to work. See for more about fonts in .

    Index Style

    Start at to learn how to create an index. The realization of the index is under the influence of the imakeidx package, which results in certain stylistic choices, such as a two-column format. It also means that any options supported by this package could be easily implemented as the result of a feature request.

    Also, there can be significant differences between how implements the index for HTML and how the imakeidx package creates an index for . See and .

    Styling styleprint

    Note that some of these switches are about style. There are many more ways to influence the style of the output, see .

    <latex /> File

    The file created by will contain the majority of your content in a form that you could use it in a new standalone document, in accordance with Principle . However some constructions which are not natural in , such as a sidebyside, may be cumbersome to reuse. We continue to improve and refine these situations, though.

    Our philosophy is to create and use many new environments, allowing styling and fine-tuning to occur in the preamble. This makes the body look more like simple and allows for much greater flexiblity in styling, along with greater reliability for successful compilation.

    The existence, variety, and quality of packages changes continuously. We can, and will, swap out some packages for replacements, as needed or desirable. This is to your advantage, as you are absolved of the need to evaluate competing packages, and to insure that they do not clash with each other. So resist the temptation to modify the output significantly prior to compilation, as it will inevitably lead to frustration. The file is a means to an endit allows us to create a PDF with excellent typography, and especially for the demands of technical discplines, such as STEM and music. It is meant to ephemeral, not archival.

    If some other variety of (or ) file is desired, a new conversion could be created. Many of the more complicated aspects of any conversion are purposely isolated in the pretext-common.xsl file so that they can be easily re-purposed and there is consistency across output formats.

    Only Edit <latex/> Files Rarely

    We want to stress that the file created by various conversions is meant to be an intermediate format. In other words, it is ephemeral. We try to make it clean and organized, but it is not the a human would write. You might be able to recycle a paragraph or two in other documents you create without . But it is not meant to be stable or archival, and no long-term use is supported in any way. In other words, it is not a supported output format, beyond compiling to a PDF without errors.

    Because of that, you may find it necessary to manually adjust a file to control widows or orphans, or maybe the placement of a graphics file, or similar adjustments. Some of the most the common adjustments used by authors are inserting \newpage, \noindent, or \par to avoid awkward transitions, or to remove an occasional \leavevmode; consult a good reference before making such changes, as effects later in the output may be unpredictable.

    We view this as the final step before making a new edition, which might be a PDF that you submit to a print-on-demand service (). So hand-editing might be an annual exercise, at the most frequent. One way to keep track of larger number of edits over long periods of time is to write a script (in an appropriate language), which looks for unique strings before or after trouble spots and replaces the nearby content. Another minimally invasive option is to keep a separate git branch of the file which makes the desired changes, which can then be applied on those rare occasions it is necessary (ideally, with little rebasing needed).

    Snapshot Record LaTeXsnapshot

    We are careful about which packages we use, trying to stick with well-established packages with active maintainers. But it can be useful to have a record of exactly which packagees are in play, and better still, which versions of those packages are being used. So you can use a publication entry to request loading the snapshot package, which will then automatically generate such a record into a <job>.dep file. See for details on electing this feature.

    If you suspect some packages are not playing well with each other, this record might be helpful for debugging this (rare) situation. It can also be useful if you wish to have a perfect archive of how some publication was produced. See the package documentation for more on the format and use.

    ================================================ FILE: doc/guide/publisher/print-on-demand.xml ================================================ Print-On-Demand print-on-demand

    If you are both author and publisher, you may wish to make your book available in a physical form, but may be reluctant to purchase and store thousands of copies, or to take orders and arrange shipments. Then print-on-demand might be the solution for you.

    A print-on-demand service is a manufacturer and distributor of printed books, which are typically only printed once ordered, or in extremely small quantities. They can provide many of the manufacturing and fulfillment services a traditional supplies. Some provide services you pay for that will produce a cover, provide editorial services, or assist with marketing.

    We list three such services below, but first describe some commonalities, pro and con.

  • Updates

    Generally, you provide a PDF of your text, and we have tried, with the print option, to make output that is amenable to this situation (see ). A real advantage of print-on-demand is that you can usually update this PDF at any time, without much trouble. You will need to decide how to indicate versions (or printings?) of your work. Perhaps we will have tools and advice about this soon.

  • Covers

    You may need to provide a cover, typically as a PDF meeting some exact specifications. Though you may be able to choose a fairly generic look through a template or wizard. Or pay to have one created for you. See also and .

  • Price

    You may choose to sell at your cost, or you may wish to make a profit on each sale. (Note: as copyright-holder you can do this, no matter what license you have chosen, review ). A 450-page hardcover book might be sold by a print-on-demand manufacturer to an online bookstore, including some profit for the manufacturer, for $23. If you, as author, want $5 profit, and the online bookstore wants $7 for fulfillment, shipping, and profit, the cost to your reader is now $35. In order for the online bookstore to give the appearance of discounting your book to $35, you may need to declare a suggested retail price of $49.95. So pricing takes a bit of thought. Or guesswork, since the discounting algorithm is not public.

    Note in the above scenario, the print-on-demand manufacturer may sell you, the publisher, small quantities at a better price, such as ten copies for $170, shipping included.

  • <init>ISBN</init> ISBN

    An International Standard Book Number is a unique identifier of books and necessary for others to distibute and sell your book. See details for each manufacturer below. Much like a domain name for your book's website (see ), this may be something you wish to control and own, foregoing the convenience of someody else providing and owning it for you.

  • In order of increasing professionalism and decreasing convenience, we describe three print-on-demand manufacturers we are familiar with, plus three others. Additions, corrections, updates, and alternatives are all welcome.

  • Lulu.com Lulu.com

    This site caters to people making photo books for relatives, in addition to more serious projects. Account setup may be trivial, an ISBN number may not even be needed, and you may have options for distribution beyond readers simply ordering direct from the site. This might be a good choice for drafts you will use in your own classes, if having your university bookstore print copies is not a good alternative. (2017-11-25)

  • Kindle Direct Publishing Kindle Direct Publishing Amazon.com

    Until early 2018, Kindle Direct Publishing (KDP) was a service known as CreateSpace. Some of the information below refers to this predecessor. (2021-04-21).

    This company is owned by Amazon.com. They manufacture and distribute serious books, in addition to music and film. Distribution through Amazon is nearly automatic. There is also Expanded Distribution, which starts to look more like Ingram (next). If royalties are small, using direct deposit might be the most convenient (international sales all get converted to dollars for authors in the US). (2017-11-25)

    CreateSpace attempts to make sure you have the rights to your content. So if they find your book freely available on the Internet, their Content Validation Request Team becomes suspicious and investigates. This has caused a few authors a few headaches and delays in making their book available for sale, though all have been successful eventually. (2018-03-06)

    If you want to offer your project electronically for no cost, you may need to do an end run. We have a report that you can put your project on KDP for a low price (e.g.$1), then offer it on Apple's similar service for free, and then exercise a price match guarantee back on KDP. Reports on this technique encouraged. (2021-04-21)

  • Ingram Spark Lightning Source IngramSpark Ingram

    IngramSpark (formerly Lightning Source) is a division of Ingram, which is a very large printer, also providing services to major publishers. Creating an account is not trivial, and you need to provide your own ISBN number. In return, your book is available at Amazon.com and many other online bookstores automatically, and is in many ways indistinguishable from offerings of large commercial publishers. There are also options for international distribution. You can also control settings for discounts and returns. (2018-03-06)

    Current startup pricing for publishers is forty-nine dollars for either a print book, or print and e-book together. A recent change seems to be that, like KDP, they will now provide a free ISBN if you don't have one; however, the free ISBN is only usable for as long as you continue to use IngramSpark. (2021-07-21)

  • LAD Custom Publishing LAD Custom Publishing

    LAD primarily helps faculty create course packets while remaining copyright compliant, so it has experience with openly licensed educational resources if you need print copies of titles without other print options. In addition, the LAD Bookstore can be used to print and market your own text without overhead, though as with other solutions an ISBN is free only so long as you use LAD. One particular advantage for some authors is you can communicate with representatives on the phone or via email, not just through an automated web form. (2024-07-18)

  • Blurb Blurb

    Blurb specializes in photo books, and uses Ingram for printing. Sizes are limited, and costs are more that the other services. Direct experiences would be a welcome addition. (2018-03-06)

  • Nook Press Nook Press

    Nook Press is a service of Barnes & Noble, and books appear only through their online store. We have no additional information, so direct experiences would be a welcome addition. (2018-03-06)

  • We currently have no good information about distributing EPUB or Kindle electronic versions for profit. (2017-11-25).

    ================================================ FILE: doc/guide/publisher/production.xml ================================================ (*) Producing a Book

    You have finished using to write a textbook, research monograph, laboratory manual, writer's handbook, or some other scholarly work, and you want to share it openly with students and other readers. Good! That's why we created , and why we include this chapter. There is more to do.

    This chapter will try to distill our personal experience, along with many conversations with other authors confronting these same decisions. But recognize there is a lot of advice here, and a bit of an attitude, simply for your consideration. The decisions are yours.

    (*) Front Matter

    TODO

    (*) Landing Page

    TODO

    (*) Source

    TODO

    (*) Marketing

    Didn't think about that one? Write it, and they will come? Not necessarily. I have seen nice projects where authors make little extra effort to get the word out, and it shows. With the Internet, effective promotion can be accomplished without much effort or expense. And very soon your project can rise very high in search engine rankings.

    (*) Social Media

    TODO

    (*) Reference Sites

    TODO

    (*) Analytics

    TODO

    (*) Discussion Groups

    TODO

    ================================================ FILE: doc/guide/publisher/publication-file.xml ================================================ Publication File Reference

    This chapter is reference material for the publication file, whose employment is described in , where you can also find an explanation of the shorthand syntax used here to describe elements of this file.

    Common Options common options publisher optionscommon

    These are options that might affect several conversions, though the influence may vary from one conversion to the next.

    Common Chunking Option common optionchunking chunking optionchunking

    Many outputs are produced as a collection of several files, others may only produce a single file. A chunk is a generic, informal term for a portion of an output, typically a single file. This is given as a level, see for more about levels. The specification is in the attribute /publication/common/chunking/@level with a whole number as the value (generally 0 is allowed). This is critical for the construction of HTML output, and ignored for output.

    Table of Contents Level Option common optiontable of contents level table of contentslevel option

    The depth of the entries in a Table of Contents is given as a level, see for more about levels. The specification is in the attribute /publication/common/tableofcontents/@level with a whole number as the value. A value of 0 is used to indicate that no Table of Contents is desired. Absent this setting, reasonable defaults are supplied, which can vary by conversion and document type.

    Exercise Component Visibility exercisecomponent visibility exercise componentsvisibility

    An exercise can appear in four different locations: mixed in with paragraphs and blocks (inline), inside an exercises specialized division (divisional), inside a worksheet specialized division (worksheet), or inside a reading-questions specialized division (reading). Also, a project, and similar (project), behaves in many ways like an exercise. All of these elements (or their task) may have statement, hint, answer, and solution (components).

    Where such exercises first appear (not, for example, in back-of-the-book solutions) publication switches can control the visibility of the components. There are five elements, each with four attributes, which can take on the values of yes or no. The default is yes, which should be most useful in the early stages of a project. The element exercise-project is a misnomer, but is used to avoid confusion with some other use of project. See for more explanation.

    Exercise Component Visibility Settings Publication File Entry Attributes: yes or no values common/exercise-inline statement, hint, answer, solution common/exercise-divisional statement, hint, answer, solution common/exercise-worksheet statement, hint, answer, solution common/exercise-reading statement, hint, answer, solution common/exercise-project statement, hint, answer, solution
    Fillin Options common optionsfillin fillinoptions

    The style of fill-in-the-blanks (from a fillin) is set by the attributes

    • Text Fillin

      Set /publication/common/fillin/@textstyle to values underline, box, or shade to influence the style of a fillin within text. The default is underline.

    • Math Fillin

      Set /publication/common/fillin/@mathstyle to values underline, box, or shade to influence the style of a fillin within math. The default is shade.

    Em Dash Width Options common optionsfillin fillinoptions

    The width of spaces on either side of an em dash (the mdash element) is set with the /publication/common/@emdash-space attribute having values none (the default) or thin. See for more explanation.

    Watermarks common optionwatermark watermarkcommon option

    The text of a watermark is given as the content of the /publication/common/watermark element. An optional scale factor may be given as a positive rational number with the /publication/common/watermark/@scale attribute. The default scale is 0.5.

    In the text itself avoid obscure characters or symbols, and do not use any markup. Keep it simple. When used with output the scharacters \\ will survive in the text to create multiple lines of text in the watermark. This feature is implemented for and HTML output. See for more detail and an example.

    Mermaid Mermaid themes

    Various themes are available for Mermaid diagrams. To use a theme, set /publication/common/mermaid/@theme with a value of the theme name. The default theme is default. See for more information on Mermaid diagrams.

    QR code image common optionqrcode qrcodecommon option

    QR codes for videos and interactive elements can have an image placed in their center. This image file should be square, and stored in the external assets folder. To use this image in your QR codes, use /publication/common/qrcode/@image with a value of the file path, relative to external assets folder.

    Note that the presence of such an image will increase the raw size of QR codes, which are then genreally shrunk to fit. This will result in a finer grain for the QR code pixels.

    Journal name common optionjournal name journal namecommon option

    When an article is intended for publication in a particular journal, the name of the journal can be specified with /publication/common/journal/@name with a value being one of a list of supported journal short name codes. Setting this option will control the format of bibliography entries and the format of that can be produced.

    A complete list of the supported journals, together with their short name codes, will be available in .

    Worksheet and Handout Margins common optionworksheet margins common optionhandout margins worksheet marginscommon option handout marginscommon option

    Margins for worksheets and handouts can be specified using a combination of attributes on the element /publication/common/worksheet using attributes margin, top, right, bottom, and left. The values of these attributes should include units, either in or cm. Setting margin will set all four margins to its value, but this can be overridden by setting (some of) the other attributes. The default margin is 0.75in.

    For example, setting <worksheet margin="1in" left="2in"/> will set the top, right, and bottom margins to 1in and the left margin to 2in. Setting <worksheet top="1cm" bottom="2cm"/> will set the top margin to 1cm and the bottom margin to 2cm, while leaving the left and right margins at their default of 0.75in.

    These settings will be used for both the and HTML conversions. See also for more information on how these margins are used in the conversion.

    Worksheet and Handout Headers/Footers common optionworksheet headers and footers worksheet headers and footerscommon option

    Headers and footers for worksheets and handouts can be specified in the publication file (they can also be edited in the browser when producing HTML output). First-page and running headers and footers are specified separately, and each can have a value for left, center, and right positions.

    That is, each of the elements /publication/common/worksheet/first-page-header /publication/common/worksheet/first-page-footer /publication/common/worksheet/running-header /publication/common/worksheet/running-footer can have attributes left, center, and right, whose values are the desired content for that position in the header or footer.

    For example, to add a name and date line to the top of the first page, one would include the publication file entry <first-page-header left="Name: __________" right="Date: __________"/> (inside the worksheet element of common).

    Numbering Options numbering options publisher optionsnumbering

    How various items get numbered can be controlled by specifying levels. For pieces of content (e.g. example, fn, ) the level will be the number of separators in the number, usually periods. To fully understand these options, carefully read and .

    You can stop numbering divisions at some depth. For example, you may want your book (without parts) to have numbered subsection, but numbers on the few subsubsection is just too messy and not necessary. Then you would set the publication file entry /publication/numbering/divisions/@level to the value 3 to number chapter, section, and subsection, only. (Note this is the exception, you will get at most two separators in a division number in this case.) So you can think of this as the maximum level for numbers on divisions. Just be careful not to try to number other objects (described next) to a greater level, as that is impossible, and so will generate a warning and the default will be substituted.

    For items within a division, various groups of objects are numbered consecutively, with a hierarchy given by a level. These numbers are controlled by /publication/numbering/blocks/@level /publication/numbering/projects/@level /publication/numbering/equations/@level /publication/numbering/footnotes/@level whose values should be integers (zero is a possibility) that do not exceed the maximum level specified for divisions.

    Chapters of a book may start numbering from something other than one. This feature is not available in a book with structural parts (rather than decorative parts). Read about this at the end of and . If you still want to proceed, then set the publication file entry /publication/numbering/divisions/@chapter-start to the desired value of the first chapter.

    A book with part may have the parts numbered to reflect two different structures, decorative or structural. Set the publication file entry /publication/numbering/divisions/@part-structure to decorative (the default) or structural.

    When a book is designed to have structural parts, then there is an expectation that the part divisions are important or relevant (at least moreso than in the case of decorative parts). Then, to choose to number objects (blocks, equations, etc.) at level 0, crossing part boundaries, strikes us as an odd choice. So odd that there is a small bug at issue #1650, which might be solved by simply banning this combination.

    For more on divisions, and their numbering see .

    PDF (<latex/>) Options PDF publisher options LaTeX publisher options publisher optionsPDF publisher optionsLaTeX

    These options affect the conversion to , which can in turn be converted into PDF. See for a more general overview of this conversion with more details. This includes some existing options that will eventually migrate to the publication file.

    <latex/> Style Option style optionLaTeX, PDF LaTeXstyle option PDFstyle option

    A limited number of custom styles are available and more are in development (see ). The /publication/latex/@latex-style attribute can be set to one of the provided styles to build the or PDF output with that style. As of 2024-10-04, the supported styles (and values of this attribute) are AIM, chaos, CLP, dyslexic-font, and guide. (Note that some of these are meant as demos and not intended for production.)

    <latex/> Print Option print optionLaTeX, PDF electronic optionLaTeX, PDF LaTeXprint option LaTeXelectronic option PDFprint option PDFelectronic option

    The conversion to can produce a PDF optimized for print, or optimized for use electronically on a screen. The /publication/latex/@print attribute can have the value yes to produce a print version, or the value no to produce an electronic version. The default is an electronic version. See for more detail. Note that the use of page numbers in cross-references has different default behavior based on this option (which can be overidden, see ).

    <latex/> Sides Option sides optionLaTeX, PDF LaTeXsides option PDFsides option

    The conversion to can produce a PDF designed for printing on only one side of the page, or on both sides of the page. The /publication/latex/@sides attribute can have the value one for a one-sided version, or the value two to produce a two-sided version. The default depends on if the output is electronic (one-sided) or print (two-sided). See for more detail.

    <latex/> Page Matching page matchingLaTeX, PDF open odd optionLaTeX, PDF LaTeXpage matching LaTeXopen odd option PDFpage matching PDFopen odd option

    A two-sided PDF will contain extra blank pages to ensure that certain divisions (usually parts and chapters) always open on an odd-numbered page. Since a one-sided PDF will omit these extra blank pages, the page numbers may get out of sync between the two versions. The /publication/latex/@open-odd attribute can be used to force the page numbers back into sync by either also inserting the extra blank pages in a one-side PDF version (by setting the attribute to value add-blanks) or by simply skipping the page number for pages that would have been blank in the pagination (by setting the attribute to value skip-pages). If the attribute value is no for a one-sided PDF output (the default), then no adjustment is made and divisions open on the next consecutive page whether odd- or even-numbered.

    Note that this attribute is ignored for two-sided PDF output, where extra blank pages are always inserted. Also note that page-matching between one- and two-sided PDF versions may require a consistent specification of the /publication/latex/@pageref option (). See for a more thorough discussion of page number fidelity.

    <latex/> Font Sizes font size optionsLaTeX, PDF LaTeXfont size option PDFfont size option

    The document-wide point size can be specified with the /publication/latex/@font-size attribute can have the value 8, 9, 10, 11, 12, 14, 17, 20, which are interpreted in points (pt) as the unit of measure. The default value is 10. See for details.

    <latex/> Page Shape Options

    The following options affect the shape of each page, so are in a way less global than some of the previous options. These are both attributes of the /publication/latex/page element.

    • Text Alignment, Right Edge

      Set /publication/latex/page/@right-alignment to values flush (default) or ragged to influence the right edge of the block of text on a page. See for more.

    • Text Alignment, Bottom Edge

      Set /publication/latex/page/@bottom-alignment to values flush or ragged (default) to influence the bottom edge of the block of text on a page. See for more.

    The content of the element /publication/latex/page/geometry element will feed directly into a \geometry{} element, with no modifications. (In other words, all whitespace, such as newlines and indentation, will be preserved.) Be sure to carefully read the advice, an example, and further detail at .

    The attribute /publication/latex/page/@crop-marks may be set to the value none, or not specified at all, and nothing will happen. Otherwise, it is set to a paper size, then the logical page (whose size is presumably set by the geometry package) will be centered on the physical page specified, with marks at each corner delineating the logical page. Some publishers request camera-ready copy to have these indications. Paper sizes are arguments to the crop package, and as of 2023-05-19 the possible values were: a0, a1, a2, a3, a4, a5, a6, b0, b1, b2, b3, b4, b5, b6, letter, legal, executive There is no error-checking of these values. See for more and examples.

    Page Numbers in Cross-References

    Set /publication/latex/@pageref to values yes or no to enable or disable the use of page numbers in cross-references (typically achieved with the xref element). The default varies, as it is dependent on the print option (). See for more on the defaults.

    Hyperlink Highlighting accessibilityhyperlink underlining, LaTeX LaTeXhyperlink highlighting

    Set /publication/latex/@link-highlight to underline to draw an underline beneath hyperlinks (xref and url) in the PDF output. The default value is none. This option requires no additional packages. See for accessibility motivation.

    <latex /> Worksheet Options

    By default, worksheets are formatted differently than other pages, including customizable margins, workspace between exercises, and on their own pages. This separate formatting can be ignored, causing worksheets to be treated like any other division, using the /publication/latex/worksheet/@formatted attribute, setting the value to no. The default value is yes.

    See also for how to specify margins for formatted worksheets.

    Covers PDFcovers LaTeXcovers coversPDF coversLaTeX

    The /publication/latex/cover element has attributes front and back whose values can be paths to PDF files to use as the first and last page of the output PDF. The paths should be relative to your directory of external files, much like a raster image you might bring to your project being given by a source attribute. See for more about managed directories, and for more detail about covers.

    <latex/> Asymptote Links Asymptote linksLaTeX, PDF LaTeXAsymptote links PDFAsymptote links

    The conversion to can provide a link to an HTML version of each Asymptote graphic. The /publication/latex/asymptote/@links attribute can have the value yes to produce links, or the value no to not create links. Note that a base URL must be set for this feature to be functional (). The default is no. See for more detail.

    Draft Mode

    Set /publication/latex/@draft to values yes or no to enable or disable the use of the draft mode. The default is no. See for more detail.

    Snapshot Record LaTeXsnapshot

    Set /publication/latex/@snapshot to values yes or no to enable or disable the generation of a snapshot record of the LaTeX packages in use. The default is no. See for more detail.

    Page Breaks Page breaksLaTeX, PDF PagebreaksLaTeX, PDF LaTeXpage breaks LaTeXpagebreaks PDFpage breaks PDFpagebreaks

    A publisher can declare xml:id values for which a pagebreak (\newpage) will precede the corresponding element in output. This is only valid for certain element types. Use /publication/latex/insertions/@pagebreaks to provide a whitespace-separated list of xml:id values. You may use multiple insertions elements, each with its own pagebreaks to help organize pagebreaks by chapter, etc.

    See .

    Online (HTML) Options HTML publisher options publisher optionsHTML

    These options affect the base conversion to web pages (online, HTML). Many, but not all, will affect subsequent conversions based on HTML, such as a conversion to EPUB or Jupyter notebooks. See for a more general overview of this conversion, including options that will eventually migrate here.

    HTML Analytics analytics

    The /publication/html/analytics element can have the following attributes:

    • google-gst: a Google global site tag, which is an ID you get from Google. Do not copy the identification numbers from another projectbe sure to obtain your own for your project.
    • statcounter-project, statcounter-security: ID numbers you get from StatCounter. Do not copy the identification numbers from another projectbe sure to obtain your own for your project.
    Setting these attributes to non-empty strings is the signal to add the relevant code to each of the pages of your HTML output. See for more.

    HTML Base URL base urlHTML output

    The /publication/html/baseurl/@href attribute may be given as a complete URL for the top-level of where HTML output is hosted. Of course, this may be different for different publishers. The value is a directory, and so should end with a slash (path separator). See for reasons why you might want to specify this.

    HTML Banner Options HTMLbanner content options

    The /publication/html/banner/@subtitle and /publication/html/banner/@byline attributes may be specified as either yes (the default) or no to control whether the subtitle and author byline are displayed in the banner. See for reasons why you might want to specify this.

    HTML Embedded Calculator calculatorembedded in HTML

    The /publication/html/calculator element has the following attribute:

    • model: used to control which calculator is available on every page. Possible values are:

      • geogebra-classic
      • geogebra-graphing
      • geogebra-geometry
      • geogebra-3d
      • none

    The default is none. See for more.

    HTML Favicon favicon

    The /publication/html/ element has the following attribute:

    • favicon: used to control how icon files for a favicon are embedded into each HTML page:

      • none
      • simple

    The default is none. See for more, including an explanation of what a favicon is.

    HTML <webwork/> Dynamism WeBWorKHTMLdynamism

    The /publication/html/webwork element has the following attributes, each of which can have a value of static or dynamic:

    • inline, default value: dynamic
    • divisional, default value: static
    • reading, default value: static
    • worksheet, default value: static
    • project, default value: dynamic
    The attribute names suggest the type of exercise or project-like that will be affected. See for more details and the rationale for the defaults.

    HTML ActiveCode Programming Window ActiveCodewindow in HTML

    The /publication/html/calculator element has the following attribute:

    • activecode: used to control if an ActiveCode window is available on every page, and if so, which language it undestands. Possible values are:

      • python (Python)
      • javascript (JavaScript)
      • html (HTML)
      • sql (SQL)
      • c (C, Runestone server only)
      • cpp (C++, Runestone server only)
      • java (Java, Runestone server only)
      • kotlin (Kotlin, Runestone server only)
      • python3 (Python 3, Runestone server only)
      • octave (Octave, Runestone server only)
      • none

    For a build hosted at a Runestone server, python is the default. For an HTML build hosted elsewhere, none is the default. See for more.

    HTML Index Page index pageHTML HTMLindex page

    The /publication/html/index-page element can have the following attribute:

    • ref: the xml:id of a division which will be a complete page at whatever level the document is chunked (broken into smaller pages).
    An index.html page will be created which redirects immediately to this page. Many webservers will serve this page when a URL stops with the enclosing directory. So the Table of Contents (book, article) or the frontmatter are common choices. See for more.

    HTML Knowlization knowlselective elective knowls

    In a conversion to HTML a wide variety of content can be born in a knowl. Publisher switches are specified via multiple attributes of a single /publication/html/knowl element, with values of yes (do use a knowl) or no (do not use a knowl, present content normally). For example, <knowl remark="yes"/> would make every remark-like element occur as a knowl where the content is first introduced. Note that these are distinctly different than cross-reference knowls. For more detail see .

    This table gives the various attribute names, the default value, and an indication of the elements affected. Note that some items are automatically born knowled (e.g. footnotes) and so there is no option to control that behavior. Also, items such as figure, when included in a sidebyside are not influenced by the relevant option and are not born knowled. There are four flavors of exercise and so four options. A hint, answer, or solution is automatically knowled as a plot-spoiler where the author is expecting the reader to do something. In contrast, an example-like is expository, so the knowlization is configurable.

    Knowlization options Attribute Default Element(s) theorem no theorem, lemma, proof yes proof definition no definition example yes example, problem, example-solution yes hint, answer, solution project no project, activity, task no task remark no remark, note, objectives no objectives outcomes no outcomes figure no figure table no table listing no listing list no list exercise-inline yes within narrative exercise-divisional no inside exercises division exercise-worksheet no inside worksheet division exercise-readingquestion no inside readingquestions division
    HTML Tabbed viewer tabbed viewerHTML HTMLtabbed viewer

    The /publication/html/exercises element can have a tabbed-tasks attribute. The value is a space-separated, or comma-separated, list of types of exercise or PROJECT-LIKE. The values in this list come specify up to four of the five possible types of exercises: divisional, inline, reading, project. Note that exercises inside a worksheet are explicity ineligible. See for careful descriptions of these types.

    HTML Platforms platformHTML hostHTML online platforms

    The /publication/html/platform element can have an attribute host with values:

    • web: the default, meant for self-hosting with no server configuration, features, or assumptions
    • runestone: output meant for hosting on a Runestone server ()
    Here platform refers to the server where the HTML output will eventually be hosted. The effect is to create minor variations in the output to take advantage of extra features of the indicated platform.

    Portable HTML platformHTML portableHTML portable html

    To limit the number of files and directories created by the HTML conversion, you can set the /publication/html/platform/@portable attribute to the value "yes". This will result in the HTML using hosted CSS and Javascript files, rather than including them adjacent to the rest of your output. This is especially useful in conjunction with setting the chunking variable to 0 to get a single html file.

    HTML Style (Theme) styleHTML themeHTML

    The /publication/html/css element can have a theme to specify the theme used to style the pages. See for examples of what different themes look like. Depending on the theme chosen, there may be other attributes that can be set. See below for details.

    The legacy stylesheets are still available. Any publication file that references html/css/@style will use the corresponding legacy style sheet (default, crc, wide, oscar-levin) as well as the colors selected for it. However, the full range of configuration is no longer available. If your publisher file mixes legacy style parts in an unexpected way (toc="crc" but sidebar="wide") you will get one or the other complete style.

    New themes other than default-modern require a build step involving node.js. If node is not installed (try node --version to check), following the directions in . If you are using the pretext/pretext script, you will need to, one time, run npm install in the script/cssbuilder directory (this step is done automatically if you are using the CLI). After this initial setup, the build script will automatically be invoked when you build a document.

    To rapidly test out different themes and options while using the CLI (see ) you can use pretext build --theme to rebuild the theme without a full book rebuild. If you are using the pretext script (see ) you can use the flag -c theme. Note that doing this assumes the HTML needed for the different themes is the same. This should generally be the case, but if you encounter odd rendering issues you should do a full rebuild.

    Theme attribute options
  • default-modern

    The following attributes can be set on CSS to modify the appearance of default-modern:

    • palette controls the colors used. Options include: "blue-red", "blue-green", "green-blue", "greens", and "blues".
    • primary-color override the primary color set by the palette. This, and all other color attributes, can be in CSS color format (hex, rbg, hsl).
    • secondary-color override the secondary color set by the palette.
    • provide-dark-mode can be set to "no" to disable dark mode on the theme. This may be desirable if the work has significant elements that do not render correctly with a dark background and you are not able to modify them to do so.
    • primary-color-dark override the primary color used in dark mode.

  • tacoma, greeley, boulder

    The following attributes can be set on CSS to modify the appearance of tacoma, greely, and boulder. They function in the same way as the corresponding attributes for default-modern.

    • primary-color
    • primary-color-dark
    • provide-dark-mode

  • salem, denver

    The following attributes can be set on CSS to modify the appearance of salem and denver.

    • palette controls the colors used. Options include: "bold", "bold2", "primaries", "primaries2", "ice-fire", "earth-sea", "leaves", and "slate".
    • color-main override the primary color set by the palette.
    • color-do override the color used for elements that ask the reader to do something (e.g. an exercise).
    • color-fact override the color used for elements that present a fact (e.g. a theorem).
    • color-meta override the color used for elements that provide meta information to the reader (e.g. goals, remarks).
    • provide-dark-mode - see default-modern.
    • primary-color-dark - see default-modern.

  • Finally, if you wish to do development on a custom theme using SCSS, you can set /publication/html/css/@theme to "custom". If you do so, you need to also set entry-point to be the path to an SCSS file that will be used to build the theme. This path should be relative to the xml file that is your document root.

    HTML Search search searchnative searchGoogle

    The /publication/html/search element can have the following attributes:

    • variant: a string specifying how search queries are handled. Possible values are textbook, reference, default and none. For historical reasons, using the value default is synonymous with using textbook, so it is not necessary. If you do not specify this entry, then that is equivalent to setting the value to textbook. This is search provided natively.
    • google-cx: a Google cx number, gained from configuring search for a site. Setting this attribute to a non-empty string is the signal to add the relevant code for a search box in the masthead.
    Note that if you elect both native search and Google search the two search boxes will overlay each other and one will not be usable. See and (respectively) for more.

    HTML Video Embedding videoembedding privacyvideo

    The /publication/html/video element can have the following attribute:

    • privacy: allowed values are yes or no.
    Setting this to yes (the default) prevents certain tracking cookies from being used. Currently only supported for videos from YouTube. See for more.

    Short Answer Responses short answer exercisesresponse area

    The /publication/html element can have an attribute short-answer-responses with values:

    • graded: the default, only show an area for responses when they can be graded or scored (such as when hosted on Runestone, ).
    • always: include an editable response area, even if it cannot be submitted for feedback.
    See for details.

    <latex/> Asymptote <q>Click to Enlarge</q> Links Asymptote linksHTML HTMLAsymptote links

    The conversion to HTML can provide a Link to full-sized image link below each Asymptote graphic. The /publication/html/asymptote/@links attribute can have the value yes to produce links, or the value no to not create links. Note that a base URL must be set for this feature to be functional (). The default is no. See for more detail.

    HTML Feedback Button HTMLfeedback button feedback buttonHTML

    The /publication/html/feedback element requires an href attribute that is a complete URL. The content of the element is optional, and will provide alternate text for the button. This alternate text should have no markupjust text. See for explanations, details, and a caveat.

    HTML Navigation Options HTMLnavigation navigationHTML

    The /publication/html/navigation element can have the following attributes:

    • logic with values linear (default) and tree.
    • upbutton with values yes (default) and no.
    See for explanations and details.

    HTML Table of Contents Options HTMLtable of contents table of contentsHTML

    The /publication/html/tableofcontents element can have the following attributes:

    • focused with values no (default) and yes. Enabling a focused TOC makes the TOC expandable/collapsible and initialliy hides TOC items not on the path to the active webpage.
    • preexpanded-levels with values 1-6 (0 is the default). This value controls how many levels from the root of the TOC are initially expanded outside of the path to the current page. Either 0 or 1 will result in the root level of the TOC being expanded (it is on the path to the active page and thus always is expanded). 2 will result in the first two levels of the TOC being visible (e.g. parts and chapters or chapters and sections). 3 would result in three initially visible levels (e.g. parts/chapters/sections), etc...
    See for explanations and details.

    xref Options xrefpublisher options

    The /publication/html/cross-references element can have the following attributes:

    • knowled with values maximum (default), never and cross-page. maximum will render xref's to structural elements as HTML links and xref's to smaller elements as knowls. never forces all xref's to be rendered as traditional HTML links. cross-page bases the rendering decision on if the xref and its target are on the same page. If so, the xref is always rendered as an HTML link. If the link and target are on different pages, the behavior is the same as maximum
    See for explanations and details.

    Embed Page Button embed page button

    The /publication/html element can have an attribute embed-button with values:

    • no: the default, do not display button.
    • yes: show a button in the navigation bar, that when clicked, displays a popup allowing the user to copy an iframe code snippet to paste into their website or LMS.

    Interactives Options publisher optionshtml interactives

    The /publication/html element can have an attribute design-width with an integer value. This will be used as the base value for converting the percentage based widths of an interactive into a pixel values when that is required. The default value is 600 (100% width is 600px).

    The /publication/html/interactives element can have an attribute resize-behavior that is used to control how interactives respond to window resizing. Possible values are:

    • fixed-height (default): interactives will maintain their initial height as the window size changes. When the content becomes too wide to display, a horizontal scrollbar will appear.
    • responsive: interactives will resize dynamically as the window size changes to maintain their aspect ratio.
    In addition to this global setting, you can add child elemements to /publication/html/interactives to set the resize behavior for specific types of interactives. Each child element should be named after the interactive type (e.g. geogebra or desmos) and have a resize-behavior attribute with the same possible values as above. Settings on these child elements will override the global setting for that specific interactive type. Known interactive types that can be specified this way are:
    • calcplot3d
    • circuitjs
    • d3
    • desmos
    • doenetml
    • geogebra
    • iframe
    • javascript
    • jsxgraph
    • sage

    Reveal.js Slideshow Options reveal.js slideshow publisher options publisher optionsreveal.js slideshow

    See for a more general overview of this conversion.

    Reveal.js Appearance publisher optionsreveal.js appearance

    The /publication/revealjs/appearance element can have the following attributes:

    • theme: the base name of a file that is a reveal.js theme. (See the reveal.js documentation for available themes.) For example if the desired theme/CSS file is css/theme/solarized.css, then set the value of this attribute to solarized.
    • custom-css: a string separated list of custom css files to load. These may be local files or remote URLs. For local files, it is recommended to place them in the external files directory so that they are automatically copied from your source folder to the output directory. (Refer to for more information on external files.)

    Reveal.js Controls publisher optionsreveal.js controls

    The /publication/revealjs/controls element can have the following attributes:

    • backarrow: for the visibility of a back arrow. Values are faded, hidden, or visible. The default is faded.
    • display: for the overall visibility of controls. Values are yes or no. The default is yes.
    • layout: for the location of the controls. Values are edges or bottom-right. The default is bottom-right.
    • tutorial: for animation of suggested navigation arrows. Values are yes or no. The default is yes.

    Reveal.js Navigation publisher optionsreveal.js navigation

    The /publication/revealjs/navigation element can have the following attribute:

    • mode: for the arrangement of the navigation through slides. Values are default, linear, or grid. The default is default. The value default refers to the default mode of Reveal.js and is synonomous with grid. In other words, the choice of default or grid results in identical behavior.
    See for more explanation of the two different navigation modes.

    Reveal.js Resources publisher optionsreveal.js resources

    You may wish to host the reveal.js CSS and javascript files locally or obtain them online. Be sure to read in about the necessity of providing the complete MathJax library if your document has mathematics and you opt for local resources.

    The /publication/revealjs/resources element can have the following attributes:

    • host: The values local and cdn will retrieve various Javascript and CSS files (such as the theme) relative to the slideshow HTML file or from an online Content Delivery Network (respectively). PreTeXt will maintain a link to a current, updated, CDN version and this will change without notice. This attribute may be given a URL or a local path, though this has not been tested, so should be considered experimental.

    EPUB Options EPUB publisher options publisher optionsEPUB

    These options are specific to a conversion to EPUB. But because an EPUB file is a compressed archive of HTML files, many of the options in can have an effect. See for a more general overview of the conversion to HTML.

    EPUB Cover Image EPUBcover image cover imageEPUB

    The /publication/epub/cover/@front attribute has a value that is a path, relative to the external directory of the managed directories scheme (see ), that is an image to be used as a cover for the EPUB. See for more.

    Source Options source publisher options publisher optionssource Directory Management

    Two directories of additional files need to be specified, as paths relative to the main source file, in order that they can be managed automatically for the construction of various output formats. Study carefully for the exact details. To set these directories, the /publication/source/directories element must have the following two attributes:

    • external: a directory of files produced independently of your project.
    • generated: a directory of files produced automatically via tools, from aspects of your source.
    It is an error to only specify one of the two directories. It is all or nothing.

    Versions

    Different versions of your source can be constructed by marking elements as belonging to different components. Each component has a name of your choosing, and then you elect components to include or exclude via the publication file. See for the exact details and examples.

    To specify components to include, the /publication/source/version/@include attribute should be a space-separated list of component names. For example, if version has include="videos labs" then a version would be created that includes all of the videos and all of the labs (since the author placed them into these components), but would not contain any elements whose component is genome. Note that videos, labs, and genome are names peculiar to the organization of your project, and are not element names (even if they are used consistently with similar element names, such as video).

    Extras

    Some source material is optional, and may be included based on the publisher and the audience. The values of the attributes below are filenames. They could be absolute paths (which is not very portable, and so likely a bad idea), or relative paths. In the latter case, they are relative to the source file that contains the pretext element (the main file if you have modularized your source). Temporarily using an absolute path can be useful when you are having problems with any of these files and want to eliminate one variable while debugging.

    The /publication/source element can have the following attributes:

    • customizations: A filename for a structured file of custom elements, each with a name attribute and content meant to be substituted into source. See for details about the use of customizations.
    • private-solutions: A filename for a structured file of hint, answer, solution that will see limited distribution (for example, instructors only). See for details about the use of a private solutions file.

    <webwork/> Options WeBWorK publisher options publisher optionsWeBWorK

    exercises in a project can be processed in two ways: using a local copy of pg, or using a webwork2 server. The variables here control which method is used where, and how it is used. These are also discussed in .

    See for publisher file attributes that control 's dynamic behavior in HTML.

    Static Processing

    The attribute /publication/webwork/@static-processing can have value webwork2 (the default) or local. When exercises are processed to make static representations, this is the method that will be used. Either communicating with a webwork2 server or a local copy of pg. The fastest processing happens if you use local. See .

    PG Location

    The attribute /publication/webwork/@pg-location gives the absolute file path to a local copy of the pg repository, for when static processing is local. The default value is /opt/webwork/pg. See .

    Server

    The URL to the webwork2 server is in the attribute /publication/webwork/@server It should include the protocol (e.g.http or https) and not include a trailing slash. The server should be version 2.16 or later. The default value is https://webwork-ptx.aimath.org. See .

    Course

    The name of the host course on the webwork2 server is in the attribute /publication/webwork/@course The default value is anonymous. See .

    User

    The username that signs in to the host course to process exercises is in the attribute /publication/webwork/@user The default value is anonymous. See .

    Password

    A password (for the host user in the host course) is in the attribute /publication/webwork/@password The default value is anonymous. See . (If the webwork2 server is version 2.18 or earlier, instead of password, there should be both coursepassword and userpassword.)

    Task Reveal

    The attribute /publication/webwork/@task-reveal is used to control how tasks in a multi-task exercise are made available to the reader. This applies to live interactive renderings of the exercises, either in HTML, in , or otherwise. Possible values are:

    • preceding-correct (all preceding tasks must be correctly answered before the next is available)
    • all (all tasks are available)
    See .

    ================================================ FILE: doc/guide/publisher/publisher-faq.xml ================================================ Publisher FAQ: Frequently Asked Questions

    This is a list of answers to frequent questions, in no particular order.

    1. Why does the conversion to HTML use a fixed width for the text?

      There is an optimal number of characters per line for human readers, based on research and centuries of book design. So we set a fixed width such that the default font comes close to achieving this optimal value. We also use responsive design to accomodate the constraints of a small screen as best as possible. A reader will not want to have to carefully resize a browser window to achieve the optimal width, nor should a line of text spread to many, many characters across a very expansive screen. See Principle.

    2. I do not want my examples in knowls (nor my inline exercises, nor proofs)

      You can change that! See .

    3. Knowls are fantastic! Can I have more?

      Start at and follow a cross-reference to details on the various options.

    4. Why are my knowls empty?

      When viewing the HTML version on your laptop or local computer as files, do not expect knowls to render properly. This is a known bug/feature, and there is nothing to be done about it, unless you run a web server on your own machine, which fortunately is a very easy thing to do (see about testing HTML output locally). Think of it this way: the knowl content comes from a server, but on your laptop there is no web server. You are just looking at files.

      A possible added confusion is that some knowls, such as proofs, will appear. That is because their content is embedded in the page, not taken from a file.

    5. How can I change the colors in the HTML version?

      Start at to learn about how to specify alternate styles for HTML output, including an easy way to specify an existing alternate color file.

    6. Something looks wrong in the HTML output. How can I customize the layout of the HTML version?

      If there are some anomalies in the HTML version of your book, probably that was just an oversight and can be fixed easily. Send a message to pretext-support@googlegroups.com describing the problem and including a live link to the page showing the error. Do not make a minimal example. (CSS issues are handled in a completely different way than other software issues.)

      The long-term plan is to have a variety of different layout options, which can be chosen as easily as choosing a color scheme. See Principle. The first step is to rewrite the current CSS so that it is easy to develop alternate layouts. That should be done by the end of Spring, 2018. Then people can develop new styles! Until that happens, either suffer with the current style, or hack away at your own peril. (Note that the support groups will not provide any help with hacking the layout, but a lot of help will be available when it is time to develop alternate layouts.)

    7. Why does the HTML output load so many external resources?

      The subtext perhaps being, Why shouldn't I host these on my own server? A main goal for is to spare authors the headaches of learning new technologies just so they can get their content in front of readers. That knowledge should be built into software, so an author can work at a higher level, explaining the intricacies of their discipline. So we only assume an author can place locally-built HTML output onto some public server they have permission to use. Any extra enabling techology we do not want to create ourselves gets pulled from other public servers. MathJax, both code and fonts, is a good example, as one of the enabling projects. Perhaps it is the enabling project.

      This way,

      • Authors can concentrate on their writing, not updating services on their server.
      • Servers that are hostile to ad-hoc configurations (think learning management systems) are not an impediment to hosting projects.
      • For the most part, updates to external resources happen automatically. This allows authors and developers to concentrate on other aspects of their work.

      We get MathJax from a content delivery network (CDN). Once we have that dependency, then fonts and search from Google, CSS and Javascript from the American Institute of Mathematics, and other components, all have the same dependency: a decent internet connection. Our experience over several years is that these resources have good uptimes and good bandwidth, and so are not a source of problems. A good offline version, with resources packaged via a script, would be a good long-term project.

      Finally, we do not load minor resources indiscriminately. Something in your source should suggest they are necessary and we perform those checks, document-wide. However, since a cross-reference is usually implemented as a knowl, and we cannot be sure what a knowl might contain, we do tend to load resources on every page, even if only needed once. We hope to improve this situation. And you are enouraged to help if you have technical skills in these areas.

    8. Searching my <init>PDF</init> output is broken

      goes to great lengths to make a high-quality PDF, but if you manipulate it by adding in new pages, or adjust the intermediate to use other fonts, you run the risk of breaking some of the features.

      A ligature is a combination of two characters into one, like a lower-case f followed closely by a lower-case i without a dot. These can confuse a search. Verbatim text sometimes ends up with smart quotes, where left and right versions are inverted. This frustrates copying source code into an actual program. And so on. If you see problems like this with un-customized PDF output, we would like to hear about it.

    9. My LMS breaks my HTML

      Suppose your HTML output seems to work fine, but once you place it inside your university's Learning Management System (LMS) it no longer works very well.

      A likely culprit is that your LMS is adding material to your files, ruining them in the process.

    10. I get a bad line break in HTML with a hyphen between text and mathematics

      When you author something like <m>x</m>-axis the code produced by MathJax may allow a web browser to break a line just before the hyphen. Yes, this looks very bad. No, it is not a problem can easily solve. So we will wait for MathJax and web browsers to do a better job. You might let us know when this happens?

    11. My publication file (or other auxiliary file) does not seem to be effective

      Does the filename, or any other directory in the complete path to the file, have a space in it? A common culprit might be My Documents on Windows. If so, the failure is likely our fault. Doing a test where you move your project someplace clear of filenames or directory names with spaces would be a big help to us. And then a careful report of the offending situation will let us make a fix for the next author or publisher. Thank-you.

    12. Should I edit the <latex/> file created to make a <init>PDF</init>?

      See and especially the contained .

    ================================================ FILE: doc/guide/publisher/runestone.xml ================================================ Conversion to Runestone

    Runestone Academy is a textbook hosting system originally designed for HTML textbooks about computer science. It is similar in design and goals to , but is also complementary in important ways. In particular, Runestone excels at providing very interactive versions where student work in the textbook can be graded (automatically or manually), scores recorded, and that information can be viewed by an instructor. Any instructor can easily spin-up an instance of your book for their course, hosted at Runestone Academy at no charge to the school or to the students. Could not be easier.

    About Runestone Academy

    Runestone textbooks are designed around interactive activities and active reading. We are very far along in the process of exposing these capabilities via markup. Publicly-accessible Runestone servers are available at Runestone Academy.

    • Every feature of the usual HTML output should function identically on a Runestone server.
    • We have designed markup for the various types of problems available in Runestone: True/False, multiple choice, Parsons problems, matching, clickable area, (basic) fill-in, and ActiveCode programming exercises. Hosted on Runestone, readers have their responses graded and get instant feedback, plus their results are saved at the site. For other HTML output, hosted on your own server, these problems are automatically graded and the reader gets instant feedback, but of course, responses and scores are not saved anywhere. Please see for details of these exercises and their markup.
    • Any exercise authored in can be electively rendered as a Runestone short answer question, when the Runestone platform is targeted as the host. A student can use notation in formulating their answer, and Runestone will provide the instructor an efficient interface for reviewing student responses, provide feedback, and assign scores.
    • Every feature described for an exercise is also available for PROJECT-LIKE, and for individual terminal task within these structures.
    • As much as possible, non-interactive versions of these problems will render in less-capable formats, like PDF, EPUB, and braille.
    • A program element with the attribute interactive set to activecode (even outside of a an exercise) will be realized as a Runestone ActiveCode interactive program, where programs can be edited, compiled, and run. In some cases a CodeLens interactive trace utility is also available. The language must be set. Supported values for the language when hosted at Runestone are: python, python3, c, cpp (C++), javascript, java, kotlin, octave (Matlab), sql, and html. When hosted on your own server, python, javascript, sql, and html, are supported with in-browser routines. So you do not need to configure anything server-side for this capability. See subsections of for details.
    • Similarly, a program element with the attribute interactive set to codelens (even outside of a an exercise) will be realized as a Runestone CodeLens interactive program. This allows a reader to step through the program, much like in a debugger, but with more informative displays of the intermediate state of the program (and nothing like breakpoints or changing variable's values). This ability varies by language, and by hosting location. See subsections of for details.
    • All of the interactive exercises on a Runestone server can be worked by a student at the location in the book where they were authored, or a student may use the interface provided by the server (the assignment page) to locate exercises assigned by an instructor, at a location disjoint from the text itself.
    • Additional activities are available when your book is hosted on a Runestone server, such as peer instruction. For example, you may choose an exercise, typically multiple-choice, for all the students to answer in class. Then the server can pair up students with different answers to discuss their responses before any more is know about the solution. This can be done through a chat window for a class where moving around is difficult.
    • Students and instructors are provided extensive reports on progress.
    • Instructors may download a spreadsheet of scores at any time.
    • If you preview some books in Runestone's library, you will notice the use of ethical advertisements. This, along with donations, is how Runestone can offer free hosting to authors and courses. Once a student logs in as a member of a course, advertisements are no longer shown. So do not let an aversion to online advertising dissuade you from making courses possible on Runestone.
    • Interactive exercises may not function fully inside of knowls. This bug is being tracked at GitHub #1983.

    We will not attempt to duplicate Runestone's documentation here. Visit the Runestone Academy site to learn more about all the features designed for hosting your textbook for everybody's courses.

    Publishing to Runestone Academy

    The usual HTML output () only needs minor modifications to run profitably on a Runestone server. You accomplish this via a publication file (). The absolute simplest publication file to accomplish this is <publication> <html> <platform host="runestone"/> </html> </publication> (See .) Then perform the usual steps for a conversion to online HTML, as described in but also be sure to specify the correct publication file. The output should appear like a usual document, but will now include a new menu on each page. This has options which allow a reader or instructor to interact with the Runestone server, once hosted there. So it will not look entirely right when you view it locally, since you are not a Runestone server, but you should see subtle differences.

    While this HTML may be manually deployed to any Runestone server, authors who wish to publish their work on the Runestone Academy server have a few more requirements.

    • Hosting on Runestone assumes certain details conform to how a project is organized for use by the CLI (). So if you are managing your project with the CLI already, you are in good shape. If you did not create your project using pretext new, run pretext init to get started upgrading. You will also need to make your project available to the public via GitHub (instructions below).

    • Copy the publication file you usually use for your html-format build target and name it as publication/runestone.ptx (or something similar that makes sense in your project). Edit this file so your html element matches the example at the start of this section.

    • You should create a new <target name="runestone"></target> in your project.ptx. The contents of this tag will differ from your usual html-format build target in the following ways. 1) You should change your publication to point to the new file you just created, perhaps named publication/runestone.ptx. 2) You should change your output-dir to point to published/document-id, where document-id is defined in your docinfo. Note Runestone's preferred practice for the document-id is to have a simple lowercase string with no dashes or other special characters. This value is visible to readers who want to register for your course on Runestone outside of any formal setting.

    • Update the docinfo section of your book so that it includes a blurb with a shelf. The blurb should not contain any additional markup, just a simple string, that describes your book. Think of something like what you would read on a book jacket. It might even also be used automatically in the future for exactly that: a blurb on the back cover of a hardback book. So keep it simplestraight ASCII text, nothing fancy. The shelf tells the Runestone software where your book belongs in the categories on the Runestone library page. Look at the Runestone library page to see what values are in use and copy an existing one exactly including capitalization. If you think a new shelf is necessary in the library, please seek advice on what to use.

    • Use pretext deploy on the command line, or simply git push the changes described above to GitHub if you are comfortable with git. The deploy command will walk you through setup if you have not deployed your project to GitHub before. You do not have to enable GitHub Pages unless you want to. (GitHub Pages does not have the features of a Runestone server, and will not render a build for the Runestone target properly. You can host your regular html-format build on GitHub.)

    • With Runestone Academy and the author interface you can see a draft of your book on author.runestone.academy When you are ready you can make a published version of your book available with the click of a button. We can set up access to the author interface when you open an issue (in the next step) requesting that your book be added to Runestone Academy.

    • Log into GitHub and open an issue at to request that your project be added to Runestone Academy. Be sure to provide the URL of your GitHub repository (e.g. https://github.com/UserName/repo-name/). Runestone Academy administrators will communicate with you via GitHub to complete this process. When your book is first added to Runestone, it will clone your repository and build from your default branch. The default branch is configured on GitHub and is usually main or master but can be anything. However if you change your default branch after your book is added to Runstone you will need to get in touch with the Runestone Academy administrators to get them to re-clone your repository.

    The Author Interface Author Interface Basics

    The author interface is a web-based interface that allows you to manage your book on Runestone Academy. It is designed to be easy to use and provides a number of features to help you manage your book.

    When moving your book to Runestone Academy we will clone your repository to our server. We do this one time, after that we use git pull to get the latest changes from your repository. This means that you can make changes to your book on your local machine and push them to GitHub, then use the author interface to pull those changes into Runestone Academy and rebuild your book. Ideally your document-id and the name of your repository are the same.

    Configuration Tip

    If your document-id and repository name do not match, then you will need to update the Path to existing repo in the author interface metadata before you build your book. This should not be a GitHub URL, it is just the name of your GitHub repository (see ).

    If your book has already been cloned on Runestone, then you cannot clone it again. If you think you have a use case where this is absolutely necessary please reach out to someone on the team to talk about it.

    The author interface is available at . You can log in with your Runestone account. Once you have logged in you will see a list of your books. You can click on the book title to to edit metadata about your book. The author interface is also where you can build a new version of your book, see some analytics about your book, and publish your book to the Runestone Academy servers. You can even get an anonymized data set from a large sample of the classes using your book.

    The author interface main page

    The author interface lets you pull changes from GitHub and rebuild your book.

    The main page of the author interface gives you access to all of the different functions. Clicking on the build button pulls the latest source from GitHub and builds your book. If you have a large book this can take a few minutes. When the build is complete you deploy your book to the runestone servers. You will see the build status change at the bottom of the page. If there is a failure for any reason you can usually see the cause by clicking the button to view the latest log.

    Another feature of the author interface is to provide you with some analytics. This page shows you the number of students that have enrolled in a course using your book year to date. It also shows you usage patterns for the book by the week of the course. You can click on any of the shaded cells to drill down and see how students are viewing the sections of each chapter.

    Some example analytics for your book

    An impact report for Foundations of Python Programming

    The Analytics are in their early stages so we encourage you to contact us with ideas for what kinds of data you would find useful.

    If you click on the book's identifier you will be able to edit metadata about the book. This is reflected in our library page so you can change the shelf section or update the blurb that describes your book to an audience. The Available for courses and Visible to Everyone in the Library checkboxes allow you to control the visibility of your book. If you are in the early stages of development you probably do not want others to see the book, but you can always view it via a direct link. When you are ready to make your book available to the world you can check the Visible to Everyone box and your book will appear in the Runestone Library. When you are ready to let others create a course around your book you can check the Available for Courses box. This will allow others to create a course using your book as the textbook. You can always change these settings later.

    Editing a book's metadata

    Editing metatdata about a book

    Advanced Author Interface

    The author interface also provides a number of advanced features to address the following scenarios:

    • Your repository and your document-id do not match.
    • Your repository is structured so that your project.ptx file is not in the root of your repository.
    • You have a single repository with more than one book.
    • You want to produce multiple books from a single repository using the PreTeXt versions feature.

    If your repository name and your document-id do not match you will need to fill out the the path to an existing repository field so that it matches what you checked out from GitHub.

    If your repository is structured so that your project.ptx file is not in the root of your repository you will need to configure the path to the project.ptx file. This is done by filling in the field for the path to the project.ptx file. This should be a relative path from the root of your repository to the project.ptx file.

    If you have a single repository with more than one book you will need to do the following steps.

    1. Create a new book for book number 1 on the main author page using the GitHub URL to your repository.
    2. Make sure you have a target in your project.ptx file for this book and it is configured to use the publication file you created for Runestone.
    3. Edit the metadata for your book in case any of the other advanced configuration situations apply.
    4. To create book number 2 on the main author page use the path to an existing repository field. This should be /books/<your-repo-name>. Leave the GitHub URL field blank.
    5. Depending on how your repository is structured you may need to make sure you have a second target for the second book with a different output folder configured and a different document-id. Alternatively you may have an entirely separate project.ptx file for the second book in a different folder of your repository. In this case you need to fill in the field for the path to the project.ptx file.

    If you have a single repository and want to build two books using different versions then the process is the same as above, but you will need to have a second publisher file with the appropriate version information so that you will get a different output. This includes using the component on the document-id element. This will allow you to have two different books in the same repository with different document-ids.

    ================================================ FILE: doc/guide/publisher/slides.xml ================================================ Conversion to Slides slides

    As discussed in and , support is available for authoring slideshows in . Currently, slideshows must be authored explicitly, but we hope to eventually support annotating books and articles to export appropriate content as slides.

    Reveal.js

    To create a reveal.js slideshow using pretext, start by creating a new project as follows.

    pretext new slideshow

    You will notice a few differences from a standard project. In the project manifest, the format is custom, and there is an xsl tag that points to a custom xsl stylesheet in the xsl folder of the project. This will import the correct reveal.js stylesheet. After authoring your slides, you can build them with the following command.

    pretext build web

    To use xsltproc, run this to produce a Reveal.js slideshow: xsltproc --xinclude -o path/to/output/slides.html --stringparam publisher path/to/source/publication.xml path/to/pretext/xsl/pretext-revealjs.xsl path/to/source/slides.xml

    Reveal.js supports themes that affect the overall appearance of a slideshow. So in you can specify the name of theme in a publication file. See for details.

    You might assume that your slideshow will be presented with the internet available, perhaps in a classroom, and will be updated for use the next semester. Or maybe you are presenting at a conference where you do not want to trust an unfamiliar internet connection, and you will later host an archival version of your presentation on your website and you want it to just work ten years from now. So you can configure your slideshow to obtain resources from a Content Delivery Network (CDN) online, or you may arrange to copy the necessary files from reveal.js and store them locally (your hard disk, your website). See for details on specifying these options, and see below for directions on how to organize the Reveal.js support files.

    Reveal.js will render syntax with MathJax, entirely similar to how MathJax is used in the conversion to HTML. This is accomplished with the Reveal.js math plugin, which is loaded automatically as part of your output. When you specify that resources come from a CDN, then this plugin will also get MathJax from a CDN. When you specify that resources are available locally (your hard disk, your website), then the plugin itself will be obtained locally, but MathJax will still be obtained from a CDN. So a local version may only be practical if you are careful not to include any mathematics in your document. (Reveal.js can be configured to use a locally installed copy of MathJax, but we have not provided any support for this scenario.)

    We are not enthusiastic about PDF as an electronic format. But it might be a good choice as an archival format. So exporting your slideshow to a PDF could be a good choice for a long-term archive. On 2020-08-01 Andrew Rechnitzer suggests the decktape node (Javascript) program. The reveal plugin works well once you settle on a resolution (the -s option). The generic plugin, along with the default key action (ArrowRight) can capture the behavior of slides built using the pause attribute. Note that the grid option (see below) may not always work well for printing all slides, while default creates slides that decktape steps through properly. A local web server can also be employed to serve up the slides, see .

    Navigation Mode

    Reveal.js has various options of the visibility of arrows a presenter can click on in order to move through a presentation. The visibility of these can be controlled via options in the publication file. See .

    Reveal.js imagines slides laid out on a 2-D grid. Each section gives rise to a title slide and these are organized left-to-right. Below each of these slides, arranged vertically, are the slides comprising the section. We use the attribute value grid to refer to this arrangement.

    If public speaking makes you nervous and going left-to-right and top-to-bottom nearly simultaneously means you get lost and even less confident (we've seen it), we have an option for you. The attribute value linear arranges all your slides from left-to-right. Aah, that's better. See for details on setting the navigation mode for your slideshow.

    Local Resources

    To set up a Reveal.js slideshow to run locally, you need to have certain files available locally. We describe here the exact mechanics of doing this.

    Suppose you have done the conversion, and have created a single slides.html file, which you have placed in a directory named talk. Now download or clone the git repository for Reveal.js (). This has a dist directory with four files, such as reveal.css, and also directory of themes, named theme. Copy these files and the directory to talk. Another directory in the repository is named plugin. Copy this directory to talk as well.

    This process will duplicate more files than you need. Suppose your talk is produced to use the solarized theme (), and includes some math. Then as an example of how the copying should go, and as an example of the bare minimum necessary, your talk directory should be organized as follows.

                talk
                    slides.html
                    reset.css
                    reveal.css
                    reveal.js
                    theme
                        solarized.css
                    plugin
                        math
                            math.js
                            plugin.js
                
    Beamer <latex/>

    Run this to produce a Beamer slideshow: xsltproc --xinclude -o path/to/output/slides.tex path/to/pretext/xsl/pretext-beamer.xsl path/to/source/slides.xml

    Of course, you should then run e.g. pdflatex slides.tex to produce a PDF.

    ================================================ FILE: doc/guide/publisher/web-hosting.xml ================================================ Hosting Your Online Version

    You have HTML output, and now where do you put it? A fundamental design decision is that you only need to simply upload your HTML files to a hosting service and since all the links are relative, readers should be able to read your whole book with no more effort than that from you. By design, no extraordinary configuration or privileges are necessary on the server.

    Users of the PreTeXt-CLI (Section) have access to pretext deploy, which walks users through the process of deploying their document to the free GitHub Pages service, even if they don't manually manage their Git revision history.

    Otherwise, for the choice of a hosting service you may have a fundamental decision to make. Mostly this applies to authors who are employees of an institution, yet have the freedom to control the copyright on their scholarly work. But there is information here for independent scholars and for other employees.

    • You love your institution, and plan to stay for a good long time. They have implicitly (or explicitly) supported your project with time and/or money. A URL with the insitution's domain name on a freely-accessible project is good advertising for the institution. Bandwidth is huge, IT is super reliable and helpful, all this is no-cost to you. Read the next scenario, but you have a good situation, so you might as well use it.

    • You are not really attached to your institution, and five years from now you may be somewhere else. Consider hosting your project externally, so it is not tied to your institution.

      Or maybe policy on faculty web pages, or crummy content management systems, make it difficult or impossible to host your project. Or it is buried five levels deep with an impossible URL. Point out the situation to your Provost or Dean, with examples of how other institutions do it right. Remember that your colleagues may be writing monographs and textbooks for commercial publishers, likely with institutional support, and selling their copyright. Your institution should be proud to host your project prominently. If a reasoned, rational approach does not improve the situation, then consider hosting your work elsewhere.

    If you are hosting at your institution, that is a great outcome. There is no cost to you, and everybody is happy. Lobby for a great URL, like platypus.mammal-institute.org and the rest should take care of itself. The rest of this section is about the second situation.

    To arrange hosting yourself,

    1. Purchase a domain name, it should not be a real big annual expense. Choose something professional, rather than just your name (though your name does have a natural appeal). And maybe something general enough that you can host your next book under that same domain name. The idea here is to own the domain name, so your book can move anywhere, but that domain name will always point to the book. This name should be owned and controlled by you, not your institution, not GitHub, not 5GBFree.com.
    2. Sign up for, and perhaps pay for, a hosting service that lets you point your domain name at the site.

      • Oscar Levin explains that GitHub Pages is free, super-easy to use if you already use git, and makes using your domain name (custom URL) nearly trivial. (2017-09-08)
      • Mitch Keller likes the Swift plan at A2 Hosting at about $60 annually. (2017-07-05)

    Now you are set, and control distribution of your scholarly publication. If you are bothered by the thought of having expenses while you make your work freely available to the world, then consider generating some modest income. For example, sell Google ads against your pages. (Why should this disturb anybody? I don't get it.) Or roll a small royalty into the print-on-demand version, see .

    There are a few practical details to think about. Eventually others will link to your book, and you will also release updates. First, think about creating a simple high-level directory that will be stable, short, easy to type, and easy to remember. Controlling your domain name (above) is the first step. Then consider that you may also distribute a PDF version, and you may someday write a second book. So, for example, your URL might look like:

        https://platypus.mammal-institute.org/aota/html
        https://platypus.mammal-institute.org/aota/aota.pdf
        

    For the first URL, the html directory would contain all of the HTML output, and especially, an index.html file which most any web server will serve up when the URL ends with a directory. has tools to help you with creating the index.html file.

    An improvement on the above is to have stable generic URLs for the current version, and dated, or versioned, URLs for older versions you may wish to keep in place (as a record, or for instructors who want to stick with an old version). It is a bit more work to maintain, but will lessen the frequency that an old version of your work is promoted as the last word.

        https://platypus.mammal-institute.org/aota/latest
        https://platypus.mammal-institute.org/aota/aota.pdf
        https://platypus.mammal-institute.org/aota/html-2017-08-15
        https://platypus.mammal-institute.org/aota/aota-2017-08-15.pdf
        
    ================================================ FILE: doc/guide/publisher/webwork.xml ================================================ <webwork/> Exercises exercises Alex Jordan

    You can embed exercises in your project. This requires using a webwork2 server that is version 2.16 or later. The server could be the AIM server that has been set up for this purpose, so to get started, there is no need to establish your own webwork2 server.

    Part of the process can optionally be sped up by using a local copy of the pg repository.

    PDF and other static output formats will display static versions. HTML output can have interactive exercises or display problems in static form. If the HTML book is hosted on Runestone, reader interactions can be recorded so that scores can be given to students.

    All such exercises can be archived into a file tree to be uploaded onto a webwork2 server for use in the traditional way.

    See for how to include or create problems in your source.

    Using a Local Copy of PG

    problems can be processed using a local copy of the pg repository. This can siginificanlty speed up processing time, compared with the other options that use a network connection.

    To use this processing method, clone the pg repository. The code below places it in a default location, but you could place it somewhere else. cd /opt mkdir webwork cd webwork git clone https://github.com/openwebwork/pg Note that you should end up with a verion of pg that is 2.19 or later. To check, examine the VERSION file in the root of the repository.

    Set the PG_ROOT environment variable to be the path to your copy of pg. If it is at the default location, you could run: export PG_ROOT=/opt/webwork/pg This will only define $PG_ROOT for your current terminal session, so you might also do whatever is appropriate on your system to set PG_ROOT each time a terminal session begins.

    In pg/conf/, make a copy of pg_config.dist.yml called pg_config.yml. In general you should read through all the settings and set them appropriately. At a minimum, set directories: root: to the absolute path to your clone of pg. You may need to set paths in externalPrograms: as well. And maybe more...

    For in general you should already have ImageMagick installed. Somewhere in your file system is an XML file that ImageMagick uses to control permissions. The file is named policy.xml and might be located in a place like /etc/imagemagick/policy.xml or /etc/ImageMagick-6/policy.xml. (If your version of ImageMagick is not 6, it's possible none of this is necessary. But also it should be harmless to continue.) In this file, within the policymap element, add the element: <policy domain="coder" rights="read" pattern="PDF" /> Depending on your file, you may need to replace a similar line that is assigning rights="none". Make sure that this is not within a commented out portion of the file.

    You need to have a recent enough perl version. Version 5.32 is known to work, and versions as early as 5.26 may work, but have not been thoroughly tested.

    PG also uses perl packages that you may not yet have and need to install. These may be available from Linux package distributions, and the details differ from one flavor of Linux to the next. Alternatively there is a utility called cpanm (cpanminus) that is supposed to let you manage perl module installation across Linux flavors. One important difference is that cpanm only manages perl modules. And sometimes a perl module is actually an interface between perl and some other system utility. cpanm will not actually install that system utility that it depends on and will just quit. Whereas Linux package distributions will have a more sophisticated dependency understanding, and try to install non-perl tools when needed. So you want to try to use Linux package distributions where you can. Or else use cpanm and perhaps be prepared to read the log if it fails and attempt to install some non-perl tool that a particular module depends on.

    Here is a list of all the perl modules you might need. Some are essential, and some are only needed for tools that many exercises will not use. Carp Class::Accessor Class::Tiny Data::Dumper DBI Digest::MD5 File::Copy File::Find File::Path File::Spec GD Getopt::Long HTML::Entities Locale::Maketext::Lexicon MIME::Base64 Mojo::Base Mojo::IOLoop Mojo::DOM Mojo::JSON Opcode Pandoc Perl::Tidy Pod::Simple::Search Scalar::Util Socket Tie::IxHash UUID::Tiny YAML::XS. If you don't have one of these that is needed, and you attempt to process problems using local PG processing, you will get a clear message about which module is missing that you must pursue installing it.

    Here are some Linux package collections that we think are sufficient (but please report if you find them to be insufficient).

  • Debian/Ubuntu

    liblocale-maketext-lexicon-perl, libyaml-libyaml-perl, libuuid-tiny-perl, libclass-tiny-perl, libdbi-perl, libgd-perl, libgd-text-perl

  • RedHat

    List not yet gathered. Please report if you put together a good list.

  • To try to install using cpanm, of course first you must have cpanm. Try cpanm --version to see if you have it. If not, follow installation instructions for Ubuntu, Debian (sudo apt install cpanminus), RedHat (sudo dnf install perl-CPAN), or MacOS (brew install cpanminus, requiring you first install Homebrew). Or you could install cpanm directly following these instructions.

    Once you have cpanm, you can opt to install the above modules one at a time, or all at once. Either way, it is probably adequate to install the modules as your own user. And yet we will recommend that you install the modules as root to avoid certain installation headaches and so that your system is set up to use webwork2 if that is ever desired. To install one at time, run commands like: sudo cpanm Carp. But proceed through each module listed above. This will help you clearly see if there was an issue during installation. To install all at once: sudo cpanm Carp Class::Accessor ... YAML::XS, replacing the dots with the full list of modules above.

    One known bump in the road may come with the GD module. You may need to actually install gd first, which is not a perl module. The perl GD module is the perl bridge to gd. For Ubuntu/Debian, install these packages: pkgconf, gdlib libgd-dev.

    Now in a publisher file, you can set the webwork element to have static-processing with value local (see ). If you put the pg repository in the default location, this is all you need to do. Otherwise, you also need to add the attribute pg-location with the absolute path, for example /opt/webwork/pg (see ). And when you process exercises for static representations (following ) your local copy of PG will be used instead of some remote server.

    Note that you will still need a network connection for problems in your HTML output to render as live interactive exercises.

    Configuring a <c>webwork2</c> Server for <pretext/>

    Note that the default webwork2 server for is , and this server is already configured. If you are configuring your own server, read on.

    We assume a mild familiarity with administrating a server. The version of needs to be 2.16 or later for use with .

    The only thing you need to do at the serverlevel is set the web server to use certain headers on content that is fetched. These headers tell a web browser that you are authorizing it to display content from this web server as embedded content inside pages from another web server (in particular, where you are hosting you book).

    <webwork/> 2.16 or 2.17

    In webwork2/conf/ there should be the apache configuration file webwork-apache2.4-config. This file needs to include the lines:

            
                
                    Header set Access-Control-Allow-Origin "*"
                
                
                    Header set Access-Control-Allow-Origin "*"
                
            
            ]]>
          

    Note there is the distribution file webwork-apache2.4-config.dist, which has these lines (or similar lines) commented out.

    You may also need to enable headers by executing something like sudo a2enmod headers from the command line.

    <webwork/> 2.18

    Edit webwork2/conf/webwork2.mojolicious.yml and uncomment these lines:

            extra_headers:
            #  /webwork2/render_rpc:
            #    Access-Control-Allow-Origin: '*'
               /webwork2/html2xml:
                 Access-Control-Allow-Origin: '*'
               /webwork2_files:
                 Access-Control-Allow-Origin: '*'
               /pg_files:
                 Access-Control-Allow-Origin: '*'
          

    Note the render_rpc lines can remain commented out, unless you have some other reason to uncomment them.

    You will need to restart the webwork2 service.

    <webwork/> 2.19

    Edit webwork2/conf/webwork2.mojolicious.yml and uncomment these lines:

            extra_headers:
               /webwork2/render_rpc:
                 Access-Control-Allow-Origin: '*'
            #  /webwork2/html2xml:
            #    Access-Control-Allow-Origin: '*'
               /webwork2_files:
                 Access-Control-Allow-Origin: '*'
               /pg_files:
                 Access-Control-Allow-Origin: '*'
          

    Note the html2xml lines can remain commented out, unless you have some other reason to uncomment them.

    Also in this same file, set allow_unsecured_rpc: 1. You will need to restart the webwork2 service.

    Configuring a <webwork/> Course for <pretext/>

    To make use of in your project, you need a host course. If someone is providing a server for you, like the AIM server at , then we assume they have already configured a course for use with , and you may skip this section and move on to .

    If you are configuring your own server to use with , we assume a mild familiarity with administrating a server. The version of needs to be 2.16 or later for use with .

    Using the admin course, create a course named anonymous. (You could name it something else, but we assume the name is anonymous in this guide.) In the course's Course Configuration menu, set all permissions to admin (or perhaps set some to the even more restrictive nobody). Except set Allowed to login to the course to login_proctor. Also if your server is new enough, it has Allowed to view course home page which should also be set to login_proctor.

    In the Accounts Manager(Classlist Editor in older versions of ), add a user named anonymous (again, you could use some other name), and set that user's permission level to login_proctor, the permission level one higher than student. Set that user's password to anonymous (again, you could use some other password). Note that because this is public information, anyone will be able to log into this course as this user. This is why restricting permissions in the previous paragraph is very important.

    Add the following lines to the course.conf file (which lives in the parent folder of the templates/ folder.)

          # Hide message about previewing hints and solutions for instructors
          $pg{specialPGEnvironmentVars}{ALWAYS_SHOW_HINT_PERMISSION_LEVEL} = 100;
          $pg{specialPGEnvironmentVars}{ALWAYS_SHOW_SOLUTION_PERMISSION_LEVEL} = 100;
        
    <webwork/> 2.16, 2.17, or 2.18 (not needed for 2.19 or later)

    In the templates/macros/ folder, edit PGcourse.pl (or create it if need be) and add the following lines.

            #### Replace essay boxes with a message
            my $essay_message = 'If you were logged into a WeBWorK course '
                . 'and this problem were assigned to you, '
                . 'you would be able to submit an essay answer '
                . 'that would be graded later by a human being.';
    
            sub essay_box {
              my $out = MODES(
                TeX => '',
                Latex2HTML => '',
                HTML => qq!<p>$essay_message</p>!,
                PTX => '',
              );
              $out;
            };
    
            sub explanation_box {
              return if ($envir{waiveExplanations});
              my $out = MODES(
                TeX => '',
                Latex2HTML => '',
                HTML => qq!<p>$essay_message</p>!,
                PTX => '',
              );
              $out;
            };
    
            #### Suppress essay help link
            sub essay_help {};
    
            #### How many attempts until hint is available
            $showHint = -1;
            # May be a bug that WeBWorK requires -1 instead of 0
            # for immediate access to hints
    
            1;
          

    Now will be able to communicate with this course to retrieve what is needed.

    PG Macros from the <pretext/> Source

    The project's exercises may rely on PG macros that are written into the project's source. For example, the exercises might have TikZ images that rely on docinfo/latex-image-preamble.

    For this, a PG macro library file must be built and placed in the host course's templates/macros/ folder before attempting to process the exercises. To build this macro library, run: pretext -c pg-macros aota.ptx aota.ptx in the example is the root file for your project. You could also specify a location to place the resulting macro library file: pretext -c pg-macros -d some/file/path aota.ptx

    Once you have the macro library file, upload it to the host course's templates/macros folder. If your project relies on the AIM server and you need to supply a macro library file to a host course on that server, post to pretex-support@googlegroups.com and we can help with that.

    Processing <webwork/> Exercises Extraction and Processing

    Before anything else can be done, a project with problems must first have its content extracted and processed into multiple representations, which are then collected into an auxiliary XML file. Using the CLI, this is done with pretext generate webwork (if you want to reference a particular target, add -t [targetname]).

    If instead you want to use the pretext/pretext/pretext script, you might need to install the Python requests module. It is not uncommon for your computer to not have requests installed (although it comes with the CLI), so you should check if it is there and install it if need be. You can check if it is installed from the command line with: python -c "import requests" And if it isn't, you can install it with pip, specifically with: pip install requests (If you don't have pip installed, you could use: easy_install pip to install it.)

    Processing problems is best accomplished if you are using directory management. With a publication file, declare the external and generated directories as describe in . Then use the pretext script to extract content from the server. It will be placed in a webwork subfolder of your generated folder. For example:

    pretext -c webwork -p <publisher> aota.ptx

    aota.ptx in the example is the root file for your project.

    File Paths

    In the previous example and those that follow, you should specify paths as needed. For example, the pretext script is typically at ~/pretext/pretext/pretext. And the -p option is specifying a publication file.

    -c webwork means you are processing the components.

    -p specifies the publication file (see ). In the publication file, the element webwork may have attributes:

    • server ()
    • course ()
    • user ()
    • password ()
    If absent, these default to https://webwork-ptx.aimath.org, anonymous, anonymous, anonymous, and anonymous respectively. If you specify a server, you must correctly specify the protocol (http versus https). And it must be version 2.16 or later. Do not include a trailing slash.

    HTML output

    We assume you are using managed directories, and have representations file as above. Build the HTML with pretext build TARGET where TARGET is the name of a target that has format="html". You can also use pretext/pretext to build HTML. For example:

    pretext -c doc -f html -p <publisher> -d <destination> aota.ptx

    -p specifies the publication file, as described in .

    -d specifies a folder to place all of the HTML output. If unspecified, this will be the current working directory.

    There are five publisher file entries which control how a problem is realized within HTML output. These are divided based on where the exercise (or project-like) resides: inline, within a division of exercises, within a reading questions division, within a worksheet, or if it is a project or similar. If the class of problems is declared dynamic, then each problem has a button that readers can click to make the problem interactive. Conversely, if the class of problems is declared static, then the problems render with a static preview.

    By default, inline exercises and project-like will be dynamic, under the assumption that these are meant to be worked as a reader works through the material. The others will be static, under the assumption that they will be placed on a WeBWorK server where they will be worked for scores and grades. See for the precise syntax for these switches.

    If an exercise is subdivided into tasks, then by default they will only be revealed incrementally as the reader answers each one correctly. If you would like to have all tasks revealed from the start, then this option may be elected in the publication file (see ).

    <latex/> output

    We assume you are using managed directories, and have representations file as above. Then build as normal with the CLI. Or you may use pretext/pretext to build a PDF. For example:

    pretext -c doc -f pdf -p <publisher> -d <destination> aota.ptx

    -p specifies the publication file, as described in .

    -d specifies a folder to place the PDF output. If unspecified, this will be the current working directory.

    Creating Files for Uploading to <webwork/>

    All of the webwork that you have written into your project can be harvested in such a way that you could send them to a server for use within . The components you would want are PG files for the exercises, PG macros that you wrote, set defintion files corresponding to the sections (or other chunks) of your project, and header files for those sets. All of this was placed into your project's generated/webwork/pg folder when you executed pretext -c webwork, so you could find it there and package it all up to send to your server.

    Alternativley, you may run the following:

    pretext -c all -f webwork-sets -p <publisher> -d <destination> aota.ptx

    This will specify a destination for that folder tree other than within generated/webwork/pg. If you additionally use a -z flag, you will instead get a compressed tarball (.tgz file).

    Unachievable Conversions

    By authoring problems within you do not need to learn all the ins and outs of PGML markup and you can concentrate on simply becoming proficient with . However, there are a few constructions which are not achievable in a problem for one reason or another. We list exceptions here, and also try to use source-checking tools to alert you to any differences.

    • Anything that is the numbered target of a cross-reference, such as a figure, may not be inside a exercise. The exercise may go on to have a life of its own independent of its parent project, and then such a number makes no sense.

    • Certain aspects of specifying borders of a tabular are not realizable in a PGML table. Specifically,

      • Specifying column-specific top border attributes are not implemented.

      • Cell-specific bottom border attributes are not implemented.

      • medium and major table rule-thickness attributes will be handled as if they were minor.

    • When constructing a list (ul or ol) specifying some number of columns (using the cols attribute) will be ignored. PGML markup has no way to declare multicolumn lists.

    ================================================ FILE: doc/quickref/README.md ================================================ # Quick Reference (aka "quickrefs") These "cheat sheets" are in the style of similar quick reference sheets pioneered for topical areas of Sage Math software. Two pages maximum, so they can be printed on one sheet of paper (two-sided). * `quickref-pretext.tex`: general authoring techniques, initiated by Tom Judson * `quickref-cli.tex`: basic usage of the PreTeXt CLI, initiated by Tom Judson and Oscar Levin Authored in LaTeX, given their structure, which would not be well-represented in PreTeXt. Built PDF versions are available on the PreTeXt website. If you build your own copies while editing, use `xelatex`, not `pdflatex`. Extensions, edits, and reorganization are all welcome contributions. Topics represented by additional quickrefs would also be welcome. ================================================ FILE: doc/quickref/quickref-cli.tex ================================================ % PreTeXt CLI Quick Reference % (c) 2022 by Steven Clontz, Thomas W.\ Judson, and Oscar Levin % Licensed with the GNU Free Documentation License (GFDL) % http://www.gnu.org/copyleft/fdl.html % % History % % 2012-06-15 Initial version based on Sage 9.4 % % \documentclass{article} \usepackage{graphicx} \usepackage[landscape]{geometry} \usepackage[xetex]{color} \usepackage{url} \usepackage{multicol} \usepackage{amsmath} \usepackage{amsfonts} \usepackage{textcomp} \newcommand{\ex}{\color{blue}} \newcommand{\apost}{\textquotesingle} \newcommand{\warn}{\bf\color{red}} \pagestyle{empty} \advance\topmargin-.9in \advance\textheight2in \advance\textwidth3.0in \advance\oddsidemargin-1.45in \advance\evensidemargin-1.45in \parindent0pt \parskip2pt % Section break, dictates column widths? \newcommand{\hr}{\centerline{\rule{3.5in}{1pt}}} % Adjust gap to affect spacing, page count \newcommand{\sect}[1]{\hr\par\vspace*{2pt}\textbf{#1}\par} % Mandatory indentation on subsidiary lines \newcommand{\skipin}{\hspace*{12pt}} % notation shortcut \newcommand{\Z}{\mathbb{Z}} \begin{document} \begin{multicols*}{3} \begin{center} \textbf{PreTeXt Quick Reference:\\ Command Line Interface (CLI)}\\ % Steve Clontz, T.\ W.\ Judson, and Oscar Levin \\ CLI version 2.0.0, 2023-09-12 \\ Full documentation: \url{pretextbook.org}\\ % Switch to CC? GNU Free Document License, extend for your own use \end{center} % backup over center environment gap \vspace{-3ex} %********************************************* \sect{Setup} \hr\textbf{Check requirements}\\ \underline{Note}: {\verb|python|} might be called {\verb|python3|} if you have MacOS or Linux. {\ex \verb| python --version|} : the CLI requires Python version 3.8 or later\\ {\ex \verb| pip --version|} : pip is the package installer for Python \\ {\ex \verb| xelatex --version|} : some PreTeXt features require \LaTeX \\ \hr\textbf{Install PreTeXt}\\ {\ex \verb| python -m pip install pretext|} : install PreTeXt \\ {\ex \verb| pretext --version|} : check version to verify install \\ \hr\textbf{Create a new project}\\ {\ex \verb| pretext new book|} : creates a new PreTeXt book in \texttt{new-pretext-project}\\ {\ex \verb| pretext new article|} : creates a new PreTeXt article \texttt{new-pretext-project} \hr\textbf{Update a project to use the CLI}\\ {\ex \verb| pretext init|}: creates project manifest ({\verb|project.ptx|}), and publication file ({\verb|publication/publication.ptx|}). Edit these files appropriately before proceeding. \\ {\ex \verb| pretext pretext init --refresh|}: creates new copies of project manifest and publication file to compare for new features. \hr\textbf{Upgrade PreTeXt}\\ {\ex \verb| python -m pip install --upgrade pretext|}: upgrade to latest stable release \\ \hr\textbf{Get Help}\\ {\ex \verb| pretext --help|}: show general help\\ {\ex \verb| pretext build --help|}: show help for build command. Each subcommand has its own help. % %********************************************* %********************************************* \columnbreak \sect{Basic Usage} \hr\textbf{Build a PreTeXt document} {\ex \verb| pretext build|}: Builds the project to the format of the first target in {\verb|project.ptx|}.\\ {\ex \verb| pretext build print|}: Create pdf version (assuming {\verb||}) is in {\verb|project.ptx|}\\ % {\ex \verb| pretext build print|}: Create print (pdf) version\\ \hr\textbf{Generate source images and WeBWorK}\\ If your book has any WeBWorK, latex-image, asymptote, sageplot, interactive, etc. assets will be generated on each build. You can generate separately with:\\ {\ex \verb| pretext generate|}: Generate all assets for first target in {\verb|project.ptx|}.\\ {\ex \verb| pretext generate webwork|}: Generate webwork for first target in {\verb|publication.ptx|}\\ {\ex \verb| pretext generate sageplot -t print|}: Generate sageplot for target ``print''.\\ {\ex \verb| pretext generate latex-image -x img-graph1|}: Generate latex-image with xml:id ``img-graph1'' (for first target).\\ %********************************************* \hr\textbf{View a PreTeXt document (local)} {\ex \verb| pretext view|}: Creates a local server to preview the first target in {\verb|project.ptx|}\\ {\ex \verb| pretext view print|}: Views the ``print'' target\\ % {\ex \verb| CTRL+C|} to close the server\\ %********************************************* %********************************************* \hr\textbf{Deploy to GitHub Pages} {\ex \verb| pretext deploy|} : deploys Git-managed project to GitHub Pages\\ % {\ex \verb| pretext deploy -u|} : deploys and also uploads source files\\ %********************************************* % \hr\textbf{Useful Shortcuts} % {\ex \verb| pretext build -g|}: build and generate in one step\\ % {\ex \verb| pretext build web -g latex-image|}: build web target and generate latex-images\\ % {\ex \verb| pretext view -b|}: build before you preview\\ % {\ex \verb| pretext view -g|}: generate assets before you view\\ % {\ex \verb| pretext view -bg|}: generate assets, build, and view\\ \columnbreak %********************************************* \hr\textbf{Project Manifest} The file {\verb|project.ptx|} describes your build targets. Each target has a \emph{name} (e.g. ``print-latex'') that you build or view with, e.g. {\verb|pretext build print-latex|}. Structure of a target: \begin{verbatim} \end{verbatim} {\ex \verb|format|} can be html, latex, pdf, custom, epub, kindle, or braille\\ Additional attributes:\\ {\ex \verb|source|} is the path to the root ptx document. Default: \texttt{source/main.ptx}\\ {\ex \verb|publication|} is the path to the publication file. Default \texttt{publication/publication.ptx}\\ {\ex \verb|output-dir|} is the path the the folder that will hold output. Default is \texttt{output/[target name]}\\ \sect{Recommended Project Structure} {\ex \verb|assets|}: Contains all static assets.\\ % , such as a photo at {\verb|assets/frog.jpg|} used as {\verb||}.\\ {\ex \verb|generated-assets|}: Contains the products of running {\verb|pretext generate|}. Should not be edited manually. \\ {\ex \verb|output|}: Contains the products of running {\verb|pretext build|}. Should not be edited manually. \\ {\ex \verb|publication|}: Contains your publication file(s) (e.g. \verb|publication/publication.ptx|). \\ {\ex \verb|source|}: Contains your PreTeXt source file(s) (e.g. \verb|source/main.ptx|). \\ {\ex \verb|project.ptx|}: Describes your project's targets (e.g. \verb|web|, \verb|print-latex|) and executables.\\ % {\ex \verb|README.md|}: Written description of your project.\\ {\ex \verb|requirements.txt|}: Specifies version of CLI used to build your project.\\ {\ex \verb|.gitignore|}: Specifies files not shared publicly when using Git or \verb|pretext deploy|. %********************************************* % \newpage % \columnbreak % \hr\textbf{publication.ptx} % Information about the publication file goes here. % \columnbreak % \sect{Common PreTeXt source tags} % \hr\textbf{Blocks/Environments} % Example: % \begin{verbatim} % % My Title % %

    % Statement of theorem. %

    %
    % %

    % The proof. %

    %
    %
    % \end{verbatim} % Theorem-like: {\ex\verb||}, {\ex\verb||}, {\ex\verb||}, {\ex\verb||}, {\ex\verb||}, {\ex\verb||}, {\ex\verb||}, {\ex\verb||}.\\ % Example-like: {\ex\verb||}, {\ex\verb||}, {\ex\verb||}.\\ % Axiom-like: {\ex\verb||}, {\ex\verb||}, {\ex\verb||}, {\ex\verb||}, {\ex\verb||}, {\ex\verb||}.\\ % Remark-like: {\ex\verb||}, {\ex\verb||}, {\ex\verb||}, {\ex\verb||}, {\ex\verb||}, {\ex\verb||}.\\ % Project-like: {\ex\verb||}, {\ex\verb||}, {\ex\verb||}, {\ex\verb||}.\\ % Other common blocks:\\ % {\ex\verb||}\\ % {\ex\verb||}\\ % {\ex\verb||}: a division of an exercise or project-like\\ % \columnbreak % \hr\textbf{Examples} % Examples go here. \end{multicols*} \end{document} ================================================ FILE: doc/quickref/quickref-pretext.tex ================================================ % Sage CLI Quick Reference % (c) 2022 by Thomas W.\ Judson, % Licensed with the GNU Free Documentation License (GFDL) % http://www.gnu.org/copyleft/fdl.html % % History % % 2012-06-15 Initial version based on Sage 9.4 % % \documentclass{article} \usepackage{graphicx} \usepackage[landscape]{geometry} % presumes xelatex, so other character sets behave better \usepackage[xetex]{color} \usepackage{url} \usepackage{multicol} \usepackage{amsmath} \usepackage{amsfonts} \usepackage{textcomp} \newcommand{\ex}{\color{blue}} \newcommand{\apost}{\textquotesingle} \newcommand{\warn}{\bf\color{red}} \pagestyle{empty} \advance\topmargin-.9in \advance\textheight2in \advance\textwidth3.0in \advance\oddsidemargin-1.45in \advance\evensidemargin-1.45in \parindent0pt \parskip2pt % Section break, dictates column widths? \newcommand{\hr}{\centerline{\rule{3.5in}{1pt}}} % Adjust gap to affect spacing, page count \newcommand{\sect}[1]{\hr\par\vspace*{2pt}\textbf{#1}\par} % Mandatory indentation on subsidiary lines \newcommand{\skipin}{\hspace*{12pt}} % notation shortcut \newcommand{\Z}{\mathbb{Z}} \begin{document} \begin{multicols*}{3} \begin{center} \textbf{PreTeXt Authoring Quick Reference}\\ % change review date iff there is an actual % review, not just some isolated update Version 1.0, reviewed 2022-07-27\\ T.\ W.\ Judson and others??? \\ GNU Free Document License, extend for your own use. \\ For more details, see \url{https://pretextbook.org/doc/guide/html/} \end{center} % backup over center environment gap \vspace{-2ex} %********************************************* \sect{PreTeXt Documents} For an article \footnotesize{ \begin{verbatim}
    Hello World!

    This is a PreTeXt document.

    \end{verbatim} or a book \begin{verbatim} Hello World! My Great Chapter

    This is a PreTeXt document.

    \end{verbatim} } % \sect{Structure of a PreTeXt Document} PreTeXt documents are structured and may contain divisions such as \texttt{} (for books), \texttt{
    }, \texttt{}, and \texttt{

    } (paragraphs). {\footnotesize \begin{verbatim}

    Mandatory

    First paragraph.

    Second paragraph.

    \end{verbatim} } Divisions may contain other divisions. Divisions require a \texttt{}. {\footnotesize \begin{verbatim} <section> <title>Mandatory

    Introductory text. (Optional.)

    Mandatory

    Subsection content.

    Concluding text. (Optional.)

    \end{verbatim} } %********************************************* %********************************************* \sect{Blocks} Besides paragraphs (\texttt{

    }) the most common object to include in a division, \texttt{}, \texttt{}, \texttt{

    } and \texttt{}. \sect{Cross-References} Any element that you place a \texttt{@xml:id} on can become the target of a cross-reference. For example, suppose your source had \texttt{} and someplace else you wrote \texttt{}. \sect{Mathematics in PreTeXt} Since PreTeXt has robust support for mathematical formulas. Inside the tags that delimit math environments, your code is basically \LaTeX\, with the caveat that you must be careful with \texttt{<}, \texttt{>}, and \texttt{\&} since they are special symbols for XML. When typing math in your PreTeXt code, use \texttt{\textbackslash{lt}} for \texttt{<}, \texttt{\textbackslash{gt}} for \texttt{>}, and \texttt{\textbackslash{amp}} for \texttt{\&}. For inline math, wrap things in the \texttt{} tag: $a^2 + b^2 = c^2$ is produced by \texttt{a\^{}2 + b\^{}2 = c\^{}2}. We get displayed equations via the \texttt{} and \texttt{}. (to produce a numbered equation) tags. The code {\footnotesize \begin{verbatim} \frac{d}{dx} \int_1^x \frac{1}{t}\, dt \int_a^b f(x)\, dx = F(b) - F(a) \end{verbatim} } produces \[ \frac{d}{dx} \int_1^x \frac{1}{t}\, dt \] \begin{equation} \int_a^b f(x)\, dx = F(b) - F(a) \end{equation} For a collection of equations all aligned at a designated point, use \texttt{} and \texttt{} (\texttt{} for numbered equations.). The code \begin{verbatim} x \amp = r\cos\theta y \amp = r\sin\theta \end{verbatim} produces \begin{align*} x & = r\cos\theta \\ y & = r\sin\theta. \end{align*} \sect{Images, Figures, sidebyside} Images can be included using the \texttt{} tag with the \texttt{@source}. The \texttt{@width} attribute can be used to control the size of the image. Images can be wrapped inside a \texttt{
    }. A \texttt{
    } must have a \texttt{
    \end{verbatim} } %********************************************* \sect{Lists} The structure of ordered lists (numbered), unordered lists (bullets) and description lists (defined terms) is given by the \texttt{
      }, \texttt{
        }, \texttt{
        } tags (respectively). List items are delimited with the \texttt{
      • } tag. %********************************************* \sect{Theorem-Like Elements} The tags \texttt{}, \texttt{}, \texttt{}, \texttt{}, \texttt{}, \texttt{}, \texttt{}, and \texttt{} have the same structure in PreTeXt. {\footnotesize \begin{verbatim} Optional

        Here's the statement of the theorem.

        You don't actually need a proof.

        \end{verbatim} } \sect{Example-Like Elements} The tags \texttt{}, \texttt{}, and \texttt{} have the same structure in PreTeXt. {\footnotesize \begin{verbatim} Differentiating a polynomial

        The derivative of the function f(x) = 3x^5-7x+5 is f'(x) = 15x^4-7.

        \end{verbatim} } \sect{Axiom-Like Elements} The tags \texttt{}, \texttt{}, \texttt{}, \texttt{}, \texttt{}, and \texttt{} have the same structure in PreTeXt. {\footnotesize \begin{verbatim} Optional Peano

        Here's the statement of the axiom.

        \end{verbatim} } \sect{Remark-Like Elements} The tags \texttt{}, \texttt{}, \texttt{}, \texttt{}, \texttt{}, and \texttt{} have the same structure in PreTeXt. {\footnotesize \begin{verbatim} A little remark

        This is a remark.

        \end{verbatim} } \hr\textbf{Project-Like Elements} The tags \texttt{}, \texttt{}, \texttt{}, and \texttt{} have the same structure in PreTeXt. {\footnotesize \begin{verbatim} A structured project

        Here is the introduction.

        The first step to do.

        The second step to do.

        A little wrap up.

        \end{verbatim} } \sect{Exercises} An \texttt{} in the middle of a division, intermixed between theorems and paragraphs and figures. In this case, it is labeled as a ``Checkpoint.'' You can put several \texttt{}s as part of an \texttt{} element within a division, which is the typical way for creating a collection of exercises together at the end of a division such as a chapter or section. An \texttt{} can group together a collection of exercises that have a set of common instructions. A specialized division, \texttt{}, can be used to house \texttt{}s designed to test or guide a reader's comprehension of the material in that division. It is possible to embed WeBWorK exercises into a PreTeXt document An \texttt{} has the following structure. {\footnotesize \begin{verbatim}

        The statement is mandatory.

        Optional.

        Optional.

        Optional.

        \end{verbatim} } An element we generically call a ``signal'' is an important component of an exercise if you want to add something that will be interactive in HTML and Runestone. Signals include \texttt{} for multiple choice questions, \texttt{} for Parsons (mixed up blocks) problems, \texttt{} for matching, \texttt{} for clickable area, \texttt{} for short answer, and \texttt{} for fill-in-the-blank. A True/False question simply uses a \texttt{correct} attribute on \texttt{} as a signal. The signal element usually has further structure, see \texttt{pretextbook.org} for examples and source. \sect{Worksheets} A \texttt{} is a specialized division that can be a child of most divisions and can contain most PreTeXt tags. \sect{Tables} Similar to \LaTeX\, PreTeXt provides a \texttt{
    }, and the figure will be numbered. The \texttt{} tag provides flexible options for placing several images together or combining figures with subcaptions. PreTeXt provides support for authoring with graphics languages such as Asymptote, TikZ, PGF, PSTricks, and xy-pic in addition to using Sage code to describe a plot or image. In most cases output can be obtained as smoothly-scalable SVG images, in addition to other formats like PDF or PNG. For accessibility, every \texttt{} should either have a \texttt{} child. { \footnotesize \begin{verbatim}
    a mass on a table that is attached to a wall with a spring
    A spring-mass system
    } tag and a \texttt{} tag. The \texttt{} tag is used for producing the array of data, while the \texttt{
    } tag provides the number and title. %********************************************* %********************************************* \hr\textbf{SageMath Content} A SageMath cell can be included in a PreTeXt document. {\footnotesize \begin{verbatim} 2+2 4 \end{verbatim} } SageMath can be used to created an image in a PreTeXt document. {\footnotesize \begin{verbatim}
    A cubic function on the interval [-3,2] f(x) = (x-1)*(x+1)*(x-2) plot(f, (x, -3, 2), color='blue', thickness=3) \end{verbatim} } \end{multicols*} \end{document} ================================================ FILE: examples/README.md ================================================ # PreTeXt Examples Some directories have their own `README`. This is an overview of the contents of the `examples/` directory, with the date of the last update for each entry. For several of these, sample output (PDF, HTML) is produced routinely and is available at the PreTeXt website from the "Examples" page. ### Sample Article (`sample-article/`) The kitchen sink, this attempts to have one of everything. Look around for something you need, experiment, or read the interspersed commentary on how things work. (2016-02-20) ### Sample Book (`sample-book/`) A forked version of the first three chapters of Tom Judson's "Abstract Algebra" textbook. Use this to get ideas about how to create a book --- both how to organize the content and how to organize your files. (2016-02-20) ### Minimal Example (`minimal/`) A short article. This is a good place to test a problematic construction. This is also a good vehicle for filing helpful bug reports: adjust the source and send source and output. (2016-02-20) ### Hello, World (`hello-world/`) The bare minimum, about as little as you can do and still be valid PreTeXt. (2016-02-20) ### WeBWorK (`webwork/`) Several examples of how to author WeBWorK online homework problems within a PreTeXt book. See the `Makefile` for guidance on how to build the examples. (2016-02-20) ### Braille (`braille/`) A fairly simple document to test the conversion of principal elements of a document into Braille. (2019-02-17) ### Humanities in Action (`humanities/`) Various exhibits of material authored in PreTeXt which might be of more interest to Humanities scholars. Initiated by Jahrme Risner during his Summer 2016 undergraduate research project. (2016-07-10) ### Characters, Fonts, and Languages (`fonts/`) A testing and demonstration document similar to the sample article, but focused on print and PDF output in a variety of scripts and languages. (2016-07-10) ### Pug (`pug`) Pug (nee Jade) is a Javascript template engine, which can be employed easily to output PreTeXt source. So if you prefer to format with whitespace, this could be a good choice. "Normal" output is best, but using a `-P` flag provides better formatting of the XML output for human eyes. Contributed by Harald Schilly. (2016-05-21) A subdirectory contains the original file for the Windows Installation Notes of the Author's Guide, contributed by Dave Rosoff. It needs a few fixes, and will not be maintained, but will give a good demonstration of how a substantial chunk of content could be authored with Pug. (2016-05-31) ### Letters (`letter/`) A sample letter you can adapt to your needs. See extensive comments in the source about using your letterhead. (2016-02-20) ### Memoranda (`memo/`) A sample memo you can adapt to your needs. See extensive comments in the source about using your own logos. (2016-02-20) ================================================ FILE: examples/braille/braille-test-book.xml ================================================ A Test Book Converting to Braille Robert A. Beezer Department of Mathematics and Computer Science University of Puget Sound beezer@pugetsound.edu Al Maneki Karen Herstein Preliminary Edition, Summer 2019

    This is a book designed to test conversions to Braille without too much extraneous material. We will describe here what should have been apparent on the title page. This will be expanded as we get more and more parts of the book under control. The title of the entire book is A Test Book with the subtitle Converting PreTeXt to Braille. The author is Robert A. Beezer, with editors Al Maneki and Karen Herstein. The edition is Preliminary Edition, Summer 2019. The date will change, but should be something recent. Nota bene: if the sentence above that ends with Herstein is followed by two spaces, then one will migrate to the start of a new line and appear almost like the start of a new paragraph. It seems that any number of extra characters will migrate. In contrast, any number of newlines behave just fine. So maybe pretty-printed source will avoid this fate.

    This preface should have formatting similar to a chapter, which is described carefully in . (The cross-reference to Chapter 1 should be realized very plain in print, and does not yet have any extra information in Braille.) The one difference is that a preface is not numbered, so there will be just a title, centered, followed by a blank line. We can give a preface a title, such as Preface to the Second Edition, but here we have let provide a default title.

    Title pages of print and Braille will not always match. BANA suggests a different set of items than what default uses. Also, we do not yet producing a Table of Contents for Braille. Later.

    Divisions: A Chapter Heading

    We test headings of divisions. Chapter, Section, Subdivision, Subsubdivision. Each will have a title, and each will be structured as a introduction followed by a single subdivision. This is the introduction to the chapter. In Braille, it will start a new page, have the word Chapter, followed by a number on a centered line all by itself, followed by a line with the text of the title, and then a blank line will separate the first line of content.

    The word Chapter is supplied automatically in the language of the book (French, Portuguese, etc.). But it could be omitted if the formatting (page break, etc.) is enough to indicate a new chapter.

    A Section Heading

    The introduction to the section with some extra text to run onto a new line of the BRF output that may not be indented. Since this sample book has more than 3 levels of divisions (chapter, section, subsection, subsubsection) this should have a centered heading.

    Most conversions supply the word Chapter, but omit words like Section and Subsection. BANA says to follow the lead of print. A hierarchical number will help also.

    A Subsection Heading

    The introduction to the subsection with some extra text to run onto a new line of the BRF output that may not be indented. The heading of this subsection begins in cell-5, and is a block when occupying more than one line. Since this sample book has 4 levels of divisions (chapter, section, sub section, subsubsection) this should have a cell-5 heading.

    A Subsubsection Heading

    The subsubsection is terminal, so this is the actual content of the division, rather than an introduction to a further division. The heading of this subsubsection begins in cell-7.

    However, any division may contain a construct called a paragraphs. It has a title and some content, and cannot be subdivided. We test one next. In print we use a run-in title, but that is hard to do with our tools.

    A Paragraphs Heading

    The paragraphs element is a lightweight division, which we realize much the same way as blocks elsewhere. It is a invention, so no good precedent or guidance.

    This second paragraph tests that it is correct, since we want to see just which paragraphs are contained in this structure.

    This paragraph is part of the subsubsection, and not part of the paragraphs element so should clearly be outside.

    Mathematics

    Our motivation is the automatic translation of texts in mathematics. We will do serious testing of mathematics elsewhere, but will include some here as both demonstration and for testing.

    The third sentence has some single-letter Latin variables, interspersed with Greek variables and other simple inline math expressions. The single-letter variables should be italicized. We let x equal the value of T, but not \theta nor the value of a+b, but it could also be \rho or g.

    For the previous line, x and T should be italicized (single Latin letter variable). a+b is meant to not be italicized (an expression). theta and rho should not be italicized (Greek). The last variable is a Latin g, not a Greek gamma. So it should simply be italicized, since it is a lone Latin letter as math.

    And a multi-row equation, authored as two mrow within a md and including alignment: a^2 + b^2 &= c^2 x^3 + y^3 &= z^3 .

    And a single displayed equation, but authored as a single mrow within a md, with alignment: p^4 + q^4 &= r^4 . Adjust to a single displayed equation, but authored as a single mrow within a md, without alignment: r^5 + s^5 = t^5 . Plus as a bare md, which cannot have alignment:p^4 + q^4 = r^4.

    And a moderately complicated fraction: \frac{\alpha+1/2}{\beta+\gamma} = \frac{12}{37} .

    Literary Text

    In this chapter we test widespread (i.e. not mathematical) constructions which would appear in a typical paragraph.

    Distinguished Text

    Portions of text are often distinguished, using vehicles like font changes, enclosing quotation marks, underlining, and/or color. Within we have semantic markup, so we are free to translate to forms that work better via Braille. Properly, this should be a list, but we have not tested those yet. So we will put each example into a paragraph of its own for now. One distinguished word or phrase per sentence, one sentence at the start of the paragraph, followed by comments.

    We emphasize the word emphasis.

    An alert is more imperative, like a warning. Default presentation is bold-italic, but we have not figured out how to make liblouis react correctly to nesting the two. Perhaps we need to create a new liblouis style. Trying to make a new emphasis class was a failure. Perhaps two HTML elements (bold, italic) will be better. For now, just plain bold is an acceptable presentation for this element.

    A definition mid-sentence is terminology.

    We used enclosing double quotes earlier, since we knew they behaved properly.

    An apostrophe and a single right quote are a real problem for Braille translation (and this problem is not limited to Braille). Maybe enclosing single quotes are not so useful, but still necessary, and that construction was very tricky since the words ended with the letter s and liblouis thought it was a (non-Braille) contraction and really wanted to use an apostrophe. A word like quote is easier it turns out. This is a place where can shine.

    We employ a heavyweight monospace font for literal text, especially in technical situations. Right now, we do not distinguish this text. However, see the liblouis documentation for compbrl and changeTable to perhaps get Computer Braille for inline code.

    A phrase from a foreign language is usually distinguished.

    The title of this publication is A Test Book. It appears the italic indicators got confused between a single letter, two words, and a total of three items (so a phrase). We'll try again: Introduction to Calculus for Engineers. Hmm, not perfect either. OK, now One Book Title. This one has me confused. See lists below, where behavior is better.

    A shorter document might be referenced as a A Test Article.

    Esoteric: text can be grouped in angle brackets.

    Esoteric: text can be grouped in double brackets. Now simply two brackets repeated.

    There is much more to check, but above is a good start on common constructions. In the schema chase through the TextLong definition to find more.

    Different indicators are used for emphasis of a letter, a word, or a phrase. It appears a phrase is defined to be three words. We test with the foreign element:

    • Single letter: A
    • Two words: One Two
    • Three words: One Two Three
    • Four words: One Two Three Four
    • Five words: One Two Three Four Five

    Now, all over again with the pubtitle element, which is normally used to italicize titles of publications:

    • Single letter: A
    • Two words: One Two
    • Three words: One Two Three
    • Four words: One Two Three Four
    • Five words: One Two Three Four Five

    Environments, Blocks

    has many chunks of text with a heading and a number. I call them blocks, others call them environments. They qualify as the boxed material of the BANA transcription guide. Experiments here are the definition and example. Theorems are more complicated, since they have associated proofs. We will start simple and iterate to more types and more complicated structures.

    liblouis allows giving the characters to use for the top and bottom line, but is a bit vague. BANA transcription guide clearly says dot patterns 2356 and 1245 for top and bottom respectively. In 6-dot braille these appear to be the characters seven and capital-g, which is what I have put into the liblouis configuration. But the BRF file seems to end up with the characters six and open-square-bracket. Al reports that when embossed these yield dot patterns 246 and 235 (possibly reversed), consistent with the six and open-square-bracket in the BRF file. I've tried many things, but cannot seem to configure liblouis to generate the seven and capital-G, nor can I see any rhyme nor reason to the results I get when experimenting.

    BANA is pretty clear about boxed material, and liblouis supports a style option called boxline. It'll be contrary to BANA, and technically more unnatural to try to just use inline markers. Yes, two blank lines, and two boxlines, will use more paper, but this sort of material is a key feature of PreTeXt material. So for now, I'd lobby for following the BANA and liblouis recommendations. (Yes, I know the paper is expensive!) Al has agreed to this.

    To get a blank line after the bottom line of the box, I had to use a style parameter. The blank line after the content, and before the bottom line, strikes me as a bug. No combination of parameters is making it go away.

    I have put the headings of boxed material onto their own lines, which is different than print. I think that is finepart of the PreTeXt philosophy is that different output formats will have different expressions of the content. And it will be really difficult to meld the title with the first bit of content.

    Right Triangle

    A right triangle has one of its three angles subtending a quarter of a circle.

    And this second paragraph is part of the definition.

    This figure has a paragraph in it. It is just forcing an exterior boxline on teh enclosing definition.

    And a last paragraph to disentangle the end of the definition.

    This faux paragraph is not part of the definition nor of the example, so we particularly want the reader to not think it is part of the preceding definition.

    This is an example of an example. We did not include a title (as we did for the definition) to test this option.

    A second paragraph of the example. Then we add a hint, and two different solutions. Al suggests the colon.

    A small hint to get a student going in the right direction. Not numbered, since it is the only one.

    A second paragraph of the hint to test formatting of a hint, answer or solution.

    A long complete solution. Numbered as first.

    Another long complete solution. Numbered as second.

    Final paragraph of the chapter on environments and blocks.

    Verbatim Material

    This chapter has examples of material that is meant to be a computer program, or commands typed exactly as shown. In other words, text formatted to be used or copied literally.

    This next paragraph is a Java computer program to write Hello, World!

                import javax.swing.JFrame;
                import javax.swing.JLabel;
                public class HelloWorld {
                  public static void main(String[] args) {
                    JFrame frame = new JFrame();
                    frame.setTitle("Hi!");
                    frame.add(new JLabel("Hello, world!"));
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                  }
                }
                

    An intervening normal paragraph.

    Sometimes we break in the middle of a paragraph to make a small bit of displayed text that is verbatim for reasons similar to before. Perhaps we have some commands to display. Here are two ways to spin up a local web server, depending on if you are stuck back on Python 2 or have moved ahead to Python 3. python2 -m SimpleHTTPServer python3 -m http.server They are both very simple, even if only one uses that term in its name. We indented the second one by 4 spaces simply as a testit doesn't mean anything.

    Lists

    These lists can have more complicated items (structured with paragraphs), and lists can be nested. We start simple. I cannot see a way to use liblouis styling to insert a blank line before and after a list, HTML empty p and br elements are not effective.

    A super-simple ordered list, which requires to be authored inside a paragraph.

    1. Create a perpendicular bisector.
    2. Mark off distance a. And we write some more that should become an indented second line.
    3. Create a circle of radius b centered at a.
    And this sentence finishes the paragraph holding the ordered list.

    A super-simple unordered list, which requires to be authored inside a paragraph. This defaults to a symbol known as a bullet or disc, which BANA transcription guide says is dot pattern 456-256.

    • Copy lengths.
    • Bisect segments.
    • Create arcs.
    And this sentence finishes the paragraph holding the unordered list.

    Two more unordered lists in this paragraph. To make legitimate HTML, explodes the paragraph into three, we need to use styles to mark the lead paragraph for indentation, and mark the later ones to not have indentation. This seems unavoidable as one step of the pipeline is doing this breakup anyway. An unordered list with a circle as a marker (not a filled circle), BANA says a Grade 1 indicator first, so dot pattern 56-1246-123456:

    • One with a circle
    • Two with a circle
    • Three with a circle
    Now with a solid (filled) square. BANA says dot pattern 456-1246-3456-145, and the liblouis files clearly suggest a Grade 1 indicator here (dots 5-6?). BANA suggests Grade 1 indicaor is not needed. We can overrule liblouisjust a fiddle.
    • One with a square
    • Two with a square
    • Three with a square
    This concludes the paragraph, which will be an apparent third paragraph.

    A description list has a single word, or simple phrase, which then has a definition or an explanation, which may be several paragraphs. We render this much differently in HTML versus print, and also somewhat differently here in Braille. Defined term is on a line of its own, in bold. Then the actual description, which can be quite variable follows, and is indented to help convey the structure.

  • First Item

    This text is a description of the first item, whicn is a paragraph.

  • Second Item

    Describes second item. In a paragraph for openers.

    This is a second paragraph, helping to describe the second item of the list.

  • Third Item

    Describes third item. The descriptions are indented for each item to help keep the groupings together.

  • A ordered list where most of the list items are authored with structure, meaning paragraphs and similar blocks that are peers.

    1. First item, first paragraph. And a nonsense sentence so we wrap to a second braille line.

      First item, second paragraph. And a nonsense sentence so we wrap to a second braille line.

    2. Second item, first paragraph. All by itself, no more structure. With some display math that the HTML conversion will isolate and provide a "continuation paragraph". a^2+b^2=c^2 And a nonsense sentence so there is something after the math.

    3. Third item, but now totally unstructured, just to provide a mix within the list.

    TODO: list items structured with more than paragraphs, nested lists.

    Tables

    A table of names of colors, with a title, with three rows and five columns. Designed to have runover lines. The title is presently being displayed below, but can move to just prior. Need to experiment with multi-column cells.

    A cubic plotted by SageMath on [-3,2] An interior boxline figure
    Some Colors Red Blood Mahogany Crimson Lipstick White Alabaster Chiffon Porcelain Parchment Blue Admiral Cerulean Peacock Sapphire

    Below is a table from section 10.3 of Active Calculus - Multivariable by Steven Schlicker. It may be a challenge because all the content is mathematical, but the negative numbers aren't marked up as such. Michael Cantino suggests that the entire table should be one big Nemeth table. It is followed by the same table appearing in the previous section but with all the table cells marked up using m. Are either of these good, or should we have something that just purely comes from SRE?

    Wind chill as a function of wind speed and temperature. v \backslash T -30 -25 -20 -15 -10 -5 0 5 10 15 20 5 -46 -40 -34 -28 -22 -16 -11 -5 1 7 13 10 -53 -47 -41 -35 -28 -22 -16 -10 -4 3 9 15 -58 -51 -45 -39 -32 -26 -19 -13 -7 0 6 20 -61 -55 -48 -42 -35 -29 -22 -15 -9 -2 4 25 -64 -58 -51 -44 -37 -31 -24 -17 -11 -4 3 30 -67 -60 -53 -46 -39 -33 -26 -19 -12 -5 1 35 -69 -62 -55 -48 -41 -34 -27 -21 -14 -7 0 40 -71 -64 -57 -50 -43 -36 -29 -22 -15 -8 -1
    Wind chill as a function of wind speed and temperature. v \backslash T -30 -25 -20 -15 -10 -5 0 5 10 15 20 5 -46 -40 -34 -28 -22 -16 -11 -5 1 7 13 10 -53 -47 -41 -35 -28 -22 -16 -10 -4 3 9 15 -58 -51 -45 -39 -32 -26 -19 -13 -7 0 6 20 -61 -55 -48 -42 -35 -29 -22 -15 -9 -2 4 25 -64 -58 -51 -44 -37 -31 -24 -17 -11 -4 3 30 -67 -60 -53 -46 -39 -33 -26 -19 -12 -5 1 35 -69 -62 -55 -48 -41 -34 -27 -21 -14 -7 0 40 -71 -64 -57 -50 -43 -36 -29 -22 -15 -8 -1

    Below are two tables from Oscar Levin's Discrete Mathematics: An Open Introduction. Might the second one be better as transposed when making BRF?

    Class: Conflicts with: A D I B D I J C E F I D A B F E C H I F C D I G J H E I J I A B C E F H J B G H Student: A B C D E F G H I J Conflicts: BEJ ADG HJ BF AI DJ B CI EHJ ACFI

    Here is a table from Active Calculus - Multivariable + Vector by Steven Schlicker, Mitchel T. Keller, and Nicholas Long. Again, it probably should be marked for Nemeth both before and after.

    (x,y) (2,1) (0,0) (-1,2) (3,-1) (-2,-1) \mathbf{F}(x,y)

    Here is a table from Applied Combinatorics by Mitchel T. Keller and William T. Trotter. One of the cells is very wide, but it looks fine in HTML and PDF.

    SchoolPlayer numbers Boston College1, 3, 4 Clemson University1, 3, 4, 6 Georgia Institute of Technology2, 6 University of GeorgiaNone interested University of Maryland2, 3, 5 University of North Carolina1, 2, 5 Virginia Polytechnic Institute and State University1, 2, 5, 6 Figures

    Figures should create some usable information, but also create a blank page (for embossable output) that will allow placement of a separately generated tactile graphic.

    A test figure with an image A picture of a pretty flower in a field of grass all by itself

    And some text trailing the figure. And a bare image next.

    More text trailing an image.

    MISCELLANEOUS - DO NOT REVIEW The Pythagorean Theorem

    For a right triangle with side lengths a, b, c, where the side of length c is opposite the right angle, we havea^2 + b^2 = c^2.

    The concluding period of the statement of the theorem will be absorbed into the displayed mathematics in a print version. For Braille, we want the period to remain detached, so it is rendered as literary text and not with Nemeth Braille.

    encourages cross-references, so we now reference the previous result: . While the liblouis library seems to be able to reference endnotes, there does not appear to be a mechanism for general cross-references.

    Quotations

    It seems that liblouis converts Unicode quote marks into opening and closing variants, and recognizes double versus single. Patterns are 2-3-6 and 3-5-6 for the double quote marks, with a shift/capital indicator for the single versions. Two tests from Alex Jordan, where we just employ our standard conversion to smart Unicode variants and we let liblouis do the rest. Life is about making an impact, not making an income. Whatever the mind of man can conceive and believe, it can achieve. Here we test individual words: double and single. And the four relevant characters isolated inside parentheses: (), (), (), ().

    Now we try a block quotation from Dr.Seuss. We have done nothing extra to try to get the attribution correct yet, though it appears to convert the quotation dash into a hyphen (good). Just now, when using his name, we put a non-breaking space between the abbreviation for Doctor and his surname, as we might commonly do in light of other conversions' behavior. It seems to have become nothing special (which is also good).

    The problem with writing a book in verse is, to be successful, it has to sound like you knocked it off on a rainy Friday afternoon. It has to sound easy. When you can do it, it helps tremendously because it's a thing that forces kids to read on. You have this unconsummated feeling if you stop.

    Dr. Seuss
    References and Suggested Readings Blake, I. F. Codes and Designs, Mathematics Magazine 52 (1979), 8195. Hill, R. A First Course in Coding Theory. Oxford University Press, Oxford, 1990. Levinson, N. Coding Theory: A Counterexample to G. H. Hardy's Conception of Applied Mathematics, American Mathematical Monthly 77 (1970), 24958. Lidl, R. and Pilz, G. Applied Abstract Algebra. 2nd ed. Springer, New York, 1998. MacWilliams, F. J. and Sloane, N. J. A. The Theory of Error-Correcting Codes. North-Holland Mathematical Library, 16, Elsevier, Amsterdam, 1983. Roman, S. Coding and Information Theory. Springer-Verlag, New York, 1992. Shannon, C. E. A Mathematical Theory of Communication, Bell System Technical Journal 27 (1948), 379423, 62356. Thompson, T. M. From Error-Correcting Codes through Sphere Packing to Simple Groups. Carus Monograph Series, No. 21. Mathematical Association of America, Washington, DC, 1983. van Lint, J. H. Introduction to Coding Theory. Springer, New York, 1999. ================================================ FILE: examples/braille/braille-test.xml ================================================
    A Test Article

    This is a article designed to test conversions to Braille without too much extraneous material. The title above should be A Test Article.

    The Pythagorean Theorem

    For a right triangle with side lengths a, b, c, where the side of length c is opposite the right angle, we havea^2 + b^2 = c^2.

    The concluding period of the statement of the theorem will be absorbed into the displayed mathematics in a print version. For Braille, we want the period to remain detached, so it is rendered as literary text and not with Nemeth Braille.

    encourages cross-references, so we now reference the previous result: . While the liblouis library seems to be able to reference endnotes, there does not appear to be a mechanism for general cross-references.

    Quotations

    It seems that liblouis converts Unicode quote marks into opening and closing variants, and recognizes double versus single. Patterns are 2-3-6 and 3-5-6 for the double quote marks, with a shift/capital indicator for the single versions. Two tests from Alex Jordan, where we just employ our standard conversion to smart Unicode variants and we let liblouis do the rest. Life is about making an impact, not making an income. Whatever the mind of man can conceive and believe, it can achieve. Here we test individual words: double and single. And the four relevant characters isolated inside parentheses: (), (), (), ().

    Now we try a block quotation from Dr.Seuss. We have done nothing extra to try to get the attribution correct yet, though it appears to convert the quotation dash into a hyphen (good). Just now, when using his name, we put a non-breaking space between the abbreciation for Doctor and his surname, as we might commonly do in light of other conversions' behavior. It seems to have become nothing special (which is also good).

    The problem with writing a book in verse is, to be successful, it has to sound like you knocked it off on a rainy Friday afternoon. It has to sound easy. When you can do it, it helps tremendously because it's a thing that forces kids to read on. You have this unconsummated feeling if you stop.

    Dr. Seuss
    ================================================ FILE: examples/braille/publication.xml ================================================ ================================================ FILE: examples/custom-theming/README.md ================================================ # Styling/Theming Samples for PreTeXt This project has samples to illustrate how the HTML output of PreTeXt can be customized. The `projects.ptx` file defines the following build targets: * `web` - Default styling * `web-custom-colors` - Specifying custom colors for a theme * `web-extra-css` - Adding extra CSS files with custom styles * `web-salem` - Specifying the "salem" theme with a specific color palette * `web-salem-extra-css` - Demonstrates additional tricks using extra CSS to use or modify the colors defined for a theme * `web-custom-theme` - Demonstrates how to create a custom theme by providing an SCSS file as a build target To build any of these targets using the PreTeXt CLI use a command like: ```bash pretext build web-custom-colors ``` See the `project.ptx` file for more details about each target. If you are experimenting with `web-custom-theme`, and want to just rebuild the theme, you can add the `-t` flag. Doing so will leave the HTML in place and just rebuild the `theme.css` file from your SCSS. ```bash pretext build web-custom-theme -t ``` ================================================ FILE: examples/custom-theming/assets/css/more-styles.css ================================================ .ptx-content-footer .button { border-radius: 10px 5px; } ================================================ FILE: examples/custom-theming/assets/css/my-styles.css ================================================ .ptx-masthead { background-color: #e4e5e6; } /* styles to apply in dark mode */ :root.dark-mode { .ptx-masthead { background-color: #000000; } } ================================================ FILE: examples/custom-theming/assets/css/salem-color-vars.css ================================================ /* Many colors in your output are controlled by CSS variables. You can override these variables to override the appearance of all items that use that color. You need to define the colors in a container that is at least as specific as the default definition. The default definitions for light mode are in :root:not(.dark-mode) { ... } The default definitions for dark mode are in :root.dark-mode { ... } */ :root:not(.dark-mode) { --body-title-color: #573c13; } section>.heading { /* you can use color variables defined in themes in your own rules to match existing colors */ background: var(--primary-color-white-95); color: var(--primary-color); } /* Normally, all remark-likes are the same color in salem. Let's customize some. */ /* observations are the classname used for the renamed "danger" blocks */ .remark-like.observation { border-color: #c72a36; background-color: #f9d6d5; } .remark-like.convention { border-color: #4CAF50; background-color: #edfcee; } .remark-like.warning { border-color: #e7d322; background-color: #fbf8e6; } ================================================ FILE: examples/custom-theming/mytheme/_chunks-customized.scss ================================================ // Grab everything from tacoma's chunks but tell it to use 0 border radius @use 'targets/html/tacoma/chunks-minimal' with ( $border-radius: 0 ); // Now add to that // @use statements must come before any actual CSS rules @use 'components/chunks/helpers/heading-box-mixin'; .project-like { @include heading-box-mixin.box; } .remark-like { > .heading { color: var(--primary-color); } } ================================================ FILE: examples/custom-theming/mytheme/mytheme.scss ================================================ // A custom theme that is a modified version of the tacoma theme // This will get compiled into "theme.css" and placed into the output directory // of your project $primary-color: #2a5ea4 !default; $primary-color-dark: #829ab1 !default; $background-color-dark: #23241f !default; @use "sass:map"; // Any @use path is checked relative to this file first, then // relative to the css directory in the pretext core. // https://github.com/PreTeXtBook/pretext/tree/master/css @use "colors/color-helpers" as colorHelpers; // --------------------------------------------- // components // To borrow a file from tacoma, we must do an @use with the // full path from the css directory: @use 'targets/html/tacoma/_parts-tacoma' as parts; // Underscores indicate files designed to be included in other files // you do not need to include the underscore in the filename in the @use // chunks-customized exists in the same directory as this file, so that // will be found/used. @use 'chunks-customized'; @use 'components/pretext-web'; // --------------------------------------------- // fonts and colors @use 'fonts/fonts-google'; @use 'colors/palette-single-muted' as palette-light with ( $primary-color: $primary-color, ); @use 'colors/palette-dark' as palette-dark with ( $primary-color: $primary-color-dark, $background-color: $background-color-dark, ); // --------------------------------------------- // concrete rules / includes that generate CSS // render the actual colors @include colorHelpers.set-root-colors(palette-light.$colors, palette-dark.$colors); ================================================ FILE: examples/custom-theming/project.ptx ================================================ ================================================ FILE: examples/custom-theming/publication/publication-custom-colors.ptx ================================================ ================================================ FILE: examples/custom-theming/publication/publication-custom-theme.ptx ================================================ ================================================ FILE: examples/custom-theming/publication/publication-salem.ptx ================================================ ================================================ FILE: examples/custom-theming/publication/publication.ptx ================================================ ================================================ FILE: examples/custom-theming/source/ch-chapter-title.ptx ================================================ Chapter Title

    Text before the first section.

    ================================================ FILE: examples/custom-theming/source/docinfo.ptx ================================================ Danger ================================================ FILE: examples/custom-theming/source/frontmatter.ptx ================================================ You Your department Your institution My Website 20202024 You This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit CreativeCommons.org ================================================ FILE: examples/custom-theming/source/main.ptx ================================================ My Great Book An example to get you started ================================================ FILE: examples/custom-theming/source/sec-section-name.ptx ================================================
    Section Title

    Here is an activity.

    Here is a project.

    Text of section.

    Here is a note.

    Here is a warning.

    Here is an observation that was renamed into a danger.

    ================================================ FILE: examples/epub/README.md ================================================ # EPUB Sampler This short book is designed for testing conversions to EPUB. Of course, the Sample Book would be a good, longer, test document as well. Features that need to be handled differently for EPUB should have examples added here. For example, footnotes and endnotes require extra care in EPUB. ================================================ FILE: examples/epub/epub-sampler.xml ================================================ \newcommand{\doubler}[1]{2#1} \newcommand{\definiteintegral}[4]{\int_{#1}^{#2}\,#3\,d#4} % this comment will be stripped \usepackage{tikz} \usetikzlibrary{arrows} An EPUB Sampler Rob Beezer PreTeXt
    https://www.pretextbook.org
    20162021 Robert A. Beezer
    Biographical sketch with title

    This is about the author and has a title.

    This sketch doesn't actually have a title in the source.

    To all those who like reflowable electronic books.

    Mitchel T. Keller has added a number of things to this sampler to continue to stress out the EPUB conversion and make sure it's all working right.

    One

    The quick brown fox jumps over the lazy dog.

    Some test cross-references:

    • To the next chapter:
    • To a figure much later:
    • To some multi-line display math later:
    • To an abstract algebra textbook:

    Two

    This is the introduction to the chapter. We put some math \int_a^b f(t)\, dt in here for validation purposes.

    A silly section.

    This section just exists so that we can add introduction and conclusion tags to this chapter.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ultricies purus sit amet rutrum dictum. Donec sit amet ligula quis orci vestibulum tempor id in erat. Ut ut placerat lacus, sit amet feugiat lorem. Pellentesque sodales risus at eros malesuada, eget ultrices est consectetur. Praesent fermentum, ligula sit amet fermentum varius, elit eros imperdiet lectus, tempus condimentum quam elit in elit. Sed molestie mauris sem, sed laoreet elit iaculis ut. In mattis blandit ex, nec rutrum purus ullamcorper eget. Nullam maximus magna non elit euismod, non ornare nisl porttitor. Pellentesque commodo tempus viverra.

    Curabitur ac hendrerit ligula. Aenean vitae nunc id elit convallis efficitur. Sed ultricies ut justo quis elementum. Sed eget eros venenatis, pellentesque risus sed, fermentum mi. Proin ipsum arcu, porta nec sem sit amet, sollicitudin faucibus erat. Quisque lacus lectus, pellentesque ut imperdiet sed, euismod vitae nibh. Donec dolor diam, elementum ac pharetra vitae, volutpat mollis augue.

    Maecenas ex enim, lobortis et blandit sit amet, pretium in ante. Sed mollis sollicitudin nibh non consectetur. Vestibulum eget tortor sit amet felis iaculis fermentum. Sed eu nisl a urna cursus congue at nec nulla. Mauris lacinia molestie tristique. Maecenas aliquet rutrum venenatis. Vivamus quis metus sit amet est feugiat facilisis quis et massa. Aenean dui sem, dapibus at imperdiet ac, auctor sit amet arcu. Vestibulum eget porttitor est. Aliquam id pellentesque quam, vitae rhoncus metus. In congue condimentum malesuada. Mauris in condimentum eros, eget mattis nibh. Praesent et ex porttitor, lobortis nibh sed, cursus ante. Suspendisse dapibus vel risus eu pellentesque.

    We end here with multiline display math to test linking from elsewhere into this multi-page section. -9y&=y''-6y' y&=c_1e^{3x} + c_2 x e^{3x}

    A Section with Subsections A simple subsection

    A subsection in a section.

    A single exercise buried in an exercises division that is a peer of a subsection.

    A lone exercise in an exercises division that is a peer of a section.

    A little suggestion.

    y=x^2

    Maecenas ex enim, lobortis et blandit sit amet, pretium in ante. Sed mollis sollicitudin nibh non consectetur. Vestibulum eget tortor sit amet felis iaculis fermentum. Sed eu nisl a urna cursus congue at nec nulla. Mauris lacinia molestie tristique. Maecenas aliquet rutrum venenatis. Vivamus quis metus sit amet est feugiat facilisis quis et massa. Aenean dui sem, dapibus at imperdiet ac, y=ax^2+bx+c auctor sit amet arcu. Vestibulum eget porttitor est. Aliquam id pellentesque quam, vitae rhoncus metus. In congue condimentum malesuada. Mauris in condimentum eros, eget mattis nibh. Praesent et ex porttitor, lobortis nibh sed, cursus ante. Suspendisse dapibus vel risus eu pellentesque.

    Wrapping up

    This is the conclusion.

    A Bit of Math <m>y=mx+b</m> A Bit of Math y=mx+b

    Diophantine equationThis paragraph has some inline math, a Diophantine equation, x^2 + \doubler{y^2} = z^2. And some display math about infinite series: \sum_{n=1}^\infty\,\frac{1}{n^2} = \frac{\pi^2}{6}. Look at the XML source to see how macros are employed.

    And a bit of multi-line display math:\frac{d}{dx}\definiteintegral{a}{x}{f(t)}{t}&=\frac{d}{dx}\left(F(x)-F(a)\right)&=\frac{d}{dx}F(x)-\frac{d}{dx}F(a)&=f(x)-0 = f(x).

    And multi-line math with an embedded cross-reference to a figure:x^2 + y^2 &= z^2&&a^2 + b^2 &= c^2&&

    Nice.

    Fundamental Theorem of Calculus Newton, Leibniz

    Let f be a continuous function on the interval [a,b]. If F is an antiderivative for f on [a,b], then \int_a^b f(t)\, dt = F(b)-F(a).

    • You have read the statement of .
    • You have seen multiline math, and it is awesome.
    Some Images <m>ax^2+bx+c=0</m> Some Imagex ax^2+bx+c=0
    • To discuss formats for graphics
    • To stress test the EPUB conversion with y=f'(x) math in here
    Graphics formats <m>f'(x)</m> Graphics formats f'(x)

    Portable Network Graphics (PNG)PNGPortable Network GraphicsA Portable Network Graphics (PNG) image created externally in Sage and then included directly here.

    A cubic polynomial and its derivative

    This is a Cartesian plot with a blue curve that enters from the lower left. It crosses the x-axis at about -2 and climbs to reac a peak at about -0.8 where it flattens out. It continues to the right, now moving downward, and crosses the y-axis at 6, and then crossing the x-axis again at 1. It bends back upward, returning to quadrant I at x=3.

    There is also a red curve, a parabola, that enters from the top right. It moves downward, crossing the x-axis at -0.8 and bottoming out at x=0.7. Then it climbs back up crossing the x-axis into quadrant I at x=2.1, and it rises out the upper right of the plot.

    A Scalable Vector Graphics (SVG) image produced from source with the pretext script.

    The graph of a function and a tangent line a=1 f(x) = exp(x/3)*cos(x) (a,f(a))

    Here we drop a small reference to an equation earlier, notably .

    A Scalable Vector Graphics (SVG) image created externally in Sage and then included here as a vector image (no file extension given).

    A complete graph on 16 vertices

    A Scalable Vector Graphics (SVG) image described by Sage commands, which is produced by the pretext script.

    A Sage multigraph of a sentence stnc = 'I am a cool multiedge graph with loops' g = DiGraph({}, loops=True, multiedges=True) for a,b in [(stnc[i], stnc[i+1]) for i in range(len(stnc)-1)]: g.add_edge(a, b, b) g.plot(color_by_label=True, edge_style='solid', figsize=(8,8))
    TikZ Electronics Diagram A pile of electronic components wired together =triangle 45] \draw % Drawing the blocks of first filter : node at (0,0)[right=-3mm]{\Large \textbullet} node [input, name=input1] {} node [sum, right of=input1] (suma1) {\suma} node [block, right of=suma1] (inte1) {\inte} node at (6.8,0)[block] (Q1) {\Large $Q_1$} node [block, below of=inte1] (ret1) {\Large$T_1$}; % Joining blocks. % Commands \draw with options like [->] must be written individually \draw[->](input1) -- node {$X(Z)$}(suma1); \draw[->](suma1) -- node {} (inte1); \draw[->](inte1) -- node {} (Q1); \draw[->](ret1) -| node[near end]{} (suma1); % Adder \draw node at (5.4,-4) [sum, name=suma2] {\suma} % Second stage of filter node at (1,-6) [sum, name=suma3] {\suma} node [block, right of=suma3] (inte2) {\inte} node [sum, right of=inte2] (suma4) {\suma} node [block, right of=suma4] (inte3) {\inte} node [block, right of=inte3] (Q2) {\Large$Q_2$} node at (9,-8) [block, name=ret2] {\Large$T_2$} ; % Joining the blocks of second filter \draw[->] (suma3) -- node {} (inte2); \draw[->] (inte2) -- node {} (suma4); \draw[->] (suma4) -- node {} (inte3); \draw[->] (inte3) -- node {} (Q2); \draw[->] (ret2) -| (suma3); \draw[->] (ret2) -| (suma4); % Third stage of filter: % Defining nodes: \draw node at (11.5, 0) [sum, name=suma5]{\suma} node [output, right of=suma5]{} node [block, below of=suma5] (deriv1){\derv} node [output, right of=suma5] (sal2){} ; % Joining the blocks: \draw[->] (suma2) -| node {}(suma3); \draw[->] (Q1) -- (8,0) |- node {}(ret1); \draw[->] (8,0) |- (suma2); \draw[->] (5.4,0) -- (suma2); \draw[->] (Q1) -- node {}(suma5); \draw[->] (deriv1) -- node {}(suma5); \draw[->] (Q2) -| node {}(deriv1); \draw[<->] (ret2) -| node {}(deriv1); \draw[->] (suma5) -- node {$Y(Z)$}(sal2); % Drawing nodes with \textbullet \draw node at (8,0) {\textbullet} node at (8,-2){\textbullet} node at (5.4,0){\textbullet} node at (5,-8){\textbullet} node at (11.5,-6){\textbullet} ; % Boxing and labelling noise shapers \draw [color=gray,thick](-0.5,-3) rectangle (9,1); \node at (-0.5,1) [above=5mm, right=0mm] {\textsc{first-order noise shaper}}; \draw [color=gray,thick](-0.5,-9) rectangle (12.5,-5); \node at (-0.5,-9) [below=5mm, right=0mm] {\textsc{second-order noise shaper}}; \end{tikzpicture} ]]>

    A diagram of some git commits, authored in Mermaid.

    Mermaid Git Diagram A git diagram in Mermaid --- title: Example Git diagram --- gitGraph commit commit branch develop checkout develop commit commit checkout main merge develop commit commit
    Additional stress testing

    We repeat an image created from an external file, because the EPUB format only wants the file noted once.

    We like to put URLs into footnotes, especially for formats like this where they may not be active. This output is from pretextbook.org.

    We make a reference to some math in another chapter in order to test that validation works for this. We also refer to

    A sample exercise, where a hint and a solution should be visible (rather than in a knowl).

    Just a little help.

    The whole story with all the details.

    This is a conclusion. We will follow it with an outcomes.

    The really awesome things we've done!
    1. We just tested if we get this list of outcomes.
    Maybe the license

    Lots of books written in include the terms of their license in an appendix, so let's use this as a test.

    List of Figures Hints, Answers and Solutions to Exercises References Tom Judson, Abstract Algebra: Theory and Applications.

    Another online, open-source offering.

    David C. Lay, Subspaces and Echelon Forms. The College Mathematics Journal, January 1993, 24 1, 5762.
    Index

    This document was authored in to stress test conversion to EPUB. Please do not judge its contents, which randomly has some y=e^{ax+b} math in the rear colophon.

    ================================================ FILE: examples/epub/gen/prefigure/prefigure-tangent-annotations.xml ================================================ figure 1 grid-axes graph-tangent grid-axes graph-tangent grid-axes 1 grid axes grid axes figure grid 1 grid-axes axes 2 grid-axes graph-tangent 2 graph point tangent graph point tangent figure graph 1 graph-tangent graph point 2 graph-tangent tangent 3 graph-tangent ================================================ FILE: examples/epub/publication.xml ================================================ ================================================ FILE: examples/errors/sample-errors-and-warnings.xml ================================================ Conundrum
    Errors and Warnings in MathBook XML
    Introduction

    We collect some bad things here, to test deprecation warnings and error handling. Don't be alarmed.

    Global Deprecations

    These are sprinkled around as necessary, but listed here.

    Cite element subsumed into xref scheme (2014/06/25).

    Obsolete filebase attribute (2014/05/04).

    Once upon a time there was a hyphen element for hyphenatedwords.

    The c element no longer needs a @latexsep attribute.

    Introduction

    A sample paragraph.

    ACK ACKYuck SNDYuck
    Cross-References

    A cite is replaced directly by an xref, the obsolete use here would be functional and .

    A cross-reference to nowhere (warnings):

    A cross-reference with a bad/missing attribute: .

    A cross-reference with a bad value for the autoname attribute: .

    The detail attribute of a cross-reference is only implemented for a reference to a bibliographic item: .

    The plural attribute of a cross-reference is deprecated with no equivalent replacment: .

    A cross-reference to a range with incompatible targets (article and section): .

    A cross-reference to a range where the two targets are in the wrong order, so generates a warning: .

    We supply two broken cross-references for testing purposes only, one a list, one not: , .

    We supply two more broken cross-references for testing purposes only, both of the first/last variety: , .

    A todo element now becomes a prefixed XML comment.
    Bad Math

    Some math that gives the Sage notebook trouble: first the fixed version, where we use a small negative space followed by a small positive space to breakup the triple braces: x^2{{\!\,{y^3}}}

    Now the problem version, which in the Sage notebook will wreck this page. You should be warned about this at the console when you built this worksheet. Elsewhere the fixed version should look like this version: x^2{{{y^3}}}

    Images

    TikZ code no longer goes in a tikz element, but latex-image-code instead. And similar graphics languages need to go into an imagec> element. We globally trap occurrence inside figurec> without an intervening image, which may not be the only way this could occur.

    And the task element has a new purpose and should not exist at the top-level of a division. We include a project with a real task to test effect.

    I should not be here.

    First real task.

    Second real task.

    The program and console elements cannot occur without a wrapper, a sidebyside or a console.

    cd a = b + c
    Miscellaneous

    A circumflex should still be obtainable with circum: . And is now .

    Groups of paragraphs

    There has always been a sort of odd mini-sectioning element, called paragraph orignally since that is what it is in , but now better named as paragraphs.

    's ten reserved characters once each had an empty element of its own: .

    And similarly, nine other elements were made redundant: braces brackets.

    There are also several Unicode characters which show up a lot in copy-paste: °×​–—‘’“”, especially from Windows. However, they look okay and can be useful in text in math mode (which cannot use normal tags like <sq>), so we leave them alone there: z\text{×}z\text{​}\text{–}z\text{ isn’t “z”}.

    Tables once looked like this, but now are really different.

    it_ix_iy_i0000.500010.200.10000.480020.400.19600.456030.600.28720.429540.800.37310.402751.000.45360.378361.200.52930.359171.400.60110.348081.600.67070.347491.800.74020.3603102.000.81230.3900
    Ordered Lists with No Labels

    Once in the sample article, but now with two problems, not one. What were we thinking?

    1. Level 1, first.
    2. Level 1, second.
      1. Level 2, first.
      2. Level 2, second.
        1. Level 3, first.
        2. Level 3, second.
        3. Level 3, third.
      3. Level 2, third.
    3. Level 1, third.
    Catching Mis-Authored Code Chunks

    The XML special characters are often misunderstood. We can see when an element expecting pure text has a stray XML element. This could happen when code outputs legitimate HTML elements via print statements. But there are other possibilities. Solution, generally, is to use an escaped less than (&lt;) or use a CDATA section. First a silly inline verbatim that has a problem: foo foo, and a structured code display I'm fine. I'm . Note, this is no help for stray less than in places like tikz code for diagrams.

    A Badly Structured Section

    This introductory paragraph should be inside an introduction, since it is followed by a sequence of subsections (well, just one anyway). This will fail validation, and also raise a warning.

    First Subsection

    With a single paragraph. We try to catch this common structural violation.

    Prohibited Cross-References in Display Mathematics

    Cross-references can be built into display mathematics, but they can only point to one item ( a comma-delimited list of targets is not supported). x^2 + y^2 &= z^2&& x^2 + y^2 &= z^2&& a^2 + b^2 &= c^2&&

    Side-by-Side Paragraphs

    First panel.

    Mock Title

    Paragraph one.

    Paragraph two.

    WeBWorK

    A WeBWorK problem will need a server. You will get a warning if you do not specify one. But you should not be warned just because you use the empty element to get the stylized version, like this: . So you can test warnings by commenting out one or the other instance.

    Mock WW Exercise

    Very minimal.

    Image Descriptions

    The height attribute is ineffective on image elements.

    width attributes once could be dimensionless, but now need to be percentages.

    Bona Fide <webwork/> Problems

    These are two legitimate problems copied from the WW sample chapter on 2018-07-12. We are using them, and variants below, to test Schematron rules enforcing locations where -specific exceptions are alllowed. The third problem is a clone of the second, but with a setup element that is deprecated as of 2020-03-13.

    Solving Quadratic Equations Context("Fraction"); $a = Compute(random(2,6,1)); do {$k = Compute(random(2,6,1))} until (gcd($a,$k)==1); $r = Compute(random(2,6,1)); $c = $k*-$r; $b = $a*-$r+$k; $quadratic = Formula("$a x^2 + $b x + $c")->reduce; $x1 = Fraction($r,1); $x2 = Fraction(-$k,$a); Context()->flags->set(reduceConstants=>0,reduceConstantFunctions=>0); $solnum1 = Formula("-$b+sqrt(($b)**2-4($a)($c))"); $solnum2 = Formula("-$b-sqrt(($b)**2-4($a)($c))"); $evaluatorfora = $a->cmp()->withPostFilter(AnswerHints( [-$a] => "Do you have the sign correct?")); $evaluatorforb = $b->cmp()->withPostFilter(AnswerHints( [-$b] => "Do you have the sign correct?")); $evaluatorforc = $c->cmp()->withPostFilter(AnswerHints( [-$c] => "Do you have the sign correct?")); Context("LimitedFraction"); $multians1 = MultiAnswer(Fraction("$x1"),Fraction("$x2"))->with( singleResult => 0, allowBlankAnswers => 1, checker => sub { my ($correct,$student,$self) = @_; my ($s1, $s2) = @{$student}; my ($c1, $c2) = @{$correct}; return (1,1) if ($c1 == $s1 and $c2 == $s2) or ($c1 == $s2 and $c2 == $s1); return (1,0) if $c1 == $s1 or $c2 == $s1; return (0,1) if $c1 == $s2 or $c2 == $s2; return (0,0); } ); Part 1: Identify the coefficients

    Consider the quadratic equation given by = 0\text{.} First, identify the coefficients for the quadratic equation using the standard form from .

    a= , b= , c=

    Take the coefficient of x^2 for the value of a, the coefficient of x for b, and the constant for c. In this case, they are a = , b = , c = .

    Part 2: Solve using the quadratic formula

    Using the quadratic formula, solve =0.

    x= or x=

    Recall that the quadratic formula is given in .

    You already identified a = , b = , and c = , so the results are: x = { \over 2()} = or x = { \over 2()} =

    Tables $x = Real(5);

    A table with minimal XML source.

    A B C D E F G H I

    Finish this table.

    1 two \lfloor\pi\rfloor \text{I}+\text{I}{}+\text{I}+\text{I} six 2^3-1 VIII

    The missing number is .

    Tables Part Two $x = Real(5);

    A table with minimal XML source.

    A B C D E F G H I

    Finish this table.

    1 two \lfloor\pi\rfloor \text{I}+\text{I}{}+\text{I}+\text{I} six 2^3-1 VIII

    The missing number is .

    Broken <webwork/> Problems

    These are remnants of the two legitimate problems copied from the WW sample chapter on 2018-07-12 (above). We are leaving them as exercise but removing the webwork wrapper to provoke errors.

    Part 1: Identify the coefficients

    Consider the quadratic equation given by = 0\text{.} First, identify the coefficients for the quadratic equation using the standard form from .

    a= , b= , c=

    Take the coefficient of x^2 for the value of a, the coefficient of x for b, and the constant for c. In this case, they are a = , b = , c = .

    Part 2: Solve using the quadratic formula

    Using the quadratic formula, solve =0.

    x= or x=

    Recall that the quadratic formula is given in .

    You already identified a = , b = , and c = , so the results are: x = { \over 2()} = or x = { \over 2()} =

    Tables

    A table with minimal XML source.

    A B C D E F G H I

    Finish this table.

    1 two \lfloor\pi\rfloor \text{I}+\text{I}{}+\text{I}+\text{I} six 2^3-1 VIII

    The missing number is .

    Two named lists Sea Life Employed, so Caption is commented

    Dr. Seuss again.

    • One fish
    • Two fish
    • Red fish
    • Blue fish
    Color Shades colorsshades
    1. Blue

      1. Light
      2. Navy
      3. Royal

    2. Red

      1. Maroon
      2. Pink
      3. Shocking

    This ends our example.

    Sign Unicode Name $ U+0024 dollar ¢ U+00A2 cent
    Supported Currency
    glossary

    A glossary may have an introduction, perhaps with some explanation. Here this is an old-style glossary to provoke errors.

    bar

    A part of foobar. See .

    foobar

    A synonym for the acronym FUBAR.

    And for symmetry, a conclusion.

    A Geometric Prelude
    • Practice visualizing vector addition
    • Use vectors without explicit coordinates

    This two-page worksheet was generously donated to the sample article by Dave Rosoff at a CuratedCourses workshop in August2018. It has the default (skinny) margins.

    It was known to Euclid, and probably earlier, that the midpoints of the sides of any quadrilateral all lie in the same plane (even if the vertices of the quadrilateral do not). In fact, these midpoints are the vertices of a parallelogram, as pictured in .

    The midpoints of the sides of a quadrilateral are the vertices of a parallelogram. \begin{tikzpicture}[xscale=0.8, yscale=0.8] \draw[style={black, ultra thick}] (0,0) -- (5,0) -- (4,4) -- (2,5) -- (0,0); \draw[style={black, dashed, very thick}] (2.5, 0) -- (4.5, 2) -- (3, 4.5) -- (1, 2.5) -- (2.5, 0); \end{tikzpicture}
    The sides of a triangle presented as vectors. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); % \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node % {} -- (1.5,0) node[below right=0mm and 3mm] {$\vec{A}$}; %\draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node % {} -- (2,1) node[above left=5mm and 1mm] {$\vec{B}$}; %\draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node % {} -- (0.5,1) node[below left=1mm and 3mm] {$\vec{C}$}; %\node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; %\node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; % \node {$P$} (1.3333,0.6667); \end{tikzpicture}
    The medians of the triangle are \vec{M}_1, \vec{M}_2, and \vec{M}_3. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node {$\vec{M}_{1}$} -- (1.5,0);% node[below right=0mm and 3mm] {$\vec{A}$}; \draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node {$\vec{M}_{2}$} -- (2,1);% node[above left=5mm and 1mm] {$\vec{B}$}; \draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node {$\vec{M}_{3}$} -- (0.5,1);% node[below left=1mm and 3mm] {$\vec{C}$}; \node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; \node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; % \node {$P$} (1.3333,0.6667); \end{tikzpicture}

    In this exercise, we'll use vectors to show that the medians of any triangle () intersect at a point. Recall that medians are the lines connecting the vertices of the triangle to the midpoints of their opposite edges, as in the figure. We'll do this in a few steps.

    What is the value of \vec{A} + \vec{B} + \vec{C}?

    from the previous page is reproduced for your convenience.

    The medians of the triangle are \vec{M}_1, \vec{M}_2, and \vec{M}_3. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node {$\vec{M}_{1}$} -- (1.5,0);% node[below right=0mm and 3mm] {$\vec{A}$}; \draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node {$\vec{M}_{2}$} -- (2,1);% node[above left=5mm and 1mm] {$\vec{B}$}; \draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node {$\vec{M}_{3}$} -- (0.5,1);% node[below left=1mm and 3mm] {$\vec{C}$}; \node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; \node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; % \node {$P$} (1.3333,0.6667); \end{tikzpicture}

    Show that \vec{M}_{1} + \vec{M}_{2} + \vec{M}_{3} = 0.

    Use .

    To show that the point P exists (as the common intersection of the \vec{M}_{i}), show that \vec{A} + \frac{2}{3} \vec{M}_{3} = \frac{2}{3} \vec{M}_{2} = .

    If you have time, try to devise a vector proof of Euclid's result presented at the beginning of the workshop. Recall that a parallelogram is a four-sided polygon whose opposite sides are parallel.

    Wrap-up

    It's possible to do interesting things with vector arithmetic in a coordinate-free way: we didn't specify an origin, or any entries of any vectors in the examples.

    Networks Worksheet Basic laws for electrical circuits

    This two-page worksheet was generously donated to the sample article by Virgil Pierce at a CuratedCourses workshop in August2018. It has default (skinny) left and right margins, but we have specified longer top and bottom margins, with the top being the larger of the two.

    Ohms Law

    The current through a resistor is proportional to the ratio of the Voltage to the Resistance I = \frac{V}{R} Or for our purposes I R = V

    Kirchoffs Current Law

    The sum of the currents in a network meeting at a point is zero. \sum_{k=1}^n I_k = 0

    Kirchoff's Current Law

    For the circuit below I_1 + I_2 = I_3 .

    \begin{circuitikz} \draw (0,0) to[R, i=$I_1$, *-o](2,2); \draw (0,0) to[R, i=$I_2$, *-o](2,-2); \draw (-3, 0) to[R, i=$I_3$, o-*](0,0); \end{circuitikz}
    Kirchoffs Voltage Law

    The sum of the voltages around any closed circuit (or subcircuit) is zero. \sum_{k=1}^n V_k = 0

    Kirchoffs Current Law and Kirkoffs Voltage Law combined with Ohms Law gives for any circuit of resistors and sources a linear system that may (or may not) determine the currents.

    For the simple network pictured, calculuate the amperage in each part of the network by setting up a system of linear equations for the amperages.

    \begin{circuitikz} \draw (0,0) to[V, v=$11\quad \mbox{volt}$](0, 3) to[short](2,3) to[R, R=$4\quad \mbox{ohm}$] (3, 3) to[short](4,3) to[R, R=$3\quad \mbox{ohm}$](4,0) to[short](3,0) to[R, R=$3\quad \mbox{ohm}$](2,0) to[short](0,0); \end{circuitikz}

    Compare it with a parallel circuit network. Calculate the amperage in each part of the network by setting up a system of linear equations for the amperages.

    \begin{circuitikz} \draw(0,0) to[V, v=$11\quad \mbox{volt}$](0, 3) to[short](5,3) to[R, R=$4\quad \mbox{ohm}$](6,3) to[short](7,3) to[R, R=$3\quad \mbox{ohm}$](7,0) to[short](6,0) to[R, R=$3\quad \mbox{ohm}$](5,0) to[short](0,0); \draw(4,0) to[R, R=$3\quad \mbox{ohm}$](4,3); \end{circuitikz}

    Now for a more complicated network. Calculate the amperage in each part of the network by setting up a system of linear equations for the amperages.

    \begin{circuitikz} \draw(0,0) to[V, v=$11 \quad \mbox{volt}$](0, 3) to[short](5,3) to[R, R=$4 \quad \mbox{ohm}$](6,3) to[short](9,3) to[R, R=$4 \quad \mbox{ohm}$](10,3) to[short](11,3) to[R, R=$3 \quad \mbox{ohm}$](11, 0) to[short](10,0) to[R, R=$2\quad \mbox{ohm}$](9,0) to[short](6,0) to[R, R=$2\quad \mbox{ohm}$](5,0) to[short](0,0); \draw(4,0) to[R, R=$3\quad \mbox{ohm}$](4,3); \draw(8,0) to[R, R=$1\quad \mbox{ohm}$](8,3); \end{circuitikz}

    Now generalize these ideas to a context outside of electrical circuits. Consider the network of streets given in the diagram (with one-way directions as indicated).

    =stealth] \draw[->, very thick] (0,0) -- (10, 0) node[midway, below]{East Bound Winooski Ave}; \draw[<-, very thick] (0, 1) -- (10, 1) node[midway, above]{West Bound Winooski Ave}; \draw[<-, very thick] (0, 4) -- (10, 4) node[midway, above]{Shelburne St}; \draw[<-, very thick] (1, -1) -- (1, 5) node[midway, above, sloped]{Willow}; \draw[->, very thick] (9, -1) -- (9, 5) node[midway, above, sloped]{Jay}; \end{tikzpicture} ]]>

    A traffic engineer counts the hourly flow of cars into and out of this network at the entrances. They get (EB = East Bound; WB = West Bound):

    Estimated hourly traffic flow for the road network EB Winooski WB Winooski Shelburne St Willow Jay into 50 400 0 10 50 out of 55 390 20 15 30

    Use a variable for each segment inside of the network and set up a system of linear equations restricting the flow. Solve the system. Note that you should not get a unique solution as traffic should be able to flow through the network in various ways.

    This is a mock one-page worksheet for testing purposes. We have specified an overall margin just slightly less than the default.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    A two-line paragraph interspersed to check on spacing, breaks and all that.

    A full-width exercise

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    Another two-line paragraph interspersed to check on spacing, breaks and all that.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    A Mock Activity

    The problem, as we see it.

    A worksheet could have hints, no? But no spacing. Note row below has widths set to balance the heights.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Dot products and projection

    Let {\vec v}_1 = (-4,1), {\vec v}_2 = (2,2), {\vec v}_3 = (1,2,3), {\vec v}_4 = (-2,1,0). Find the values of the following expressions:

    {\vec v}_1 \cdot {\vec v}_2 = {\vec v}_3 \cdot {\vec v}_4 = \lVert{\vec v}_1\rVert = \lVert{\vec v}_4\rVert =

    Are any of these vectors perpendicular to each other?

    The vectors \vec a = (3,9) and \vec u = (4,2) are pictured below. Derive the formula for projection on a line and use it to find the projection of \vec a on the line spanned by \vec u. Also compute the length of the residual vector.

    two vectors...

    Consider the vector equation m \begin{bmatrix}2 \\ 5\end{bmatrix} = \begin{bmatrix}3 \\ 7\end{bmatrix} .

    Check that there is no solution m that makes the equation true.

    Use projection to find the best approximation \hat m.

    Compute \hat m \begin{bmatrix}2 \\ 5\end{bmatrix} .

    Compute the residual vector.

    Compute the length of the residual vector and explain what it means.

    Consider the system of equations 3t \amp =5 2t \amp = 9 .

    Write the system in vector form.

    Find the best estimate, \hat t, of t using projection.

    Compute the length of the residual vector.

    Index
    ================================================ FILE: examples/fonts/README.md ================================================ Characters, Fonts, and Languages ================================ The `fonts-and-charcters.xml` document here is mostly for testing the use of the `xelatex` LaTeX engine on the output of `xsl/pretext-latex.html`. It should also render well in HTML formats. With the `pdflatex` engine it will produce numerous errors (partly by design). ================================================ FILE: examples/fonts/fonts-and-characters.xml ================================================ \usepackage{pstricks-add}
    Characters, Fonts, and Languages in <pretext/>
    Introduction

    This is a sample document to demonstrate and test different fonts used for different languages. For PDF output, and best results, process with xelatex (or lualatex, unsupported). If processed with pdflatex, be prepared for errors, and maybe try running with the command-line option -interaction batchmode or -interaction nonstopmode. Commentary here, and in the original source file, should help you track down what might be missing in your system if the xelatex results are not satisfactory. You can also compare PDF output with the HTML output, which should work well for many different characters tested here.

    1. Your source XML file should always have <?xml version="1.0" encoding="UTF-8" ?> as the first line of the file to specify that your file contains Unicode characters.
    2. You will need to determine how to make your operating system, keyboard and editor cooperate to create the Unicode characters you need. The Full Unicode Input utility can be useful for generating short snippets or you can copy/paste from the source of this document.
    3. Generating variants of HTML for web browsers should work smoothly. You can test your system and browser for font support by viewing samples at Alan Wood’s Unicode Resources.

    Not finding what you are looking for? Send us a request. Even better, send us a snippet of text that I can use as a sample. If you know of any subleties in the use of for your desired font, please include those hints.

    Language Examples

    This next sections contain examples from various languages. The characters should render in HTML, but without any special support for subtle variations of how a language is used ( date formats). For output, the polyglossia package may handle details like hyphenation. Here we mostly test characters and fonts. Improvements from those knowledgeable about the use of particular languages within are especially welcome, as are requests for particular languages.

    Supported Languages
    1. Greek (modern), 2016-07-25
    2. Korean, 2016-12-08
    3. Hungarian (Magyar), 2016-07-25
    4. Spanish, 2016-07-25
    5. Vietnamese, 2016-07-25
    Greek (Modern)

    • Language code: el
    • Font: CMU Serif (Computer Modern Unicode)
    • Source: Opening lines of the Odyssey

    ἄνδρα μοι ἔννεπε, μοῦσα, πολύτροπον, ὃς μάλα πολλὰ πλάγχθη, ἐπεὶ Τροίης ἱερὸν πτολίεθρον ἔπερσεν: πολλῶν δ᾽ ἀνθρώπων ἴδεν ἄστεα καὶ νόον ἔγνω, πολλὰ δ᾽ ὅ γ᾽ ἐν πόντῳ πάθεν ἄλγεα ὃν κατὰ θυμόν, ἀρνύμενος ἥν τε ψυχὴν καὶ νόστον ἑταίρων. ἀλλ᾽ οὐδ᾽ ὣς ἑτάρους ἐρρύσατο, ἱέμενός περ: αὐτῶν γὰρ σφετέρῃσιν ἀτασθαλίῃσιν ὄλοντο, νήπιοι, οἳ κατὰ βοῦς Ὑπερίονος Ἠελίοιο ἤσθιον: αὐτὰρ ὁ τοῖσιν ἀφείλετο νόστιμον ἦμαρ. τῶν ἁμόθεν γε, θεά, θύγατερ Διός, εἰπὲ καὶ ἡμῖν. ἔνθ᾽ ἄλλοι μὲν πάντες, ὅσοι φύγον αἰπὺν ὄλεθρον, οἴκοι ἔσαν, πόλεμόν τε πεφευγότες ἠδὲ θάλασσαν: τὸν δ᾽ οἶον νόστου κεχρημένον ἠδὲ γυναικὸς νύμφη πότνι᾽ ἔρυκε Καλυψὼ δῖα θεάων ἐν σπέσσι γλαφυροῖσι, λιλαιομένη πόσιν εἶναι. ἀλλ᾽ ὅτε δὴ ἔτος ἦλθε περιπλομένων ἐνιαυτῶν, τῷ οἱ ἐπεκλώσαντο θεοὶ οἶκόνδε νέεσθαι εἰς Ἰθάκην, οὐδ᾽ ἔνθα πεφυγμένος ἦεν ἀέθλων καὶ μετὰ οἷσι φίλοισι. θεοὶ δ᾽ ἐλέαιρον ἅπαντες νόσφι Ποσειδάωνος: ὁ δ᾽ ἀσπερχὲς μενέαινεν ἀντιθέῳ Ὀδυσῆι πάρος ἣν γαῖαν ἱκέσθαι. ἀλλ᾽ ὁ μὲν Αἰθίοπας μετεκίαθε τηλόθ᾽ ἐόντας, Αἰθίοπας τοὶ διχθὰ δεδαίαται, ἔσχατοι ἀνδρῶν, οἱ μὲν δυσομένου Ὑπερίονος οἱ δ᾽ ἀνιόντος, ἀντιόων ταύρων τε καὶ ἀρνειῶν ἑκατόμβης. ἔνθ᾽ ὅ γ᾽ ἐτέρπετο δαιτὶ παρήμενος: οἱ δὲ δὴ ἄλλοι Ζηνὸς ἐνὶ μεγάροισιν Ὀλυμπίου ἁθρόοι ἦσαν. τοῖσι δὲ μύθων ἦρχε πατὴρ ἀνδρῶν τε θεῶν τε: μνήσατο γὰρ κατὰ θυμὸν ἀμύμονος Αἰγίσθοιο, τόν ῥ᾽ Ἀγαμεμνονίδης τηλεκλυτὸς ἔκταν᾽ Ὀρέστης: τοῦ ὅ γ᾽ ἐπιμνησθεὶς ἔπε᾽ ἀθανάτοισι μετηύδα: ὢ πόποι, οἷον δή νυ θεοὺς βροτοὶ αἰτιόωνται: ἐξ ἡμέων γάρ φασι κάκ᾽ ἔμμεναι, οἱ δὲ καὶ αὐτοὶ σφῇσιν ἀτασθαλίῃσιν ὑπὲρ μόρον ἄλγε᾽ ἔχουσιν, ὡς καὶ νῦν Αἴγισθος ὑπὲρ μόρον Ἀτρεΐδαο γῆμ᾽ ἄλοχον μνηστήν, τὸν δ᾽ ἔκτανε νοστήσαντα, εἰδὼς αἰπὺν ὄλεθρον, ἐπεὶ πρό οἱ εἴπομεν ἡμεῖς, Ἑρμείαν πέμψαντες, ἐύσκοπον ἀργεϊφόντην, μήτ᾽ αὐτὸν κτείνειν μήτε μνάασθαι ἄκοιτιν: ἐκ γὰρ Ὀρέσταο τίσις ἔσσεται Ἀτρεΐδαο, ὁππότ᾽ ἂν ἡβήσῃ τε καὶ ἧς ἱμείρεται αἴης. ὣς ἔφαθ᾽ Ἑρμείας, ἀλλ᾽ οὐ φρένας Αἰγίσθοιο πεῖθ᾽ ἀγαθὰ φρονέων: νῦν δ᾽ ἁθρόα πάντ᾽ ἀπέτισεν.

    τὸν δ᾽ ἠμείβετ᾽ ἔπειτα θεά, γλαυκῶπις Ἀθήνη: ὦ πάτερ ἡμέτερε Κρονίδη, ὕπατε κρειόντων, καὶ λίην κεῖνός γε ἐοικότι κεῖται ὀλέθρῳ: ὡς ἀπόλοιτο καὶ ἄλλος, ὅτις τοιαῦτά γε ῥέζοι: ἀλλά μοι ἀμφ᾽ Ὀδυσῆι δαΐφρονι δαίεται ἦτορ, δυσμόρῳ, ὃς δὴ δηθὰ φίλων ἄπο πήματα πάσχει νήσῳ ἐν ἀμφιρύτῃ, ὅθι τ᾽ ὀμφαλός ἐστι θαλάσσης. νῆσος δενδρήεσσα, θεὰ δ᾽ ἐν δώματα ναίει, Ἄτλαντος θυγάτηρ ὀλοόφρονος, ὅς τε θαλάσσης πάσης βένθεα οἶδεν, ἔχει δέ τε κίονας αὐτὸς μακράς, αἳ γαῖάν τε καὶ οὐρανὸν ἀμφὶς ἔχουσιν. τοῦ θυγάτηρ δύστηνον ὀδυρόμενον κατερύκει, αἰεὶ δὲ μαλακοῖσι καὶ αἱμυλίοισι λόγοισιν θέλγει, ὅπως Ἰθάκης ἐπιλήσεται: αὐτὰρ Ὀδυσσεύς, ἱέμενος καὶ καπνὸν ἀποθρῴσκοντα νοῆσαι ἧς γαίης, θανέειν ἱμείρεται. οὐδέ νυ σοί περ ἐντρέπεται φίλον ἦτορ, Ὀλύμπιε. οὔ νύ τ᾽ Ὀδυσσεὺς Ἀργείων παρὰ νηυσὶ χαρίζετο ἱερὰ ῥέζων Τροίῃ ἐν εὐρείῃ; τί νύ οἱ τόσον ὠδύσαο, Ζεῦ; τὴν δ᾽ ἀπαμειβόμενος προσέφη νεφεληγερέτα Ζεύς: τέκνον ἐμόν, ποῖόν σε ἔπος φύγεν ἕρκος ὀδόντων. πῶς ἂν ἔπειτ᾽ Ὀδυσῆος ἐγὼ θείοιο λαθοίμην, ὃς περὶ μὲν νόον ἐστὶ βροτῶν, περὶ δ᾽ ἱρὰ θεοῖσιν ἀθανάτοισιν ἔδωκε, τοὶ οὐρανὸν εὐρὺν ἔχουσιν; ἀλλὰ Ποσειδάων γαιήοχος ἀσκελὲς αἰεὶ Κύκλωπος κεχόλωται, ὃν ὀφθαλμοῦ ἀλάωσεν, ἀντίθεον Πολύφημον, ὅου κράτος ἐστὶ μέγιστον πᾶσιν Κυκλώπεσσι: Θόωσα δέ μιν τέκε νύμφη, Φόρκυνος θυγάτηρ ἁλὸς ἀτρυγέτοιο μέδοντος, ἐν σπέσσι γλαφυροῖσι Ποσειδάωνι μιγεῖσα. ἐκ τοῦ δὴ Ὀδυσῆα Ποσειδάων ἐνοσίχθων οὔ τι κατακτείνει, πλάζει δ᾽ ἀπὸ πατρίδος αἴης. ἀλλ᾽ ἄγεθ᾽, ἡμεῖς οἵδε περιφραζώμεθα πάντες νόστον, ὅπως ἔλθῃσι: Ποσειδάων δὲ μεθήσει ὃν χόλον: οὐ μὲν γὰρ τι δυνήσεται ἀντία πάντων ἀθανάτων ἀέκητι θεῶν ἐριδαινέμεν οἶος.

    Korean

    • Language code: ko-KR
    • Font: NanumMyeongjo
    • Source: Wikipedia Seoul entry, accessed 2016-12-08.

    서울특별시(서울特別市)는 대한민국의 수도이자 최대 도시이다. 기원전 18년부터 475년까지 백제의 첫 수도인 위례성이었고, 고려시대에는 남경(南京)이었으며, 조선 건국 2년 후인 1394년 조선의 수도가 된 이후로 대한민국의 정부중앙청사, 청와대의 소재지가 되기까지 1,000년 이상 백제, 조선, 대한제국, 일제 강점기, 미 군정기, 대한민국의 정치·경제·사회·문화의 중심지 역할을 해왔다. 도시의 중앙으로 한강이 흐르고, 북한산, 관악산, 도봉산, 불암산, 인능산, 인왕산, 청계산 등 산으로 둘러싸인 분지 지형의 도시이다. 동서 간의 거리는 36.78km, 남북 간의 거리는 30.3km이며, 넓이는 605.25km2이다. 면적은 대한민국 국토의 0.6%에 불과하지만, 대한민국 인구의 1/5 정도 되는 약 990만여 명이 살고 있어서 인구밀도가 매우 높다. 1986년 아시안 게임과 1988년 하계 올림픽, 2002년 FIFA 월드컵, 2010년 G20 정상회의, 2012년 핵안보정상회의가 개최된 국제적인 도시이다. 시청과 정부서울청사가 소재하는 중구와 종로구의 세종대로를 중심으로 도심을 형성하며, 행정구역은 25개 구로 이루어진다. 2013년 예산은 20조 6287억 원으로 대한민국 지방자치단체 중 예산 규모가 가장 크다.

    Hungarian (Magyar)

    • Language code: hu-HU
    • Font: Latin Modern
    • Source: Wikipedia Budapest entry, accessed 2016-07-25.

    Budapest Magyarország fővárosa, egyben legnagyobb és legnépesebb városa, az Európai Unió kilencedik legnépesebb városa. Budapest az ország politikai, kulturális, kereskedelmi, ipari és közlekedési központja. Emellett Pest megye székhelye is, bár közigazgatásilag nem része annak. 2011-ben regisztrált lakónépessége meghaladta az 1,7 (elővárosokkal együtt pedig a 2,5) millió főt. A város lakossága 1989-ben volt a legnagyobb, az akkori lélekszám 2,1 millió fő volt, és az ezt követő szuburbanizáció után is megmaradt az ország legnépesebb városának. Területe mintegy 525 négyzetkilométer, ebben a tekintetben is első az ország települései között.

    Budapest története a keltákig nyúlik vissza, mivel a város eredetileg kelta település volt. A rómaiak által létrehozott, a Danubius folyó jobb partján fekvő Aquincum és a bal parti Contra-Aquincum volt Pannonia provincia székhelye. A magyarok a 9. században érkeztek erre a területre. Az első általuk létrehozott települést a mongolok 1241 és 1242 között, a tatárjárás során teljesen kifosztották és elpusztították. A 15. században a helyreállított város lett a magyarországi reneszánsz humanizmus központja. Ezt követően százötven évnyi török hódoltság telepedett a városra és csak a 18-19. században tudott újra fejlődni, ezt fokozta, hogy a kiegyezést követően Bécs mellett az Osztrák–Magyar Monarchia fővárosa volt. 1873-ban egyesítették Budát, Pestet és Óbudát, ekkor jött létre Budapest. Ebben az időben épültek a város leghíresebb épületei, és ekkor nőtte ki magát világvárossá.

    Budapest kedvelt idegenforgalmi célpont is, 2012-ben 4 821 600 turista kereste fel, ezzel az Euromonitor International felmérése szerint a világ 27. és Európa 7. leglátogatottabb városa. Budapesten több világörökségi helyszín is található, többek között a Duna-part látképe, a Budai Várnegyed, az Andrássy út, a Hősök tere és a Millenniumi Földalatti Vasút, amely a második legrégebbi a világon a londoni után. Turisztikailag jelentősek még a város Duna-hídjai, valamint gyógyfürdői, mivel Budapest a világ legtöbb gyógyfürdőjével rendelkező fővárosa. Itt található még a világ legnagyobb termálvizes barlangrendszere, Európa legnagyobb zsinagógája (a Dohány utcai), valamint a magyar Országház is, amely a világ harmadik legnagyobb parlamenti épülete, és a Szent Korona jelenlegi otthona.

    Budapest Közép-Európa egyik pénzügyi központja és a világ 100. legnagyobb GDP-jét termelő városa. Az amerikai Forbes magazin szerint Budapest a 7. „legidillibb európai város”. A UCityGuides a világ 9. legszebb városának sorolja. A befolyásos amerikai Condé Nast Traveler utazási magazin által megkérdezett 1,3 millió személy véleménye alapján „Budapest a világ második legjobb városa”. A magyar főváros továbbá egyike Európa 10 legkedveltebb bevásárlóvárosának az Economist magazin kutatásai szerint, ugyanis itt található Közép- és Kelet-Európa legtöbb bevásárlóközpontja.

    Russian

    • Language code: ru-RU
    • Font: CMU Serif (Computer Modern Unicode)
    • Source: Wikipedia Moscow entry, accessed 2016-12-09.

    Москва — столица Российской Федерации, город федерального значения, административный центр Центрального федерального округа и центр Московской области, в состав которой не входит. Крупнейший по численности населения город России и её субъект — 12 330 126 чел. (2016), самый населённый из городов, полностью расположенных в Европе, входит в первую десятку городов мира по численности населения. Центр Московской городской агломерации.

    Историческая столица Великого княжества Московского, Русского царства, Российской империи (в 1728—1730 годах), Советской России и СССР. Город-герой. В Москве находятся федеральные органы государственной власти Российской Федерации (за исключением Конституционного суда), посольства иностранных государств, штаб-квартиры большинства крупнейших российских коммерческих организаций и общественных объединений.

    Расположена на реке Москве в центре Восточно-Европейской равнины, в междуречье Оки и Волги. Как субъект федерации Москва граничит с Московской и Калужской областями.

    Москва — важный туристический центр России. Московский Кремль, Красная площадь, Новодевичий монастырь и Церковь Вознесения в Коломенском входят в список Всемирного наследия ЮНЕСКО. Она является важнейшим транспортным узлом. Город обслуживают 5 аэропортов, 9 железнодорожных вокзалов, 3 речных порта (имеется речное сообщение с морями бассейнов Атлантического и Северного Ледовитого океанов). С 1935 года в Москве работает метрополитен.

    Spanish

    • Language code: es-ES
    • Font: Latin Modern
    • Source: Wikipedia Madrid entry, accessed 2016-07-25.

    Madrid es un municipio y ciudad de España. La localidad, con categoría histórica de villa, es la capital del Estado y de la Comunidad de Madrid. También conocida como la Villa y Corte, es la ciudad más poblada del país, con 3 165 235 habitantes empadronados según datos del INE de 2014 mientras que, con la inclusión de su área metropolitana la cifra de población asciende a 6 543 031 habitantes, siendo por ello la tercera o cuarta área metropolitana de la Unión Europea, según la fuente, por detrás de las de París y Londres, y en algunas fuentes detrás también de la Región del Ruhr, así como la tercera ciudad más poblada de la Unión Europea, por detrás de Berlín y Londres. Madrid ocupa el puesto nº 38 en la lista Economist Intelligence Unit de ciudades con mejor calidad de vida del mundo.

    Como capital del Estado, Madrid alberga las sedes del Gobierno, las Cortes Generales, ministerios, instituciones y organismos asociados, así como la residencia oficial de los reyes de España12 y del presidente del Gobierno. En el plano económico, es la cuarta ciudad más rica de Europa, tras Londres, París y Moscú. Para el 2009, el 50,1 % de los ingresos de las 5000 principales empresas españolas son generados por sociedades con sede social en Madrid, las cuales representan el 31,8 % de ellas. Es sede del 3.er mayor mercado de valores de Europa, y 2ª en el ámbito latinoamericano (Latibex) y de varias de las más grandes corporaciones del mundo. Es la 8.ª ciudad del mundo con mayor presencia de multinacionales, tras Pekín y por delante de Dubái, París y Nueva York.

    En el plano internacional acoge la sede central de la Organización Mundial del Turismo (OMT), perteneciente a la ONU, la sede de la Organización Internacional de Comisiones de Valores (OICV), la sede de la Secretaría General Iberoamericana (SEGIB), la sede de la Organización de Estados Iberoamericanos para la Educación, la Ciencia y la Cultura (OEI), la Organización Iberoamericana de Juventud (OIJ), y la sede de Public Interest Oversight Board (PIOB). También alberga las principales instituciones internacionales reguladoras y difusoras del idioma español: la Comisión Permanente de la Asociación de Academias de la Lengua Española, y sedes centrales de la Real Academia Española (RAE), del Instituto Cervantes y de la Fundación del Español Urgente (Fundéu). Madrid organiza ferias como FITUR, Madrid Fusión, ARCO, SIMO TCI, el Salón del Automóvil y la Cibeles Madrid Fashion Week.

    Es un influyente centro cultural y cuenta con museos de referencia internacional, entre los que destacan el Museo del Prado, el Museo Nacional Centro de Arte Reina Sofía, el Thyssen-Bornemisza y CaixaForum Madrid, que ocupan, respectivamente, el 12º, 18º, 67º y 80º puesto entre los museos más visitados del mundo.

    Los orígenes de la ciudad son objeto de revisión tras recientes hallazgos de enterramientos visigodos así como de restos que se remontan a los carpetanos o periodo prerromano. Las excavaciones arqueológicas también arrojan restos que se atribuyen al Madrid romano. Estos hallazgos de época visigoda han venido a confirmar que el posterior asentamiento fortificado musulmán de Maǧrīţ (del siglo IX) se había asentado sobre un vicus visigodo del siglo VII llamado Matrice o matriz, arroyo. (AFI [maʤriːtˁ]),

    No sería hasta el siglo XI cuando Madrid fue incorporada a la Corona de Castilla, tras su conquista por Alfonso VI de León y Castilla en 1083. Fue designada como sede de la Corte por el rey Felipe II en 1561, convirtiéndose en la primera capital permanente de la monarquía española. Desde el Renacimiento hasta la actualidad ha sido capital de España y sede del Gobierno y la administración del Estado salvo breves intervalos de tiempo: entre los años de 1601 y 1606 la capitalidad pasó a Valladolid; durante la Guerra de la Independencia Española, en que la capital se trasladó a Sevilla; en 1808 y en 1810 a Cádiz; durante la Guerra Civil, cuando el Gobierno republicano se trasladó primero a Valencia y después a Barcelona, durante la Guerra Civil el bando nacional se estableció en Burgos, y tras finalizar esta se estableció allí la capital hasta el 18 de octubre de 1939 que se volvió a trasladar a Madrid.

    Vietnamese

    • Language code: vi-VN
    • Font: Latin Modern
    • Source: Wikipedia Hà Nội entry, accessed 2016-07-25.

    Hà Nội là thủ đô của nước Cộng hoà Xã hội chủ nghĩa Việt Nam và cũng là kinh đô của rất nhiều vương triều Việt cổ. Do đó, lịch sử Hà Nội gắn liền với sự thăng trầm của lịch sử Việt Nam qua các thời kỳ. Hà Nội là thành phố lớn nhất Việt Nam về diện tích với 3328,9 km2 sau đợt mở rộng hành chính năm 2008, đồng thời cũng là địa phương đứng thứ nhì về dân số với 7.500.000 người (năm 2015). Hiện nay, thủ đô Hà Nội và thành phố Hồ Chí Minh là đô thị loại đặc biệt của Việt Nam.

    Hà Nội nằm giữa đồng bằng sông Hồng trù phú, nơi đây đã sớm trở thành 1 trung tâm chính trị, kinh tế và văn hóa ngay từ những buổi đầu của lịch sử Việt Nam. Năm 1010, Lý Công Uẩn, vị vua đầu tiên của nhà Lý, quyết định xây dựng kinh đô mới ở vùng đất này với cái tên Thăng Long. Trong suốt thời kỳ của các triều đại Lý, Trần, Lê, Mạc, kinh thành Thăng Long là trung tâm văn hóa, giáo dục và buôn bán của cả nước. Khi Tây Sơn rồi nhà Nguyễn lên nắm quyền trị vì, kinh đô được chuyển về Huế và Thăng Long bắt đầu mang tên Hà Nội từ năm 1831, dưới thời vua Minh Mạng. Năm 1902, Hà Nội trở thành thủ đô của Liên bang Đông Dương và được người Pháp xây dựng, quy hoạch lại, được coi là tiểu Paris của Phương Đông thời bấy giờ. Trải qua hai cuộc chiến tranh, Hà Nội là thủ đô của nước CHXHCN Việt Nam thống nhất và giữ vai trò này cho tới ngày nay.

    Sau đợt mở rộng địa giới hành chính vào tháng 8 năm 2008, Hà Nội hiện nay gồm 12 quận, 1 thị xã và 17 huyện ngoại thành. Hiện nay, Hà Nội và Thành phố Hồ Chí Minh là hai trung tâm kinh tế - xã hội đặc biệt quan trọng của Việt Nam.

    General Language and Script Support

    2016-12-08: this section is preliminary.

    HTML output works well if your source includes Unicode characters. Hyphenation is a non-issue, since text reflows and there is no flush-right support.

    It is a different story for , PDF, and print. So that is the focus in this sample document. You may not recognize the next subsection, but an explanation follows.

    ὁ δὴ ἤτοι πρῶτός ἐστιν ἢ οὔ

    ὁ δὴ ἤτοι πρῶτός ἐστιν ἢ οὔ.

    Languages, Scripts, Subdivisions

    The previous subsection has an xml:lang attribute on the subsection element, whose value is el indicating the Modern Greek language. So the entire subsection is being treated as characters from that language. There is a title, but it is not being affected now, and so is empty.

    The behavior should be entirely similar for part, chapter, section, and subsubsection.

    Language and Script Examples

    Other elements have language support. We are starting with foreign, which also italicizes the content.

    I Can Eat Glass

    From the Kermit Project a startling phrase in many languages.

    • Modern Greek (monotonic), Italic: Μπορώ να φάω σπασμένα γυαλιά χωρίς να πάθω τίποτα.
    • Korean, Italic: 나는 유리를 먹을 수 있어요. 그래도 아프지 않아요
    • Hungarian, Italic: Meg tudom enni az üveget, nem lesz tőle bajom.
    • Russian, Italic: Я могу есть стекло, оно мне не вредит.
    • Spanish, Italic: Puedo comer vidrio, no me hace daño.
    • Vietnamese, Italic: Tôi có thể ăn thủy tinh mà không hại gì.
    Font Tests

    We place various blocks of Unicode characters here to determine the minimum configuration necessary to make them render. Alan Wood’s Unicode Resources site has been helpful in formulating these tests.

    Basic Latin, <c>U+0000</c><ndash /><c>U+007F</c>

    These 95 characters are the most basic, and will all render using xelatex with no special setup. U+0000 to U+001F are control codes and not used here. U+007F is also a control code and so is excluded. In the source we have authored each character by its escaped version using its Unicode number (in hexadecimal). So, for example, capital-B is authored as &#x0042;.

    Basic Latin, Regular 0 1 2 3 4 5 6 7 8 9 A B C D E F 002_ !"#$%&' ()*+,-./ 003_01234567 89:;<=>? 004_@ABCDEFG HIJKLMNO 005_PQRSTUVW XYZ[\]^_ 006_`abcdefg hijklmno 007_pqrstuvw xyz{|}~
    Monospace, Basic Latin, <c>U+0000</c><ndash /><c>U+007F</c>

    These are exactly the same characters as above, but now we wrap them in the <c> element intended for inline use. This does not test all verbatim situations but is a good simple first test.

    Basic Latin, Monospace 0 1 2 3 4 5 6 7 8 9 A B C D E F 002_ !"#$%&' ()*+,-./ 003_01234567 89:;<=>? 004_@ABCDEFG HIJKLMNO 005_PQRSTUVW XYZ[\]^_ 006_`abcdefg hijklmno 007_pqrstuvw xyz{|}~

    Note that the single and double quotes are upright and dumb, not curly and smart: " ' " ' " '. The zero is distinguished from the capital oh: 0 O 0 O 0 O. And the numeral one is slightly different from the lower-case ell: 1 l 1 l 1 l. The hyphen should be short and not expanded into some other kind of dash: - - -. These characters should all cut/paste out of a PDF into a text editor with no conversion to other characters.

    Note also that we have again entered all these characters into the source with the &#x00NN; XML notation.

    Latin-1 Supplement, <c>U+0080</c><ndash /><c>U+00FF</c>

    These 94 characters will all render using either pdflatex or xelatex with no special setup. U+0080 to U+009F are control codes and not used here. U+00A0 (non-breaking space) and U+00AD (soft hyphen) are also excluded. In the source we have authored each character by its escaped version using its Unicode number (in hexadecimal). So, for example, a copyright symbol is authored as &#x00A9;.

    Latin-1 Supplement, Regular 0 1 2 3 4 5 6 7 8 9 A B C D E F 00A_ ¡¢£¤¥¦§ ¨©ª«¬ ®¯ 00B_°±²³´µ· ¸¹º»¼½¾¿ 00C_ÀÁÂÃÄÅÆÇ ÈÉÊËÌÍÎÏ 00D_ÐÑÒÓÔÕÖ× ØÙÚÛÜÝÞß 00E_àáâãäåæç èéêëìíîï 00F_ðñòóôõö÷ øùúûüýþÿ
    Monospace, Latin-1 Supplement, <c>U+0080</c><ndash /><c>U+00FF</c>

    The same 94 characters as above, wrapped in a <c> element as if being used inside a sentence. These will all render with xelatex and none will render with pdflatex (so there is just blank space below). If we improve the latter, then these will get duplicated into the sample article.

    Latin-1 Supplement, Monospace 0 1 2 3 4 5 6 7 8 9 A B C D E F 00A_ ¡¢£¤¥¦§ ¨©ª«¬ ®¯ 00B_°±²³´µ· ¸¹º»¼½¾¿ 00C_ÀÁÂÃÄÅÆÇ ÈÉÊËÌÍÎÏ 00D_ÐÑÒÓÔÕÖ× ØÙÚÛÜÝÞß 00E_àáâãäåæç èéêëìíîï 00F_ðñòóôõö÷ øùúûüýþÿ
    Latin Extended-A, <c>U+0100</c><ndash /><c>U+017F</c>

    Good success rendering with xelatex and no extra setup, subject to glyphs actually being available in whatever font you use. Our default font is Latin Modern. About 25% of these are missing when rendered with pdflatex.

    Latin Extended-A 0 1 2 3 4 5 6 7 8 9 A B C D E F 010_ĀāĂ㥹Ćć ĈĉĊċČčĎď 011_ĐđĒēĔĕĖė ĘęĚěĜĝĞğ 012_ĠġĢģĤĥĦħ ĨĩĪīĬĭĮį 013_İıIJijĴĵĶķ ĸĹĺĻļĽľĿ 014_ŀŁłŃńŅņŇ ňʼnŊŋŌōŎŏ 015_ŐőŒœŔŕŖŗ ŘřŚśŜŝŞş 016_ŠšŢţŤťŦŧ ŨũŪūŬŭŮů 017_ŰűŲųŴŵŶŷ ŸŹźŻżŽžſ

    Rendered with xelatex and no special setup, with default latin Modern fonts, we seem to be missing only four characters:

    • U+0138 (LATIN SMALL LETTER KRA, Greenlandic, removed 1973)
    • U+0149 (LATIN SMALL LETTER N PRECEDED BY APOSTROPHE, Afrikaans, deprecated as of Unicode version 5.2.0)
    • U+0166 (LATIN CAPITAL LETTER T WITH STROKE, Northern Sámi alphabet, used in northern parts of Norway, Sweden and Finland)
    • U+0167 (LATIN SMALL LETTER T WITH STROKE, Northern Sámi alphabet, used in northern parts of Norway, Sweden and Finland)

    Latin Extended-B, <c>U+0180</c><ndash /><c>U+024F</c>

    Rendering with xelatex and no extra setup, with default latin Modern fonts, maybe 50% missing, and some constructions of accents are clearly wrong. Almost none of these appear when rendered with pdflatex. (When processed with lualatex the incorrectly accented characters are not even visible, but we have not learned much about using fonts in LuaTeX.) Latin Modern does not claim to support any of this range.

    Latin Extended-B 0 1 2 3 4 5 6 7 8 9 A B C D E F 018_ƀƁƂƃƄƅƆƇ ƈƉƊƋƌƍƎƏ 019_ƐƑƒƓƔƕƖƗ ƘƙƚƛƜƝƞƟ 01A_ƠơƢƣƤƥƦƧ ƨƩƪƫƬƭƮƯ 01B_ưƱƲƳƴƵƶƷ ƸƹƺƻƼƽƾƿ 01C_ǀǁǂǃDŽDždžLJ LjljNJNjnjǍǎǏ 01D_ǐǑǒǓǔǕǖǗ ǘǙǚǛǜǝǞǟ 01E_ǠǡǢǣǤǥǦǧ ǨǩǪǫǬǭǮǯ 01F_ǰDZDzdzǴǵǶǷ ǸǹǺǻǼǽǾǿ 020_ȀȁȂȃȄȅȆȇ ȈȉȊȋȌȍȎȏ 021_ȐȑȒȓȔȕȖȗ ȘșȚțȜȝȞȟ 022_ȠȡȢȣȤȥȦȧ ȨȩȪȫȬȭȮȯ 023_ȰȱȲȳȴȵȶȷ ȸȹȺȻȼȽȾȿ
    Latin Extended Additional, <c>U+1E00</c><ndash /><c>U+1EFF</c>

    Latin Modern, our default font, supports this range of 256 characters, which includes 90 Vietnamese characters. Their documentation shows about 140 characters rendered correctly, which seems to jibe with the examples here that render properly.

    Latin Extended Additional 0 1 2 3 4 5 6 7 8 9 A B C D E F 1E0_ 1E1_ 1E2_ 1E3_ ḿ 1E4_ 1E5_ 1E6_ 1E7_ ṿ 1E8_ 1E9_ 1EA_ 1EB_ ế 1EC_ 1ED_ 1EE_ 1EF_ ỿ
    Graphics

    Some graphics languages require the xelatex engine, which this document presumes.

    PSTricks PSTricks

    PSTricks is a package for drawing diagrams and pictures, dating back to the days before PDF when PostScript (PS) was king. Given its history, it does not seem to work easily with the pdflatex engine. But it will work easily with the xelatex engine. So we test and document this approach here.

    For the following we add\usepackage{pstricks-add} to the latex-image-preamble portion of docinfo. Your diagrams might be fine with simply the pstricks package. Following comes fromhttps://www.tug.org/PSTricks/main.cgi?file=Examples/polar#lemniscateaccessed on 2018-02-05.

    Note that the width attribute is respected for HTML output, but ignored for the output. This situation could change.

    A Lemniscate \psset{unit=3cm,opacity=0.4} \begin{pspicture}(-2,-1)(2,1) \psgrid[gridcolor=lightgray,subgriddiv=0] \psset{polarplot,plotpoints=500,linecolor=red,fillcolor=blue!30,fillstyle=solid,linewidth=2pt} \psplot{-45}{45}{x dup add cos 3 mul sqrt} \psplot[fillcolor=red!30,fillstyle=solid,linecolor=blue]{135}{225}{x dup add cos 3 mul sqrt} \end{pspicture}
    ================================================ FILE: examples/hello-world/README.md ================================================ # "Hello, World" Example `hello-world.xml` is a one-page article that has only a single paragraph with a single sentence. Guess what it says? For a more informative small example, see the `examples/minimal` directory. ================================================ FILE: examples/hello-world/hello-world.xml ================================================
    A Small Hello to the World

    Hello, World!

    ================================================ FILE: examples/hello-world/publication.xml ================================================ ================================================ FILE: examples/humanities/README.md ================================================ # Humanities Example `source/main.ptx` is a small document that primarily illustrates (and tests) markup for music and poetry. `project.ptx` is a project configuration file for use with the PreTeXt-CLI. `codechat_config.yaml` is a CodeChat project configuration file, which will use the PreTeXt-CLI for processing. ================================================ FILE: examples/humanities/codechat_config.yaml ================================================ # .. Copyright (C) 2012-2020 Bryan A. Jones. # # This file is part of the CodeChat System. # # The CodeChat System is free software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # The CodeChat System is distributed in the hope that it will be # useful, but WITHOUT ANY WARRANTY; without even the implied warranty # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the CodeChat System. If not, see # . # # ************************************************ # |docname| - Configuration for a CodeChat project # ************************************************ # This file defines the configuration for a CodeChat project. It contains a working `Sphinx `_ configuration. # # ``source_path``: optional; defaults to ``.`` (the current directory). A path to the root of the source tree. Relative paths are rooted in the directory containing this configuration file. source_path: source # ``output_path``: required. A path to the root of the HTML output produced by this renderer. Relative paths are rooted in the directory containing this configuration file. output_path: output/html # ``args``: required string or sequence of strings. This provides the arguments to invoke the renderer. These strings may optionally contain the following replacement values: # # - ``{project_path}``: an absolute path to the directory containing this file. # - ``{source_path}``: the ``source_path`` above, but as an absolute path. # - ``{output_path}``: the ``output_path`` above, but as an absolute path. # # The line below could also be written ``args: sphinx-build . _build``. args: pretext build html # ``html_ext``: optional; defaults to ``.html``. The extension used by this renderer when generating HTML files. #html_ext: .html # ``project_type``: optional; defaults to ``general``. Define the project type, which enables special processing based on the type. Valid values are ``general`` (no special processing), ``Doxygen``, and ``PreTeXt``. project_type: PreTeXt ================================================ FILE: examples/humanities/generated-assets/.gitkeep ================================================ ================================================ FILE: examples/humanities/project.ptx ================================================ html source/hia.xml publication/publication.ptx output/html latex source/hia.xml publication/publication.ptx output/latex pdf source/hia.xml publication/publication.ptx output/pdf latex pdflatex xelatex pdf2svg asy sage convert pdftops pdf-crop-margins pageres node file2brl ================================================ FILE: examples/humanities/publication/publication.ptx ================================================ ================================================ FILE: examples/humanities/requirements.txt ================================================ pretextbook == 0.7.0 ================================================ FILE: examples/humanities/source/hia.xml ================================================ Humanities in Action Jahrme Risner University of Puget Sound

    A collection of demonstrations leveraging the increased support for writing in the humanities.

    ================================================ FILE: examples/humanities/source/music.xml ================================================ Music
    Musical Symbols Accidentals

    The accidentals are

    • <doublesharp/>:

    • <sharp/>:

    • <natural/>:

    • <flat/>:

    • <doubleflat/>:

    Scale Degrees

    Scale degrees are created using the <scaledeg> tag which places a diacritic circumflex over the degree. The circumflex looks best when attached to single-digit numbers.

    Scale Degrees

    The scale degrees are

    • <scaledeg>0</scaledeg>: 0

    • <scaledeg>1</scaledeg>: 1

    • <scaledeg>2</scaledeg>: 2

    • <scaledeg>3</scaledeg>: 3

    • <scaledeg>4</scaledeg>: 4

    • <scaledeg>5</scaledeg>: 5

    • <scaledeg>6</scaledeg>: 6

    • <scaledeg>7</scaledeg>: 7

    • <scaledeg>8</scaledeg>: 8

    • <scaledeg>9</scaledeg>: 9

    • <scaledeg>10</scaledeg>: 10

    Time Signatures

    Time signatures are formed with the timesignature element and the top and bottom attributes. For example,

    • <timesignature top="2" bottom="4"/>:
    • <timesignature top="12" bottom="8"/>:
    • <timesignature top="7" bottom="8"/>:
    • <timesignature top="5" bottom="24"/>:
    • <timesignature top="3+2+3" bottom="8"/>:
    • <timesignature top="5" bottom="8"/><ampersand/><timesignature top="3" bottom="8"/>: &

    Notes

    Notes are created using the <n> tag with a pitch class, @pc. Optional attributes include accidentals, @acc, and octaves, @octave. Please note, accidentals precede numeric pitch classes.

    For example, <n pc="C" acc="sharp" octave="4"/> results in while <n pc="5" acc="flat"/> results in .

    Alphabetic Pitch Classes

    The alphabetic pitch classes are

    Numeric Pitch Classes

    The numeric pitch classes are

    Chords

    Chords are created using a combination of the <chord> and <alteration> tags. The <chord> tag can have any combination of the following attributes: @root, @mode, @bps, @suspended, @parentheses, and @bass. For alterations to chords, we place each alteration in an <alteration> tag, which are contained within the <chord> tag. To accommodate different styles of chord notation, the <chord> attribute @parentheses (parentheses="yes|no") will toggle the parentheses surrounding the alterations. With regard to the mode or characteristic of the chord, whatever text is entered will be used verbatim except in the cases of augmented, major, minor, halfdiminished, and diminished. In these cases, the standard chord symbol representation will be used (, , , , and respectively).

    For example, <chord root="C" bps="4 3"/> will result in while

                <chord root="B doublesharp" mode="min major" bps="6 5"
                       suspended="yes" parentheses="yes" bass="G">
                    <alteration><sharp/>9</alteration>
                    <alteration>add 11</alteration>
                </chord>
            

    will result in 9add 11.

    Chords

    Examples of chaords are

    • bass

    • 5

    • dim 5

    • dim 5

    • add 9omit 3

    • 119

    • add 11omit 5

    • 5

    • add 3

    • add 9add 9

    Chord Comparisons

    While there are different ways to notate chords, some are clearer than others.

    • vs

    • vs

    • 5 vs vs

    Scores

    A score may be represented in several formats: PDF output from a scorewriter (not a scan of printed sheet music), an XML file in the MusicXML format, online within MuseScore, or in Lilypond syntax. We plan to support various output options and conversions, but at this writing support is rudimentary, but evolving.

    <init>PDF</init> Source

    Starting with a PDF that is born digital such as output from a scorewriter like Finale, it is possible to treat the score simply as we would any other image. The PDF version will be incorporated into the PDF output when the output is compiled, presuming the file is placed in the right location relative to the main file. For HTML output the utilities pdfcrop and pdf2svg will produce an SVG image that will work well.

    This procedure will work best for very short scores, since it is treated as an indivisible image. For output, a longer score can lead to very poor page breaks, and large vertical gaps, especially in a preceding page. Or worse, the score might be longer than a single page, for which there is no solution. The piece below is inadvisably long and will likely demonstrate this behavior, though it is shorter than a page. Using scores authored, or converted to, Lilypond syntax should allow for better behavior of longer scores within a document.

    Allegretto in F, Rob Hutchinson
    Embedded Interactive Musical Scores

    A score hosted on MuseScore is easy to specify with two ID numbers: the user number and the score number (examine the source for details). Then an embedded interactive player is nearly trivial to embed into HTML output. Work continues on a process to realize the score within output.

    String Quartet 1 by Lily He
    ================================================ FILE: examples/humanities/source/poetry.xml ================================================ Poetry

    A collection of public domain poetry from: publicdomainpoems.com

    William Butler Yeats No Second Troy William Butler Yeats Why should I blame her that she filled my days With misery, or that she would of late Have taught to ignorant men most violent ways, Or hurled the little streets upon the great, Had they but courage equal to desire? What could have made her peaceful with a mind That nobleness made simple as a fire, With beauty like a tightened bow, a kind That is not natural in an age like this, Being high and solitary and most stern? Why, what could she have done, being what she is? Was there another Troy for her to burn? The Lake Isle of Innisfree William Butler Yeats I will arise and go now, and go to Innisfree, And a small cabin build there, of clay and wattles made: Nine bean-rows will I have there, a hive for the honeybee, And live alone in the bee-loud glade. And I shall have some peace there, for peace comes dropping slow, Dropping from the veils of the morning to where the cricket sings; There midnight's all a glimmer, and noon a purple glow, And evening full of the linnet's wings. I will arise and go now, for always night and day I hear lake water lapping with low sounds by the shore; While I stand on the roadway, or on the pavements grey, I hear it in the deep heart's core. He wishes for the clothes of Heaven William Butler Yeats Had I the heavens' embroidered cloths, Enwrought with golden and silver light, The blue and the dim and the dark cloths Of night and light and the half-light, I would spread the cloths under your feet: But I, being poor, have only my dreams; I have spread my dreams under your feet; Tread softly because you tread on my dreams. Easter 1916 William Butler Yeats I I have met them at close of day Coming with vivid faces From counter or desk among grey Eighteenth-century houses. I have passed with a nod of the head Or polite meaningless words, Or have lingered awhile and said Polite meaningless words, And thought before I had done Of a mocking tale or a gibe To please a companion Around the fire at the club, Being certain that they and I But lived where motley is worn: All changed, changed utterly: A terrible beauty is born. II That woman's days were spent In ignorant good-will, Her nights in argument Until her voice grew shrill. What voice more sweet than hers When, young and beautiful, She rode to harriers? This man had kept a school And rode our winged horse; This other his helper and friend Was coming into his force; He might have won fame in the end, So sensitive his nature seemed, So daring and sweet his thought. This other man I had dreamed A drunken, vainglorious lout. He had done most bitter wrong To some who are near my heart, Yet I number him in the song; He, too, has resigned his part In the casual comedy; He, too, has been changed in his turn, Transformed utterly: A terribly beauty is born. III Hearts with one purpose alone Through summer and winter seem Enchanted to a stone To trouble the living stream. The horse that comes from the road, The rider, the birds that range From cloud to tumbling cloud, Minute by minute they change; A shadow of cloud on the stream Changes minute by minute; A horse-hoof slides on the brim, And a horse plashed within it; The long-legged moor-hens dive, And hens to moor-cocks call; Minute by minute they live: The stone's in the midst of all. IV Too long a sacrifice Can make a stone of the heart. O when may it suffice? That is Heaven's part, our part To murmur name upon name, As a mother names her child When sleep at last has come On limbs that had run wild. What is it but nightfall? No, no, not night but death; Was it needless death after all? For England may keep faith For all that is done and said. We know their dream; enough To know they dreamed and are dead; And what if excess of love Bewildered them till they died? I write it out in a verse - MacDonagh and MacBride And Connolly and Pearse Now and in time to be, Wherever green is worn, Are changed, changed utterly: A terrible beauty is born. An Irish Airman Foresees His Death William Butler Yeats I know that I shall meet my fate Somewhere among the clouds above; Those that I fight I do not hate Those that I guard I do not love; My country is Kiltartan Cross, My countrymen Kiltartan's poor, No likely end could bring them loss Or leave them happier than before. Nor law, nor duty bade me fight, Nor public man, nor cheering crowds, A lonely impulse of delight Drove to this tumult in the clouds; I balanced all, brought all to mind, The years to come seemed waste of breath, A waste of breath the years behind In balance with this life, this death. The Stolen Child William Butler Yeats Where dips the rocky highland Of Sleuth Wood in the lake, There lies a leafy island Where flapping herons wake The drowsy water-rats; There we've hid our faery vats, Full of berries And of reddest stolen cherries. Come away, O human child! To the waters and the wild With a faery, hand in hand, For the world's more full of weeping than you can understand. Where the wave of moonlight glosses The dim grey sands with light, Far off by furthest Rosses We foot it all the night, Weaving olden dances, Mingling hands and mingling glances Till the moon has taken flight; To and fro we leap And chase the frothy bubbles, While the world is full of troubles And is anxious in its sleep. Come away, O human child! To the waters and the wild With a faery, hand in hand, For the world's more full of weeping than you can understand. Where the wandering water gushes From the hills above Glen-Car, In pools among the rushes That scarce could bathe a star, We seek for slumbering trout And whispering in their ears Give them unquiet dreams; Leaning softly out From ferns that drop their tears Over the young streams. Come away, O human child! To the waters and the wild With a faery, hand in hand, For the world's more full of weeping than you can understand. Away with us he's going, The solemn-eyed: He'll hear no more the lowing Of the calves on the warm hillside Or the kettle on the hob Sing peace into his breast, Or see the brown mice bob Round and round the oatmeal-chest. For he comes, the human child, To the waters and the wild With a faery, hand in hand, From a world more full of weeping than he can understand. When you are old William Butler Yeats When you are old and grey and full of sleep, And nodding by the fire, take down this book, And slowly read, and dream of the soft look Your eyes had once, and of their shadows deep; How many loved your moments of glad grace, And loved your beauty with love false or true, But one man loved the pilgrim soul in you, And loved the sorrows of your changing face; And bending down beside the glowing bars, Murmur, a little sadly, how Love fled And paced upon the mountains overhead And hid his face amid a crowd of stars. The Fiddler of Dooney William Butler Yeats When I play on my fiddle in Dooney Folk dance like a wave of the sea My cousin is priest in Kilvarnet My brother in Moharabuiee I passed my brother and cousin: They read in their books of prayer; I read in my book of songs I bought at the Sligo fair. When we come at the end of time, To Peter sitting in state, He will smile on the three old spirits, But call me first through the gate; For the good are always the merry, Save by an evil chance, And the merry love the fiddle And the merry love to dance: And when the folk there spy me, They will all come up to me, With Here is the fiddler of Dooney! And dance like a wave of the sea. Swift's Epitaph William Butler Yeats Swift has sailed into his rest; Savage indignation there Cannot lacerate his breast. Imitate him if you dare, World-besotted traveller; he Served human liberty. The Wild Swans At Coole William Butler Yeats The trees are in their autumn beauty, The woodland paths are dry, Under the October twilight the water Mirrors a still sky; Upon the brimming water among the stones Are nine-and-fifty swans. The nineteenth autumn has come upon me Since I first made my count; I saw, before I had well finished, All suddenly mount And scatter wheeling in great broken rings Upon their clamorous wings. I have looked upon those brilliant creatures, And now my heart is sore. All's changed since I, hearing at twilight, The first time on this shore, The bell-beat of their wings above my head, Trod with a lighter tread. Unwearied still, lover by lover, They paddle in the cold Companionable streams or climb the air; Their hearts have not grown old; Passion or conquest, wander where they will, attend upon them still. But now they drift on the still water, Mysterious, beautiful; Among what rushes will they build, By what lake's edge or pool Delight men's eyes when I awake some day To find they have flown away? To A Friend Whose Work Has Come To Nothing William Butler Yeats Now all the truth is out, Be secret and take defeat From any brazen throat, For how can you compete, Being honour bred, with one Who, were it proved he lies, Were neither shamed in his own Nor in his neighbours' eyes? Bred to a harder thing Than Triumph, turn away And like a laughing string Whereon mad fingers play Amid a place of stone, Be secret and exult, Because of all things known That is most difficult.
    Robert Frost Fire and Ice Robert Frost Some say the world will end in fire, Some say in ice. From what I've tasted of desire I hold with those who favor fire. But if it had to perish twice, I think I know enough of hate To say that for destruction ice Is also great And would suffice. The Oven Bird Robert Frost There is a singer everyone has heard, Loud, a mid-summer and a mid-wood bird, Who makes the solid tree trunks sound again. He says that leaves are old and that for flowers Mid-summer is to spring as one to ten. He says the early petal-fall is past When pear and cherry bloom went down in showers On sunny days a moment overcast; And comes that other fall we name the fall. He says the highway dust is over all. The bird would cease and be as other birds But that he knows in singing not to sing. The question that he frames in all but words Is what to make of a diminished thing. Bond and Free Robert Frost Love has earth to which she clings With hills and circling arms about Wall within wall to shut fear out. But Thought has need of no such things, For Thought has a pair of dauntless wings. On snow and sand and turf, I see Where Love has left a printed trace With straining in the world's embrace. And such is Love and glad to be. But Thought has shaken his ankles free. Thought cleaves the interstellar gloom And sits in Sirius' disc all night, Till day makes him retrace his flight, With smell of burning on every plume, Back past the sun to an earthly room. His gains in heaven are what they are. Yet some say Love by being thrall And simply staying possesses all In several beauty that Thought fares far To find fused in another star. Putting in the Seed Robert Frost You come to fetch me from my work tonight When supper's on the table, and we'll see If I can leave off burying the white Soft petals fallen from the apple tree. (Soft petals, yes, but not so barren quite, Mingled with these, smooth bean and wrinkled pea;) And go along with you ere you lose sight Of what you came for and become like me, Slave to a springtime passion for the earth. How Love burns through the Putting in the Seed On through the watching for that early birth When, just as the soil tarnishes with weed, The sturdy seedling with arched body comes Shouldering its way and shedding the earth crumbs. The Road Not Taken Robert Frost Two roads diverged in a yellow wood, And sorry I could not travel both And be one traveler, long I stood And looked down one as far as I could To where it bent in the undergrowth; Then took the other, as just as fair, And having perhaps the better claim, Because it was grassy and wanted wear; Though as for that the passing there Had worn them really about the same, And both that morning equally lay In leaves no step had trodden black. Oh, I kept the first for another day! Yet knowing how way leads on to way, I doubted if I should ever come back. I shall be telling this with a sigh Somewhere ages and ages hence: Two roads diverged in a wood, and I I took the one less traveled by, And that has made all the difference. The Need of Being Versed in Country Things Robert Frost The house had gone to bring again To the midnight sky a sunset glow. Now the chimney was all of the house that stood, Like a pistil after the petals go. The barn opposed across the way, That would have joined the house in flame Had it been the will of the wind, was left To bear forsaken the place's name. No more it opened with all one end For teams that came by the stony road To drum on the floor with scurrying hoofs And brush the mow with the summer load. The birds that came to it through the air At broken windows flew out and in, Their murmur more like the sigh we sigh From too much dwelling on what has been. Yet for them the lilac renewed its leaf, And the aged elm, though touched with fire; And the dry pump flung up an awkward arm; And the fence post carried a strand of wire. For them there was really nothing sad. But though they rejoiced in the nest they kept, One had to be versed in country things Not to believe the phoebes wept. Mending Wall Robert Frost Something there is that doesn't love a wall, That sends the frozen-ground-swell under it, And spills the upper boulders in the sun; And makes gaps even two can pass abreast. The work of hunters is another thing: I have come after them and made repair Where they have left not one stone on a stone, But they would have the rabbit out of hiding, To please the yelping dogs. The gaps I mean, No one has seen them made or heard them made, But at spring mending-time we find them there. I let my neighbor know beyond the hill; And on a day we meet to walk the line And set the wall between us once again. We keep the wall between us as we go. To each the boulders that have fallen to each. And some are loaves and some so nearly balls We have to use a spell to make them balance: Stay where you are until our backs are turned! We wear our fingers rough with handling them. Oh, just another kind of outdoor game, One on a side. It comes to little more: There where it is we do not need the wall: He is all pine and I am apple orchard. My apple trees will never get across And eat the cones under his pines, I tell him. He only says, Good fences make good neighbors. Spring is the mischief in me, and I wonder If I could put a notion in his head: Why do they make good neighbors? Isn't it Where there are cows? But here there are no cows. Before I built a wall I'd ask to know What I was walling in or walling out, And to whom I was like to give offense. Something there is that doesn't love a wall, That wants it down. I could say Elves to him, But it's not elves exactly, and I'd rather He said it for himself. I see him there Bringing a stone grasped firmly by the top In each hand, like an old-stone savage armed. He moves in darkness as it seems to me, Not of woods only and the shade of trees. He will not go behind his father's saying, And he likes having thought of it so well He says again, Good fences make good neighbors. After Apple-picking Robert Frost My long two-pointed ladder's sticking through a tree Toward heaven still, And there's a barrel that I didn't fill Beside it, and there may be two or three Apples I didn't pick upon some bough. But I am done with apple-picking now. Essence of winter sleep is on the night, The scent of apples: I am drowsing off. I cannot rub the strangeness from my sight I got from looking through a pane of glass I skimmed this morning from the drinking trough And held against the world of hoary grass. It melted, and I let it fall and break. But I was well Upon my way to sleep before it fell, And I could tell What form my dreaming was about to take. Magnified apples appear and disappear, Stem end and blossom end, And every fleck of russet showing clear. My instep arch not only keeps the ache, It keeps the pressure of a ladder-round. I feel the ladder sway as the boughs bend. And I keep hearing from the cellar bin The rumbling sound Of load on load of apples coming in. For I have had too much Of apple-picking: I am overtired Of the great harvest I myself desired. There were ten thousand thousand fruit to touch, Cherish in hand, lift down, and not let fall. For all That struck the earth, No matter if not bruised or spiked with stubble, Went surely to the cider-apple heap As of no worth. One can see what will trouble This sleep of mine, whatever sleep it is. Were he not gone, The woodchuck could say whether it's like his Long sleep, as I describe its coming on, Or just some human sleep. The Wood-pile Robert Frost Out walking in the frozen swamp one gray day I paused and said, I will turn back from here. No, I will go on fartherand we shall see. The hard snow held me, save where now and then One foot went down. The view was all in lines Straight up and down of tall slim trees Too much alike to mark or name a place by So as to say for certain I was here Or somewhere else: I was just far from home. A small bird flew before me. He was careful To put a tree between us when he lighted, And say no word to tell me who he was Who was so foolish as to think what he thought. He thought that I was after him for a feather The white one in his tail; like one who takes Everything said as personal to himself. One flight out sideways would have undeceived him. And then there was a pile of wood for which I forgot him and let his little fear Carry him off the way I might have gone, Without so much as wishing him good-night. He went behind it to make his last stand. It was a cord of maple, cut and split And piled and measured, four by four by eight. And not another like it could I see. No runner tracks in this year's snow looped near it. And it was older sure than this year's cutting, Or even last year's or the year's before. The wood was gray and the bark warping off it And the pile somewhat sunken. Clematis Had wound strings round and round it like a bundle. What held it though on one side was a tree Still growing, and on one a stake and prop, These latter about to fall. I thought that only Someone who lived in turning to fresh tasks Could so forget his handiwork on which He spent himself, the labor of his axe, And leave it there far from a useful fireplace To warm the frozen swamp as best it could With the slow smokeless burning of decay. The Exposed Nest Robert Frost You were forever finding some new play. So when I saw you down on hands and knees In the meadow, busy with the new-cut hay, Trying, I thought, to set it up on end, I went to show you how to make it stay, If that was your idea, against the breeze, And, if you asked me, even help pretend To make it root again and grow afresh. But 'twas no make-believe with you to-day, Nor was the grass itself your real concern, Though I found your hand full of wilted fern, Steel-bright June-grass, and blackening heads of clover. 'Twas a nest full of young birds on the ground The cutter-bar had just gone champing over (Miraculously without tasting flesh) And left defenseless to the heat and light. You wanted to restore them to their right Of something interposed between their sight And too much world at once-could means be found. The way the nest-full every time we stirred Stood up to us as to a mother-bird Whose coming home has been too long deferred, Made me ask would the mother-bird return And care for them in such a change of scene And might our meddling make her more afraid. That was a thing we could not wait to learn. We saw the risk we took in doing good, But dared not spare to do the best we could Though harm should come of it; so built the screen You had begun, and gave them back their shade. All this to prove we cared. Why is there then No more to tell? We turned to other things. I haven't any memory-have you? Of ever coming to the place again To see if the birds lived the first night through, And so at last to learn to use their wings.
    Walt Whitman O Captain! My Captain Walt Whitman O Captain! my Captain! our fearful trip is done, The ship has weather'd every rack, the prize we sought is won, The port is near, the bells I hear, the people all exulting, While follow eyes the steady keel, the vessel grim and daring; But O heart! heart! heart! O the bleeding drops of red, Where on the deck my Captain lies, Fallen cold and dead. O Captain! my Captain! rise up and hear the bells; Rise upfor you the flag is flungfor you the bugle trills, For you bouquets and ribbon'd wreathsfor you the shores a-crowding, For you they call, the swaying mass, their eager faces turning; Here Captain! dear father! This arm beneath your head! It is some dream that on the deck, You've fallen cold and dead. My Captain does not answer, his lips are pale and still, My father does not feel my arm, he has no pulse nor will, The ship is anchor'd safe and sound, its voyage closed and done, From fearful trip the victor ship comes in with object won; Exult O shores, and ring O bells! But I with mournful tread, Walk the deck my Captain lies, Fallen cold and dead. I saw in Lousiana a live oak growing Walt Whitman I saw in Louisiana a live-oak growing, All alone stood it and the moss hung down from the branches, Without any companion it grew there uttering joyous leaves of dark green, And its look, rude, unbending, lusty, made me think of myself, But I wonder'd how it could utter joyous leaves standing alone there without its friend near, for I knew I could not, And I broke off a twig with a certain number of leaves upon it, and twined around it a little moss, And brought it away, and I have placed it in sight in my room, It is not needed to remind me as of my own dear friends, (For I believe lately I think of little else than of them,) Yet it remains to me a curious token, it makes me think of manly love; For all that, and though the live-oak glistens there in Louisiana solitary in a wide flat space, Uttering joyous leaves all its life without a friend a lover near, I know very well I could not. Prairie Grass Dividing Walt Whitman The prairie-grass dividing, its special odor breathing, I demand of it the spiritual corresponding, Demand the most copious and close companionship of men, Demand the blades to rise of words, acts, beings, Those of the open atmosphere, coarse, sunlit, fresh, nutritious, Those that go their own gait, erect, stepping with freedom and command, leading not following, Those with a never-quell'd audacity, those with sweet and lusty flesh clear of taint, Those that look carelessly in the faces of Presidents and governors, as to say Who are you? Those of earth-born passion, simple, never constrain'd, never obedient, Those of inland America. A Farm Picture Walt Whitman Through the ample open door of the peaceful country barn, A sunlit pasture field with cattle and horses feeding, And haze and vista, and the far horizon fading away. 1861 Walt Whitman Arm'd year-year of the struggle, No dainty rhymes or sentimental love verses for you terrible year, Not you as some pale poetling seated at a desk lisping cadenzas piano, But as a strong man erect, clothed in blue clothes, advancing, carrying a rifle on your shoulder, With well-gristled body and sunburnt face and hands, with a knife in the belt at your side, As I heard you shouting loud, your sonorous voice ringing across the continent, Your masculine voice O year, as rising amid the great cities, Amid the men of Manhattan I saw you as one of the workmen, the dwellers in Manhattan, Or with large steps crossing the prairies out of Illinois and Indiana, Rapidly crossing the West with springy gait and descending the Alleghanies, Or down from the great lakes or in Pennsylvania, or on deck along the Ohio river, Or southward along the Tennessee or Cumberland rivers, or at Chattanooga on the mountain top, Saw I your gait and saw I your sinewy limbs clothed in blue, bearing weapons, robust year, Old Ireland Walt Whitman Far hence amid an isle of wondrous beauty, Crouching over a grave an ancient sorrowful mother, Once a queen, now lean and tatter'd seated on the ground, Her old white hair drooping dishevel'd round her shoulders, At her feet fallen an unused royal harp, Long silent, she too long silent, mourning her shrouded hope and heir, Of all the earth her heart most full of sorrow because most full of love. Yet a word ancient mother, You need crouch there no longer on the cold ground with forehead between your knees, O you need not sit there veil'd in your old white hair so dishevel'd, For know you the one you mourn is not in that grave, It was an illusion, the son you love was not really dead, The Lord is not dead, he is risen again young and strong in another country, Even while you wept there by your fallen harp by the grave, What you wept for was translated, pass'd from the grave, The winds favor'd and the sea sail'd it, And now with rosy and new blood, Moves to-day in a new country. Bivouac on a Mountain side Walt Whitman I see before me now a traveling army halting, Below a fertile valley spread, with barns and the orchards of summer, Behind, the terraced sides of a mountain, abrupt, in places rising high, Broken, with rocks, with clinging cedars, with tall shapes dingily seen, The numerous camp-fires scatter'd near and far, some away up on the mountain, The shadowy forms of men and horses, looming, large-sized, flickering, And over all the sky—the sky! far, far out of reach, studded, breaking out, the eternal stars. City of Orgies Walt Whitman City of orgies, walks and joys, City whom that I have lived and sung in your midst will one day make Not the pageants of you, not your shifting tableaus, your spectacles, repay me, Not the interminable rows of your houses, nor the ships at the wharves, Nor the processions in the streets, nor the bright windows with goods in them, Nor to converse with learn'd persons, or bear my share in the soiree or feast; Not those, but as I pass O Manhattan, your frequent and swift flash of eyes offering me love, Offering response to my ownthese repay me, Lovers, continual lovers, only repay me. Out of the Rolling Ocean the Crowd Walt Whitman Out of the rolling ocean, the crowd, came a drop gently to me, Whispering, I love you, before long I die, I have travel'd a long way, merely to look on you, to touch you, For I could not die till I once look'd on you, For I fear'd I might afterward lose you. Now we have met, we have look'd, we are safe, Return in peace to the ocean, my love, I too am part of that ocean, my love,-we are not so much separated, Behold the great rondurethe cohesion of all, how perfect! But as for me, for you, the irresistible sea is to separate us, As for an hour carrying us diverse-yet cannot carry us diverse forever; Be not impatienta little spaceknow you I salute the air, the ocean and the land, Every day at sundown for your dear sake my love. Shut Not Your Doors Walt Whitman Shut not your doors to me, proud libraries, For that which was lacking on all your well-fill'd shelves, yet needed most, I bring Forth from the war emerging, a book I have made, The words of my book nothing, the drift of it every thing, A book separate, not link'd with the rest nor felt by the intellect, But you ye untold latencies will thrill to every page.
    Oscar Wilde Magdalen Walks Oscar Wilde The little white clouds are racing over the sky, And the fields are strewn with the gold of the flower of March, The daffodil breaks under foot, and the tasselled larch Sways and swings as the thrush goes hurrying by. A delicate odour is borne on the wings of the morning breeze, The odour of deep wet grass, and of brown new-furrowed earth, The birds are singing for joy of the Spring's glad birth, Hopping from branch to branch on the rocking trees. And all the woods are alive with the murmur and sound of Spring, And the rose-bud breaks into pink on the climbing briar, And the crocus-bed is a quivering moon of fire Girdled round with the belt of an amethyst ring. And the plane to the pine-tree is whispering some tale of love Till it rustles with laughter and tosses its mantle of green, And the gloom of the wych-elm's hollow is lit with the iris sheen Of the burnished rainbow throat and the silver breast of a dove. See! the lark starts up from his bed in the meadow there, Breaking the gossamer threads and the nets of dew, And flashing adown the river, a flame of blue! The kingfisher flies like an arrow, and wounds the air. Sonnet to Liberty Oscar Wilde Not that I love thy children, whose dull eyes See nothing save their own unlovely woe, Whose minds know nothing, nothing care to know, But that the roar of thy Democracies, Thy reigns of Terror, thy great Anarchies, Mirror my wildest passions like the sea, And give my rage a brother! Liberty! For this sake only do thy dissonant cries Delight my discreet soul, else might all kings By bloody knout or treacherous cannonades Rob nations of their rights inviolate And I remain unmoved-and yet, and yet, These Christs that die upon the barricades, God knows it I am with them, in some things. The Grave of Shelley Oscar Wilde Like burnt-out torches by a sick man's bed Gaunt cypress-trees stand round the sun-bleached stone; Here doth the little night-owl make her throne, And the slight lizard show his jewelled head. And, where the chaliced poppies flame to red, In the still chamber of yon pyramid Surely some Old-World Sphinx lurks darkly hid, Grim warder of this pleasaunce of the dead. Ah! sweet indeed to rest within the womb Of Earth, great mother of eternal sleep, But sweeter far for thee a restless tomb In the blue cavern of an echoing deep, Or where the tall ships founder in the gloom Against the rocks of some wave-shattered steep The Grave of Keats Oscar Wilde Rid of the world's injustice, and his pain, He rests at last beneath God's veil of blue: Taken from life when life and love were new The youngest of the martyrs here is lain, Fair as Sebastian, and as early slain. No cypress shades his grave, no funeral yew, But gentle violets weeping with the dew Weave on his bones an ever-blossoming chain. O proudest heart that broke for misery! O sweetest lips since those of Mitylene! O poet-painter of our English Land! Thy name was writ in waterit shall stand: And tears like mine will keep thy memory green, As Isabella did her Basil-tree. A Vision Oscar Wilde Two crownèd Kings, and One that stood alone With no green weight of laurels round his head, But with sad eyes as one uncomforted, And wearied with man's never-ceasing moan For sins no bleating victim can atone, And sweet long lips with tears and kisses fed. Girt was he in a garment black and red, And at his feet I marked a broken stone Which sent up lilies, dove-like, to his knees. Now at their sight, my heart being lit with flame I cried to Beatricé, Who are these? And she made answer, knowing well each name, Æschylos first, the second Sophokles, And last (wide stream of tears!) Euripides. By the Arno Oscar Wilde The oleander on the wall Grows crimson in the dawning light, Though the grey shadows of the night Lie yet on Florence like a pall. The dew is bright upon the hill, And bright the blossoms overhead, But ah! the grasshoppers have fled, The little Attic song is still. Only the leaves are gently stirred By the soft breathing of the gale, And in the almond-scented vale The lonely nightingale is heard. The day will make thee silent soon, O nightingale sing on for love! While yet upon the shadowy grove Splinter the arrows of the moon. Before across the silent lawn In sea-green mist the morning steals, And to love's frightened eyes reveals The long white fingers of the dawn Fast climbing up the eastern sky To grasp and slay the shuddering night, All careless of my heart's delight, Or if the nightingale should die. At Verona Oscar Wilde How steep the stairs within Kings' houses are For exile-wearied feet as mine to tread, And O how salt and bitter is the bread Which falls from this Hound's table, better far That I had died in the red ways of war, Or that the gate of Florence bare my head, Than to live thus, by all things comraded Which seek the essence of my soul to mar. Curse God and die: what better hope than this? He hath forgotten thee in all the bliss Of his gold city, and eternal day Nay peace: behind my prison's blinded bars I do possess what none can take away, My love, and all the glory of the stars. Greece Oscar Wilde The sea was sapphire coloured, and the sky Burned like a heated opal through the air; We hoisted sail; the wind was blowing fair For the blue lands that to the eastward lie. From the steep prow I marked with quickening eye Zakynthos, every olive grove and creek, Ithaca's cliff, Lycaon's snowy peak, And all the flower-strewn hills of Arcady. The flapping of the sail against the mast, The ripple of the water on the side, The ripple of girls' laughter at the stern, The only sounds: when 'gan the West to burn, And a red sun upon the seas to ride, I stood upon the soil of Greece at last! Apologia Oscar Wilde Is it thy will that I should wax and wane, Barter my cloth of gold for hodden grey, And at thy pleasure weave that web of pain Whose brightest threads are each a wasted day? Is it thy will-Love that I love so well That my Soul's House should be a tortured spot Wherein, like evil paramours, must dwell The quenchless flame, the worm that dieth not? Nay, if it be thy will I shall endure, And sell ambition at the common mart, And let dull failure be my vestiture, And sorrow dig its grave within my heart. Perchance it may be better so-at least I have not made my heart a heart of stone, Nor starved my boyhood of its goodly feast, Nor walked where Beauty is a thing unknown. Many a man hath done so; sought to fence In straitened bonds the soul that should be free, Trodden the dusty road of common sense, While all the forest sang of liberty, Not marking how the spotted hawk in flight Passed on wide pinion through the lofty air, To where the steep untrodden mountain height Caught the last tresses of the Sun God's hair. Or how the little flower he trod upon, The daisy, that white-feathered shield of gold, Followed with wistful eyes the wandering sun Content if once its leaves were aureoled. But surely it is something to have been The best belovèd for a little while, To have walked hand in hand with Love, and seen His purple wings flit once across thy smile. Ay! though the gorgèd asp of passion feed On my boy's heart, yet have I burst the bars, Stood face to face with Beauty, known indeed The Love which moves the Sun and all the stars!
    Alfred Tennyson The Deserted house Alfred Tennyson 1 Life and Thought have gone away Side by side, Leaving door and windows wide: Careless tenants they! 2 All within is dark as night: In the windows is no light; And no murmur at the door, So frequent on its hinge before. 3 Close the door, the shutters close, Or thro' the windows we shall see The nakedness and vacancy Of the dark deserted house. 4 Come away: no more of mirth Is here or merry-making sound. The house was builded of the earth, And shall fall again to ground. 5 Come away: for Life and Thought Here no longer dwell; But in a city glorious A great and distant cityhave bought A mansion incorruptible. Would they could have stayed with us! Ulysses Alfred Tennyson It little profits that an idle king, By this still hearth, among these barren crags, Match'd with an aged wife, I mete and dole Unequal laws unto a savage race, That hoard, and sleep, and feed, and know not me. I cannot rest from travel: I will drink Life to the lees; all times I have enjoy'd Greatly, have suffer'd greatly, both with those That loved me, and alone; on shore, and when Thro' scudding drifts the rainy Hyades Vext the dim sea: I am become a name; For always roaming with a hungry heart Much have I seen and known; cities of men And manners, climates, councils, governments, Myself not least, but honour'd of them all; And drunk delight of battle with my peers, Far on the ringing plains of windy Troy, I am a part of all that I have met; Yet all experience is an arch wherethro' Gleams that untravell'd world, whose margin fades For ever and for ever when I move. How dull it is to pause, to make an end, To rust unburnish'd, not to shine in use! As tho' to breathe were life. Life piled on life Were all too little, and of one to me Little remains: but every hour is saved From that eternal silence, something more, A bringer of new things; and vile it were For some three suns to store and hoard myself, And this gray spirit yearning in desire To follow knowledge like a sinking star, Beyond the utmost bound of human thought. This is my son, mine own Telemachus, To whom I leave the scepter and the isle Well-loved of me, discerning to fulfil This labour, by slow prudence to make mild A rugged people, and thro' soft degrees Subdue them to the useful and the good. Most blameless is he, centred in the sphere Of common duties, decent not to fail In offices of tenderness, and pay Meet adoration to my household gods, When I am gone. He works his work, I mine. There lies the port; the vessel puffs her sail: There gloom the dark broad seas. My mariners, Souls that have toil'd, and wrought, and thought with me That ever with a frolic welcome took The thunder and the sunshine, and opposed Free hearts, free foreheads-you and I are old; Old age hath yet his honour and his toil; Death closes all: but something ere the end, Some work of noble note, may yet be done, Not unbecoming men that strove with Gods. The lights begin to twinkle from the rocks: The long day wanes: the slow moon climbs: the deep Moans round with many voices. Come, my friends, 'Tis not too late to seek a newer world. Push off, and sitting well in order smite The sounding furrows; for my purpose holds To sail beyond the sunset, and the baths Of all the western stars, until I die. It may be that the gulfs will wash us down: It may be we shall touch the Happy Isles, And see the great Achilles, whom we knew. Tho' much is taken, much abides; and tho' We are not now that strength which in old days Moved earth and heaven; that which we are, we are; One equal temper of heroic hearts, Made weak by time and fate, but strong in will To strive, to seek, to find, and not to yield. Locksley Hall Alfred Tennyson Comrades, leave me here a little, while as yet 'tis early morn: Leave me here, and when you want me, sound upon the bugle horn. 'Tis the place, and all around it, as of old, the curlews call, Dreary gleams about the moorland flying over Locksley Hall; Locksley Hall, that in the distance overlooks the sandy tracts, And the hollow ocean-ridges roaring into cataracts. Many a night from yonder ivied casement, ere I went to rest, Did I look on great Orion sloping slowly to the West. Many a night I saw the Pleiads, rising thro' the mellow shade, Glitter like a swarm of fire-flies tangled in a silver braid. Here about the beach I wander'd, nourishing a youth sublime With the fairy tales of science, and the long result of Time; When the centuries behind me like a fruitful land reposed; When I clung to all the present for the promise that it closed: When I dipt into the future far as human eye could see; Saw the Vision of the world, and all the wonder that would be. In the Spring a fuller crimson comes upon the robin's breast; In the Spring the wanton lapwing gets himself another crest; In the Spring a livelier iris changes on the burnish'd dove; In the Spring a young man's fancy lightly turns to thoughts of love. Then her cheek was pale and thinner than should be for one so young, And her eyes on all my motions with a mute observance hung. And I said, My cousin Amy, speak, and speak the truth to me, Trust me, cousin, all the current of my being sets to thee. On her pallid cheek and forehead came a colour and a light, As I have seen the rosy red flushing in the northern night. And she turn'd-her bosom shaken with a sudden storm of sighs All the spirit deeply dawning in the dark of hazel eyes Saying, I have hid my feelings, fearing they should do me wrong; Saying, Dost thou love me, cousin? weeping, I have loved thee long. Love took up the glass of Time, and turn'd it in his glowing hands; Every moment, lightly shaken, ran itself in golden sands. Love took up the harp of Life, and smote on all the chords with might; Smote the chord of Self, that, trembling, pass'd in music out of sight. Many a morning on the moorland did we hear the copses ring, And her whisper throng'd my pulses with the fulness of the Spring. Many an evening by the waters did we watch the stately ships, And our spirits rush'd together at the touching of the lips. O my cousin, shallow-hearted! O my Amy, mine no more! O the dreary, dreary moorland! O the barren, barren shore! Falser than all fancy fathoms, falser than all songs have sung, Puppet to a father's threat, and servile to a shrewish tongue! Is it well to wish thee happy?-having known me-to decline On a range of lower feelings and a narrower heart than mine! Yet it shall be: thou shalt lower to his level day by day, What is fine within thee growing coarse to sympathise with clay. As the husband is, the wife is: thou art mated with a clown, And the grossness of his nature will have weight to drag thee down. He will hold thee, when his passion shall have spent its novel force, Something better than his dog, a little dearer than his horse. What is this? his eyes are heavy: think not they are glazed with wine. Go to him: it is thy duty: kiss him: take his hand in thine. It may be my lord is weary, that his brain is overwrought: Soothe him with thy finer fancies, touch him with thy lighter thought. He will answer to the purpose, easy things to understand Better thou wert dead before me, tho' I slew thee with my hand! Better thou and I were lying, hidden from the heart's disgrace, Roll'd in one another's arms, and silent in a last embrace. Cursed be the social wants that sin against the strength of youth! Cursed be the social lies that warp us from the living truth! Cursed be the sickly forms that err from honest Nature's rule! Cursed be the gold that gilds the straiten'd forehead of the fool! Well-'tis well that I should bluster!-Hadst thou less unworthy proved Would to God-for I had loved thee more than ever wife was loved. Am I mad, that I should cherish that which bears but bitter fruit? I will pluck it from my bosom, tho' my heart be at the root. Never, tho' my mortal summers to such length of years should come As the many-winter'd crow that leads the clanging rookery home. Where is comfort? in division of the records of the mind? Can I part her from herself, and love her, as I knew her, kind? I remember one that perish'd: sweetly did she speak and move: Such a one do I remember, whom to look at was to love. Can I think of her as dead, and love her for the love she bore? No-she never loved me truly: love is love for evermore. Comfort? comfort scorn'd of devils! this is truth the poet sings, That a sorrow's crown of sorrow is remembering happier things. Drug thy memories, lest thou learn it, lest thy heart be put to proof, In the dead unhappy night, and when the rain is on the roof. Like a dog, he hunts in dreams, and thou art staring at the wall, Where the dying night-lamp flickers, and the shadows rise and fall. Then a hand shall pass before thee, pointing to his drunken sleep, To thy widow'd marriage-pillows, to the tears that thou wilt weep. Thou shalt hear the Never, never, whisper'd by the phantom years, And a song from out the distance in the ringing of thine ears; And an eye shall vex thee, looking ancient kindness on thy pain. Turn thee, turn thee on thy pillow: get thee to thy rest again. Nay, but Nature brings thee solace; for a tender voice will cry, 'Tis a purer life than thine; a lip to drain thy trouble dry. Baby lips will laugh me down: my latest rival brings thee rest. Baby fingers, waxen touches, press me from the mother's breast. O, the child too clothes the father with a dearness not his due. Half is thine and half is his: it will be worthy of the two. O, I see thee old and formal, fitted to thy petty part, With a little hoard of maxims preaching down a daughter's heart. They were dangerous guides the feelings-she herself was not exempt Truly, she herself had suffer'dPerish in thy self-contempt! Overlive it-lower yet-be happy! wherefore should I care, I myself must mix with action, lest I wither by despair. What is that which I should turn to, lighting upon days like these? Every door is barr'd with gold, and opens but to golden keys. Every gate is throng'd with suitors, all the markets overflow. I have but an angry fancy: what is that which I should do? I had been content to perish, falling on the foeman's ground, When the ranks are roll'd in vapour, and the winds are laid with sound. But the jingling of the guinea helps the hurt that Honour feels, And the nations do but murmur, snarling at each other's heels. Can I but relive in sadness? I will turn that earlier page. Hide me from my deep emotion, O thou wondrous Mother-Age! Make me feel the wild pulsation that I felt before the strife, When I heard my days before me, and the tumult of my life; Yearning for the large excitement that the coming years would yield, Eager-hearted as a boy when first he leaves his father's field, And at night along the dusky highway near and nearer drawn, Sees in heaven the light of London flaring like a dreary dawn; And his spirit leaps within him to be gone before him then, Underneath the light he looks at, in among the throngs of men; Men, my brothers, men the workers, ever reaping something new: That which they have done but earnest of the things that they shall do: For I dipt into the future, far as human eye could see, Saw the vision of the world, and all the wonder that would be; Saw the heavens fill with commerce, argosies of magic sails, Pilots of the purple twilight, dropping down with costly bales; Heard the heavens fill with shouting, and there rain'd a ghastly dew From the nations' airy navies grappling in the central blue; Far along the world-wide whisper of the south-wind rushing warm, With the standards of the peoples plunging thro' the thunder-storm; Till the war-drum throbbed no longer, and the battle-flags were furl'd In the Parliament of man, the Federation of the world. There the common sense of most shall hold a fretful realm in awe, And the kindly earth shall slumber, lapt in universal law. So I triumph'd, ere my passion sweeping thro' me left me dry, Left me with the palsied heart, and left me with the jaundiced eye; Eye, to which all order festers, all things here are out of joint, Science moves, but slowly slowly, creeping on from point to point: Slowly comes a hungry people, as a lion, creeping nigher, Glares at one that nods and winks behind a slowly-dying fire. Yet I doubt not thro' the ages one increasing purpose runs, And the thoughts of men are widen'd with the process of the suns. What is that to him that reaps not harvest of his youthful joys, Tho' the deep heart of existence beat for ever like a boy's? Knowledge comes, but wisdom lingers, and I linger on the shore, And the individual withers, and the world is more and more. Knowledge comes, but wisdom lingers, and he bears a laden breast, Full of sad experience, moving toward the stillness of his rest. Hark, my merry comrades call me, sounding on the bugle-horn, They to whom my foolish passion were a target for their scorn: Shall it not be scorn to me to harp on such a moulder'd string? I am shamed thro' all my nature to have loved so slight a thing. Weakness to be wroth with weakness! woman's pleasure, woman's pain Nature made them blinder motions bounded in a shallower brain: Woman is the lesser man, and all thy passions, match'd with mine, Are as moonlight unto sunlight, and as water unto wine Here at least, where nature sickens, nothing. Ah, for some retreat Deep in yonder shining Orient, where my life began to beat; Where in wild Mahratta-battle fell my father evil-starr'd; I was left a trampled orphan, and a selfish uncle's ward. Or to burst all links of habit-there to wander far away, On from island unto island at the gateways of the day. Larger constellations burning, mellow moons and happy skies, Breadths of tropic shade and palms in cluster, knots of Paradise. Never comes the trader, never floats an European flag, Slides the bird o'er lustrous woodland, swings the trailer from the crag; Droops the heavy-blossom'd bower, hangs the heavy-fruited tree Summer isles of Eden lying in dark-purple spheres of sea. There methinks would be enjoyment more than in this march of mind, In the steamship, in the railway, in the thoughts that shake mankind. There the passions cramp'd no longer shall have scope and breathing-space; I will take some savage woman, she shall rear my dusky race. Iron-jointed, supple-sinew'd, they shall dive, and they shall run, Catch the wild goat by the hair, and hurl their lances in the sun; Whistle back the parrot's call, and leap the rainbows of the brooks. Not with blinded eyesight poring over miserable books Fool, again the dream, the fancy! but I know my words are wild, But I count the gray barbarian lower than the Christian child. I, to herd with narrow foreheads, vacant of our glorious gains, Like a beast with lower pleasures, like a beast with lower pains! Mated with a squalid savage-what to me were sun or clime? I the heir of all the ages, in the foremost files of time I that rather held it better men should perish one by one, Than that earth should stand at gaze like Joshua's moon in Ajalon! Not in vain the distance beacons. Forward, forward let us range. Let the great world spin for ever down the ringing grooves of change. Thro' the shadow of the globe we sweep into the younger day: Better fifty years of Europe than a cycle of Cathay. Mother-Age (for mine I knew not) help me as when life begun: Rift the hills, and roll the waters, flash the lightnings, weigh the Sun O, I see the crescent promise of my spirit hath not set. Ancient founts of inspiration well thro' all my fancy yet. Howsoever these things be, a long farewell to Locksley Hall! Now for me the woods may wither, now for me the roof-tree fall. Comes a vapour from the margin, blackening over heath and holt, Cramming all the blast before it, in its breast a thunderbolt. Let it fall on Locksley Hall, with rain or hail, or fire or snow; For the mighty wind arises, roaring seaward, and I go. Tithonos Alfred Tennyson The woods decay, the woods decay and fall, The vapours weep their burthen to the ground, Man comes and tills the field and lies beneath, And after many a summer dies the swan. Me only cruel immortality Consumes; I wither slowly in thine arms, Here at the quiet limit of the world, A white-hair'd shadow roaming like a dream The ever-silent spaces of the East, Far-folded mists, and gleaming halls of morn. Alas! for this gray shadow, once a man So glorious in his beauty and thy choice, Who madest him thy chosen, that he seem'd To his great heart none other than a God! I ask'd thee, Give me immortality. Then didst thou grant mine asking with a smile, Like wealthy men who care not how they give. But thy strong Hours indignant work'd their wills, And beat me down and marr'd and wasted me, And tho' they could not end me left me maim'd To dwell in presence of immortal youth, Immortal age beside immortal youth, And all I was in ashes. Can thy love Thy beauty, make amends, tho' even now, Close over us, the silver star, thy guide, Shines in those tremulous eyes that fill with tears To hear me? Let me go: take back thy gift: Why should a man desire in any way To vary from the kindly race of men, Or pass beyond the goal of ordinance Where all should pause, as if most meet for all? A soft air fans the cloud apart; there comes A glimpse of that dark world where I was born. Once more the old mysterious glimmer steals From any pure brows, and from thy shoulders pure, And bosom beating with a heart renew'd. Thy cheek begins to redden thro' the gloom, Thy sweet eyes brighten slowly close to mine, Ere yet they blind the stars, and the wild team Which love thee, yearning for thy yoke, arise, And shake the darkness from their loosen'd manes, And beat the twilight into flakes of fire. Lo! ever thus thou growest beautiful In silence, then before thine answer given Departest, and thy tears are on my cheek. Why wilt thou ever scare me with thy tears, And make me tremble lest a saying learnt, In days far-off, on that dark earth, be true? The Gods themselves cannot recall their gifts. Ay me! ay me! with what another heart In days far-off, and with what other eyes I used to watch {if I be he that watch'd} The lucid outline forming round thee; saw The dim curls kindle into sunny rings; Changed with thy mystic change, and felt my blood Glow with the glow that slowly crimson'd all Thy presence and thy portals, while I lay, Mouth, forehead, eyelids, growing dewy-warm With kisses balmier than half-opening buds Of April, and could hear the lips that kiss'd Whispering I knew now what of wild and sweet, Like that strange song I heard Apollo sing, While Ilion like a mist rose into towers. Yet hold me not for ever in thine East; How can my nature longer mix with thine? Coldly thy rosy shadows bathe me, cold Are all thy lights, and cold my wrinkled feet Upon thy glimmering thresholds, when the steam Floats up from those dim fields about the homes Of happy men that have the power to die, And grassy barrows of the happier dead. Release me, and restore me to the ground; Thou seest all things, thou wilt see my grave: Thou wilt renew thy beauty morn by morn; I earth in earth forget these empty courts, And thee returning on thy silver wheels. Break, Break, Break Alfred Tennyson Break, break, break, On thy cold gray stones, O Sea! And I would that my tongue could utter The thoughts that arise in me. O well for the fisherman's boy, That he shouts with his sister at play! O well for the sailor lad, That he sings in his boat on the bay! And the stately ships go on To their haven under the hill: But O for the touch of a vanish'd hand, And the sound of a voice that is still! Break, break, break, At the foot of thy crags, O Sea! But the tender grace of a day that is dead Will never come back to me. In the Valley of Cauteretz Alfred Tennyson All along the valley, stream that flashest white, Deepening thy voice with the deepening of the night, All along the valley, where thy waters flow, I walked with one I loved two and thirty years ago. All along the valley while I walked to-day, The two and thirty years were a mist that rolls away; For all along the valley, down thy rocky bed, Thy living voice to me was as the voice of the dead, And all along the valley, by rock and cave and tree, The voice of the dead was a living voice to me. Crossing the Bar Alfred Tennyson Sunset and evening star, And one clear call for me! And may there be no moaning of the bar, When I put out to sea, But such a tide as moving seems asleep, Too full for sound and foam, When that which drew from out the boundless deep Turns again home. Twilight and evening bell, And after that the dark! And may there be no sadness of farewell, When I embark; For though from out our bourne of Time and Place The flood may bear me far, I hope to see my Pilot face to face When I have crossed the bar.
    David Herbert Richards Lawrence Self Pity D. H. Lawrence I never saw a wild thing sorry for itself. A small bird will drop frozen dead from a bough without ever having felt sorry for itself. At the Window D. H. Lawrence The pine-trees bend to listen to the autumn wind as it mutters Something which sets the black poplars ashake with hysterical laughter; While slowly the house of day is closing its eastern shutters. Further down the valley the clustered tombstones recede, Winding about their dimness the mist's grey cerements, after The street lamps in the darkness have suddenly started to bleed. The leaves fly over the window and utter a word as they pass To the face that leans from the darkness, intent, with two dark-filled eyes That watch for ever earnestly from behind the window glass. From A College Window D. H. Lawrence The glimmer of the limes, sun-heavy, sleeping, Goes trembling past me up the College wall. Below, the lawn, in soft blue shade is keeping The diasy-froth quiescent, softly in thrall. Beyond the leaves that overhang the street, Along the flagged, clean pavement summer-white, Passes the world with shadows at their feet Going left and right. Romoste, although I hear the beggar's cough, See the woman's twinkling fingers tend him a coin, I sit absolved, assured I am better off Beyond a world I never want to join. Gloire de Dijon D. H. Lawrence When she rises in the morning I linger to watch her; She spreads the bath-cloth underneath the window And the sunbeams catch her Glistening white on the shoulders, While down her sides the mellow Golden shadow glows as She stoops to the sponge, and her swung breasts Sway like full-blown yellow Gloire de Dijon roses. She drips herself with water, and her shoulders Glisten as silver, they crumple up Like wet and falling roses, and I listen For the sluicing of their rain-dishevelled petals. In the window full of sunlight Concentrates her golden shadow Fold on fold, until it glows as Mellow as the glory roses. Patience D. H. Lawrence A wind comes from the north Blowing little flocks of birds Like spray across the town, And a train, roaring forth, Rushes stampeding down With cries and flying curds Of steam, out of the darkening north. Whither I turn and set Like a needle steadfastly, Waiting ever to get The news that she is free; But ever fixed, as yet, To the lode of her agony. Piano D. H. Lawrence Softly, in the dusk, a woman is singing to me; Taking me back down the vista of years, till I see A child sitting under the piano, in the boom of the tingling strings And pressing the small, poised feet of a mother who smiles as she sings. In spite of myself, the insidious mastery of song Betrays me back, till the heart of me weeps to belong to the old Sunday evenings at home, with the winter outside And hymns in the cosy parlour, the tinkling piano our guide. So now it is vain for the singer to burst into clamour With the great black piano appassionato. The glamour Of childish days is upon me, my manhood is cast Down in the flood of remembrance, I weep like a child for the past. Piccadilly Circus at Night D. H. Lawrence When into the night the yellow light is roused like dust above the towns, Or like a mist the moon has kissed from off a pool in the midst of the downs, Our faces flower for a little hour pale and uncertain along the street, Daisies that waken all mistaken white-spread in expectancy to meet The luminous mist which the poor things wist was dawn arriving across the sky, When dawn is far behind the star the dust-lit town has driven so high. All the birds are folded in a silent ball of sleep, All the flowers are faded from the asphalt isle in the sea, Only we hard-faced creatures go round and round, and keep The shores of this innermost ocean alive and illusory. Wanton sparrows that twittered when morning looked in at their eyes And the Cyprian's pavement-roses are gone, and now it is we Flowers of illusion who shine in our gauds, make a Paradise On the shores of this ceaseless ocean, gay birds of the town-dark sea. A White Blossom D. H. Lawrence A tiny moon as white and small as a single jasmine flower Leans all alone above my window, on night's wintry bower, Liquid as lime-tree blossom, soft as brilliant water or rain She shines, the one white love of my youth, which all sin cannot stain. A Winter's Tale D. H. Lawrence Yesterday the fields were only gray with scattered snow, And now the longest grass-leaves hardly emerge; Yet her deep footsteps mark the snow, and go On towards the pines at the hills' white verge. I cannot see her, since the mist's white scarf Obscures the dark wood and the dull orange sky; But she's waiting, I know, impatient and cold, half Sobs struggling into her frosty sigh. Why does she come so promptly, when she must know That she's only the nearer to the inevitable farewell; The hill is steep, on the snow my steps are slow Why does she come, when she knows what I have to tell? The Wild Common D. H. Lawrence The quick sparks on the gorse bushes are leaping, Little jets of sunlight-texture imitating flame; Above them, exultant, the pee-wits are sweeping: They are lords of the desolate wastes of sadness their screamings proclaim. Rabbits, handfuls of brown earth, lie Low-rounded on the mournful grass they have bitten down to the quick. Are they asleep?Are they alive?Now see, when I Move my arms the hill bursts and heaves under their spurting kick. The common flaunts bravely; but below, from the rushes Crowds of glittering king-cups surge to challenge the blossoming bushes; There the lazy streamlet pushes Its curious course mildly; here it wakes again, leaps, laughs, and gushes. Into a deep pond, an old sheep-dip, Dark, overgrown with willows, cool, with the brook ebbing through so slow, Naked on the steep, soft lip Of the bank I stand watching my own white shadow quivering to and fro. What if the gorse flowers shrivelled and kissing were lost? Without the pulsing waters, where were the marigolds and the songs of the brook? If my veins and my breasts with love embossed Withered, my insolent soul would be gone like flowers that the hot wind took. So my soul like a passionate woman turns, Filled with remorseful terror to the man she scorned, and her love For myself in my own eyes' laughter burns, Runs ecstatic over the pliant folds rippling down to my belly from the breast-lights above. Over my sunlit skin the warm, clinging air, Rich with the songs of seven larks singing at once, goes kissing me glad. And the soul of the wind and my blood compare Their wandering happiness, and the wind, wasted in liberty, drifts on and is sad. Oh but the water loves me and folds me, Plays with me, sways me, lifts me and sinks me as though it were living blood, Blood of a heaving woman who holds me, Owning my supple body a rare glad thing, supremely good.
    John Keats Ode on a Grecian Urn John Keats Thou still unravished bride of quietness! Thou foster-child of silence and slow time, Sylvan historian, who canst thus express A flow'ry tale more sweetly than our rhyme: What leaf-fringed legend haunts about thy shape Of deities or mortals, or of both, In Tempe or the dales of Arcady? What men or gods are these? What maidens loth? What mad pursuit? What struggle to escape? What pipes and timbrels? What wild ecstasy? Heard melodies are sweet, but those unheard Are sweeter; therefore, ye soft pipes, play on; Not to the sensual ear, but, more endeared, Pipe to the spirit ditties of no tone: Fair youth, beneath the trees, thou canst not leave Thy song, nor ever can those trees be bare; Bold Lover, never, never canst thou kiss, Though winning near the goal yet, do not grieve; She cannot fade, though thou hast not thy bliss, For ever wilt thou love, and she be fair! Ah, happy, happy boughs! that cannot shed Your leaves, nor ever bid the Spring adieu; And, happy melodist, unwearied, For ever piping songs for ever new; More happy love! more happy, happy love! For ever warm and still to be enjoyed, For ever panting and for ever young; All breathing human passion far above, That leaves a heart high-sorrowful and cloyed, A burning forehead, and a parching tongue. Who are these coming to the sacrifice? To what green altar, O mysterious priest, Lead'st thou that heifer lowing at the skies, And all her silken flanks with garlands drest? What little town by river or sea-shore, Or mountain-built with peaceful citadel, Is emptied of its folk, this pious morn? And, little town, thy streets for evermore Will silent be; and not a soul to tell Why thou art desolate, can e'er return. O Attic shape! Fair attitude! with brede Of marble men and maidens overwrought, With forest branches and the trodden weed; Thou, silent form, dost tease us out of thought As doth eternity: Cold pastoral! When old age shall this generation waste, Thou shalt remain, in midst of other woe Than ours, a friend to man, to whom thou sayst, "Beauty is truth, truth beauty," that is all Ye know on earth, and all ye need to know. Bright Star, Would I were Stedfast as Thou Art<mdash/> John Keats Bright star, would I were stedfast as thou art Not in lone splendour hung aloft the night And watching, with eternal lids apart, Like nature's patient, sleepless Eremite, The moving waters at their priestlike task Of pure ablution round earth's human shores, Or gazing on the new soft-fallen mask Of snow upon the mountains and the moors Noyet still stedfast, still unchangeable, Pillow'd upon my fair love's ripening breast, To feel for ever its soft fall and swell, Awake for ever in a sweet unrest, Still, still to hear her tender-taken breath, And so live everor else swoon to death. On the Sea John Keats It keeps eternal whisperings around Desolate shores, and with its mighty swell Gluts twice ten thousand caverns, till the spell Of Hecate leaves them their old shadowy sound. Often 'tis in such gentle temper found, That scarcely will the very smallest shell Be moved for days from whence it sometime fell, When last the winds of heaven were unbound. Oh ye! who have your eye-balls vexed and tired, Feast them upon the wideness of the Sea; Oh ye! whose ears are dinned with uproar rude, Or fed too much with cloying melody, Sit ye near some old cavern's mouth, and brood Until ye start, as if the sea-nymphs choired! To Autumn John Keats I Season of mists and mellow fruitfulness, Close bosom-friend of the maturing sun; Conspiring with him how to load and bless With fruit the vines that round the thatch-eaves run; To bend with apples the moss'd cottage-trees, And fill all fruit with ripeness to the core; To swell the gourd, and plump the hazel shells With a sweet kernel; to set budding more, And still more, later flowers for the bees, Until they think warm days will never cease, For summer has o'er-brimm'd their clammy cells. II Who hath not seen thee oft amid thy store? Sometimes whoever seeks abroad may find Thee sitting careless on a granary floor, Thy hair soft-lifted by the winnowing wind; Or on a half-reap'd furrow sound asleep, Drows'd with the fume of poppies, while thy hook Spares the next swath and all its twined flowers: And sometimes like a gleaner thou dost keep Steady thy laden head across a brook; Or by a cyder-press, with patient look, Thou watchest the last oozings hours by hours. III Where are the songs of spring? Ay, where are they? Think not of them, thou hast thy music too, While barred clouds bloom the soft-dying day, And touch the stubble-plains with rosy hue; Then in a wailful choir the small gnats mourn Among the river sallows, borne aloft Or sinking as the light wind lives or dies; And full-grown lambs loud bleat from hilly bourn; Hedge-crickets sing; and now with treble soft The red-breast whistles from a garden-croft; And gathering swallows twitter in the skies. Ode to a Nightingale John Keats 1. My heart aches, and a drowsy numbness pains My sense, as though of hemlock I had drunk, Or emptied some dull opiate to the drains One minute past, and Lethe-wards had sunk: 'Tis not through envy of thy happy lot, But being too happy in thine happiness, That thou, light-winged Dryad of the trees, In some melodious plot Of beechen green, and shadows numberless, Singest of summer in full-throated ease. 2. O, for a draught of vintage! that hath been Cool''d a long age in the deep-delved earth, Tasting of Flora and the country green, Dance, and Provencal song, and sunburnt mirth! O for a beaker full of the warm South, Full of the true, the blushful Hippocrene, With beaded bubbles winking at the brim, And purple-stained mouth; That I might drink, and leave the world unseen, And with thee fade away into the forest dim: 3. Fade far away, dissolve, and quite forget What thou among the leaves hast never known, The weariness, the fever, and the fret Here, where men sit and hear each other groan; Where palsy shakes a few, sad, last gray hairs, Where youth grows pale, and spectre-thin, and dies; Where but to think is to be full of sorrow And leaden-eyed despairs, Where Beauty cannot keep her lustrous eyes, Or new Love pine at them beyond to-morrow. 4. Away! away! for I will fly to thee, Not charioted by Bacchus and his pards, But on the viewless wings of Poesy, Though the dull brain perplexes and retards: Already with thee! tender is the night, And haply the Queen-Moon is on her throne, Cluster'd around by all her starry Fays; But here there is no light, Save what from heaven is with the breezes blown Through verdurous glooms and winding mossy ways. 5. I cannot see what flowers are at my feet, Nor what soft incense hangs upon the boughs, But, in embalmed darkness, guess each sweet Wherewith the seasonable month endows The grass, the thicket, and the fruit-tree wild; White hawthorn, and the pastoral eglantine; Fast fading violets cover'd up in leaves; And mid-May's eldest child, The coming musk-rose, full of dewy wine, The murmurous haunt of flies on summer eves. 6. Darkling I listen; and, for many a time I have been half in love with easeful Death, Call'd him soft names in many a mused rhyme, To take into the air my quiet breath; Now more than ever seems it rich to die, To cease upon the midnight with no pain, While thou art pouring forth thy soul abroad In such an ecstasy! Still wouldst thou sing, and I have ears in vain To thy high requiem become a sod. 7. Thou wast not born for death, immortal Bird! No hungry generations tread thee down; The voice I hear this passing night was heard In ancient days by emperor and clown: Perhaps the self-same song that found a path Through the sad heart of Ruth, when, sick for home, She stood in tears amid the alien corn; The same that oft-times hath Charm'd magic casements, opening on the foam Of perilous seas, in faery lands forlorn. 8. Forlorn! the very word is like a bell To toll me back from thee to my sole self! Adieu! the fancy cannot cheat so well As she is fam'd to do, deceiving elf. Adieu! adieu! thy plaintive anthem fades Past the near meadows, over the still stream, Up the hill-side; and now 'tis buried deep In the next valley-glades: Was it a vision, or a waking dream? Fled is that music: do I wake or sleep?
    Percy Shelley Ode to the West Wind Percy Shelley I O wild West Wind, thou breath of Autumn's being, Thou, from whose unseen presence the leaves dead Are driven, like ghosts from an enchanter fleeing, Yellow, and black, and pale, and hectic red, Pestilence-stricken multitudes: O thou, Who chariotest to their dark wintry bed The wingéd seeds, where they lie cold and low, Each like a corpse within its grave, until Thine azure sister of the Spring shall blow Her clarion o'er the dreaming earth, and fill (Driving sweet buds like flocks to feed in air) With living hues and odours plain and hill: Wild Spirit, which art moving everywhere; Destroyer and preserver; hear, oh, hear! II Thou on whose stream, 'mid the steep sky's commotion, Loose clouds like earth's decaying leaves are shed, Shook from the tangled boughs of Heaven and Ocean, Angels of rain and lightning: there are spread On the blue surface of thine aery surge, Like the bright hair uplifted from the head Of some fierce Maenad, even from the dim verge Of the horizon to the zenith's height, The locks of the approaching storm. Thou dirge Of the dying year, to which this closing night Will be the dome of a vast sepulchre, Vaulted with all thy congregated might Of vapors, from whose solid atmosphere Black rain, and fire, and hail will burst: oh, hear! III Thou who didst waken from his summer dreams The blue Mediterranean, where he lay, Lulled by the coil of his crystalline streams, Beside a pumice isle in Baiae's bay, And saw in sleep old palaces and towers Quivering within the wave's intenser day, All overgrown with azure moss and flowers So sweet, the sense faints picturing them! Thou For whose path the Atlantic's level powers Cleave themselves into chasms, while far below The sea-blooms and the oozy woods which wear The sapless foliage of the ocean, know Thy voice, and suddenly grow gray with fear, And tremble and despoil themselves: oh, hear! IV If I were a dead leaf thou mightest bear; If I were a swift cloud to fly with thee; A wave to pant beneath thy power, and share The impulse of thy strength, only less free Than thou, O uncontrollable! If even I were as in my boyhood, and could be The comrade of thy wanderings over Heaven, As then, when to outstrip thy skiey speed Scarce seemed a vision; I would ne'er have striven As thus with thee in prayer in my sore need. Oh, lift me as a wave, a leaf, a cloud! I fall upon the thorns of life! I bleed! A heavy weight of hours has chained and bowed One too like thee: tameless, and swift, and proud. V Make me thy lyre, even as the forest is: What if my leaves are falling like its own! The tumult of thy mighty harmonies Will take from both a deep, autumnal tone, Sweet though in sadness. Be thou, Spirit fierce, My spirit! Be thou me, impetuous one! Drive my dead thoughts over the universe Like withered leaves to quicken a new birth! And, by the incantation of this verse, Scatter, as from an unextinguished hearth Ashes and sparks, my words among mankind! Be through my lips to unawakened earth The trumpet of a prophecy! O Wind, If Winter comes, can Spring be far behind? Ozymandias Percy Shelley I met a traveller from an antique land Who said: Two vast and trunkless legs of stone Stand in the desert. Near them on the sand, Half sunk, a shatter'd visage lies, whose frown And wrinkled lip and sneer of cold command Tell that its sculptor well those passions read Which yet survive, stamp'd on these lifeless things, The hand that mock'd them and the heart that fed. And on the pedestal these words appear: My name is Ozymandias, king of kings: Look on my works, ye Mighty, and despair! Nothing beside remains: round the decay Of that colossal wreck, boundless and bare, The lone and level sands stretch far away. The Indian Serenade Percy Shelley I arise from dreams of thee In the first sweet sleep of night, When the winds are breathing low, And the stars are shining bright I arise from dreams of thee, And a spirit in my feet Hath led me—who knows how? To thy chamber window, Sweet! The wandering airs they faint On the dark, the silent stream— The champak odors fail Like sweet thoughts in a dream; The nightingale's complaint, It dies upon her heart; As I must on thine, Oh, beloved as thou art! O lift me from the grass! die! I faint! I fail! Let thy love in kisses rain On my lips and eyelids pale. My cheek is cold and white, alas! My heart beats loud and fast;— Oh! press it to thine own again, Where it will break at last. Ode to a Skylark Percy Shelley Hail to thee, blithe spirit Bird thou never wert That from heaven or near it Pourest thy full heart In profuse strains of unpremeditated art. Higher still and higher From the earth thou springest, Like a cloud of fire; The blue deep thou wingest, And singing still dost soar and soaring ever singest. In the golden lightning Of the sunken sun, O'er which clouds are brightening, Thou dost float and run, Like an unbodied joy whose race is just begun. The pale purple even Melts around thy flight; Like a star of heaven, In the broad daylight Thou art unseen, but yet I hear thy shrill delight. All the earth and air With thy voice is loud, As, when night is bare, From one lonely cloud The moon rains out her beams, and heaven is overflowed. What thou art we know not; What is most like thee? From rainbow-clouds there flow not Drops so bright to see As from thy presence showers a rain of melody: Like a poet hidden In the light of thought; Singing hymns unbidden, Till the world is wrought To sympathy with hopes and fears it heeded not. Teach us, sprite or bird, What sweet thoughts are thine: I have never heard Praise of love or wine That panted forth a flood of rapture so divine. Chorus hymeneal Or triumphal chaunt, Matched with thine, would be all But an empty vaunt A thing wherein we feel there is some hidden want. What objects are the fountains Of thy happy strain? What fields, or waves, or mountains? What shapes of sky or plain? What love of thine own kind? what ignorance of pain? Teach me half the gladness That thy brain must know, Such harmonious madness From my lips would flow, The world should listen then, as I am listening now! Love's Philosophy Percy Shelley The Fountains mingle with the Rivers And the Rivers with the Oceans, The winds of Heaven mix forever With a sweet emotion; Nothing in the world is single; All things by a law divine In one spirit meet and mingle. Why not I with thine? See the mountains kiss high Heaven And the waves clasp one another; No sister-flower would be forgiven If it disdained its brother, And the sunlight clasps the earth And the moonbeams kiss the sea: What is all this sweet work worth If thou kiss not me?
    Mouse Tail Lewis Carroll Fury said to a mouse, That he met in the house, Let us both go to law: I will prosecute you.Come, I'll take no denial; We must have a trial: For really this morning I've nothing to do. Said the mouse to the cur, Such a trial, dear Sir, With no jury or judge,would be wasting our breath. I'll be judge, I'll be jury, Said cunning old Fury: I'll try the whole cause, and condemn you to death.
    ================================================ FILE: examples/letter/README.md ================================================ # Sample Letter Letters convert only to LaTeX. See the XML source for instructions on customizing letterhead. Be aware that the two PNG files need to be available when you process the LaTeX source to make a PDF. ================================================ FILE: examples/letter/sample-letter.xml ================================================ Jane Doe Big State University Department of Mathematics and Computer Science University of Puget Sound Dear Professor Doe,

    It is a pleasure to write as part of John Q. Public's application for a position in your organization. I have known John for a very long time now. I am confident that he will work out very well in your department.

    Of course, John has been a valued member of our department. So much so, that I have every confidence he will work splendidly for you. If I can provide more specific details, do not hesitate to contact me at your earliest convenience.

    Sincerely, John Z. Smith Associate Professor
    ================================================ FILE: examples/memo/README.md ================================================ # Sample Memo Letters convert only to LaTeX. See the XML source for instructions on customizing masthead. Be aware that a PNG and a PDF graphics file each need to be available when you process the LaTeX source to make a PDF. ================================================ FILE: examples/memo/sample-memo.xml ================================================ The Organization The Provost Professor Michael Smith, Department of Institutional Organization Organizational Evaluation

    It appears this place could be much better run.

    Conclusion

    In summary, I hope something will be done.

    And for the sake of all of us who toil and labor here daily, I hope it is done soon. Real soon. Promptly. Expeditiously.

    Thank-you for your attention.

    ================================================ FILE: examples/minimal/README.md ================================================ # Minimal Example `source/main.ptx` is a one-page article that might be your first exercise in setting up PreTeXt. Look at the top of the file for instructions on processing the file into a variety of output formats using `xsltproc` or the PreTeXt-CLI. `project.ptx` is a project configuration file for use with the PreTeXt-CLI. `codechat_config.yaml` is a CodeChat project configuration file, which will use the PreTeXt-CLI for processing. ================================================ FILE: examples/minimal/assets/.keep ================================================ ================================================ FILE: examples/minimal/codechat_config.yaml ================================================ # .. Copyright (C) 2012-2020 Bryan A. Jones. # # This file is part of the CodeChat System. # # The CodeChat System is free software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # The CodeChat System is distributed in the hope that it will be # useful, but WITHOUT ANY WARRANTY; without even the implied warranty # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the CodeChat System. If not, see # . # # ************************************************ # |docname| - Configuration for a CodeChat project # ************************************************ # This file defines the configuration for a CodeChat project. It contains a working `Sphinx `_ configuration. # # ``source_path``: optional; defaults to ``.`` (the current directory). A path to the root of the source tree. Relative paths are rooted in the directory containing this configuration file. source_path: source # ``output_path``: required. A path to the root of the HTML output produced by this renderer. Relative paths are rooted in the directory containing this configuration file. output_path: output/html # ``args``: required string or sequence of strings. This provides the arguments to invoke the renderer. These strings may optionally contain the following replacement values: # # - ``{project_path}``: an absolute path to the directory containing this file. # - ``{source_path}``: the ``source_path`` above, but as an absolute path. # - ``{output_path}``: the ``output_path`` above, but as an absolute path. # # The line below could also be written ``args: sphinx-build . _build``. args: pretext build html # ``html_ext``: optional; defaults to ``.html``. The extension used by this renderer when generating HTML files. #html_ext: .html # ``project_type``: optional; defaults to ``general``. Define the project type, which enables special processing based on the type. Valid values are ``general`` (no special processing), ``Doxygen``, and ``PreTeXt``. project_type: PreTeXt ================================================ FILE: examples/minimal/generated-assets/.keep ================================================ ================================================ FILE: examples/minimal/project.ptx ================================================ html source/main.ptx publication/publication.ptx output/html latex source/main.ptx publication/publication.ptx output/latex pdf source/main.ptx publication/publication.ptx output/pdf latex pdflatex xelatex asy sage convert pdftops pdf-crop-margins pageres node file2brl ================================================ FILE: examples/minimal/publication/publication.ptx ================================================ ================================================ FILE: examples/minimal/requirements.txt ================================================ pretextbook == 0.7.0 ================================================ FILE: examples/minimal/source/main.ptx ================================================ \newcommand{\doubler}[1]{2#1}
    A Minimal Article Robert A. Beezer University of Puget Sound

    This is a very short article, but it still exercises some advanced features of MathBook XML.

    This is a short paragraph to introduce the article (but it is not the abstract). It is optional, in case it would be preferable to have the first section be titled an Introduction.

    Just Some Text

    Now a single paragraph inside a titled section of the article.

    A Bit More Interesting

    The previous section () was a bit boring.

    This paragraph has some inline math, a Diophantine equation, x^2 + \doubler{y^2} = z^2. And some display math about infinite series: \sum_{n=1}^\infty\,\frac{1}{n^2} = \frac{\pi^2}{6}. Look at the XML source to see how macros are employed universally across all possible output formats.

    Computation

    The following is a chunk of Sage code. Your output format will dictate what you see next. In print, you will see expected output. In HTML you will have an executable, and editable, Sage Cell to work with. In a SageMathCloud worksheet, you will be able to execute and edit the code with all the other features of SageMathCloud. Note that if you include the expected output in your source, then you can test the example to verify that the behavior of Sage has not changed.

    A = matrix(4,5, srange(20)) A.rref() [ 1 0 -1 -2 -3] [ 0 1 2 3 4] [ 0 0 0 0 0] [ 0 0 0 0 0]
    ================================================ FILE: examples/pug/.gitignore ================================================ *.html *.xml node_modules/ knowl/ ================================================ FILE: examples/pug/authors-guide/windows.pug ================================================ doctype xml chapter(xml:id="windows-install-notes") title Windows Installation Notes introduction p. This document explains the best known way to install the MathBook XML toolchain in a Windows environment. It has been tested on Windows 7, 8, and 10. We assume that none of the listed tools or equivalents have been previously installed. That may complicate matters. This is especially true if you use Cygwin, or if you have already installed Python on your machine. MathBook XML compatibility with existing Python installations is addressed elsewhere in this document (future version?). section(xml:id="setup") title Setup introduction p. In this section, we do some initial setup, establish notation, and issue warnings. Some of the steps in this process are dangerous. Typos could lead to an unstable system, or possibly even to unrecoverable system errors. Double-check everything. subsection(xml:id="notation") title Notation p. Strings enclosed in angle brackets are variables whose values you should substitute in typed expressions. username, for example, should be replaced with your Windows username (mine is drosoff, e.g.). Throughout this installation process it is very important to pay attention to the direction of slashes / and backslashes \. subsection(xml:id="initial-windows-setup") title Initial Windows setup p. It is easier to see what is happening if your Windows file browser is not set up to hide file extensions from you. Disable the hide file extensions behavior before proceeding. In Windows 7/8, this can be done through the Control Panel. In Windows 10, there is a checkbox somewhere in the ribbon for it. ol(xml:id="initial-windows-setup-steps") li: p On Windows 7 or 8: ol li: p. Open the Start Menu and type Control Panel. Select the Control Panel entry from the popup list. li: p. Type Folder Options into the search box in the Control Panel window. Select Folder Options when it appears. li: p. Select the View tab. li: p. Uncheck the box for Hide extensions for known file types. li: p. Click OK until there are no more OKs to click. li: p. On Windows 10: Coming soon. subsection(xml:id="a-word-on-path-names") title A word on path names p. An appallingly large fraction of the difficulties of using GNU/Linux-based utilities with Windows come from the differences in formatting path names. Windows path names begin with a drive letter (usually C) and a colon. Like all path names, they describe a path in a rooted tree. The root directory (folder) in Windows is called \, backslash. Note the direction carefully. Children of the root node are either subdirectories or files in the root directory (leaves). The path to my downloads folder is: pre C:\Users\drosoff\Downloads\ p. The trailing backslash is often unnecessary, but it is an easy way to see immediately if a path name refers to a file or to a directory. Windows path names are not case-sensitive. p. Linux/Mac OS X path names are quite similar, but lack drive letters, start with an explicit reference to the root, use forward slashes, and are case-sensitive. A path to a typical Linux user's download folder might be pre /home/typical.username/Downloads p. Again, Linux/Mac OS X pathnames are case-sensitive. The Git Bash shell for Windows is an emulation of a Linux environment, and the utilities within it expect path names that follow Linux conventions. So we conform to this expectation as follows. ol li: p Remove the colon, but keep the drive letter. li: p All backslashes \ become slashes /. li: p Add an initial slash preceding the drive letter. p The path name to my Windows download folder becomes pre /c/users/drosoff/Downloads p. Even though Git Bash is pretending to be a Linux shell, path names are still the underlying Windows path names, and therefore are not case sensitive. You can verify this using tab-completion. p. Path names that begin with the drive letter (Windows) or the root / (Linux/Mac OS X) are called absolute path names. Their referents do not depend on the location from which the path name is invoked. Relative path names, on the other hand, begin in the so-called current working directory. A relative pathname might look something like this: pre ../../examples/sample-article/sample-article.xml p. The symbol .. is a shortcut for the parent of the current directory. Thus, the relative path name above means blockquote from where we are, ascend two levels, then descend into the examples and sample-article subdirectories, and find the file sample-article.xml. p. Path names that contain spaces are evil, and should be avoided in many cases. Unfortunately, all Windows default program installation locations contain at least one space (directory name Program Files). This does not appear to cause problems, except when installing ImageMagick (). To be extra careful, you could always choose an installation location that is free of space characters. subsection(xml:id="do-i-have-64-bit-windows") title Do I have 64-bit Windows? p Find out on Windows 7: ol li: p. Open the start menu and type Computer. Right-click the Computer item in the popup menu. li: p Select Properties from the drop-down menu. li: p. Read in the right-hand side of the pane to find the System heading. li: p. From the System type entry, read whether you have a 32- or a 64-bit OS. conclusion p. Now you are ready to begin installing the various pieces of the MathBook XML puzzle. The first one, xsltproc (), is the most annoying. You might want to go get a snack or another cup of coffee. section(xml:id="installing-xsltproc") title Installing xsltproc subsection(xml:id="download-and-install-executables-and-linked-libraries") p. This is the most annoying part of the installation. Obtain four zip archives from Igor Zlatkovic's FTP site that hosts the most recent Libxml binaries for Windows. At the time of this writing, the 64-bit binaries were considered experimental. I have had no trouble using the 32-bit binaries on my 64-bit Windows 7 system, so I suggest that all users download the most recent 32-bit version of the following libraries: ol(xml:id="list-zip-files-xsltproc") li: p. iconv (filename something like iconv-1.9.2.win32.zip) li: p. libxml2 (filename something like libxml2-2.7.8.win32.zip) li: p. libxslt (filename something like libxslt-1.1.26.win32.zip) li: p. zlib (filename something like zlib-1.2.5.win32.zip) p. We only need a handful of files from these archives. So the simplest thing is to leave them in your Downloads folder and grab what we need. Create a new folder C:\xsltproc (it can be anywhere, as long as it's a new location). We'll call this location xsltproc in case you named your folder something different. p. Extract the following files from the four zip archives you downloaded above into xsltproc: ol(xml:id="list-extracted-files-from-zips-xsltproc") li: p From iconv-*.win32.zip: ol li: p: pre iconv-*.win32\bin\iconv.dll li: p From libxml2-*.win32.zip: ol li: p: pre libxml2-*.win32\bin\libxml2.dll li: p: pre libxml2-*.win32\bin\xmllint.exe li: p From libxslt-*.win32.zip: ol li: p: pre libxslt-*.win32\bin\libexslt.dll li: p: pre libxslt-*.win32\bin\libxslt.dll li: p: pre libxslt-*.win32\bin\xsltproc.exe li: p From zlib-*.win32.zip: ol li: p: pre zlib-*.win32\bin\zlib1.dll subsection(xml:id="change-path-environment-variable-xsltproc") title Change PATH envronment variable p.u Note: if you prefer not to meddle with this, it can be avoided. See . p. Now, we need to make sure your system can find these files when we need them. ol(xml:id="steps-change-path-environment-variable-xsltproc") li: p. Open the Start menu and start typing Edit the system environment variables. Select this option when it becomes visible. li: p. Click the Environment Variables button near the bottom of the dialog. li p. In the bottom part of the dialog labeled System environment variables, look for a variable named PATH. You may need to scroll. ol li: p. If you don't find one, create it using the New... button. Make sure to use all capital letters. (This really shouldn't happen. Make sure you are editing the system environment variables, not the user environment variables.) li: p. If you do find the PATH variable, select it and click the Edit... button. li: p. Regardless of which of steps 1 and 2 you followed, now you should see a dialog with two text fields. Your variable name should be PATH. li: p. If you created this variable, populate the second field with the full path name of xsltproc, the location where you put the seven files from Igor's zip archives. For me this looks like C:\xsltproc. li: p. If you are editing the PATH variable, place the cursor in the existing value and press the End key, so that the cursor moves to the back of the line. The PATH string is a ;-delimited list of full path names, so append the string xsltproc; (note the semicolon) to the existing value. If you named xsltproc as we suggested above, then the last part of your PATH variable is now C:\xsltproc;. li: p. Click OK to save changes. section(xml:id="installing-git") title Installing git p. In this section we install the git version control system and some tools to interact with it, including a fairly full- featured emulation of the bash command line shell. I strongly recommend you use the Git Bash shell or another bash emulation, so that you can use Linux commands referenced elsewhere. ol(xml:id="steps-install-git") li: p. Visit the official git download page (download starts automatically) and obtain the latest binary for your system. li: p. Find the installer in your Download location and run it. li: p. Choose whatever location you like for the git installation folder. I recommend you use the default. li: p. At the Adjusting your PATH environment dialog, select either of the first two items. I recommend the second, Add git executable to Windows PATH. If you are apprehensive about adding git to the Windows PATH, select the first option. I do not recommend the third option. li: p. Accept the default options for all the remaining prompts. subsection(xml:id="changing-path-with-bashrc") title Changing the path with .bashrc p. In , we promised that you could avoid messing with the Windows environment variables. If you install something else later that wants to use xsltproc, then this might not be the best idea. But if you are only going to use it from within Git Bash, then this will work fine. p. From the Git Bash command prompt, enter this line of text and hit Enter. Don't make any typos. You should substitute your value of xsltproc where indicated, but make sure to conform to the conventions at the end of regarding Windows path names in Git Bash. (I warned you this was going to be annoying.) pre echo "export PATH=/c/xsltproc:$PATH" ~/.bashrc p. You may get a message from Git Bash the next time you run it about .bash_profile, which you may safely ignore. section(xml:id="installing-anaconda") title Installing Anaconda p. Anaconda is a well-regulated development environment for Python under Windows, and I recommend it for users who do not already have Python installed. The essential pretext script has recently been updated to support both Python 2 and Python 3. Therefore I make no recommendation about which Python version to choose, except to say that as of support for Python 3 should be regarded as experimental. p. If you already have a working Python installation, skip to . p. You have some choice with your Anaconda installation. It actually supports the installation of several independent Pythons side-by- side (since both 2.7 and 3.x are in active use, this is more reasonable than it seems). If you don't need Python for anything else or are simply a minimalist, Miniconda is also an option. Miniconda installs no packages, but these can be installed via the conda utility at the command line later. p. Download either Miniconda, Python 2.7, or Python 3.5 from the Anaconda download page. Run the installer and accept all the default suggestions. conclusion p. Congratulations, you have successfully installed Python. p. If you don't care about images, you can stop here. Much of the functionality is already present. However, to use the pretext script to create SVG images from sources like PDF/PNG images, Sage, Asymptote, or TikZ, you need to install ImageMagick and Ghostscript using the directions in and . section(xml:id="installing-imagemagick") title Installing ImageMagick p. Visit the ImageMagick downloads page and grab a binary. If you have a 64-bit Windows installation, use the recommended version. If you have a 32-bit installation, find the version whose filename is obtained from that of the recommended version by substituting x86 for x64. For example, if the recommended version's filename is: pre ImageMagick-7.0.1-6-Q16-x64-dll.exe p then a good choice for a 32-bit Windows would be pre ImageMagick-7.0.1-6-Q16-x86-dll.exe ol(xml:id="installing-imagemagick-steps") li: p Run the installer from your download location. li: p Accept the license agreement. li p. Choose a default installation location that has no spaces in its folder name. The default choice Program Files causes problems because of path name issues. I chose pre c:\ImageMagick-7.0.1-Q16\ p. It matters because the ImageMagick utility convert is used by the pretext script to convert your images into different formats. The pretext script will have a lot of trouble with path names that contain spaces. li p. When confronted with Select additional tasks, make sure that the boxes for Add application directory to your system path and Install legacy utilities are checked. li: p If you like, carry out the procedure to verify your installation. conclusion p. Congratulations, you have installed ImageMagick. section(xml:id="installing-ghostscript") title Installing Ghostscript p. Visit the Ghostscript download area and download the most current binary for either 64-bit or 32-bit Windows. Run the installer and accept all the default options. conclusion p. Congratulations, you have successfully installed Ghostscript. section(xml:id="whats-missing") title What's missing p. Development of a Windows-compatible pretext script () is continuing. If you need help with pretext now, contact Dave Rosoff. conclusion p. If you find any problems or bugs, please let us know at the MathBook XML Support group in Google Groups, or email drosoff AT collegeofidaho DOT edu. ================================================ FILE: examples/pug/build.sh ================================================ #!/usr/bin/env bash # for pug, install node.js and then run npm install (will read packages.json) ./node_modules/.bin/pug --pretty --extension xml pug.pug xsltproc ../../xsl/pretext-html.xsl pug.xml ================================================ FILE: examples/pug/package.json ================================================ { "name": "mathbookxml-pug-demo", "version": "1.0.0", "description": "using the pug template engine to write the clunky xml", "dependencies": { "pug": "^1.11.0" }, "devDependencies": {}, "author": "Harald Schilly", "license": "GPL-3.0" } ================================================ FILE: examples/pug/pug-include.pug ================================================ - var name = "content of variable name" introduction p. Besides these basics, Pug also offers #[q true] includes. This means, just write the text and don't think about additional overheads, like that it also has to be an XML document. p. This makes it easy to divide your document into smaller parts, while PreTeXt will see the #[q full] XML file later on. subsection title Variables and Code p. You can use variables like that: !{name}. They are pre-processed by Pug and inserted via string interpolation. p | You could even go ahead and include some code in your template, | or use #[q mixins] as macros. | E.g. below here, this variable is inserted several times in a for loop: ul - for (var x = 1; x <= 5; x++) li This is iteration #{x}, inserting variable name: !{name} ================================================ FILE: examples/pug/pug.pug ================================================ doctype xml mathbook // Pug code can contain comments, they will show up as XML comments. docinfo macros | \newcommand{\doubler}[1]{2#1} article(xml:id="pug") title Pug meets PreTeXt frontmatter titlepage author personname Harald Schilly date today/ abstract: p. This is a very short demo, how writing PreTeXt can be simplified by using Pug #[xref(ref="biblio-pug")/]. introduction p. Wouldn't it be nice, if you do not have to deal with verbose XML tags? Write paragraphs that do stand more out and aren't cluttered by too much overhead? What if, you can start writing in version control (Git) friendly multiple line documents? You are finally able to limit yourself to 80 character line lengths and make the source of your documents look more like a tidy Python #[xref(ref="biblio-python")/] program. p. Additionally, all this works well together with Pug's include statement, mixin #[q macros] and much more. p. ... and yes, inline XML tags do just work, too! section(xml:id="section-textual") title Some Demo Text p. This is just copied from the minimal demo. The interesting thing to see here is the source of this in the #[c pug.pug] file. p. Now a single paragraph inside a titled section of the article. Which has some text on a second line. ... and a bit of #[em emphasizing]. p. The code to accomplish this looks like this: pre. section(xml:id="section-textual") title Some Demo Text p. This is just copied from the minimal demo. The interesting thing to see here is the source of this in the \#[c pug.pug] file. p. Now a single paragraph inside a titled section of the article. Which has some text on a second line. ... and a bit of \#[em emphasizing]. section(xml:id="section-interesting") title A Bit More Interesting p The previous section (#[xref(ref="section-textual" text="type-global")/]) was a bit boring. p | This paragraph has some inline math, a Diophantine equation, m x^2 + \doubler{y^2} = z^2 | , and some display math about infinite series: #[me \sum_{n=1}^\infty\,\frac{1}{n^2} = \frac{\pi^2}{6}]. | Look at the Pug source to see how #[latex/] macros are employed universally across all possible output formats. p | We could even write a formula me \int_0^\infty 3 x^2 + 1 \mathrm{d}x | inside a p-tag text on its separate line prefixed by #[c me] only! p This looks like that: pre. p | We could even write a formula me \int_0^\infty 3 x^2 + 1 \mathrm{d}x | inside a p-tag text on its separate line prefixed by \#[c me] only! section(xml:id="section-computation") title Computation p. The following is a chunk of Sage code. Your output format will dictate what you see next. In print, you will see expected output. In HTML you will have an executable, and editable, Sage Cell to work with. In a SageMathCloud worksheet, you will be able to execute and edit the code with all the other features of SageMathCloud. Note that if you include the expected output in your source, then you can test the example to verify that the behavior of Sage has not changed. sage input. A = matrix(4,5, srange(20)) A.rref() output. [ 1 0 -1 -2 -3] [ 0 1 2 3 4] [ 0 0 0 0 0] [ 0 0 0 0 0] section(xml:id="section-pug") title Pug include ./pug-include.pug section(xml:id="section-gotchas") title Some gotchas p. Here are some pitfalls that it's helpful to be aware of if you want to use Pug more seriously: paragraphs title The case keyword p | For Pug #[c case] is a keyword, used in program control. | For example like this: pre. - var friends = 3 case friends when 0 - break when 1 p you have very few friends default p you have #{friends} friends p This produces: - var friends = 3 case friends when 0 - break when 1 p you have very few friends default p you have #{friends} friends p | Unfortunately, #[c case] is also a tag used by PreTeXt, | for a case of a proof, so the following Pug code will throw an error pre. proof case: p | First case. case: p | Second case. p | To work around this issue you could use a different keyword, | such as #[c proofcase] and use a simple script | to change all instances of #[c proofcase] to #[c case] in the XML Pug produces. paragraphs title Braces in inline tags p | The Pug way of typing inline math is to use \#[m f\in R[x],g \in R[y]]. | But Pug will interpret the first instance of ] in this snippet as the end of the tag, producing #[m f\in R[x], g\in R[y]]. | There a few ways to avoid this ol li p Define #[latex/] macros for these characters, just like #[c \lt] and #[c \gt]: pre. \newcommand{\lb}{[} \newcommand{\rb}{]} p And use these whenever needed (as a bonus you can use #[c \left] and #[c \right] in these macros too). li p | Only use non-inline tags for math containing ]. | For example pre. p | It would be annoying but doable to write: let m f \in K[x] | and m g \in K[y] | so that m fg \in K[x,y] | . li | Use only XML style inline tags for math <m> f\in R[x] </m> (or at least for math containing the ] character. backmatter references title References biblio(type="raw" xml:id="biblio-pug"). The magic behind all this is provided by the #[url(href="https://pugjs.org/") Pug Template Engine]. biblio(type="raw" xml:id="biblio-python"). Python Programming Language. ================================================ FILE: examples/sample-article/bibliography.xml ================================================ Tom Judson, Abstract Algebra: Theory and Applications.

    Another online, open-source offering.

    Tom Judson, Abstract Algebra: Theory and Applications.

    Another online, open-source offering.

    David C. Lay, Subspaces and Echelon Forms. The College Mathematics Journal, January 1993, 24 1, 5762. David C. Lay, Subspaces and Echelon Forms. The College Mathematics Journal, January 1993, 24 1, 5762.
    ================================================ FILE: examples/sample-article/customizations-one.xml ================================================ alligators feeling, since it is more fun
    • Red

    • Blue

    • Green

    ================================================ FILE: examples/sample-article/customizations-two.xml ================================================ mice shouting, because we are often ANGRY
    • Crimson

    • Navy

    • Emerald

    ================================================ FILE: examples/sample-article/gen/asymptote/asymptote-contour-sbs.html ================================================ /tmp/tmpir68p_cf/out ================================================ FILE: examples/sample-article/gen/asymptote/asymptote-contour.html ================================================ workspace_1 ================================================ FILE: examples/sample-article/gen/asymptote/asymptote-lever-integral.html ================================================ workspace_1 ================================================ FILE: examples/sample-article/gen/asymptote/asymptote-lever-sbs.html ================================================ /tmp/tmp6st7zvse/out ================================================ FILE: examples/sample-article/gen/asymptote/asymptote-lever-solo.html ================================================ workspace_1 ================================================ FILE: examples/sample-article/gen/asymptote/asymptote-lever.html ================================================ workspace_1 ================================================ FILE: examples/sample-article/gen/asymptote/asymptote-surface.html ================================================ workspace_1 ================================================ FILE: examples/sample-article/gen/asymptote/asymptote-workcone.html ================================================ workspace_1 ================================================ FILE: examples/sample-article/gen/dynamic_subs/dynamic_substitutions.xml ================================================ -5 -2 2 5 -\frac{1}{4} \left(x+5\right) \left(x+2\right) \left(x-2\right) \left(x+5\right) \left(x+2\right) \left(x-2\right) -20 -\frac{1}{4} 4 \left(-x-3\right)^{3}+5 4 x^{3}+5 -1 x-3 ================================================ FILE: examples/sample-article/gen/prefigure/prefigure-fibonacci-a-annotations.xml ================================================ prefigure-fibonacci-a-figure 1 prefigure-fibonacci-a-top prefigure-fibonacci-a-arrows prefigure-fibonacci-a-top prefigure-fibonacci-a-arrows prefigure-fibonacci-a-top 1 prefigure-fibonacci-a-top-L prefigure-fibonacci-a-top-S prefigure-fibonacci-a-top-L prefigure-fibonacci-a-top-S prefigure-fibonacci-a-figure prefigure-fibonacci-a-top-L 1 prefigure-fibonacci-a-top prefigure-fibonacci-a-top-S 2 prefigure-fibonacci-a-top prefigure-fibonacci-a-arrows 2 prefigure-fibonacci-a-left-deflate prefigure-fibonacci-a-right-deflate prefigure-fibonacci-a-left-deflate prefigure-fibonacci-a-right-deflate prefigure-fibonacci-a-figure prefigure-fibonacci-a-left-deflate 1 prefigure-fibonacci-a-left-arrow prefigure-fibonacci-a-top-L prefigure-fibonacci-a-bottom-L prefigure-fibonacci-a-bottom-L prefigure-fibonacci-a-arrows prefigure-fibonacci-a-left-arrow 0 prefigure-fibonacci-a-left-deflate prefigure-fibonacci-a-top-L 0 prefigure-fibonacci-a-left-deflate prefigure-fibonacci-a-bottom-L 1 prefigure-fibonacci-a-bottom-LL prefigure-fibonacci-a-bottom-LS prefigure-fibonacci-a-bottom-LL prefigure-fibonacci-a-bottom-LS prefigure-fibonacci-a-left-deflate prefigure-fibonacci-a-bottom-LL 1 prefigure-fibonacci-a-bottom-L prefigure-fibonacci-a-bottom-LS 2 prefigure-fibonacci-a-bottom-L prefigure-fibonacci-a-right-deflate 2 prefigure-fibonacci-a-right-arrow prefigure-fibonacci-a-top-S prefigure-fibonacci-a-bottom-S prefigure-fibonacci-a-bottom-S prefigure-fibonacci-a-arrows prefigure-fibonacci-a-right-arrow 0 prefigure-fibonacci-a-right-deflate prefigure-fibonacci-a-top-S 0 prefigure-fibonacci-a-right-deflate prefigure-fibonacci-a-bottom-S 1 prefigure-fibonacci-a-right-deflate ================================================ FILE: examples/sample-article/gen/prefigure/prefigure-fibonacci-b-annotations.xml ================================================ prefigure-fibonacci-b-figure 1 prefigure-fibonacci-b-down-arrows prefigure-fibonacci-b-top-down-arrow prefigure-fibonacci-b-tiling-row_0 prefigure-fibonacci-b-tiling-row_1 prefigure-fibonacci-b-tiling-row_2 prefigure-fibonacci-b-bottom-tilings prefigure-fibonacci-b-periodic-0 prefigure-fibonacci-b-periodic-1 prefigure-fibonacci-b-periodic-2 prefigure-fibonacci-b-tiling-row_0 prefigure-fibonacci-b-tiling-row_1 prefigure-fibonacci-b-tiling-row_2 prefigure-fibonacci-b-bottom-tilings prefigure-fibonacci-b-periodic-0 prefigure-fibonacci-b-periodic-1 prefigure-fibonacci-b-periodic-2 prefigure-fibonacci-b-down-arrows 0 prefigure-fibonacci-b-figure prefigure-fibonacci-b-top-down-arrow 0 prefigure-fibonacci-b-figure prefigure-fibonacci-b-tiling-row_0 1 prefigure-fibonacci-b-figure prefigure-fibonacci-b-tiling-row_1 2 prefigure-fibonacci-b-down-arrow-row_0 prefigure-fibonacci-b-figure prefigure-fibonacci-b-down-arrow-row_0 0 prefigure-fibonacci-b-tiling-row_1 prefigure-fibonacci-b-tiling-row_2 3 prefigure-fibonacci-b-down-arrow-row_1 prefigure-fibonacci-b-figure prefigure-fibonacci-b-down-arrow-row_1 0 prefigure-fibonacci-b-tiling-row_2 prefigure-fibonacci-b-bottom-tilings 4 prefigure-fibonacci-b-tiling-row_0 prefigure-fibonacci-b-tiling-row_1 prefigure-fibonacci-b-tiling-row_0 prefigure-fibonacci-b-tiling-row_1 prefigure-fibonacci-b-figure prefigure-fibonacci-b-tiling-row_0 1 prefigure-fibonacci-b-bottom-tilings prefigure-fibonacci-b-tiling-row_1 2 prefigure-fibonacci-b-bottom-tilings prefigure-fibonacci-b-periodic-0 5 prefigure-fibonacci-b-tiling-row_0 prefigure-fibonacci-b-right-arrow-row_0 prefigure-fibonacci-b-tiling-row_0 prefigure-fibonacci-b-right-arrow-row_0 prefigure-fibonacci-b-figure prefigure-fibonacci-b-tiling-row_0 1 prefigure-fibonacci-b-periodic-0 prefigure-fibonacci-b-right-arrow-row_0 2 prefigure-fibonacci-b-periodic-0 prefigure-fibonacci-b-periodic-1 6 prefigure-fibonacci-b-tiling-row_1 prefigure-fibonacci-b-right-arrow-row_1 prefigure-fibonacci-b-tiling-row_1 prefigure-fibonacci-b-right-arrow-row_1 prefigure-fibonacci-b-figure prefigure-fibonacci-b-tiling-row_1 1 prefigure-fibonacci-b-periodic-1 prefigure-fibonacci-b-right-arrow-row_1 2 prefigure-fibonacci-b-periodic-1 prefigure-fibonacci-b-periodic-2 7 prefigure-fibonacci-b-tiling-row_2 prefigure-fibonacci-b-right-arrow-row_2 prefigure-fibonacci-b-tiling-row_2 prefigure-fibonacci-b-right-arrow-row_2 prefigure-fibonacci-b-figure prefigure-fibonacci-b-tiling-row_2 1 prefigure-fibonacci-b-periodic-2 prefigure-fibonacci-b-right-arrow-row_2 2 prefigure-fibonacci-b-periodic-2 ================================================ FILE: examples/sample-article/gen/prefigure/prefigure-tangent-annotations.xml ================================================ prefigure-tangent-figure 1 prefigure-tangent-grid-axes prefigure-tangent-graph-tangent prefigure-tangent-grid-axes prefigure-tangent-graph-tangent prefigure-tangent-grid-axes 1 prefigure-tangent-grid prefigure-tangent-axes prefigure-tangent-grid prefigure-tangent-axes prefigure-tangent-figure prefigure-tangent-grid 1 prefigure-tangent-grid-axes prefigure-tangent-axes 2 prefigure-tangent-grid-axes prefigure-tangent-graph-tangent 2 prefigure-tangent-graph prefigure-tangent-point prefigure-tangent-tangent prefigure-tangent-graph prefigure-tangent-point prefigure-tangent-tangent prefigure-tangent-figure prefigure-tangent-graph 1 prefigure-tangent-graph-tangent prefigure-tangent-graph prefigure-tangent-point 2 prefigure-tangent-graph-tangent prefigure-tangent-tangent 3 prefigure-tangent-graph-tangent ================================================ FILE: examples/sample-article/gen/prefigure/prefigure-worksheet-vectors-annotations.xml ================================================ prefigure-worksheet-vectors-figure 1 prefigure-worksheet-vectors-grid prefigure-worksheet-vectors-axes prefigure-worksheet-vectors-vector-a prefigure-worksheet-vectors-vector-b prefigure-worksheet-vectors-grid prefigure-worksheet-vectors-axes prefigure-worksheet-vectors-vector-a prefigure-worksheet-vectors-vector-b prefigure-worksheet-vectors-grid 1 prefigure-worksheet-vectors-figure prefigure-worksheet-vectors-axes 2 prefigure-worksheet-vectors-figure prefigure-worksheet-vectors-vector-a 3 prefigure-worksheet-vectors-figure prefigure-worksheet-vectors-vector-b 4 prefigure-worksheet-vectors-figure ================================================ FILE: examples/sample-article/gen/problems/mom-2168.xml ================================================

    Find the equation of the line in the form \displaystyle{y}={m}{x}+{b}.

    Answer: \displaystyle{y}=

     

    • \displaystyle{y}=-{2}{x}-{6}

    ================================================ FILE: examples/sample-article/gen/problems/mom-2572.xml ================================================

    Try to evaluate \displaystyle-{\left(-{100}\right)}^{{-{1}{/}{2}}} without using a calculator. Enter your answer as an integer or reduced fraction (no decimals). Enter DNE if the number is not real.

    The value is  

    • DNE

    ================================================ FILE: examples/sample-article/gen/problems/mom-7492.xml ================================================

    You wish to determine if there is a linear correlation between the two variables at a significance level of \displaystyle\alpha={0.001}. You have the following bivariate data set.

    xy34.386.54245.635.546.742.2480.7138.978.6-64.743.550.668.2-4550.217.439.164.978.3-105.830.247.552.719.440.85121.572.15730.667-40.258.3-9.730.890.945.534.33.3168.34323.134.829.230.9104.813.1101.660.9-68.930.964.241.460.335.320.849.838.73959.531.992.518.9113.953.617.659-40.4

    download link provided here:  Download CSV

    What is the correlation coefficient for this data set?

           r =

    (report answer accurate to at least 3 decimal places)

    To find the p-value for a correlation coefficient, you need to convert to a t-score: \displaystyle{t}={r}\cdot\sqrt{{\frac{{{n}-{2}}}{{{1}-{r}^{{2}}}}}} This t-score is from a t-distribution with \displaystyle{n}-{2} degrees of freedom.

    What is the p-value for this correlation coefficient?

           p-value =

    (report answer accurate to at least 4 decimal places)

    Your final conclusion is that...

    1. There is sufficient sample evidence to support the claim that there is a statistically significant correlation between the two variables.
    2. There is insufficient sample evidence to support the claim the there is a correlation between the two variables.

    • -0.928
    • 0
    • A: There is sufficient sample evidence to support the claim that there is a statistically significant correlation between the two variables.

    ================================================ FILE: examples/sample-article/gen/problems/mom-930582.xml ================================================

    The right circular conical tank shown has height 4.00 m and top radius \displaystyle{1.40} m. It is filled with water to a height of \displaystyle{3.50} m. The cross section is a right triangle with height 4.00 m and top side \displaystyle{1.40} m. Inside is another right triangle with height \displaystyle{3.50} m.

    What is the volume of water? m

    How much water must be added to fill the tank? \displaystyle\text{m}^{{3}}

    • 5.55
    • 2.66

    ================================================ FILE: examples/sample-article/gen/qrcode/airborne-midnight-1-url.xml ================================================ https://www.youtube.com/watch?v=UYPoMjR6-Aohttps://pretextbook.org/examples/sample-article/html/section-side-by-side-gallery.html#airborne-midnight-1 ================================================ FILE: examples/sample-article/gen/qrcode/audio-bach-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/audio-bach.htmlhttps://pretextbook.org/examples/sample-article/html/section-audio.html#audio-bach ================================================ FILE: examples/sample-article/gen/qrcode/audio-organ-finale-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/audio-organ-finale.htmlhttps://pretextbook.org/examples/sample-article/html/section-audio.html#audio-organ-finale ================================================ FILE: examples/sample-article/gen/qrcode/audio-piano-trill-two-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/audio-piano-trill-two.htmlhttps://pretextbook.org/examples/sample-article/html/section-audio.html#audio-piano-trill-two ================================================ FILE: examples/sample-article/gen/qrcode/audio-piano-trill-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/audio-piano-trill.htmlhttps://pretextbook.org/examples/sample-article/html/section-audio.html#audio-piano-trill ================================================ FILE: examples/sample-article/gen/qrcode/bareilles-love-song-url.xml ================================================ https://www.youtube.com/watch?v=qi7Yh16dA0w\&start=60\&end=120https://pretextbook.org/examples/sample-article/html/section-video.html#bareilles-love-song ================================================ FILE: examples/sample-article/gen/qrcode/big-buck-bunny-best-format-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/big-buck-bunny-best-format.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#big-buck-bunny-best-format ================================================ FILE: examples/sample-article/gen/qrcode/big-buck-bunny-frame-one-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/big-buck-bunny-frame-one.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#big-buck-bunny-frame-one ================================================ FILE: examples/sample-article/gen/qrcode/big-buck-bunny-margins-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/big-buck-bunny-margins.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#big-buck-bunny-margins ================================================ FILE: examples/sample-article/gen/qrcode/big-buck-bunny-mp4-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/big-buck-bunny-mp4.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#big-buck-bunny-mp4 ================================================ FILE: examples/sample-article/gen/qrcode/big-buck-bunny-ogg-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/big-buck-bunny-ogg.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#big-buck-bunny-ogg ================================================ FILE: examples/sample-article/gen/qrcode/big-buck-bunny-subtitles-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/big-buck-bunny-subtitles.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#big-buck-bunny-subtitles ================================================ FILE: examples/sample-article/gen/qrcode/big-buck-bunny-two-subtitles-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/big-buck-bunny-two-subtitles.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#big-buck-bunny-two-subtitles ================================================ FILE: examples/sample-article/gen/qrcode/big-buck-bunny-webm-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/big-buck-bunny-webm.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#big-buck-bunny-webm ================================================ FILE: examples/sample-article/gen/qrcode/calcplot3d-full-application-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/calcplot3d-full-application.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#calcplot3d-full-application ================================================ FILE: examples/sample-article/gen/qrcode/calcplot3d-intersection-planes-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/calcplot3d-intersection-planes.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#calcplot3d-intersection-planes ================================================ FILE: examples/sample-article/gen/qrcode/calcplot3d-probability-wavefunction-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/calcplot3d-probability-wavefunction.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#calcplot3d-probability-wavefunction ================================================ FILE: examples/sample-article/gen/qrcode/desmos-natural-log-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/desmos-natural-log.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#desmos-natural-log ================================================ FILE: examples/sample-article/gen/qrcode/drone-flight-clip-url.xml ================================================ https://www.youtube.com/watch?v=VsHMjWORFvI\&start=54\&end=72https://pretextbook.org/examples/sample-article/html/section-video.html#drone-flight-clip ================================================ FILE: examples/sample-article/gen/qrcode/drone-flight-full-url.xml ================================================ https://www.youtube.com/watch?v=VsHMjWORFvIhttps://pretextbook.org/examples/sample-article/html/section-video.html#drone-flight-full ================================================ FILE: examples/sample-article/gen/qrcode/drone-flight-sbs-url.xml ================================================ https://www.youtube.com/watch?v=VsHMjWORFvIhttps://pretextbook.org/examples/sample-article/html/section-video.html#drone-flight-sbs ================================================ FILE: examples/sample-article/gen/qrcode/geogebra-SAS-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/geogebra-SAS.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#geogebra-SAShttps://pretextbook.org/examples/sample-article/html/geogebra-SAS-if.html ================================================ FILE: examples/sample-article/gen/qrcode/geogebra-astroid-original-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/geogebra-astroid-original.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#geogebra-astroid-originalhttps://pretextbook.org/examples/sample-article/html/geogebra-astroid-original-if.html ================================================ FILE: examples/sample-article/gen/qrcode/geogebra-astroid-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/geogebra-astroid.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#geogebra-astroidhttps://pretextbook.org/examples/sample-article/html/geogebra-astroid-if.html ================================================ FILE: examples/sample-article/gen/qrcode/geogebra-cycloid-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/geogebra-cycloid.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#geogebra-cycloidhttps://pretextbook.org/examples/sample-article/html/geogebra-cycloid-if.html ================================================ FILE: examples/sample-article/gen/qrcode/geogebra-right-triangle-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/geogebra-right-triangle.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#geogebra-right-trianglehttps://pretextbook.org/examples/sample-article/html/geogebra-right-triangle-if.html ================================================ FILE: examples/sample-article/gen/qrcode/geogebra-seed-head-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/geogebra-seed-head.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#geogebra-seed-headhttps://pretextbook.org/examples/sample-article/html/geogebra-seed-head-if.html ================================================ FILE: examples/sample-article/gen/qrcode/geogebra-train-distance-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/geogebra-train-distance.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#geogebra-train-distancehttps://pretextbook.org/examples/sample-article/html/geogebra-train-distance-if.html ================================================ FILE: examples/sample-article/gen/qrcode/ggb_3d-direction-vector_interactive-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ggb_3d-direction-vector_interactive.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#ggb_3d-direction-vector_interactivehttps://pretextbook.org/examples/sample-article/html/ggb_3d-direction-vector_interactive-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-animation-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-animation.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-animationhttps://pretextbook.org/examples/sample-article/html/interactive-animation-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-archimedian-spiral-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-archimedian-spiral.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-archimedian-spiralhttps://pretextbook.org/examples/sample-article/html/interactive-archimedian-spiral-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-bspline-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-bspline.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-bsplinehttps://pretextbook.org/examples/sample-article/html/interactive-bspline-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-circuitjs-attribute-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-circuitjs-attribute.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-circuitjs-attribute ================================================ FILE: examples/sample-article/gen/qrcode/interactive-circuitjs-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-circuitjs.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-circuitjs ================================================ FILE: examples/sample-article/gen/qrcode/interactive-d3-collision-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-d3-collision.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-d3-collisionhttps://pretextbook.org/examples/sample-article/html/interactive-d3-collision-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-d3-graph-layout-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-d3-graph-layout.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-d3-graph-layouthttps://pretextbook.org/examples/sample-article/html/interactive-d3-graph-layout-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-d3-welsh-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-d3-welsh.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-d3-welshhttps://pretextbook.org/examples/sample-article/html/interactive-d3-welsh-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-doenetml-example-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-doenetml-example.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-doenetml-examplehttps://pretextbook.org/examples/sample-article/html/interactive-doenetml-example-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-eigenvectors-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-eigenvectors.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-eigenvectorshttps://pretextbook.org/examples/sample-article/html/interactive-eigenvectors-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-fermats-spiral-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-fermats-spiral.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-fermats-spiralhttps://pretextbook.org/examples/sample-article/html/interactive-fermats-spiral-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-infinity-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-infinity.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-infinityhttps://pretextbook.org/examples/sample-article/html/interactive-infinity-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-layout-circuitjs-big-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-layout-circuitjs-big.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#interactive-layout-circuitjs-big ================================================ FILE: examples/sample-article/gen/qrcode/interactive-layout-circuitjs-small-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-layout-circuitjs-small.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#interactive-layout-circuitjs-small ================================================ FILE: examples/sample-article/gen/qrcode/interactive-layout-desmos-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-layout-desmos.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#interactive-layout-desmos ================================================ FILE: examples/sample-article/gen/qrcode/interactive-layout-grow-one-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-layout-grow-one.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#interactive-layout-grow-onehttps://pretextbook.org/examples/sample-article/html/interactive-layout-grow-one-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-layout-grow-three-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-layout-grow-three.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#interactive-layout-grow-threehttps://pretextbook.org/examples/sample-article/html/interactive-layout-grow-three-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-layout-grow-two-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-layout-grow-two.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#interactive-layout-grow-twohttps://pretextbook.org/examples/sample-article/html/interactive-layout-grow-two-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-layout-map-medium-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-layout-map-medium.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#interactive-layout-map-medium ================================================ FILE: examples/sample-article/gen/qrcode/interactive-layout-map-tall-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-layout-map-tall.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#interactive-layout-map-tall ================================================ FILE: examples/sample-article/gen/qrcode/interactive-layout-map-wide-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-layout-map-wide.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#interactive-layout-map-wide ================================================ FILE: examples/sample-article/gen/qrcode/interactive-map-california-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-map-california.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#interactive-map-california ================================================ FILE: examples/sample-article/gen/qrcode/interactive-numerical-integral-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-numerical-integral.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-numerical-integralhttps://pretextbook.org/examples/sample-article/html/interactive-numerical-integral-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-oscillating-secant-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-oscillating-secant.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-oscillating-secanthttps://pretextbook.org/examples/sample-article/html/interactive-oscillating-secant-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-phet-fourier-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-phet-fourier.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-server.html#interactive-phet-fourier ================================================ FILE: examples/sample-article/gen/qrcode/interactive-piecewise-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-piecewise.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-piecewisehttps://pretextbook.org/examples/sample-article/html/interactive-piecewise-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-quadratic-tangent-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-quadratic-tangent.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-quadratic-tangenthttps://pretextbook.org/examples/sample-article/html/interactive-quadratic-tangent-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-sage-jupyter-iframe-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-sage-jupyter-iframe.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-sage-jupyter-iframe ================================================ FILE: examples/sample-article/gen/qrcode/interactive-simple-eigenvector-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-simple-eigenvector.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-simple-eigenvectorhttps://pretextbook.org/examples/sample-article/html/interactive-simple-eigenvector-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-simple-js-script-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-simple-js-script.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-simple-js-scripthttps://pretextbook.org/examples/sample-article/html/interactive-simple-js-script-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-slopes-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-slopes.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-slopeshttps://pretextbook.org/examples/sample-article/html/interactive-slopes-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-threejs-catenoid-surface-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-threejs-catenoid-surface.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-threejs-catenoid-surfacehttps://pretextbook.org/examples/sample-article/html/interactive-threejs-catenoid-surface-if.html ================================================ FILE: examples/sample-article/gen/qrcode/interactive-threejs-saddle-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/interactive-threejs-saddle.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#interactive-threejs-saddlehttps://pretextbook.org/examples/sample-article/html/interactive-threejs-saddle-if.html ================================================ FILE: examples/sample-article/gen/qrcode/js-module-test-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/js-module-test.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#js-module-testhttps://pretextbook.org/examples/sample-article/html/js-module-test-if.html ================================================ FILE: examples/sample-article/gen/qrcode/kinematics-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/kinematics.htmlhttps://pretextbook.org/examples/sample-article/html/section-interactive-authored.html#kinematicshttps://pretextbook.org/examples/sample-article/html/kinematics-if.html ================================================ FILE: examples/sample-article/gen/qrcode/led-zeppelin-kashmir-generic-url.xml ================================================ https://www.youtube.com/watch?v=hAzdgU_kpGohttps://pretextbook.org/examples/sample-article/html/section-video.html#led-zeppelin-kashmir-generic ================================================ FILE: examples/sample-article/gen/qrcode/led-zeppelin-kashmir-solo-url.xml ================================================ https://www.youtube.com/watch?v=hAzdgU_kpGohttps://pretextbook.org/examples/sample-article/html/section-video.html#led-zeppelin-kashmir-solo ================================================ FILE: examples/sample-article/gen/qrcode/led-zeppelin-kashmir-url.xml ================================================ https://www.youtube.com/watch?v=hAzdgU_kpGohttps://pretextbook.org/examples/sample-article/html/section-video.html#led-zeppelin-kashmir ================================================ FILE: examples/sample-article/gen/qrcode/minelli-newyork-newyork-url.xml ================================================ https://www.youtube.com/watch?v=5-pyc_z7WbY\&start=16\&end=35https://pretextbook.org/examples/sample-article/html/section-video.html#minelli-newyork-newyork ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-1-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1Uhttps://pretextbook.org/examples/sample-article/html/section-video.html#pre-roll-countdown-1 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-10-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1Uhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#pre-roll-countdown-10 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-11-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1Uhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#pre-roll-countdown-11 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-12-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1Uhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#pre-roll-countdown-12 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-13-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1Uhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#pre-roll-countdown-13 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-14-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1Uhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#pre-roll-countdown-14 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-2-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1U\&start=2\&end=4https://pretextbook.org/examples/sample-article/html/section-video.html#pre-roll-countdown-2 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-3-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1Uhttps://pretextbook.org/examples/sample-article/html/section-video.html#pre-roll-countdown-3 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-4-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1Uhttps://pretextbook.org/examples/sample-article/html/section-video.html#pre-roll-countdown-4 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-5-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1U\&start=2\&end=4https://pretextbook.org/examples/sample-article/html/section-video.html#pre-roll-countdown-5 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-6-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1Uhttps://pretextbook.org/examples/sample-article/html/section-video.html#pre-roll-countdown-6 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-7-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1Uhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#pre-roll-countdown-7 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-8-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1Uhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#pre-roll-countdown-8 ================================================ FILE: examples/sample-article/gen/qrcode/pre-roll-countdown-9-url.xml ================================================ https://www.youtube.com/watch?v=Srmdij0CU1Uhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#pre-roll-countdown-9 ================================================ FILE: examples/sample-article/gen/qrcode/section-video-5-5-2-url.xml ================================================ https://vimeo.com/27246366https://pretextbook.org/examples/sample-article/html/section-video.html#section-video-5-5-2 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-1-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-1.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#ups-promo-1 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-10-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-10.htmlhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#ups-promo-10 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-11-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-11.htmlhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#ups-promo-11 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-12-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-12.htmlhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#ups-promo-12 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-13-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-13.htmlhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#ups-promo-13 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-14-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-14.htmlhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#ups-promo-14 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-2-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-2.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#ups-promo-2 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-3-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-3.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#ups-promo-3 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-4-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-4.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#ups-promo-4 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-5-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-5.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#ups-promo-5 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-6-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-6.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#ups-promo-6 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-7-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-7.htmlhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#ups-promo-7 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-8-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-8.htmlhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#ups-promo-8 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-9-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-9.htmlhttps://pretextbook.org/examples/sample-article/html/section-atomic-items.html#ups-promo-9 ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-frame-one-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-frame-one.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#ups-promo-frame-one ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-generic-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-generic.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#ups-promo-generic ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-preview-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-preview.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#ups-promo-preview ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-sbs-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-sbs.htmlhttps://pretextbook.org/examples/sample-article/html/section-video.html#ups-promo-sbs ================================================ FILE: examples/sample-article/gen/qrcode/ups-promo-side-by-side-url.xml ================================================ https://pretextbook.org/examples/sample-article/html/ups-promo-side-by-side.htmlhttps://pretextbook.org/examples/sample-article/html/section-side-by-side-gallery.html#ups-promo-side-by-side ================================================ FILE: examples/sample-article/gen/qrcode/vimeo-move-url.xml ================================================ https://vimeo.com/27246366https://pretextbook.org/examples/sample-article/html/section-video.html#vimeo-move ================================================ FILE: examples/sample-article/gen/qrcode/yt-list-vars-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/sample-article/html/section-interactive-code.html#yt-list-vars ================================================ FILE: examples/sample-article/gen/qrcode/zeppelin-playlist-named-url.xml ================================================ https://www.youtube.com/playlist?list=PLGRecdYLYDNdX5NEkS3KH-ZtCqc2f8lJ_https://pretextbook.org/examples/sample-article/html/section-video.html#zeppelin-playlist-named ================================================ FILE: examples/sample-article/gen/qrcode/zeppelin-playlist-url.xml ================================================ https://www.youtube.com/watch_videos?video_ids=6tlSx0jkuLM,FeJkDewhTEwhttps://pretextbook.org/examples/sample-article/html/section-video.html#zeppelin-playlist ================================================ FILE: examples/sample-article/gen/sageplot/sageplot-implicit-surface.html ================================================ ================================================ FILE: examples/sample-article/gen/stack/stack-integration.ptx ================================================

    Find \int {{\left(x-3\right)}^6} d{x}

    We can either do this question by inspection (i.e. spot the answer) or in a more formal manner by using the substitution u = ({x}-{3}). Then, since \frac{d}{d{x}}u=1 we have \int {{\left(x-3\right)}^6} d{x} = \int u^{6} du = \frac{u^{7}}{7}+c = {\frac{{\left(x-3\right)}^7}{7}}+c.

    \frac{{\left(x-3\right)}^7}{7}+c

    ================================================ FILE: examples/sample-article/gen/stack/stack-matrix.ptx ================================================

    Type in {\left[\begin{array}{cc} 1 & 2 \\ 3 & 4 \end{array}\right]}

    \left[\begin{array}{cc} 1 & 2 \\ 3 & 4 \end{array}\right]

    ================================================ FILE: examples/sample-article/gen/stack/stack-mcq.ptx ================================================

    Differentiate {\sin \left( 2\cdot x \right)} with respect to x.

    1. 2\cdot \cos \left( 2\cdot x \right)
    2. \sin \left( 2\cdot x \right)
    3. -\frac{\cos \left( 2\cdot x \right)}{2}
    4. \cos \left( 2\cdot x \right)+c
    5. None of these

    (1)

    ================================================ FILE: examples/sample-article/gen/stack/stack-plot.ptx ================================================

    What is the function plotted here:

    STACK auto-generated plot of (x-1)^2+2 with parameters [[x,-7,7],[y,-5,5],[box,false]]

    {\left(x-1\right)}^2+2

    ================================================ FILE: examples/sample-article/gen/stack/stack-typesetting.ptx ================================================

    Exercise

    In triangle OAB the point P divides AB internally in the ratio m:n.

    If \overrightarrow{OA} = \underline{a} and \overrightarrow{OB} = \underline{b}, then find an expression for \overrightarrow{OP} in terms of \underline{a} and \underline{b}.

    You might find it helpful to draw a diagram showing this triangle.

    \overrightarrow{OP} =

    The figure below shows the triangle with the vector \overrightarrow{OP} marked with a dotted line within.

    A triangle OAB with vectors a and b marked on the edges OA and OB respectively. The point P is marked partway along the edge AB and a dotted line marks the vector OP through the middle of the triangle.

    From the diagram we can see \overrightarrow{OP} = \overrightarrow{OA} + \overrightarrow{AP}. We are told \overrightarrow{OA} = \underline{a} and so we need to find \overrightarrow{AP}. We know that P divides \overrightarrow{AB} in the ratio m:n so \overrightarrow{AP} = \frac{m}{m+n}\left(\overrightarrow{AB}\right), as \overrightarrow{AB} = \underline{b} - \underline{a} we find \overrightarrow{AP} = \frac{m}{m+n}\left(\underline{b} - \underline{a}\right) and therefore, \overrightarrow{OP} = \underline{a} + \frac{m}{m+n}\left(\underline{b} - \underline{a}\right).

    Note: You can arrive at an equivalent expression by starting from \overrightarrow{OP} = \overrightarrow{OB} + \overrightarrow{BP}.


    \frac{\left(b-a\right) m}{n+m}+a

    ================================================ FILE: examples/sample-article/gen/trace/python-hello-world-code-lens.js ================================================ if (allTraceData === undefined) { var allTraceData = {}; } allTraceData["rs-python-hello-world-code-lens"] = {"code": "print('Hello, World!')\n\n", "trace": [{"line": 1, "event": "step_line", "func_name": "", "globals": {}, "ordered_globals": [], "stack_to_render": [], "heap": {}, "stdout": ""}, {"line": 1, "event": "return", "func_name": "", "globals": {}, "ordered_globals": [], "stack_to_render": [], "heap": {}, "stdout": "Hello, World!\n"}]} ================================================ FILE: examples/sample-article/media/code/asymptote/bezier-patch.js ================================================ webGLStart(p); ================================================ FILE: examples/sample-article/media/code/austin/animation.js ================================================ /* From David Austin, 2018-04-05 */ var dx = 4; var reset = document.getElementById("reset"); reset.onclick = function() { left.resetBaseTransform(); right.resetBaseTransform(); update(); } var compose = document.getElementById("compose"); compose.onclick = function() { var af = getCurrentTransform(); left.composeBaseTransform(af); right.composeBaseTransform(af); sliders[0].reset(1); sliders[1].reset(0); sliders[2].reset(0); sliders[3].reset(0); sliders[4].reset(1); sliders[5].reset(0); update(); } var getCurrentTransform = function() { var matrix = [[1,0,0], [0,1,0], [0,0,1]]; matrix[0][0] = sliders[0].coordinate(); matrix[0][1] = sliders[1].coordinate(); matrix[0][2] = sliders[2].coordinate(); matrix[1][0] = sliders[3].coordinate(); matrix[1][1] = sliders[4].coordinate(); matrix[1][2] = sliders[5].coordinate(); var af = new AffineTransform(); af.matrix = matrix; return af; } var update = function() { var af = getCurrentTransform(); left.woody.draw(); right.setDrawTransform(af); right.woody.draw(); } function Slider(id, xpos) { this.slider = document.getElementById(id); this.slider.id = id; this.slider.ctx = this.slider.getContext("2d"); this.slider.margin = 5; this.deltaX = (this.slider.width - 2*this.slider.margin)/4.0; this.slider.locationX = this.slider.margin + (2+xpos)*this.deltaX; this.slider.locationY = this.slider.height/2.0; this.slider.moving = false; this.coordinate = function() { var coord = (this.slider.locationX - this.slider.margin)/this.deltaX - 2.0; return coord } this.reset = function(xpos) { this.slider.locationX = this.slider.margin + (2+xpos)*this.deltaX; this.slider.draw(); } this.slider.onmousedown = function(event) { var x = event.offsetX; var y = event.offsetY; if (Math.abs(x - this.locationX) <= dx && Math.abs(y - this.locationY) <= dx) { this.moving = true; } else return; if (x < this.margin || x > this.width - this.margin) return; this.locationX = x; this.draw(); update(); } this.slider.onmousemove = function(event) { if (!this.moving) return; var x = event.offsetX; var y = event.offsetY; if (x < this.margin || x > this.width - this.margin) return; this.locationX = x; this.draw(); update(); } this.slider.onmouseup = function(event) { if (!this.moving) return; this.moving = false; var x = event.offsetX; var y = event.offsetY; if (x < this.margin || x > this.width - this.margin) return; this.locationX = x; this.draw(); update(); } this.slider.draw = function() { this.ctx.clearRect(0,0,this.width, this.height); this.ctx.beginPath(); this.ctx.moveTo(this.margin, this.locationY); this.ctx.lineTo(this.width - this.margin, this.locationY); this.ctx.stroke(); var deltaX = (this.width - 2*this.margin)/4.0; var xtick = this.margin; var tickheight = 5; var fontsize = 12; this.ctx.font = fontsize + "px Arial"; this.ctx.textAlign = "center"; for (var i = -2; i <= 2; i++) { this.ctx.beginPath(); this.ctx.moveTo(xtick, this.locationY - tickheight); this.ctx.lineTo(xtick, this.locationY + tickheight); this.ctx.stroke(); this.ctx.fillText(i,xtick, this.locationY + fontsize + tickheight); xtick += deltaX; } this.ctx.font = "14px Arial"; this.ctx.textAlign = "left"; this.ctx.fillText(this.id, this.margin + 5, this.locationY - 10); this.ctx.save(); this.ctx.lineWidth = 2; this.ctx.moveTo(this.margin + 2*deltaX, this.locationY - tickheight); this.ctx.lineTo(this.margin + 2*deltaX, this.locationY + tickheight); this.ctx.stroke(); this.ctx.restore(); var x = this.locationX - dx; var y = this.locationY - dx; this.ctx.save(); this.ctx.fillStyle = "red" this.ctx.fillRect(x, y, 2*dx, 2*dx); this.ctx.strokeRect(x, y, 2*dx, 2*dx); this.ctx.restore(); } } function AffineTransform() { this.matrix = [[1,0,0], [0,1,0], [0,0,1]]; this.inverse = [[1,0,0], [0,1,0], [0,0,1]]; this.multiply = function(m, n) { var newMatrix = [[0,0,0], [0,0,0], [0,0,0]]; for (var i = 0; i < 3; i++) { for (var j = 0; j < 3; j++) { for (var k = 0; k < 3; k++) { newMatrix[i][j] += m[i][k] * n[k][j] } } } return newMatrix; } this.compose = function(af) { this.matrix = this.multiply(this.matrix, af.matrix); } this.translate = function(tx, ty) { var translate = [[1,0,tx], [0, 1, ty], [0,0,1]] var inverseTranslate = [[1, 0, -tx], [0,1,-ty], [0,0,1]] this.matrix = this.multiply(this.matrix,translate); this.inverse = this.multiply(inverseTranslate, this.inverse); } this.scale = function(sx, sy) { var scaling = [[sx, 0, 0], [0, sy, 0], [0,0,1]]; var inverseScaling = [[1.0/sx, 0, 0], [0, 1.0/sy, 0], [0,0,1]]; this.matrix = this.multiply(this.matrix, scaling); this.inverse = this.multiply(inverseScaling, this.inverse); } this.actOnPoint = function(x, y) { var newx = this.matrix[0][0] * x + this.matrix[0][1] * y + this.matrix[0][2]; var newy = this.matrix[1][0] * x + this.matrix[1][1] * y + this.matrix[1][2]; return [newx,newy]; } this.inverseOnPoint = function(x,y) { var newx = this.inverse[0][0]*x + this.inverse[0][1] * y + this.inverse[0][2]; var newy = this.inverse[1][0]*x + this.inverse[1][1] * y + this.inverse[1][2]; return [newx, newy]; } this.clone = function() { var tform = new AffineTransform(); var mat = [[1,0,0], [0,1,0], [0,0,1]]; var inv = [[1,0,0], [0,1,0], [0,0,1]]; for (var i = 0; i < 3; i++) { for (var j = 0; j < 3; j++) { mat[i][j] = this.matrix[i][j]; inv[i][j] = this.inverse[i][j]; } } tform.matrix = mat; tform.inverse = inv; return tform; } } function Woody(id) { this.woody = document.getElementById(id); this.woody.ctx = this.woody.getContext("2d"); var halfSize = this.woody.width/2.0 this.woody.transform = new AffineTransform(); this.woody.transform.translate(halfSize, halfSize); this.woody.transform.scale(1, -1); this.woody.baseTransform = new AffineTransform(); this.composeBaseTransform = function(af) { var newaf = new AffineTransform(); newaf.compose(af); newaf.compose(this.woody.baseTransform); this.woody.baseTransform = newaf; // this.woody.baseTransform.compose(af); } this.resetBaseTransform = function() { this.woody.baseTransform = new AffineTransform(); } var scale = halfSize/4; this.woody.transform.scale(scale, scale); this.woody.drawTransform = new AffineTransform(); this.setDrawTransform = function(af) { this.woody.drawTransform = af; } this.woody.move = function(x, y) { var point = this.transform.actOnPoint(x, y); this.ctx.moveTo(point[0], point[1]); } this.woody.line = function(x, y) { var point = this.transform.actOnPoint(x, y); this.ctx.lineTo(point[0], point[1]); } this.woody.draw = function() { this.ctx.clearRect(0,0,this.width, this.height); this.ctx.beginPath(); for (var i = -4; i <= 4; i++) { this.move(-4, i); this.line(4, i); this.move(i, -4); this.line(i, 4); } this.ctx.strokeStyle = "lightgray"; this.ctx.stroke(); this.ctx.strokeStyle = "black"; this.ctx.beginPath(); this.move(-4, 0); this.line(4, 0); this.move(0, -4); this.line(0, 4); this.ctx.stroke(); var defTransform = this.transform.clone(); var drawTransformClone = this.drawTransform.clone(); drawTransformClone.compose(this.baseTransform); this.transform.compose(drawTransformClone); this.ctx.save(); this.ctx.lineWidth = 2; this.ctx.strokeStyle = "blue" this.transform.translate(0,2); this.transform.scale(0.5, 0.5); // right arm this.ctx.beginPath(); this.move(0, -1); this.line(0, -3); this.move(1,-1) this.line(-1,-3); this.move(0, -3); this.line(1,-4); this.move(0, -3); this.line(-1,-4); var N = 100; var dangle = 2*Math.PI/N; var angle = 0; this.transform.scale(0.5,1); this.move(1,0); for (var i = 0; i < N; i++) { angle += dangle; this.line(Math.cos(angle), Math.sin(angle)); } this.ctx.closePath(); this.ctx.stroke(); this.ctx.restore(); this.transform = defTransform; this.ctx.strokeRect(0,0,this.width, this.height); } } sliders = [new Slider("a",1), new Slider("b",0), new Slider("c",0), new Slider("d",0), new Slider("e",1), new Slider("f",0)]; for (var i = 0; i < sliders.length; i++) { sliders[i].slider.draw(); } var left = new Woody("left"); var right = new Woody("right"); left.woody.draw(); right.woody.draw(); ================================================ FILE: examples/sample-article/media/code/austin/eigenvectors.js ================================================ /* From David Austin, 2018-04-05 */ var matrix = new Canvas("sliders", [0,0, 2,2]); var canvas = new Canvas("eigenvectors", [-4,-4,4,4]); matrix.margins = [20,5,20,5]; matrix.setUpCoordinates(); canvas.margins = [5,5,5,5]; canvas.setUpCoordinates(); var dx = 0.05; var mkslider = function(xr, y) { var s = new Slider(xr, y, [-2,2], update); s.ticks = [-2,1,2] s.labels = [-2,1,2] s.point.style = "box"; s.point.fillColor = "blue" s.point.size = 4; matrix.addPlotable(s); matrix.addMoveable(s); return s; } var update = function() { var ma = a.coordinate(); var mb = b.coordinate(); var mc = c.coordinate(); var md = d.coordinate(); var x = v.head[0]; var y = v.head[1]; Av.head = [ma*x + mb*y, mc*x + md*y]; matrix.draw(); canvas.draw(); } var a = mkslider([dx, 1-2*dx], 1.5); var b = mkslider([1+2*dx, 2-dx], 1.5); var c = mkslider([dx, 1-2*dx], 0.5); var d = mkslider([1+2*dx, 2-dx], 0.5); a.init(1); b.init(0); c.init(0); d.init(1); var grid = new Grid([-4,1,4], [-4,1,4]); canvas.addPlotable(grid); var axes = new Axes(); canvas.addPlotable(axes); var v = new Vector([1,0]); v.move = function(p) { v.head = p; update(); } v.fillColor = "red"; var Av = new Vector([1,0]); Av.fillColor = "gray"; canvas.addPlotable(Av); canvas.addPlotable(v); canvas.addMoveable(v); update(); ================================================ FILE: examples/sample-article/media/code/austin/figures.js ================================================ /* From David Austin, 2018-04-05 */ function Canvas(id, bbox) { this.id = id var element = document.getElementById(id); this.elem = element; this.ctx = element.getContext("2d"); this.plotables = [] element.moveables = [] element.moving = null; element.container = this; this.addPlotable = function(p) { if (!Array.isArray(p)) { var p = [p]; } for (i in p) { this.plotables.push(p[i]); p[i].setContext(this.transform, this.ctx, this.bbox); } } this.addMoveable = function(m) { if (!Array.isArray(m)) { m = [m]; } for (i in m) { element.moveables.push(m[i]); } } this.resetPlotables = function() { for (var i = 0; i < this.plotables.length; i++) { this.plotables[i].setContext(this.transform, this.ctx, this.bbox); } } this.draw = function() { this.ctx.clearRect(0,0,element.width,element.height); for (i in this.plotables) { var p = this.plotables[i]; p.draw(); } } this.margins = [0,0,0,0] this.transform = new AffineTransform(); this.setUpCoordinates = function(bbox) { this.transform = new AffineTransform(); var sx = (element.width-this.margins[0]-this.margins[2]) / (this.bbox[2] - this.bbox[0]); var sy = (element.height-this.margins[1]-this.margins[3]) / (this.bbox[3] - this.bbox[1]); this.transform.translate([this.margins[0], element.height-this.margins[1]]); this.transform.scale([sx, -sy]); this.transform.translate([-this.bbox[0], -this.bbox[1]]); } this.bbox = bbox; this.setUpCoordinates(bbox); element.onmousedown = function(event) { var x = event.offsetX; var y = event.offsetY; for (i in this.moveables) { if (this.moveables[i].hit(x,y)) { this.moving = this.moveables[i]; var p = this.container.transform.inverseTransformPoint([x,y]); this.moving.move(p); return; } } } element.onmousemove = function(event) { if (this.moving == null) return; var x = event.offsetX; var y = event.offsetY; var p = this.container.transform.inverseTransformPoint([x,y]); this.moving.move(p); } element.onmouseup = function(event) { if (this.moving == null) return; var x = event.offsetX; var y = event.offsetY; var p = this.container.transform.inverseTransformPoint([x,y]); this.moving.move(p); this.moving = null; } element.onmouseout = function(event) { this.moving = null; } } function AffineTransform() { this.matrix = [[1,0,0], [0,1,0], [0,0,1]] this.inverse = [[1,0,0], [0,1,0], [0,0,1]] var multiply = function(m1, m2) { r = [[0,0,0], [0,0,0], [0,0,0]] for (var i = 0; i < m1.length; i++) { for (var j = 0; j < m2[0].length; j++) { for (var k = 0; k < m2.length; k++) { r[i][j] += m1[i][k] * m2[k][j] } } } return r; } var multiplyVector = function(m, v) { var p = [0, 0, 0]; for (var i = 0; i < m.length; i++) { for (var j = 0; j < v.length; j++) { p[i] += m[i][j] * v[j]; } } return p.slice(0, v.length); } this.printMatrix = function() { console.log(this.matrix[0]); console.log(this.matrix[1]); } this.compose = function(transform) { this.matrix = multiply(this.matrix, transform.matrix); this.inverse = multiply(transform.inverse, this.inverse); } this.scale = function(s) { var sx = s[0]; var sy = s[0]; if (s.length == 2) sy = s[1]; var af = new AffineTransform(); af.matrix = [[sx, 0, 0], [0, sy, 0], [0,0,1]]; af.inverse = [[1.0/sx, 0, 0], [0, 1.0/sy, 0], [0,0,1]]; this.compose(af); } this.translate = function(t) { var tx = t[0]; var ty = t[1]; var af = new AffineTransform(); af.matrix = [[1, 0, tx], [0, 1, ty], [0,0,1]]; af.inverse = [[1, 0, -tx], [0, 1.0, -ty], [0,0,1]]; this.compose(af); } this.rotate = function(angle) { var af = new AffineTransform(); af.matrix = [[Math.cos(angle), -Math.sin(angle), 0], [Math.sin(angle), Math.cos(angle), 0], [0,0,1]]; af.inverse = [[Math.cos(angle), Math.sin(angle), 0], [-Math.sin(angle), Math.cos(angle), 0], [0,0,1]]; this.compose(af); } this.rotateDeg = function(angle) { this.rotate(angle * Math.PI / 180.0); } this.transformPoint = function(p) { p = p.slice(0); p.push(1); p = multiplyVector(this.matrix, p) return p.slice(0,2); } this.inverseTransformPoint = function(p) { p = p.slice(0); p.push(1); p = multiplyVector(this.inverse, p); return p.slice(0,2); } } function Plotable() { this.fillColor = "black"; this.strokeColor = "black"; this.lineWidth = 1; this.lineDash = null; this.transform = null; this.ctx = null; this.bbox = null; this.fontsize = 14; this.font = this.fontsize + "px Arial"; this.setContext = function(t, c, b) { this.transform = t; this.ctx = c; this.bbox = b; } this.moveTo = function(p) { p = this.transform.transformPoint(p); this.ctx.moveTo(p[0], p[1]); } this.lineTo = function(p) { p = this.transform.transformPoint(p); this.ctx.lineTo(p[0], p[1]); } this.textAt = function(s, p, offset, align) { this.ctx.save(); p = this.transform.transformPoint(p); this.ctx.translate(p[0], p[1]); this.ctx.translate(offset[0], offset[1]); this.ctx.font = this.font; this.ctx.textAlign = align; this.ctx.fillText(s, 0, 0); this.ctx.restore(); } this.fill = function() { if (this.fillColor != null) { this.ctx.fillStyle = this.fillColor; this.ctx.fill(); } } this.stroke = function() { if (this.strokeColor != null) { this.ctx.lineWidth = this.lineWidth; this.ctx.strokeStyle = this.strokeColor; if (this.lineDash != null) this.ctx.setLineDash(this.lineDash); this.ctx.stroke(); } } } function Label(s, p) { this.s = s; this.p = p; this.offset = [0,0]; this.align = "center" this.font = "italic 14px arial"; this.draw = function() { this.ctx.save(); p = this.transform.transformPoint(this.p); this.ctx.translate(p[0], p[1]); this.ctx.translate(this.offset[0], -this.offset[1]); this.ctx.font = this.font; this.ctx.textAlign = this.align; this.ctx.fillText(s, 0, 0); this.ctx.restore(); } } Label.prototype = new Plotable(); function Grid(rx, ry) { this.rx = rx; this.ry = ry; this.strokeColor = "lightgray"; this.draw = function() { this.ctx.save(); this.ctx.strokeStyle = this.strokeColor; this.ctx.lineWidth = this.lineWidth; this.ctx.beginPath(); for (var x = this.rx[0]; x <= this.rx[2]; x += this.rx[1]) { this.moveTo([x, this.bbox[1]]); this.lineTo([x, this.bbox[3]]); } for (var y = this.ry[0]; y <= this.ry[2]; y += this.ry[1]) { this.moveTo([this.bbox[0], y]); this.lineTo([this.bbox[2], y]); } this.ctx.stroke(); this.ctx.restore(); } } Grid.prototype = new Plotable(); function TGrid(a1, a2) { this.a1 = a1; this.a2 = a2; this.strokeColor = "lightgray"; this.draw = function() { this.ctx.save(); this.ctx.strokeStyle = this.strokeColor; this.ctx.lineWidth = this.lineWidth; this.ctx.beginPath() this.moveTo([this.bbox[0], this.bbox[1]]); this.lineTo([this.bbox[2], this.bbox[1]]); this.lineTo([this.bbox[2], this.bbox[3]]); this.lineTo([this.bbox[0], this.bbox[3]]); this.ctx.closePath(); this.ctx.clip(); this.ctx.beginPath(); var num = 100; for (var i = -num; i <= num; i++) { this.moveTo(vadd(smult(i, this.a1), smult(-num,this.a2))); this.lineTo(vadd(smult(i, this.a1), smult(num,this.a2))); } for (var i = -num; i <= num; i++) { this.moveTo(vadd(smult(i, this.a2), smult(-num,this.a1))); this.lineTo(vadd(smult(i, this.a2), smult(num,this.a1))); } this.ctx.stroke(); this.ctx.restore(); } } TGrid.prototype = new Plotable(); function Axes() { this.ticks = null; this.labels = null; this.draw = function() { this.ctx.save(); this.ctx.strokeStyle = this.strokeColor; this.ctx.beginPath(); this.moveTo([this.bbox[0], 0]); this.lineTo([this.bbox[2], 0]); this.moveTo([0, this.bbox[1]]); this.lineTo([0, this.bbox[3]]); this.ctx.stroke(); if (this.ticks != null) { if (this.ticks[0] != null) this.drawHTicks(); if (this.ticks[1] != null) this.drawVTicks(); } if (this.labels != null) { if (this.labels[0] != null) this.drawHLabels(); if (this.labels[1] != null) this.drawVLabels(); } this.ctx.restore(); } var ticksize = 4; this.drawHTicks = function() { for (var x = this.ticks[0][0]; x <= this.ticks[0][2]; x += this.ticks[0][1]) { if (Math.abs(x) < 1e-10) continue; this.ctx.save(); var p = this.transform.transformPoint([x, 0]); this.ctx.translate(p[0], p[1]); this.ctx.lineWidth = 2; this.ctx.beginPath(); this.ctx.moveTo(0, -ticksize); this.ctx.lineTo(0, ticksize); this.ctx.stroke(); this.ctx.restore(); } } this.drawVTicks = function() { for (var y = this.ticks[1][0]; y <= this.ticks[1][2]; y += this.ticks[1][1]) { if (Math.abs(y) < 1e-10) continue; this.ctx.save(); var p = this.transform.transformPoint([0, y]); this.ctx.translate(p[0], p[1]); this.ctx.lineWidth = 2; this.ctx.beginPath(); this.ctx.moveTo(-ticksize,0); this.ctx.lineTo(ticksize,0); this.ctx.stroke(); this.ctx.restore(); } } this.drawHLabels = function() { for (var x = this.labels[0][0]; x <= this.labels[0][2]; x += this.labels[0][1]) { if (Math.abs(x) < 1e-10) continue; this.textAt(x, [x,0], [0, ticksize + this.fontsize], "center"); } } this.drawVLabels = function() { for (var y = this.labels[1][0]; y <= this.labels[1][2]; y += this.labels[1][1]) { if (Math.abs(y) < 1e-10) continue; this.textAt(y, [0,y], [-ticksize-2,this.fontsize/2.0-2], "right"); } } } Axes.prototype = new Plotable(); function Slider(rx, y, sx, update) { this.rx = rx; // coordinates in canvas this.y = y; this.sx = sx; // coordinates of slider this.ratioPerPix = (sx[1]-sx[0])/(rx[1]-rx[0]) this.point = new Point([rx[0], y]); this.update = update; this.init = function(x) { this.point.point = [this.toPix(x),this.y]; } this.toPix = function(x) { return (x-this.sx[0])/this.ratioPerPix + this.rx[0]; } this.fromPix = function(x) { return (x-this.rx[0])*this.ratioPerPix + this.sx[0]; } this.draw = function() { this.ctx.save(); this.ctx.beginPath(); this.moveTo([this.rx[0], this.y]); this.lineTo([this.rx[1], this.y]); this.stroke(); if (this.ticks != null) this.drawTicks(); if (this.labels != null) this.drawLabels(); this.point.ctx = this.ctx; this.point.transform = this.transform; this.point.draw(); this.ctx.restore(); } this.hit = function(x, y) { return this.point.hit(x,y); } this.move = function(p) { var x = p[0]; if (x < this.rx[0] || x > this.rx[1]) return; this.point.point = [x, this.y] this.update(); } this.coordinate = function() { return this.fromPix(this.point.point[0]); } var ticksize = 4; this.drawTicks = function() { for (var x = this.ticks[0]; x <= this.ticks[2]; x += this.ticks[1]) { this.ctx.save(); var p = this.transform.transformPoint([this.toPix(x), this.y]); this.ctx.translate(p[0], p[1]); this.ctx.lineWidth = 2; this.ctx.beginPath(); this.ctx.moveTo(0, -ticksize); this.ctx.lineTo(0, ticksize); this.ctx.stroke(); this.ctx.restore(); } } this.drawLabels = function() { for (var x = this.labels[0]; x <= this.labels[2]; x += this.labels[1]) { this.textAt(x, [this.toPix(x),this.y], [0, ticksize + this.fontsize], "center"); } } } Slider.prototype = new Plotable(); function VSlider(x, ry, sy, update) { this.x = x; this.ry = ry; // coordinates in canvas this.sy = sy; // coordinates of slider this.ratioPerPix = (sy[1]-sy[0])/(ry[1]-ry[0]) this.point = new Point([x, ry[0]]); this.update = update; this.init = function(y) { this.point.point = [this.x, this.toPix(y)]; } this.toPix = function(y) { return (y-this.sy[0])/this.ratioPerPix + this.ry[0]; } this.fromPix = function(y) { return (y-this.ry[0])*this.ratioPerPix + this.sy[0]; } this.draw = function() { this.ctx.save(); this.ctx.beginPath(); this.moveTo([this.x, this.ry[0]]); this.lineTo([this.x, this.ry[1]]); this.stroke(); if (this.ticks != null) this.drawTicks(); if (this.labels != null) this.drawLabels(); this.point.ctx = this.ctx; this.point.transform = this.transform; this.point.draw(); this.ctx.restore(); } this.hit = function(x, y) { return this.point.hit(x,y); } this.move = function(p) { var y = p[1]; if (y < this.ry[0] || y > this.ry[1]) return; this.point.point = [this.x, y] this.update(); } this.coordinate = function() { return this.fromPix(this.point.point[1]); } var ticksize = 4; this.drawTicks = function() { for (var y = this.ticks[0]; y <= this.ticks[2]; y += this.ticks[1]) { this.ctx.save(); var p = this.transform.transformPoint([this.x, this.toPix(y)]); this.ctx.translate(p[0], p[1]); this.ctx.lineWidth = 2; this.ctx.beginPath(); this.ctx.moveTo(-ticksize, 0); this.ctx.lineTo(ticksize, 0); this.ctx.stroke(); this.ctx.restore(); } } this.drawLabels = function() { for (var y = this.labels[0]; y <= this.labels[2]; y += this.labels[1]) { this.textAt(y, [this.x, this.toPix(y)], [-10, 5], "center"); } } } VSlider.prototype = new Plotable(); function Function(f) { this.f = f; this.dx = 0.0001; this.value = function(x) { return this.f(x); } this.derivative = function(x) { return (this.f(x+this.dx) - this.f(x-this.dx)) / (2*this.dx); } this.secondDerivative = function(x) { return (this.f(x+this.dx) - 2*this.f(x) + this.f(x-this.dx))/ (this.dx*this.dx) } this.integral = function(x, a) { var N = 64; var h = (x - a)/N; var x = a; var sum = 0; for (var i = 0; i < N/2; i++ ) { sum += this.f(x) + 4*this.f(x+h) + this.f(x+2*h); x += 2*h; } return sum*h/3.0; } } function Antiderivative(f, a) { this.f = f; this.a = a; this.value = function(x) { return this.f.integral(x, this.a); } } Antiderivative.prototype = new Function(); function Graph(f) { this.f = f; this.domain = null; this.N = 100; this.draw = function() { if (this.domain == null) { this.domain = [this.bbox[0], this.bbox[2]]; } var x = this.domain[0]; var dx = (this.domain[1] - this.domain[0])/this.N; this.ctx.save(); this.ctx.beginPath(); this.moveTo([x, this.f.value(x)]); for (var i = 0; i < this.N; i++) { x += dx; this.lineTo([x,this.f.value(x)]); } this.ctx.lineWidth = this.lineWidth; this.ctx.strokeStyle = this.strokeColor; if (this.lineDash != null) this.ctx.setLineDash(this.lineDash); this.ctx.stroke(); this.ctx.restore(); } } Graph.prototype = new Plotable(); function ParametricCurve(x, y, domain) { this.x = x; this.y = y; this.N = 100; this.domain = domain; this.draw = function() { var t = this.domain[0]; var dt = (this.domain[1]-this.domain[0])/this.N; this.ctx.save(); this.ctx.beginPath(); this.moveTo([this.x(t), this.y(t)]); for (var i = 0; i < this.N; i++) { t += dt this.lineTo([this.x(t), this.y(t)]); } this.stroke(); this.ctx.restore(); } } ParametricCurve.prototype = new Plotable(); function Rectangle(ll, dims) { this.ll = ll; this.dims = dims; this.draw = function() { var ur = vadd(this.ll, this.dims); this.ctx.save(); this.ctx.beginPath(); this.moveTo(this.ll); this.lineTo([ur[0], this.ll[1]]); this.lineTo(ur); this.lineTo([this.ll[0], ur[1]]); this.ctx.closePath(); this.fill(); this.stroke(); this.ctx.restore(); } } Rectangle.prototype = new Plotable(); function Polygon(points) { this.points = points; this.draw = function() { this.ctx.save(); this.ctx.beginPath(); this.moveTo(this.points[0]); for (var i = 1; i < this.points.length; i++) { this.lineTo(this.points[i]); } this.ctx.closePath(); this.fill(); this.stroke(); this.ctx.restore(); } } Polygon.prototype = new Plotable(); function AreaBetweenCurves(f) { this.f = f; this.g = function(x) {return 0}; this.N = 100; this.domain = null; this.draw = function() { if (this.domain == null) { this.domain = [this.bbox[0], this.bbox[2]]; } if (this.domain[1] == this.domain[0]) return; var x = this.domain[0]; var dx = (this.domain[1] - this.domain[0])/this.N; this.ctx.save(); this.ctx.beginPath(); this.moveTo([x, this.f(x)]); for (var i = 0; i < this.N; i++) { x += dx; this.lineTo([x,this.f(x)]); } this.lineTo([x, this.g(x)]); for (var i = 0; i < this.N; i++) { x -= dx; this.lineTo([x,this.g(x)]); } this.ctx.closePath(); if (this.fillColor != null) { this.ctx.fillStyle = this.fillColor; this.ctx.fill(); } if (this.strokeColor != null) { this.ctx.lineWidth = this.lineWidth; this.ctx.strokeStyle = this.strokeColor; this.ctx.stroke(); } this.ctx.restore(); } } AreaBetweenCurves.prototype = new Plotable(); var vadd = function(u,v) { var r = [] for (var i = 0; i < u.length; i++) { r.push(u[i] + v[i]); } return r } var vdiff = function(u,v) { var r = [] for (var i = 0; i < u.length; i++) { r.push(u[i] - v[i]); } return r } var smult = function(s,u) { var r = [] for (var i = 0; i < u.length; i++) { r.push(s*u[i]); } return r } var dot = function(u,v) { var dot = 0; for (var i = 0; i < u.length; i++) { dot += u[i]*v[i]; } return dot; } var length = function(u) { return Math.sqrt(dot(u,u)); } var midpoint = function(u,v) { return smult(0.5, vadd(u,v)); } var pointOnLine = function(p, t, q) { d = vdiff(q, p); return vadd(p, smult(t, d)); } var isInBbox = function(p, bbox) { if (p[0] < bbox[0] || p[0] > bbox[2] || p[1] < bbox[1] || p[1] > bbox[3]) return false; return true; } function Line(p0, p1) { this.p0 = p0; this.p1 = p1; this.infinite = false; this.draw = function() { var t0 = 0; var t1 = 1; if (this.infinite) { while (isInBbox(pointOnLine(this.p0, t1, this.p1), this.bbox)) { t1++; } while (isInBbox(pointOnLine(this.p0, t0, this.p1), this.bbox)) { t0--; } } this.ctx.save(); this.ctx.lineWidth = this.lineWidth; this.ctx.strokeStyle = this.strokeColor; if (this.lineDash != null) this.ctx.setLineDash(this.lineDash); this.ctx.beginPath(); this.moveTo(pointOnLine(this.p0, t0, this.p1)); this.lineTo(pointOnLine(this.p0, t1, this.p1)); this.ctx.stroke(); this.ctx.restore(); } } Line.prototype = new Plotable(); function Point(p) { this.point = p; this.size = 3; this.style = "circle" this.draw = function() { var p = this.transform.transformPoint(this.point); this.ctx.save(); this.ctx.translate(p[0], p[1]); this.ctx.beginPath(); if (this.style == "circle") { this.ctx.arc(0,0,this.size, 0, 2*Math.PI); this.ctx.closePath(); } else if (this.style == "box") { this.ctx.moveTo(-this.size, -this.size); this.ctx.lineTo(this.size, -this.size); this.ctx.lineTo(this.size, this.size); this.ctx.lineTo(-this.size, this.size); this.ctx.closePath(); } else if (this.style == "rect") { this.ctx.moveTo(-this.width, -this.height); this.ctx.lineTo(this.width, -this.height); this.ctx.lineTo(this.width, this.height); this.ctx.lineTo(-this.width, this.height); this.ctx.closePath(); } if (this.fillColor != null) { this.ctx.fillStyle = this.fillColor; this.ctx.fill(); } if (this.strokeColor != null) { this.ctx.strokeStyle = this.strokeColor; this.ctx.lineWidth = this.lineWidth; this.ctx.stroke(); } if (this.style == "rect" && this.centerLine) { this.ctx.beginPath(); this.ctx.moveTo(0, this.height); this.ctx.lineTo(0, -this.height); this.ctx.stroke(); } this.ctx.restore(); } this.hit = function(x,y) { var p = this.transform.transformPoint(this.point); var dx = x-p[0]; var dy = y-p[1] if (this.style == "circle") { return Math.sqrt(dx*dx + dy*dy) <= this.size; } else if (this.style == "box") { return Math.abs(dx) <= this.size && Math.abs(dy) <= this.size; } else if (this.style == "rect") { return Math.abs(dx) <= this.width && Math.abs(dy) <= this.height; } return false; if (this.fillColor != null) { this.ctx.fillStyle = this.fillColor; this.ctx.fill(); } if (this.strokeColor != null) { this.ctx.strokeStyle = this.strokeColor; this.ctx.stroke(); } } } Point.prototype = new Plotable(); function Ellipse(center, a, b) { this.center = center; this.a = a; this.b = b; this.N = 100; this.draw = function() { this.ctx.save(); this.ctx.beginPath(); var theta = 0; var dtheta = 2*Math.PI/this.N; this.moveTo(vadd(this.center, [this.a*Math.cos(theta) , this.b*Math.sin(theta)])) for (var i = 0; i < this.N; i++) { theta += dtheta; this.lineTo(vadd(this.center, [this.a*Math.cos(theta) , this.b*Math.sin(theta)])) } this.ctx.closePath(); this.fill(); this.stroke(); this.ctx.restore(); } } Ellipse.prototype = new Plotable() function Circle(center, radius) { this.center = center; this.a = radius; this.b = radius; } Circle.prototype = new Ellipse(); function QuadTree(corners, depth) { this.corners = corners; this.depth = depth; this.subdivide = function() { var bottom = midpoint(this.corners[0], this.corners[1]); var top = midpoint(this.corners[2], this.corners[3]); var left = midpoint(this.corners[0], this.corners[3]); var right = midpoint(this.corners[1], this.corners[2]); var mid = midpoint(bottom, top); var quad = [] quad.push(new QuadTree([this.corners[0], bottom, mid, left], this.depth-1)); quad.push(new QuadTree([bottom, this.corners[1], right, mid], this.depth-1)); quad.push(new QuadTree([left, mid, top, this.corners[3]], this.depth-1)); quad.push(new QuadTree([mid, right, this.corners[2], top], this.depth-1)); return quad; } this.intersects = function(ctx) { var sign = ctx.g(this.corners[3]); for (var i = 0; i < 4; i++) { var nextsign = ctx.g(this.corners[i]); if (sign * nextsign <= 0) return true; sign = nextsign; } return false; } this.findzero = function(p1, p2, ctx) { var dx = p2[0] - p1[0]; var dy = p2[1] - p1[1]; var dt; var nextp change = 0.00001 if (dx != 0) { dx = change * Math.abs(dx) / dx; dy = 0; dt = dx } else { dy = change * Math.abs(dy) / dy; dx = 0; dt = dy; } var p = p1; var diff = 1; var N = 0; while (Math.abs(diff) > 0.000001 && N < 50) { var f = ctx.g(p); if (f == 0) break; var df = (ctx.g(vadd(p, [dx,dy]))-f)/dt; diff = f/df; if (dx != 0) { nextp = vdiff(p, [diff,0]); } else { nextp = vdiff(p, [0, diff]); } N ++; p = nextp; } return p } this.draw = function(ctx) { var corner = this.corners[3]; var sign = ctx.g(corner); var lastZero = null; for (var i = 0; i < 4; i++) { var nextcorner = this.corners[i]; var nextsign = ctx.g(nextcorner); if (sign == 0 && nextsign == 0) { ctx.moveTo(corner); ctx.lineTo(nextcorner); } else if (sign * nextsign <= 0) { if (lastZero == null) { lastZero = this.findzero(corner, nextcorner, ctx); } else { var thisZero = this.findzero(corner, nextcorner, ctx); ctx.moveTo(lastZero); ctx.lineTo(thisZero); lastZero = thisZero; } } corner = nextcorner; sign = nextsign; } } } function Implicit(f) { this.initialdepth = 4; this.depth = 8; this.f = f; this.box = null; this.draw = function() { if (this.box == null) { this.box = this.bbox; } this.g = function(p) { return this.f(p) - this.k; } this.ctx.save(); this.ctx.lineWidth = this.lineWidth; this.ctx.strokeStyle = this.strokeColor; this.ctx.beginPath(); var root = new QuadTree([[this.box[0], this.box[1]], [this.box[2], this.box[1]], [this.box[2], this.box[2]], [this.box[0], this.box[2]]], this.depth); var tree = [root] for (var i = 0; i < this.initialdepth; i++) { var newtree = [] for (var j = 0; j < tree.length; j++) { var quad = tree[j].subdivide(); newtree = newtree.concat(tree[j].subdivide()); } tree = newtree; } while (tree.length > 0) { var node = tree[0]; tree.splice(0, 1); if (node.depth == 0) { node.draw(this); } else if (node.intersects(this)) { tree = tree.concat(node.subdivide()); } } this.ctx.stroke(); this.ctx.restore(); } } Implicit.prototype = new Plotable(); function Vector(head) { this.head = head this.tail = [0,0]; this.arrowWidth = 2; this.sw = 5 this.hw = 2.5*this.sw; // was 3.6 this.A = 24*Math.PI/180.0; this.B = 60*Math.PI/180.0; // was 60 this.draw = function() { this.ctx.save(); this.ctx.beginPath(); var p0 = this.transform.transformPoint(this.tail); var p1 = this.transform.transformPoint(this.head); var dx = p1[0] - p0[0]; var dy = p1[1] - p0[1]; var L = Math.sqrt(dx*dx + dy*dy); var xA = L - 0.5*this.hw/Math.tan(this.A); var xB = xA + 0.5*(this.hw - this.sw)/Math.tan(this.B); this.ctx.translate(p0[0], p0[1]); this.ctx.rotate(Math.atan2(dy, dx)); this.ctx.moveTo(0, -0.5*this.sw); this.ctx.lineTo(xB,-0.5*this.sw); this.ctx.lineTo(xA,-0.5*this.hw); this.ctx.lineTo(L, 0); this.ctx.lineTo(xA, 0.5*this.hw); this.ctx.lineTo(xB, 0.5*this.sw); this.ctx.lineTo(0, 0.5*this.sw); this.ctx.closePath(); this.fill(); this.stroke(); this.ctx.restore(); } this.hit = function(x,y) { var tail = this.transform.transformPoint(this.tail); var head = this.transform.transformPoint(this.head); var dy = head[1] - tail[1]; var dx = head[0] - tail[0]; var af = new AffineTransform(); af.translate(tail); af.rotate(Math.atan2(dy, dx)); var p = af.inverseTransformPoint([x,y]); var L = Math.sqrt(dx*dx + dy*dy); var xA = L - 0.5*this.hw/Math.tan(this.A); var maxY = Math.tan(this.A)*(L-p[0]); if (p[0] > L || p[0] < xA) return false; if (Math.abs(p[1]) > maxY) return false; return true; } } Vector.prototype = new Plotable(); var getColor = function(r,g,b) { return 'rgb(' + Math.floor(r) + ',' + Math.floor(g) + ',' + Math.floor(b) + ')'; } var timer = null; var startAnimation = function(update, interval) { if (timer != null) return; timer = setInterval(update, interval); } var stopAnimation = function() { if (timer != null) { clearTimeout(timer); } timer = null; } ================================================ FILE: examples/sample-article/media/code/austin/simple-ev.js ================================================ /* From David Austin, 2018-04-05 */ var canvas = new Canvas("eigenvector", [-4,-4,4,4]); canvas.margins = [5,5,5,5]; canvas.setUpCoordinates(); var update = function() { var ma = 1; var mb = 2; var mc = 2; var md = 1; var x = v.head[0]; var y = v.head[1]; Av.head = [ma*x + mb*y, mc*x + md*y]; canvas.draw(); } var grid = new Grid([-4,1,4], [-4,1,4]); canvas.addPlotable(grid); var axes = new Axes(); canvas.addPlotable(axes); var v = new Vector([1,0]); v.move = function(p) { v.head = p; update(); } v.fillColor = "red"; var Av = new Vector([1,0]); Av.fillColor = "gray"; canvas.addPlotable(Av); canvas.addPlotable(v); canvas.addMoveable(v); update(); ================================================ FILE: examples/sample-article/media/code/d3/collision.js ================================================ /* Mike Bostock, GPL license, 2018-04-25 */ /* https://bl.ocks.org/mbostock/3231298 */ var width = 480, height = 480; var nodes = d3.range(200).map(function() { return {radius: Math.random() * 12 + 4}; }), root = nodes[0], color = d3.scale.category10(); root.radius = 0; root.fixed = true; var force = d3.layout.force() .gravity(0.05) .charge(function(d, i) { return i ? 0 : -2000; }) .nodes(nodes) .size([width, height]); force.start(); var svg = d3.select("#d3-collision").append("svg") .attr("width", width) .attr("height", height) .attr("display", "block"); svg.selectAll("circle") .data(nodes.slice(1)) .enter().append("circle") .attr("r", function(d) { return d.radius; }) .style("fill", function(d, i) { return color(i % 3); }); force.on("tick", function(e) { var q = d3.geom.quadtree(nodes), i = 0, n = nodes.length; while (++i < n) q.visit(collide(nodes[i])); svg.selectAll("circle") .attr("cx", function(d) { return d.x; }) .attr("cy", function(d) { return d.y; }); }); svg.on("mousemove", function() { var p1 = d3.mouse(this); root.px = p1[0]; root.py = p1[1]; force.resume(); }); function collide(node) { var r = node.radius + 16, nx1 = node.x - r, nx2 = node.x + r, ny1 = node.y - r, ny2 = node.y + r; return function(quad, x1, y1, x2, y2) { if (quad.point && (quad.point !== node)) { var x = node.x - quad.point.x, y = node.y - quad.point.y, l = Math.sqrt(x * x + y * y), r = node.radius + quad.point.radius; if (l < r) { l = (l - r) / l * .5; node.x -= x *= l; node.y -= y *= l; quad.point.x += x; quad.point.y += y; } } return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1; }; } ================================================ FILE: examples/sample-article/media/code/d3/graph-layout.js ================================================ /* shimizu, GPL License, 2018-04-25 */ /* https://bl.ocks.org/shimizu/raw/e6209de87cdddde38dadbb746feaf3a3/ */ !(function(){ "use strict" var width,height var chartWidth, chartHeight var margin var svg = d3.select("#d3-graph-layout").append("svg") var chartLayer = svg.append("g").classed("chartLayer", true) main() function main() { setSize(data) // Add more data when we have a larger canvas var range = Math.pow(width, 1.3) / 50 var data = { nodes:d3.range(0, range).map(function(d){ return {label: "l"+d ,r:~~d3.randomUniform(4, 16)()}}), links:d3.range(0, range).map(function(){ return {source:~~d3.randomUniform(range)(), target:~~d3.randomUniform(range)()} }) } drawChart(data) } function setSize(data) { // boundingRect provides true decimal values for dimensions. // clientWidth/clientHeight are integer values that may have been rounded up let boundingRect = document.querySelector("#d3-graph-layout").getBoundingClientRect() width = Math.floor(boundingRect.width) height = Math.floor(boundingRect.height) margin = {top:0, left:0, bottom:0, right:0 } chartWidth = width - (margin.left+margin.right) chartHeight = height - (margin.top+margin.bottom) svg.attr("width", width).attr("height", height).attr("display", "block") chartLayer .attr("width", chartWidth) .attr("height", chartHeight) .attr("transform", "translate("+[margin.left, margin.top]+")") } function drawChart(data) { var simulation = d3.forceSimulation() .force("link", d3.forceLink().id(function(d) { return d.index })) .force("collide",d3.forceCollide( function(d){return d.r + 8 }).iterations(16) ) .force("charge", d3.forceManyBody()) .force("center", d3.forceCenter(chartWidth / 2, chartHeight / 2)) .force("y", d3.forceY(0)) .force("x", d3.forceX(0)) var link = svg.append("g") .attr("class", "links") .selectAll("line") .data(data.links) .enter() .append("line") .attr("stroke", "black") var node = svg.append("g") .attr("class", "nodes") .selectAll("circle") .data(data.nodes) .enter().append("circle") .attr("r", function(d){ return d.r }) .call(d3.drag() .on("start", dragstarted) .on("drag", dragged) .on("end", dragended)); var ticked = function() { link .attr("x1", function(d) { return d.source.x; }) .attr("y1", function(d) { return d.source.y; }) .attr("x2", function(d) { return d.target.x; }) .attr("y2", function(d) { return d.target.y; }); node .attr("cx", function(d) { return d.x; }) .attr("cy", function(d) { return d.y; }); } simulation .nodes(data.nodes) .on("tick", ticked); simulation.force("link") .links(data.links); function dragstarted(d) { if (!d3.event.active) simulation.alphaTarget(0.3).restart(); d.fx = d.x; d.fy = d.y; } function dragged(d) { d.fx = d3.event.x; d.fy = d3.event.y; } function dragended(d) { if (!d3.event.active) simulation.alphaTarget(0); d.fx = null; d.fy = null; } } }()); ================================================ FILE: examples/sample-article/media/code/d3/mention_network.json ================================================ { "nodes": [ { "twitter": "_Adam_Price", "name": "Adam Price", "id": "_Adam_Price", "colour": "#008142", "party": "Plaid Cymru" }, { "twitter": "AlunDaviesAM", "name": "Alun Davies", "id": "AlunDaviesAM", "colour": "#dc241f", "party": "Labour" }, { "twitter": "AndrewRTDavies", "name": "Andrew RT Davies", "id": "AndrewRTDavies", "colour": "#0087DC", "party": "Conservative" }, { "twitter": "AngelaBurnsAM", "name": "Angela Burns", "id": "AngelaBurnsAM", "colour": "#0087DC", "party": "Conservative" }, { "twitter": "ann_jonesam", "name": "Ann Jones", "id": "ann_jonesam", "colour": "#dc241f", "party": "Labour" }, { "twitter": "bethanjenkins", "name": "Bethan Jenkins", "id": "bethanjenkins", "colour": "#008142", "party": "Plaid Cymru" }, { "twitter": "Carl4AandD", "name": "Carl Sargeant", "id": "Carl4AandD", "colour": "#dc241f", "party": "Labour" }, { "twitter": "carolineUKIP", "name": "Caroline Jones", "id": "carolineUKIP", "colour": "#70147a", "party": "UKIP" }, { "twitter": "AMCarwyn", "name": "Carwyn Jones", "id": "AMCarwyn", "colour": "#dc241f", "party": "Labour" }, { "twitter": "ElisThomasD", "name": "Dafydd Elis-Thomas", "id": "ElisThomasD", "colour": "#eeeeee", "party": "Independent" }, { "twitter": "DaiLloydAM", "name": "Dai Lloyd", "id": "DaiLloydAM", "colour": "#008142", "party": "Plaid Cymru" }, { "twitter": "DarrenMillarAM", "name": "Darren Millar", "id": "DarrenMillarAM", "colour": "#0087DC", "party": "Conservative" }, { "twitter": "", "name": "David Melding", "id": "", "colour": "#0087DC", "party": "Conservative" }, { "twitter": "DavidReesAM", "name": "David Rees", "id": "DavidReesAM", "colour": "#dc241f", "party": "Labour" }, { "twitter": "DavidRowlandsAM", "name": "David Rowlands", "id": "DavidRowlandsAM", "colour": "#70147a", "party": "UKIP" }, { "twitter": "Dawn_Bowden", "name": "Dawn Bowden", "id": "Dawn_Bowden", "colour": "#dc241f", "party": "Labour" }, { "twitter": "ElinCeredigion", "name": "Elin Jones", "id": "ElinCeredigion", "colour": "#008142", "party": "Plaid Cymru" }, { "twitter": "Eluned_Morgan", "name": "Eluned Morgan", "id": "Eluned_Morgan", "colour": "#dc241f", "party": "Labour" }, { "twitter": "GarethBennettAM", "name": "Gareth Bennett", "id": "GarethBennettAM", "colour": "#70147a", "party": "UKIP" }, { "twitter": "hannahblythyn", "name": "Hannah Blythyn", "id": "hannahblythyn", "colour": "#dc241f", "party": "Labour" }, { "twitter": "hef4caerphilly", "name": "Hefin David", "id": "hef4caerphilly", "colour": "#dc241f", "party": "Labour" }, { "twitter": "huw4ogmore", "name": "Huw Irranca-Davies", "id": "huw4ogmore", "colour": "#dc241f", "party": "Labour" }, { "twitter": "JaneHutt", "name": "Jane Hutt", "id": "JaneHutt", "colour": "#dc241f", "party": "Labour" }, { "twitter": "JFinchSaunders", "name": "Janet Finch-Saunders", "id": "JFinchSaunders", "colour": "#0087DC", "party": "Conservative" }, { "twitter": "JBryantWales", "name": "Jayne Bryant", "id": "JBryantWales", "colour": "#dc241f", "party": "Labour" }, { "twitter": "JennyRathbone", "name": "Jenny Rathbone", "id": "JennyRathbone", "colour": "#dc241f", "party": "Labour" }, { "twitter": "Jeremy_Miles", "name": "Jeremy Miles", "id": "Jeremy_Miles", "colour": "#dc241f", "party": "Labour" }, { "twitter": "JGriffithsLab", "name": "John Griffiths", "id": "JGriffithsLab", "colour": "#dc241f", "party": "Labour" }, { "twitter": "JoyceWatsonam", "name": "Joyce Watson", "id": "JoyceWatsonam", "colour": "#dc241f", "party": "Labour" }, { "twitter": "JulieJamesAM", "name": "Julie James", "id": "JulieJamesAM", "colour": "#dc241f", "party": "Labour" }, { "twitter": "JulieMorganLAB", "name": "Julie Morgan", "id": "JulieMorganLAB", "colour": "#dc241f", "party": "Labour" }, { "twitter": "KenSkatesAM", "name": "Ken Skates", "id": "KenSkatesAM", "colour": "#dc241f", "party": "Labour" }, { "twitter": "Kirsty_Williams", "name": "Kirsty Williams", "id": "Kirsty_Williams", "colour": "#fdbb30", "party": "Liberal Democrat" }, { "twitter": "LeanneWood", "name": "Leanne Wood", "id": "LeanneWood", "colour": "#008142", "party": "Plaid Cymru" }, { "twitter": "Amanwy", "name": "Lee Waters", "id": "Amanwy", "colour": "#dc241f", "party": "Labour" }, { "twitter": "lesley4wrexham", "name": "Lesley Griffiths", "id": "lesley4wrexham", "colour": "#dc241f", "party": "Labour" }, { "twitter": "LlyrGruffydd", "name": "Llyr Huws Gruffydd", "id": "LlyrGruffydd", "colour": "#008142", "party": "Plaid Cymru" }, { "twitter": "lynne_neagle", "name": "Lynne Neagle", "id": "lynne_neagle", "colour": "#dc241f", "party": "Labour" }, { "twitter": "MarkDrakeford", "name": "Mark Drakeford", "id": "MarkDrakeford", "colour": "#dc241f", "party": "Labour" }, { "twitter": "MarkIsherwoodAM", "name": "Mark Isherwood", "id": "MarkIsherwoodAM", "colour": "#0087DC", "party": "Conservative" }, { "twitter": "MarkReckless", "name": "Mark Reckless", "id": "MarkReckless", "colour": "#70147a", "party": "UKIP" }, { "twitter": "MishBrownAM", "name": "Michelle Brown", "id": "MishBrownAM", "colour": "#70147a", "party": "UKIP" }, { "twitter": "MickAntoniw1", "name": "Mick Antoniw", "id": "MickAntoniw1", "colour": "#dc241f", "party": "Labour" }, { "twitter": "MikeHedgesAM", "name": "Mike Hedges", "id": "MikeHedgesAM", "colour": "#dc241f", "party": "Labour" }, { "twitter": "MohammadAsghar", "name": "Mohammad Asghar", "id": "MohammadAsghar", "colour": "#0087DC", "party": "Conservative" }, { "twitter": "NathanGillMEP", "name": "Nathan Gill", "id": "NathanGillMEP", "colour": "#eeeeee", "party": "Independent" }, { "twitter": "NeilUKIP", "name": "Neil Hamilton", "id": "NeilUKIP", "colour": "#70147a", "party": "UKIP" }, { "twitter": "neiljmcevoy", "name": "Neil McEvoy", "id": "neiljmcevoy", "colour": "#008142", "party": "Plaid Cymru" }, { "twitter": "NickRamsayAM", "name": "Nick Ramsay", "id": "NickRamsayAM", "colour": "#0087DC", "party": "Conservative" }, { "twitter": "", "name": "Paul Davies", "id": "", "colour": "#0087DC", "party": "Conservative" }, { "twitter": "RebeccaEvansAM", "name": "Rebecca Evans", "id": "RebeccaEvansAM", "colour": "#dc241f", "party": "Labour" }, { "twitter": "rhi4islwyn", "name": "Rhianon Passmore", "id": "rhi4islwyn", "colour": "#dc241f", "party": "Labour" }, { "twitter": "RhunapIorwerth", "name": "Rhun Ap Iorwerth", "id": "RhunapIorwerth", "colour": "#008142", "party": "Plaid Cymru" }, { "twitter": "russ_george", "name": "Russell George", "id": "russ_george", "colour": "#0087DC", "party": "Conservative" }, { "twitter": "siangwenfelin", "name": "Sian Gwenllian", "id": "siangwenfelin", "colour": "#008142", "party": "Plaid Cymru" }, { "twitter": "SimonThomasAC", "name": "Simon Thomas", "id": "SimonThomasAC", "colour": "#008142", "party": "Plaid Cymru" }, { "twitter": "steffanlewis", "name": "Steffan Lewis", "id": "steffanlewis", "colour": "#008142", "party": "Plaid Cymru" }, { "twitter": "suzydaviesam", "name": "Suzy Davies", "id": "suzydaviesam", "colour": "#0087DC", "party": "Conservative" }, { "twitter": "vaughangething", "name": "Vaughan Gething", "id": "vaughangething", "colour": "#dc241f", "party": "Labour" }, { "twitter": "VikkiHowells", "name": "Vikki Howells", "id": "VikkiHowells", "colour": "#dc241f", "party": "Labour" } ], "links": [ { "value": 34, "source": "AMCarwyn", "target": "Amanwy" }, { "value": 7, "source": "AMCarwyn", "target": "Dawn_Bowden" }, { "value": 9, "source": "AMCarwyn", "target": "JBryantWales" }, { "value": 9, "source": "AMCarwyn", "target": "JFinchSaunders" }, { "value": 17, "source": "AMCarwyn", "target": "JaneHutt" }, { "value": 7, "source": "AMCarwyn", "target": "JennyRathbone" }, { "value": 10, "source": "AMCarwyn", "target": "Jeremy_Miles" }, { "value": 5, "source": "AMCarwyn", "target": "JoyceWatsonam" }, { "value": 12, "source": "AMCarwyn", "target": "JulieMorganLAB" }, { "value": 5, "source": "AMCarwyn", "target": "KenSkatesAM" }, { "value": 6, "source": "AMCarwyn", "target": "Kirsty_Williams" }, { "value": 7, "source": "AMCarwyn", "target": "MarkDrakeford" }, { "value": 12, "source": "AMCarwyn", "target": "MarkReckless" }, { "value": 8, "source": "AMCarwyn", "target": "MickAntoniw1" }, { "value": 10, "source": "AMCarwyn", "target": "RebeccaEvansAM" }, { "value": 6, "source": "AMCarwyn", "target": "VikkiHowells" }, { "value": 11, "source": "AMCarwyn", "target": "hannahblythyn" }, { "value": 25, "source": "AMCarwyn", "target": "huw4ogmore" }, { "value": 11, "source": "AMCarwyn", "target": "lesley4wrexham" }, { "value": 8, "source": "AMCarwyn", "target": "vaughangething" }, { "value": 5, "source": "AlunDaviesAM", "target": "AMCarwyn" }, { "value": 13, "source": "AlunDaviesAM", "target": "Amanwy" }, { "value": 5, "source": "AlunDaviesAM", "target": "AndrewRTDavies" }, { "value": 7, "source": "AlunDaviesAM", "target": "ElisThomasD" }, { "value": 5, "source": "AlunDaviesAM", "target": "Jeremy_Miles" }, { "value": 6, "source": "AlunDaviesAM", "target": "KenSkatesAM" }, { "value": 6, "source": "AlunDaviesAM", "target": "Kirsty_Williams" }, { "value": 12, "source": "AlunDaviesAM", "target": "LeanneWood" }, { "value": 8, "source": "AlunDaviesAM", "target": "MickAntoniw1" }, { "value": 5, "source": "AlunDaviesAM", "target": "RhunapIorwerth" }, { "value": 7, "source": "AlunDaviesAM", "target": "SimonThomasAC" }, { "value": 6, "source": "AlunDaviesAM", "target": "vaughangething" }, { "value": 10, "source": "Amanwy", "target": "AMCarwyn" }, { "value": 16, "source": "Amanwy", "target": "AlunDaviesAM" }, { "value": 6, "source": "Amanwy", "target": "AndrewRTDavies" }, { "value": 5, "source": "Amanwy", "target": "ElinCeredigion" }, { "value": 5, "source": "Amanwy", "target": "ElisThomasD" }, { "value": 14, "source": "Amanwy", "target": "Eluned_Morgan" }, { "value": 7, "source": "Amanwy", "target": "JennyRathbone" }, { "value": 48, "source": "Amanwy", "target": "Jeremy_Miles" }, { "value": 13, "source": "Amanwy", "target": "KenSkatesAM" }, { "value": 25, "source": "Amanwy", "target": "LeanneWood" }, { "value": 6, "source": "Amanwy", "target": "MarkDrakeford" }, { "value": 7, "source": "Amanwy", "target": "MarkReckless" }, { "value": 11, "source": "Amanwy", "target": "NathanGillMEP" }, { "value": 10, "source": "Amanwy", "target": "NeilUKIP" }, { "value": 9, "source": "Amanwy", "target": "RebeccaEvansAM" }, { "value": 7, "source": "Amanwy", "target": "RhunapIorwerth" }, { "value": 15, "source": "Amanwy", "target": "SimonThomasAC" }, { "value": 13, "source": "Amanwy", "target": "VikkiHowells" }, { "value": 30, "source": "Amanwy", "target": "_Adam_Price" }, { "value": 5, "source": "Amanwy", "target": "bethanjenkins" }, { "value": 27, "source": "Amanwy", "target": "hef4caerphilly" }, { "value": 13, "source": "Amanwy", "target": "huw4ogmore" }, { "value": 33, "source": "Amanwy", "target": "neiljmcevoy" }, { "value": 6, "source": "Amanwy", "target": "vaughangething" }, { "value": 8, "source": "AndrewRTDavies", "target": "AMCarwyn" }, { "value": 35, "source": "AndrewRTDavies", "target": "AngelaBurnsAM" }, { "value": 48, "source": "AndrewRTDavies", "target": "DarrenMillarAM" }, { "value": 6, "source": "AndrewRTDavies", "target": "Eluned_Morgan" }, { "value": 27, "source": "AndrewRTDavies", "target": "JFinchSaunders" }, { "value": 5, "source": "AndrewRTDavies", "target": "JaneHutt" }, { "value": 6, "source": "AndrewRTDavies", "target": "JulieMorganLAB" }, { "value": 13, "source": "AndrewRTDavies", "target": "Kirsty_Williams" }, { "value": 30, "source": "AndrewRTDavies", "target": "LeanneWood" }, { "value": 25, "source": "AndrewRTDavies", "target": "MarkIsherwoodAM" }, { "value": 5, "source": "AndrewRTDavies", "target": "MarkReckless" }, { "value": 6, "source": "AndrewRTDavies", "target": "MohammadAsghar" }, { "value": 17, "source": "AndrewRTDavies", "target": "NickRamsayAM" }, { "value": 25, "source": "AndrewRTDavies", "target": "russ_george" }, { "value": 19, "source": "AndrewRTDavies", "target": "suzydaviesam" }, { "value": 15, "source": "AngelaBurnsAM", "target": "AlunDaviesAM" }, { "value": 7, "source": "AngelaBurnsAM", "target": "Amanwy" }, { "value": 59, "source": "AngelaBurnsAM", "target": "AndrewRTDavies" }, { "value": 47, "source": "AngelaBurnsAM", "target": "DarrenMillarAM" }, { "value": 9, "source": "AngelaBurnsAM", "target": "ElinCeredigion" }, { "value": 5, "source": "AngelaBurnsAM", "target": "ElisThomasD" }, { "value": 16, "source": "AngelaBurnsAM", "target": "JFinchSaunders" }, { "value": 8, "source": "AngelaBurnsAM", "target": "LeanneWood" }, { "value": 6, "source": "AngelaBurnsAM", "target": "LlyrGruffydd" }, { "value": 22, "source": "AngelaBurnsAM", "target": "MarkIsherwoodAM" }, { "value": 6, "source": "AngelaBurnsAM", "target": "MikeHedgesAM" }, { "value": 5, "source": "AngelaBurnsAM", "target": "MohammadAsghar" }, { "value": 7, "source": "AngelaBurnsAM", "target": "NeilUKIP" }, { "value": 12, "source": "AngelaBurnsAM", "target": "NickRamsayAM" }, { "value": 9, "source": "AngelaBurnsAM", "target": "RhunapIorwerth" }, { "value": 21, "source": "AngelaBurnsAM", "target": "SimonThomasAC" }, { "value": 16, "source": "AngelaBurnsAM", "target": "bethanjenkins" }, { "value": 11, "source": "AngelaBurnsAM", "target": "russ_george" }, { "value": 29, "source": "AngelaBurnsAM", "target": "suzydaviesam" }, { "value": 8, "source": "AngelaBurnsAM", "target": "vaughangething" }, { "value": 8, "source": "Carl4AandD", "target": "AMCarwyn" }, { "value": 5, "source": "Carl4AandD", "target": "Jeremy_Miles" }, { "value": 15, "source": "Carl4AandD", "target": "KenSkatesAM" }, { "value": 6, "source": "Carl4AandD", "target": "ann_jonesam" }, { "value": 36, "source": "Carl4AandD", "target": "hannahblythyn" }, { "value": 11, "source": "Carl4AandD", "target": "lesley4wrexham" }, { "value": 11, "source": "DaiLloydAM", "target": "LeanneWood" }, { "value": 12, "source": "DaiLloydAM", "target": "bethanjenkins" }, { "value": 6, "source": "DaiLloydAM", "target": "suzydaviesam" }, { "value": 6, "source": "DarrenMillarAM", "target": "AMCarwyn" }, { "value": 8, "source": "DarrenMillarAM", "target": "AlunDaviesAM" }, { "value": 72, "source": "DarrenMillarAM", "target": "AndrewRTDavies" }, { "value": 17, "source": "DarrenMillarAM", "target": "AngelaBurnsAM" }, { "value": 6, "source": "DarrenMillarAM", "target": "DavidReesAM" }, { "value": 21, "source": "DarrenMillarAM", "target": "ElinCeredigion" }, { "value": 22, "source": "DarrenMillarAM", "target": "JFinchSaunders" }, { "value": 36, "source": "DarrenMillarAM", "target": "Kirsty_Williams" }, { "value": 18, "source": "DarrenMillarAM", "target": "LlyrGruffydd" }, { "value": 27, "source": "DarrenMillarAM", "target": "MarkIsherwoodAM" }, { "value": 7, "source": "DarrenMillarAM", "target": "MohammadAsghar" }, { "value": 12, "source": "DarrenMillarAM", "target": "NickRamsayAM" }, { "value": 6, "source": "DarrenMillarAM", "target": "RhunapIorwerth" }, { "value": 7, "source": "DarrenMillarAM", "target": "ann_jonesam" }, { "value": 17, "source": "DarrenMillarAM", "target": "russ_george" }, { "value": 5, "source": "DarrenMillarAM", "target": "suzydaviesam" }, { "value": 7, "source": "DarrenMillarAM", "target": "vaughangething" }, { "value": 27, "source": "DavidReesAM", "target": "AMCarwyn" }, { "value": 26, "source": "DavidReesAM", "target": "AlunDaviesAM" }, { "value": 15, "source": "DavidReesAM", "target": "Amanwy" }, { "value": 5, "source": "DavidReesAM", "target": "DarrenMillarAM" }, { "value": 10, "source": "DavidReesAM", "target": "Dawn_Bowden" }, { "value": 5, "source": "DavidReesAM", "target": "ElinCeredigion" }, { "value": 8, "source": "DavidReesAM", "target": "Eluned_Morgan" }, { "value": 9, "source": "DavidReesAM", "target": "JBryantWales" }, { "value": 5, "source": "DavidReesAM", "target": "JFinchSaunders" }, { "value": 5, "source": "DavidReesAM", "target": "JaneHutt" }, { "value": 56, "source": "DavidReesAM", "target": "Jeremy_Miles" }, { "value": 10, "source": "DavidReesAM", "target": "JulieJamesAM" }, { "value": 5, "source": "DavidReesAM", "target": "JulieMorganLAB" }, { "value": 19, "source": "DavidReesAM", "target": "Kirsty_Williams" }, { "value": 10, "source": "DavidReesAM", "target": "LeanneWood" }, { "value": 24, "source": "DavidReesAM", "target": "MickAntoniw1" }, { "value": 16, "source": "DavidReesAM", "target": "MikeHedgesAM" }, { "value": 6, "source": "DavidReesAM", "target": "NickRamsayAM" }, { "value": 29, "source": "DavidReesAM", "target": "RebeccaEvansAM" }, { "value": 9, "source": "DavidReesAM", "target": "SimonThomasAC" }, { "value": 5, "source": "DavidReesAM", "target": "VikkiHowells" }, { "value": 42, "source": "DavidReesAM", "target": "bethanjenkins" }, { "value": 22, "source": "DavidReesAM", "target": "hannahblythyn" }, { "value": 14, "source": "DavidReesAM", "target": "huw4ogmore" }, { "value": 9, "source": "DavidReesAM", "target": "suzydaviesam" }, { "value": 10, "source": "DavidReesAM", "target": "vaughangething" }, { "value": 39, "source": "DavidRowlandsAM", "target": "MarkReckless" }, { "value": 88, "source": "DavidRowlandsAM", "target": "NathanGillMEP" }, { "value": 10, "source": "DavidRowlandsAM", "target": "NeilUKIP" }, { "value": 6, "source": "DavidRowlandsAM", "target": "carolineUKIP" }, { "value": 21, "source": "Dawn_Bowden", "target": "AMCarwyn" }, { "value": 8, "source": "Dawn_Bowden", "target": "AlunDaviesAM" }, { "value": 5, "source": "Dawn_Bowden", "target": "Amanwy" }, { "value": 6, "source": "Dawn_Bowden", "target": "Eluned_Morgan" }, { "value": 8, "source": "Dawn_Bowden", "target": "JBryantWales" }, { "value": 7, "source": "Dawn_Bowden", "target": "Jeremy_Miles" }, { "value": 6, "source": "Dawn_Bowden", "target": "KenSkatesAM" }, { "value": 7, "source": "Dawn_Bowden", "target": "Kirsty_Williams" }, { "value": 6, "source": "Dawn_Bowden", "target": "LeanneWood" }, { "value": 7, "source": "Dawn_Bowden", "target": "MickAntoniw1" }, { "value": 7, "source": "Dawn_Bowden", "target": "VikkiHowells" }, { "value": 5, "source": "Dawn_Bowden", "target": "bethanjenkins" }, { "value": 8, "source": "Dawn_Bowden", "target": "hef4caerphilly" }, { "value": 9, "source": "Dawn_Bowden", "target": "huw4ogmore" }, { "value": 5, "source": "Dawn_Bowden", "target": "rhi4islwyn" }, { "value": 12, "source": "Dawn_Bowden", "target": "vaughangething" }, { "value": 5, "source": "ElinCeredigion", "target": "DarrenMillarAM" }, { "value": 7, "source": "ElinCeredigion", "target": "JaneHutt" }, { "value": 5, "source": "ElinCeredigion", "target": "Kirsty_Williams" }, { "value": 82, "source": "ElinCeredigion", "target": "LeanneWood" }, { "value": 14, "source": "ElinCeredigion", "target": "LlyrGruffydd" }, { "value": 22, "source": "ElinCeredigion", "target": "RhunapIorwerth" }, { "value": 46, "source": "ElinCeredigion", "target": "SimonThomasAC" }, { "value": 32, "source": "ElinCeredigion", "target": "_Adam_Price" }, { "value": 7, "source": "ElinCeredigion", "target": "ann_jonesam" }, { "value": 9, "source": "ElinCeredigion", "target": "siangwenfelin" }, { "value": 8, "source": "ElisThomasD", "target": "LeanneWood" }, { "value": 23, "source": "ElisThomasD", "target": "_Adam_Price" }, { "value": 5, "source": "ElisThomasD", "target": "huw4ogmore" }, { "value": 5, "source": "ElisThomasD", "target": "siangwenfelin" }, { "value": 8, "source": "Eluned_Morgan", "target": "AMCarwyn" }, { "value": 35, "source": "Eluned_Morgan", "target": "Amanwy" }, { "value": 6, "source": "Eluned_Morgan", "target": "AndrewRTDavies" }, { "value": 8, "source": "Eluned_Morgan", "target": "Dawn_Bowden" }, { "value": 15, "source": "Eluned_Morgan", "target": "Jeremy_Miles" }, { "value": 16, "source": "Eluned_Morgan", "target": "JoyceWatsonam" }, { "value": 8, "source": "Eluned_Morgan", "target": "RebeccaEvansAM" }, { "value": 6, "source": "Eluned_Morgan", "target": "SimonThomasAC" }, { "value": 7, "source": "Eluned_Morgan", "target": "VikkiHowells" }, { "value": 9, "source": "Eluned_Morgan", "target": "_Adam_Price" }, { "value": 5, "source": "Eluned_Morgan", "target": "hannahblythyn" }, { "value": 5, "source": "Eluned_Morgan", "target": "huw4ogmore" }, { "value": 5, "source": "Eluned_Morgan", "target": "rhi4islwyn" }, { "value": 11, "source": "GarethBennettAM", "target": "MarkReckless" }, { "value": 8, "source": "GarethBennettAM", "target": "MishBrownAM" }, { "value": 19, "source": "GarethBennettAM", "target": "NeilUKIP" }, { "value": 6, "source": "GarethBennettAM", "target": "carolineUKIP" }, { "value": 25, "source": "JBryantWales", "target": "AMCarwyn" }, { "value": 5, "source": "JBryantWales", "target": "Eluned_Morgan" }, { "value": 40, "source": "JBryantWales", "target": "JGriffithsLab" }, { "value": 9, "source": "JBryantWales", "target": "JulieMorganLAB" }, { "value": 5, "source": "JBryantWales", "target": "MohammadAsghar" }, { "value": 6, "source": "JBryantWales", "target": "RebeccaEvansAM" }, { "value": 6, "source": "JBryantWales", "target": "VikkiHowells" }, { "value": 15, "source": "JBryantWales", "target": "hannahblythyn" }, { "value": 14, "source": "JBryantWales", "target": "huw4ogmore" }, { "value": 24, "source": "JBryantWales", "target": "vaughangething" }, { "value": 174, "source": "JFinchSaunders", "target": "AndrewRTDavies" }, { "value": 25, "source": "JFinchSaunders", "target": "AngelaBurnsAM" }, { "value": 55, "source": "JFinchSaunders", "target": "DarrenMillarAM" }, { "value": 6, "source": "JFinchSaunders", "target": "ElinCeredigion" }, { "value": 5, "source": "JFinchSaunders", "target": "GarethBennettAM" }, { "value": 5, "source": "JFinchSaunders", "target": "JGriffithsLab" }, { "value": 7, "source": "JFinchSaunders", "target": "Jeremy_Miles" }, { "value": 6, "source": "JFinchSaunders", "target": "JoyceWatsonam" }, { "value": 13, "source": "JFinchSaunders", "target": "LeanneWood" }, { "value": 6, "source": "JFinchSaunders", "target": "LlyrGruffydd" }, { "value": 56, "source": "JFinchSaunders", "target": "MarkIsherwoodAM" }, { "value": 7, "source": "JFinchSaunders", "target": "MohammadAsghar" }, { "value": 10, "source": "JFinchSaunders", "target": "NeilUKIP" }, { "value": 26, "source": "JFinchSaunders", "target": "NickRamsayAM" }, { "value": 5, "source": "JFinchSaunders", "target": "bethanjenkins" }, { "value": 7, "source": "JFinchSaunders", "target": "hannahblythyn" }, { "value": 12, "source": "JFinchSaunders", "target": "russ_george" }, { "value": 5, "source": "JFinchSaunders", "target": "siangwenfelin" }, { "value": 16, "source": "JFinchSaunders", "target": "suzydaviesam" }, { "value": 67, "source": "JGriffithsLab", "target": "JBryantWales" }, { "value": 6, "source": "JaneHutt", "target": "AMCarwyn" }, { "value": 8, "source": "JaneHutt", "target": "JennyRathbone" }, { "value": 25, "source": "JaneHutt", "target": "JulieMorganLAB" }, { "value": 8, "source": "JaneHutt", "target": "RebeccaEvansAM" }, { "value": 5, "source": "JaneHutt", "target": "ann_jonesam" }, { "value": 18, "source": "JaneHutt", "target": "vaughangething" }, { "value": 10, "source": "JennyRathbone", "target": "AlunDaviesAM" }, { "value": 8, "source": "JennyRathbone", "target": "Amanwy" }, { "value": 6, "source": "JennyRathbone", "target": "ElisThomasD" }, { "value": 15, "source": "JennyRathbone", "target": "Eluned_Morgan" }, { "value": 12, "source": "JennyRathbone", "target": "JaneHutt" }, { "value": 36, "source": "JennyRathbone", "target": "JulieMorganLAB" }, { "value": 6, "source": "JennyRathbone", "target": "KenSkatesAM" }, { "value": 6, "source": "JennyRathbone", "target": "MarkDrakeford" }, { "value": 5, "source": "JennyRathbone", "target": "MikeHedgesAM" }, { "value": 7, "source": "JennyRathbone", "target": "ann_jonesam" }, { "value": 8, "source": "JennyRathbone", "target": "lesley4wrexham" }, { "value": 15, "source": "JennyRathbone", "target": "vaughangething" }, { "value": 35, "source": "Jeremy_Miles", "target": "AMCarwyn" }, { "value": 20, "source": "Jeremy_Miles", "target": "AlunDaviesAM" }, { "value": 87, "source": "Jeremy_Miles", "target": "Amanwy" }, { "value": 7, "source": "Jeremy_Miles", "target": "AndrewRTDavies" }, { "value": 9, "source": "Jeremy_Miles", "target": "DaiLloydAM" }, { "value": 30, "source": "Jeremy_Miles", "target": "DavidReesAM" }, { "value": 16, "source": "Jeremy_Miles", "target": "Dawn_Bowden" }, { "value": 16, "source": "Jeremy_Miles", "target": "Eluned_Morgan" }, { "value": 25, "source": "Jeremy_Miles", "target": "JulieJamesAM" }, { "value": 6, "source": "Jeremy_Miles", "target": "Kirsty_Williams" }, { "value": 10, "source": "Jeremy_Miles", "target": "LeanneWood" }, { "value": 5, "source": "Jeremy_Miles", "target": "LlyrGruffydd" }, { "value": 7, "source": "Jeremy_Miles", "target": "MarkIsherwoodAM" }, { "value": 12, "source": "Jeremy_Miles", "target": "MickAntoniw1" }, { "value": 11, "source": "Jeremy_Miles", "target": "MikeHedgesAM" }, { "value": 8, "source": "Jeremy_Miles", "target": "NeilUKIP" }, { "value": 39, "source": "Jeremy_Miles", "target": "RebeccaEvansAM" }, { "value": 7, "source": "Jeremy_Miles", "target": "RhunapIorwerth" }, { "value": 5, "source": "Jeremy_Miles", "target": "SimonThomasAC" }, { "value": 23, "source": "Jeremy_Miles", "target": "VikkiHowells" }, { "value": 20, "source": "Jeremy_Miles", "target": "_Adam_Price" }, { "value": 20, "source": "Jeremy_Miles", "target": "bethanjenkins" }, { "value": 5, "source": "Jeremy_Miles", "target": "carolineUKIP" }, { "value": 50, "source": "Jeremy_Miles", "target": "hannahblythyn" }, { "value": 28, "source": "Jeremy_Miles", "target": "hef4caerphilly" }, { "value": 15, "source": "Jeremy_Miles", "target": "huw4ogmore" }, { "value": 5, "source": "Jeremy_Miles", "target": "rhi4islwyn" }, { "value": 20, "source": "Jeremy_Miles", "target": "suzydaviesam" }, { "value": 15, "source": "Jeremy_Miles", "target": "vaughangething" }, { "value": 9, "source": "JoyceWatsonam", "target": "Eluned_Morgan" }, { "value": 10, "source": "JoyceWatsonam", "target": "JulieJamesAM" }, { "value": 5, "source": "JoyceWatsonam", "target": "JulieMorganLAB" }, { "value": 6, "source": "JoyceWatsonam", "target": "RebeccaEvansAM" }, { "value": 5, "source": "JoyceWatsonam", "target": "rhi4islwyn" }, { "value": 5, "source": "JoyceWatsonam", "target": "vaughangething" }, { "value": 15, "source": "JulieJamesAM", "target": "AMCarwyn" }, { "value": 14, "source": "JulieJamesAM", "target": "AlunDaviesAM" }, { "value": 61, "source": "JulieJamesAM", "target": "Amanwy" }, { "value": 9, "source": "JulieJamesAM", "target": "Carl4AandD" }, { "value": 13, "source": "JulieJamesAM", "target": "DavidReesAM" }, { "value": 37, "source": "JulieJamesAM", "target": "Dawn_Bowden" }, { "value": 13, "source": "JulieJamesAM", "target": "Eluned_Morgan" }, { "value": 20, "source": "JulieJamesAM", "target": "JBryantWales" }, { "value": 23, "source": "JulieJamesAM", "target": "JaneHutt" }, { "value": 23, "source": "JulieJamesAM", "target": "JennyRathbone" }, { "value": 57, "source": "JulieJamesAM", "target": "Jeremy_Miles" }, { "value": 16, "source": "JulieJamesAM", "target": "JoyceWatsonam" }, { "value": 14, "source": "JulieJamesAM", "target": "JulieMorganLAB" }, { "value": 6, "source": "JulieJamesAM", "target": "KenSkatesAM" }, { "value": 13, "source": "JulieJamesAM", "target": "Kirsty_Williams" }, { "value": 7, "source": "JulieJamesAM", "target": "LeanneWood" }, { "value": 13, "source": "JulieJamesAM", "target": "MickAntoniw1" }, { "value": 32, "source": "JulieJamesAM", "target": "MikeHedgesAM" }, { "value": 44, "source": "JulieJamesAM", "target": "RebeccaEvansAM" }, { "value": 5, "source": "JulieJamesAM", "target": "SimonThomasAC" }, { "value": 16, "source": "JulieJamesAM", "target": "VikkiHowells" }, { "value": 5, "source": "JulieJamesAM", "target": "ann_jonesam" }, { "value": 7, "source": "JulieJamesAM", "target": "bethanjenkins" }, { "value": 21, "source": "JulieJamesAM", "target": "hannahblythyn" }, { "value": 11, "source": "JulieJamesAM", "target": "hef4caerphilly" }, { "value": 22, "source": "JulieJamesAM", "target": "huw4ogmore" }, { "value": 13, "source": "JulieJamesAM", "target": "lesley4wrexham" }, { "value": 6, "source": "JulieJamesAM", "target": "rhi4islwyn" }, { "value": 27, "source": "JulieJamesAM", "target": "vaughangething" }, { "value": 7, "source": "JulieMorganLAB", "target": "DavidReesAM" }, { "value": 23, "source": "JulieMorganLAB", "target": "JaneHutt" }, { "value": 20, "source": "JulieMorganLAB", "target": "JennyRathbone" }, { "value": 5, "source": "JulieMorganLAB", "target": "JoyceWatsonam" }, { "value": 13, "source": "JulieMorganLAB", "target": "JulieJamesAM" }, { "value": 9, "source": "JulieMorganLAB", "target": "MarkDrakeford" }, { "value": 8, "source": "JulieMorganLAB", "target": "MickAntoniw1" }, { "value": 15, "source": "JulieMorganLAB", "target": "MikeHedgesAM" }, { "value": 5, "source": "JulieMorganLAB", "target": "RebeccaEvansAM" }, { "value": 7, "source": "JulieMorganLAB", "target": "hannahblythyn" }, { "value": 8, "source": "JulieMorganLAB", "target": "hef4caerphilly" }, { "value": 6, "source": "JulieMorganLAB", "target": "lesley4wrexham" }, { "value": 12, "source": "JulieMorganLAB", "target": "vaughangething" }, { "value": 16, "source": "KenSkatesAM", "target": "AMCarwyn" }, { "value": 8, "source": "KenSkatesAM", "target": "AndrewRTDavies" }, { "value": 5, "source": "KenSkatesAM", "target": "JaneHutt" }, { "value": 6, "source": "KenSkatesAM", "target": "LlyrGruffydd" }, { "value": 7, "source": "KenSkatesAM", "target": "MarkDrakeford" }, { "value": 12, "source": "KenSkatesAM", "target": "RebeccaEvansAM" }, { "value": 17, "source": "KenSkatesAM", "target": "ann_jonesam" }, { "value": 31, "source": "KenSkatesAM", "target": "hannahblythyn" }, { "value": 59, "source": "KenSkatesAM", "target": "lesley4wrexham" }, { "value": 31, "source": "KenSkatesAM", "target": "vaughangething" }, { "value": 7, "source": "Kirsty_Williams", "target": "AndrewRTDavies" }, { "value": 12, "source": "Kirsty_Williams", "target": "LeanneWood" }, { "value": 6, "source": "Kirsty_Williams", "target": "RebeccaEvansAM" }, { "value": 12, "source": "LeanneWood", "target": "Amanwy" }, { "value": 6, "source": "LeanneWood", "target": "AndrewRTDavies" }, { "value": 25, "source": "LeanneWood", "target": "ElinCeredigion" }, { "value": 15, "source": "LeanneWood", "target": "LlyrGruffydd" }, { "value": 7, "source": "LeanneWood", "target": "MarkDrakeford" }, { "value": 9, "source": "LeanneWood", "target": "NeilUKIP" }, { "value": 37, "source": "LeanneWood", "target": "RhunapIorwerth" }, { "value": 34, "source": "LeanneWood", "target": "SimonThomasAC" }, { "value": 74, "source": "LeanneWood", "target": "_Adam_Price" }, { "value": 10, "source": "LeanneWood", "target": "bethanjenkins" }, { "value": 7, "source": "LeanneWood", "target": "neiljmcevoy" }, { "value": 37, "source": "LeanneWood", "target": "siangwenfelin" }, { "value": 27, "source": "LeanneWood", "target": "steffanlewis" }, { "value": 5, "source": "LlyrGruffydd", "target": "AMCarwyn" }, { "value": 8, "source": "LlyrGruffydd", "target": "Amanwy" }, { "value": 6, "source": "LlyrGruffydd", "target": "AndrewRTDavies" }, { "value": 17, "source": "LlyrGruffydd", "target": "DarrenMillarAM" }, { "value": 47, "source": "LlyrGruffydd", "target": "ElinCeredigion" }, { "value": 6, "source": "LlyrGruffydd", "target": "ElisThomasD" }, { "value": 5, "source": "LlyrGruffydd", "target": "JennyRathbone" }, { "value": 5, "source": "LlyrGruffydd", "target": "Kirsty_Williams" }, { "value": 157, "source": "LlyrGruffydd", "target": "LeanneWood" }, { "value": 5, "source": "LlyrGruffydd", "target": "MarkIsherwoodAM" }, { "value": 7, "source": "LlyrGruffydd", "target": "NathanGillMEP" }, { "value": 6, "source": "LlyrGruffydd", "target": "RebeccaEvansAM" }, { "value": 44, "source": "LlyrGruffydd", "target": "RhunapIorwerth" }, { "value": 54, "source": "LlyrGruffydd", "target": "SimonThomasAC" }, { "value": 17, "source": "LlyrGruffydd", "target": "_Adam_Price" }, { "value": 14, "source": "LlyrGruffydd", "target": "bethanjenkins" }, { "value": 5, "source": "LlyrGruffydd", "target": "neiljmcevoy" }, { "value": 8, "source": "LlyrGruffydd", "target": "russ_george" }, { "value": 24, "source": "LlyrGruffydd", "target": "siangwenfelin" }, { "value": 6, "source": "LlyrGruffydd", "target": "steffanlewis" }, { "value": 5, "source": "MarkDrakeford", "target": "JulieMorganLAB" }, { "value": 154, "source": "MarkIsherwoodAM", "target": "AndrewRTDavies" }, { "value": 22, "source": "MarkIsherwoodAM", "target": "AngelaBurnsAM" }, { "value": 128, "source": "MarkIsherwoodAM", "target": "DarrenMillarAM" }, { "value": 7, "source": "MarkIsherwoodAM", "target": "ElinCeredigion" }, { "value": 5, "source": "MarkIsherwoodAM", "target": "Eluned_Morgan" }, { "value": 57, "source": "MarkIsherwoodAM", "target": "JFinchSaunders" }, { "value": 6, "source": "MarkIsherwoodAM", "target": "JennyRathbone" }, { "value": 8, "source": "MarkIsherwoodAM", "target": "Jeremy_Miles" }, { "value": 12, "source": "MarkIsherwoodAM", "target": "JulieMorganLAB" }, { "value": 8, "source": "MarkIsherwoodAM", "target": "KenSkatesAM" }, { "value": 6, "source": "MarkIsherwoodAM", "target": "LeanneWood" }, { "value": 18, "source": "MarkIsherwoodAM", "target": "LlyrGruffydd" }, { "value": 5, "source": "MarkIsherwoodAM", "target": "MickAntoniw1" }, { "value": 18, "source": "MarkIsherwoodAM", "target": "MikeHedgesAM" }, { "value": 11, "source": "MarkIsherwoodAM", "target": "NickRamsayAM" }, { "value": 14, "source": "MarkIsherwoodAM", "target": "RhunapIorwerth" }, { "value": 6, "source": "MarkIsherwoodAM", "target": "SimonThomasAC" }, { "value": 14, "source": "MarkIsherwoodAM", "target": "ann_jonesam" }, { "value": 12, "source": "MarkIsherwoodAM", "target": "bethanjenkins" }, { "value": 6, "source": "MarkIsherwoodAM", "target": "carolineUKIP" }, { "value": 10, "source": "MarkIsherwoodAM", "target": "hannahblythyn" }, { "value": 12, "source": "MarkIsherwoodAM", "target": "lesley4wrexham" }, { "value": 11, "source": "MarkIsherwoodAM", "target": "neiljmcevoy" }, { "value": 17, "source": "MarkIsherwoodAM", "target": "russ_george" }, { "value": 22, "source": "MarkIsherwoodAM", "target": "suzydaviesam" }, { "value": 26, "source": "MarkReckless", "target": "AMCarwyn" }, { "value": 5, "source": "MarkReckless", "target": "Amanwy" }, { "value": 22, "source": "MarkReckless", "target": "AndrewRTDavies" }, { "value": 8, "source": "MarkReckless", "target": "DavidRowlandsAM" }, { "value": 10, "source": "MarkReckless", "target": "Eluned_Morgan" }, { "value": 10, "source": "MarkReckless", "target": "KenSkatesAM" }, { "value": 10, "source": "MarkReckless", "target": "Kirsty_Williams" }, { "value": 21, "source": "MarkReckless", "target": "LeanneWood" }, { "value": 11, "source": "MarkReckless", "target": "MarkDrakeford" }, { "value": 8, "source": "MarkReckless", "target": "MickAntoniw1" }, { "value": 47, "source": "MarkReckless", "target": "NathanGillMEP" }, { "value": 18, "source": "MarkReckless", "target": "NeilUKIP" }, { "value": 12, "source": "MarkReckless", "target": "SimonThomasAC" }, { "value": 8, "source": "MarkReckless", "target": "bethanjenkins" }, { "value": 7, "source": "MarkReckless", "target": "carolineUKIP" }, { "value": 10, "source": "MarkReckless", "target": "huw4ogmore" }, { "value": 5, "source": "MarkReckless", "target": "neiljmcevoy" }, { "value": 29, "source": "MickAntoniw1", "target": "AMCarwyn" }, { "value": 31, "source": "MickAntoniw1", "target": "AlunDaviesAM" }, { "value": 7, "source": "MickAntoniw1", "target": "Amanwy" }, { "value": 11, "source": "MickAntoniw1", "target": "AndrewRTDavies" }, { "value": 7, "source": "MickAntoniw1", "target": "DavidReesAM" }, { "value": 6, "source": "MickAntoniw1", "target": "Dawn_Bowden" }, { "value": 6, "source": "MickAntoniw1", "target": "JBryantWales" }, { "value": 8, "source": "MickAntoniw1", "target": "JaneHutt" }, { "value": 8, "source": "MickAntoniw1", "target": "JennyRathbone" }, { "value": 12, "source": "MickAntoniw1", "target": "Jeremy_Miles" }, { "value": 6, "source": "MickAntoniw1", "target": "JulieMorganLAB" }, { "value": 10, "source": "MickAntoniw1", "target": "LeanneWood" }, { "value": 6, "source": "MickAntoniw1", "target": "MarkDrakeford" }, { "value": 5, "source": "MickAntoniw1", "target": "MikeHedgesAM" }, { "value": 12, "source": "MickAntoniw1", "target": "VikkiHowells" }, { "value": 9, "source": "MickAntoniw1", "target": "bethanjenkins" }, { "value": 6, "source": "MickAntoniw1", "target": "huw4ogmore" }, { "value": 6, "source": "MickAntoniw1", "target": "lesley4wrexham" }, { "value": 14, "source": "MickAntoniw1", "target": "vaughangething" }, { "value": 5, "source": "MikeHedgesAM", "target": "AlunDaviesAM" }, { "value": 12, "source": "MikeHedgesAM", "target": "Amanwy" }, { "value": 5, "source": "MikeHedgesAM", "target": "AndrewRTDavies" }, { "value": 18, "source": "MikeHedgesAM", "target": "DavidReesAM" }, { "value": 14, "source": "MikeHedgesAM", "target": "Dawn_Bowden" }, { "value": 11, "source": "MikeHedgesAM", "target": "Eluned_Morgan" }, { "value": 11, "source": "MikeHedgesAM", "target": "JBryantWales" }, { "value": 9, "source": "MikeHedgesAM", "target": "JFinchSaunders" }, { "value": 10, "source": "MikeHedgesAM", "target": "JennyRathbone" }, { "value": 17, "source": "MikeHedgesAM", "target": "Jeremy_Miles" }, { "value": 53, "source": "MikeHedgesAM", "target": "JulieJamesAM" }, { "value": 14, "source": "MikeHedgesAM", "target": "JulieMorganLAB" }, { "value": 5, "source": "MikeHedgesAM", "target": "KenSkatesAM" }, { "value": 10, "source": "MikeHedgesAM", "target": "LeanneWood" }, { "value": 6, "source": "MikeHedgesAM", "target": "MarkIsherwoodAM" }, { "value": 5, "source": "MikeHedgesAM", "target": "MickAntoniw1" }, { "value": 7, "source": "MikeHedgesAM", "target": "NickRamsayAM" }, { "value": 25, "source": "MikeHedgesAM", "target": "RebeccaEvansAM" }, { "value": 6, "source": "MikeHedgesAM", "target": "ann_jonesam" }, { "value": 12, "source": "MikeHedgesAM", "target": "bethanjenkins" }, { "value": 5, "source": "MikeHedgesAM", "target": "huw4ogmore" }, { "value": 18, "source": "MikeHedgesAM", "target": "lesley4wrexham" }, { "value": 17, "source": "MikeHedgesAM", "target": "suzydaviesam" }, { "value": 14, "source": "MikeHedgesAM", "target": "vaughangething" }, { "value": 12, "source": "MishBrownAM", "target": "MarkReckless" }, { "value": 19, "source": "MishBrownAM", "target": "NathanGillMEP" }, { "value": 27, "source": "MishBrownAM", "target": "NeilUKIP" }, { "value": 10, "source": "MishBrownAM", "target": "carolineUKIP" }, { "value": 21, "source": "MohammadAsghar", "target": "AndrewRTDavies" }, { "value": 8, "source": "MohammadAsghar", "target": "AngelaBurnsAM" }, { "value": 11, "source": "MohammadAsghar", "target": "DarrenMillarAM" }, { "value": 16, "source": "MohammadAsghar", "target": "JFinchSaunders" }, { "value": 6, "source": "MohammadAsghar", "target": "MarkIsherwoodAM" }, { "value": 7, "source": "MohammadAsghar", "target": "MikeHedgesAM" }, { "value": 37, "source": "MohammadAsghar", "target": "NickRamsayAM" }, { "value": 6, "source": "MohammadAsghar", "target": "russ_george" }, { "value": 13, "source": "NathanGillMEP", "target": "AndrewRTDavies" }, { "value": 13, "source": "NathanGillMEP", "target": "LeanneWood" }, { "value": 45, "source": "NathanGillMEP", "target": "MarkReckless" }, { "value": 8, "source": "NathanGillMEP", "target": "huw4ogmore" }, { "value": 8, "source": "NathanGillMEP", "target": "neiljmcevoy" }, { "value": 6, "source": "NeilUKIP", "target": "Amanwy" }, { "value": 10, "source": "NeilUKIP", "target": "AndrewRTDavies" }, { "value": 5, "source": "NeilUKIP", "target": "DaiLloydAM" }, { "value": 5, "source": "NeilUKIP", "target": "DavidRowlandsAM" }, { "value": 7, "source": "NeilUKIP", "target": "Eluned_Morgan" }, { "value": 9, "source": "NeilUKIP", "target": "GarethBennettAM" }, { "value": 5, "source": "NeilUKIP", "target": "JFinchSaunders" }, { "value": 5, "source": "NeilUKIP", "target": "Jeremy_Miles" }, { "value": 6, "source": "NeilUKIP", "target": "Kirsty_Williams" }, { "value": 12, "source": "NeilUKIP", "target": "LeanneWood" }, { "value": 22, "source": "NeilUKIP", "target": "MarkReckless" }, { "value": 6, "source": "NeilUKIP", "target": "MishBrownAM" }, { "value": 14, "source": "NeilUKIP", "target": "NathanGillMEP" }, { "value": 5, "source": "NeilUKIP", "target": "SimonThomasAC" }, { "value": 8, "source": "NeilUKIP", "target": "bethanjenkins" }, { "value": 14, "source": "NeilUKIP", "target": "carolineUKIP" }, { "value": 5, "source": "NeilUKIP", "target": "suzydaviesam" }, { "value": 7, "source": "NickRamsayAM", "target": "AlunDaviesAM" }, { "value": 10, "source": "NickRamsayAM", "target": "Amanwy" }, { "value": 29, "source": "NickRamsayAM", "target": "AndrewRTDavies" }, { "value": 7, "source": "NickRamsayAM", "target": "AngelaBurnsAM" }, { "value": 5, "source": "NickRamsayAM", "target": "DarrenMillarAM" }, { "value": 9, "source": "NickRamsayAM", "target": "ElisThomasD" }, { "value": 22, "source": "NickRamsayAM", "target": "JFinchSaunders" }, { "value": 7, "source": "NickRamsayAM", "target": "JennyRathbone" }, { "value": 11, "source": "NickRamsayAM", "target": "MarkIsherwoodAM" }, { "value": 5, "source": "NickRamsayAM", "target": "MickAntoniw1" }, { "value": 8, "source": "NickRamsayAM", "target": "MikeHedgesAM" }, { "value": 31, "source": "NickRamsayAM", "target": "MohammadAsghar" }, { "value": 5, "source": "NickRamsayAM", "target": "SimonThomasAC" }, { "value": 14, "source": "NickRamsayAM", "target": "bethanjenkins" }, { "value": 6, "source": "NickRamsayAM", "target": "rhi4islwyn" }, { "value": 9, "source": "NickRamsayAM", "target": "russ_george" }, { "value": 6, "source": "NickRamsayAM", "target": "suzydaviesam" }, { "value": 26, "source": "RebeccaEvansAM", "target": "AMCarwyn" }, { "value": 8, "source": "RebeccaEvansAM", "target": "AlunDaviesAM" }, { "value": 33, "source": "RebeccaEvansAM", "target": "Amanwy" }, { "value": 10, "source": "RebeccaEvansAM", "target": "DavidReesAM" }, { "value": 7, "source": "RebeccaEvansAM", "target": "Eluned_Morgan" }, { "value": 9, "source": "RebeccaEvansAM", "target": "JaneHutt" }, { "value": 5, "source": "RebeccaEvansAM", "target": "JennyRathbone" }, { "value": 24, "source": "RebeccaEvansAM", "target": "Jeremy_Miles" }, { "value": 24, "source": "RebeccaEvansAM", "target": "JulieJamesAM" }, { "value": 7, "source": "RebeccaEvansAM", "target": "JulieMorganLAB" }, { "value": 9, "source": "RebeccaEvansAM", "target": "KenSkatesAM" }, { "value": 9, "source": "RebeccaEvansAM", "target": "LeanneWood" }, { "value": 13, "source": "RebeccaEvansAM", "target": "MikeHedgesAM" }, { "value": 5, "source": "RebeccaEvansAM", "target": "ann_jonesam" }, { "value": 16, "source": "RebeccaEvansAM", "target": "huw4ogmore" }, { "value": 5, "source": "RebeccaEvansAM", "target": "lesley4wrexham" }, { "value": 26, "source": "RebeccaEvansAM", "target": "vaughangething" }, { "value": 13, "source": "RhunapIorwerth", "target": "Amanwy" }, { "value": 5, "source": "RhunapIorwerth", "target": "DaiLloydAM" }, { "value": 5, "source": "RhunapIorwerth", "target": "ElinCeredigion" }, { "value": 5, "source": "RhunapIorwerth", "target": "JulieMorganLAB" }, { "value": 68, "source": "RhunapIorwerth", "target": "LeanneWood" }, { "value": 11, "source": "RhunapIorwerth", "target": "LlyrGruffydd" }, { "value": 17, "source": "RhunapIorwerth", "target": "SimonThomasAC" }, { "value": 36, "source": "RhunapIorwerth", "target": "_Adam_Price" }, { "value": 15, "source": "RhunapIorwerth", "target": "bethanjenkins" }, { "value": 14, "source": "RhunapIorwerth", "target": "neiljmcevoy" }, { "value": 22, "source": "RhunapIorwerth", "target": "siangwenfelin" }, { "value": 6, "source": "SimonThomasAC", "target": "AMCarwyn" }, { "value": 17, "source": "SimonThomasAC", "target": "Amanwy" }, { "value": 6, "source": "SimonThomasAC", "target": "AndrewRTDavies" }, { "value": 6, "source": "SimonThomasAC", "target": "DaiLloydAM" }, { "value": 31, "source": "SimonThomasAC", "target": "ElinCeredigion" }, { "value": 5, "source": "SimonThomasAC", "target": "ElisThomasD" }, { "value": 5, "source": "SimonThomasAC", "target": "JaneHutt" }, { "value": 8, "source": "SimonThomasAC", "target": "Kirsty_Williams" }, { "value": 51, "source": "SimonThomasAC", "target": "LeanneWood" }, { "value": 12, "source": "SimonThomasAC", "target": "LlyrGruffydd" }, { "value": 14, "source": "SimonThomasAC", "target": "MarkReckless" }, { "value": 13, "source": "SimonThomasAC", "target": "MickAntoniw1" }, { "value": 5, "source": "SimonThomasAC", "target": "NeilUKIP" }, { "value": 7, "source": "SimonThomasAC", "target": "NickRamsayAM" }, { "value": 7, "source": "SimonThomasAC", "target": "RhunapIorwerth" }, { "value": 7, "source": "SimonThomasAC", "target": "VikkiHowells" }, { "value": 25, "source": "SimonThomasAC", "target": "_Adam_Price" }, { "value": 7, "source": "SimonThomasAC", "target": "bethanjenkins" }, { "value": 16, "source": "SimonThomasAC", "target": "huw4ogmore" }, { "value": 19, "source": "SimonThomasAC", "target": "siangwenfelin" }, { "value": 24, "source": "VikkiHowells", "target": "AMCarwyn" }, { "value": 15, "source": "VikkiHowells", "target": "AlunDaviesAM" }, { "value": 18, "source": "VikkiHowells", "target": "Amanwy" }, { "value": 22, "source": "VikkiHowells", "target": "Dawn_Bowden" }, { "value": 11, "source": "VikkiHowells", "target": "Eluned_Morgan" }, { "value": 8, "source": "VikkiHowells", "target": "JBryantWales" }, { "value": 6, "source": "VikkiHowells", "target": "JennyRathbone" }, { "value": 16, "source": "VikkiHowells", "target": "Jeremy_Miles" }, { "value": 6, "source": "VikkiHowells", "target": "JulieMorganLAB" }, { "value": 10, "source": "VikkiHowells", "target": "KenSkatesAM" }, { "value": 7, "source": "VikkiHowells", "target": "LeanneWood" }, { "value": 11, "source": "VikkiHowells", "target": "MarkReckless" }, { "value": 10, "source": "VikkiHowells", "target": "MickAntoniw1" }, { "value": 30, "source": "VikkiHowells", "target": "hef4caerphilly" }, { "value": 20, "source": "VikkiHowells", "target": "huw4ogmore" }, { "value": 7, "source": "VikkiHowells", "target": "rhi4islwyn" }, { "value": 13, "source": "VikkiHowells", "target": "vaughangething" }, { "value": 71, "source": "_Adam_Price", "target": "Amanwy" }, { "value": 30, "source": "_Adam_Price", "target": "ElinCeredigion" }, { "value": 9, "source": "_Adam_Price", "target": "Jeremy_Miles" }, { "value": 7, "source": "_Adam_Price", "target": "Kirsty_Williams" }, { "value": 102, "source": "_Adam_Price", "target": "LeanneWood" }, { "value": 5, "source": "_Adam_Price", "target": "LlyrGruffydd" }, { "value": 42, "source": "_Adam_Price", "target": "RhunapIorwerth" }, { "value": 32, "source": "_Adam_Price", "target": "SimonThomasAC" }, { "value": 12, "source": "_Adam_Price", "target": "bethanjenkins" }, { "value": 8, "source": "_Adam_Price", "target": "neiljmcevoy" }, { "value": 11, "source": "_Adam_Price", "target": "siangwenfelin" }, { "value": 59, "source": "ann_jonesam", "target": "AMCarwyn" }, { "value": 6, "source": "ann_jonesam", "target": "AlunDaviesAM" }, { "value": 14, "source": "ann_jonesam", "target": "AndrewRTDavies" }, { "value": 15, "source": "ann_jonesam", "target": "Carl4AandD" }, { "value": 20, "source": "ann_jonesam", "target": "DarrenMillarAM" }, { "value": 6, "source": "ann_jonesam", "target": "DavidReesAM" }, { "value": 11, "source": "ann_jonesam", "target": "ElinCeredigion" }, { "value": 8, "source": "ann_jonesam", "target": "JBryantWales" }, { "value": 14, "source": "ann_jonesam", "target": "JFinchSaunders" }, { "value": 18, "source": "ann_jonesam", "target": "JaneHutt" }, { "value": 5, "source": "ann_jonesam", "target": "JennyRathbone" }, { "value": 5, "source": "ann_jonesam", "target": "JoyceWatsonam" }, { "value": 6, "source": "ann_jonesam", "target": "JulieJamesAM" }, { "value": 6, "source": "ann_jonesam", "target": "JulieMorganLAB" }, { "value": 22, "source": "ann_jonesam", "target": "KenSkatesAM" }, { "value": 7, "source": "ann_jonesam", "target": "LeanneWood" }, { "value": 7, "source": "ann_jonesam", "target": "MikeHedgesAM" }, { "value": 23, "source": "ann_jonesam", "target": "RebeccaEvansAM" }, { "value": 7, "source": "ann_jonesam", "target": "SimonThomasAC" }, { "value": 9, "source": "ann_jonesam", "target": "bethanjenkins" }, { "value": 16, "source": "ann_jonesam", "target": "hannahblythyn" }, { "value": 5, "source": "ann_jonesam", "target": "huw4ogmore" }, { "value": 25, "source": "ann_jonesam", "target": "lesley4wrexham" }, { "value": 28, "source": "ann_jonesam", "target": "vaughangething" }, { "value": 29, "source": "bethanjenkins", "target": "Amanwy" }, { "value": 7, "source": "bethanjenkins", "target": "AndrewRTDavies" }, { "value": 47, "source": "bethanjenkins", "target": "DaiLloydAM" }, { "value": 8, "source": "bethanjenkins", "target": "Dawn_Bowden" }, { "value": 13, "source": "bethanjenkins", "target": "ElisThomasD" }, { "value": 6, "source": "bethanjenkins", "target": "Eluned_Morgan" }, { "value": 5, "source": "bethanjenkins", "target": "GarethBennettAM" }, { "value": 18, "source": "bethanjenkins", "target": "Jeremy_Miles" }, { "value": 10, "source": "bethanjenkins", "target": "KenSkatesAM" }, { "value": 41, "source": "bethanjenkins", "target": "LeanneWood" }, { "value": 9, "source": "bethanjenkins", "target": "MarkIsherwoodAM" }, { "value": 7, "source": "bethanjenkins", "target": "MarkReckless" }, { "value": 15, "source": "bethanjenkins", "target": "NeilUKIP" }, { "value": 5, "source": "bethanjenkins", "target": "NickRamsayAM" }, { "value": 6, "source": "bethanjenkins", "target": "RebeccaEvansAM" }, { "value": 14, "source": "bethanjenkins", "target": "RhunapIorwerth" }, { "value": 12, "source": "bethanjenkins", "target": "SimonThomasAC" }, { "value": 25, "source": "bethanjenkins", "target": "_Adam_Price" }, { "value": 5, "source": "bethanjenkins", "target": "hef4caerphilly" }, { "value": 5, "source": "bethanjenkins", "target": "neiljmcevoy" }, { "value": 6, "source": "bethanjenkins", "target": "siangwenfelin" }, { "value": 18, "source": "bethanjenkins", "target": "suzydaviesam" }, { "value": 6, "source": "carolineUKIP", "target": "DavidRowlandsAM" }, { "value": 23, "source": "carolineUKIP", "target": "GarethBennettAM" }, { "value": 8, "source": "carolineUKIP", "target": "Jeremy_Miles" }, { "value": 36, "source": "carolineUKIP", "target": "MarkReckless" }, { "value": 15, "source": "carolineUKIP", "target": "MishBrownAM" }, { "value": 77, "source": "carolineUKIP", "target": "NathanGillMEP" }, { "value": 41, "source": "carolineUKIP", "target": "NeilUKIP" }, { "value": 6, "source": "carolineUKIP", "target": "NickRamsayAM" }, { "value": 6, "source": "carolineUKIP", "target": "RhunapIorwerth" }, { "value": 7, "source": "carolineUKIP", "target": "_Adam_Price" }, { "value": 5, "source": "carolineUKIP", "target": "bethanjenkins" }, { "value": 6, "source": "carolineUKIP", "target": "suzydaviesam" }, { "value": 14, "source": "hannahblythyn", "target": "AMCarwyn" }, { "value": 8, "source": "hannahblythyn", "target": "Amanwy" }, { "value": 5, "source": "hannahblythyn", "target": "Carl4AandD" }, { "value": 8, "source": "hannahblythyn", "target": "Dawn_Bowden" }, { "value": 5, "source": "hannahblythyn", "target": "Eluned_Morgan" }, { "value": 15, "source": "hannahblythyn", "target": "JBryantWales" }, { "value": 20, "source": "hannahblythyn", "target": "Jeremy_Miles" }, { "value": 40, "source": "hannahblythyn", "target": "KenSkatesAM" }, { "value": 10, "source": "hannahblythyn", "target": "lesley4wrexham" }, { "value": 7, "source": "hannahblythyn", "target": "vaughangething" }, { "value": 8, "source": "hef4caerphilly", "target": "AMCarwyn" }, { "value": 5, "source": "hef4caerphilly", "target": "AlunDaviesAM" }, { "value": 40, "source": "hef4caerphilly", "target": "Amanwy" }, { "value": 9, "source": "hef4caerphilly", "target": "Dawn_Bowden" }, { "value": 6, "source": "hef4caerphilly", "target": "Eluned_Morgan" }, { "value": 21, "source": "hef4caerphilly", "target": "Jeremy_Miles" }, { "value": 17, "source": "hef4caerphilly", "target": "JulieMorganLAB" }, { "value": 6, "source": "hef4caerphilly", "target": "LlyrGruffydd" }, { "value": 32, "source": "hef4caerphilly", "target": "VikkiHowells" }, { "value": 9, "source": "hef4caerphilly", "target": "_Adam_Price" }, { "value": 9, "source": "hef4caerphilly", "target": "huw4ogmore" }, { "value": 9, "source": "hef4caerphilly", "target": "neiljmcevoy" }, { "value": 8, "source": "hef4caerphilly", "target": "rhi4islwyn" }, { "value": 6, "source": "hef4caerphilly", "target": "steffanlewis" }, { "value": 24, "source": "huw4ogmore", "target": "AMCarwyn" }, { "value": 18, "source": "huw4ogmore", "target": "Amanwy" }, { "value": 13, "source": "huw4ogmore", "target": "DavidReesAM" }, { "value": 7, "source": "huw4ogmore", "target": "Dawn_Bowden" }, { "value": 8, "source": "huw4ogmore", "target": "ElisThomasD" }, { "value": 8, "source": "huw4ogmore", "target": "JBryantWales" }, { "value": 10, "source": "huw4ogmore", "target": "JaneHutt" }, { "value": 11, "source": "huw4ogmore", "target": "Jeremy_Miles" }, { "value": 5, "source": "huw4ogmore", "target": "LlyrGruffydd" }, { "value": 5, "source": "huw4ogmore", "target": "MarkReckless" }, { "value": 10, "source": "huw4ogmore", "target": "SimonThomasAC" }, { "value": 14, "source": "huw4ogmore", "target": "VikkiHowells" }, { "value": 11, "source": "huw4ogmore", "target": "bethanjenkins" }, { "value": 7, "source": "huw4ogmore", "target": "suzydaviesam" }, { "value": 10, "source": "huw4ogmore", "target": "vaughangething" }, { "value": 28, "source": "lesley4wrexham", "target": "AMCarwyn" }, { "value": 11, "source": "lesley4wrexham", "target": "AlunDaviesAM" }, { "value": 6, "source": "lesley4wrexham", "target": "Amanwy" }, { "value": 12, "source": "lesley4wrexham", "target": "Carl4AandD" }, { "value": 8, "source": "lesley4wrexham", "target": "Dawn_Bowden" }, { "value": 8, "source": "lesley4wrexham", "target": "JBryantWales" }, { "value": 7, "source": "lesley4wrexham", "target": "JaneHutt" }, { "value": 7, "source": "lesley4wrexham", "target": "JennyRathbone" }, { "value": 12, "source": "lesley4wrexham", "target": "Jeremy_Miles" }, { "value": 7, "source": "lesley4wrexham", "target": "JulieMorganLAB" }, { "value": 24, "source": "lesley4wrexham", "target": "KenSkatesAM" }, { "value": 5, "source": "lesley4wrexham", "target": "MarkIsherwoodAM" }, { "value": 7, "source": "lesley4wrexham", "target": "MikeHedgesAM" }, { "value": 5, "source": "lesley4wrexham", "target": "RebeccaEvansAM" }, { "value": 8, "source": "lesley4wrexham", "target": "ann_jonesam" }, { "value": 24, "source": "lesley4wrexham", "target": "hannahblythyn" }, { "value": 11, "source": "lesley4wrexham", "target": "vaughangething" }, { "value": 6, "source": "lynne_neagle", "target": "AngelaBurnsAM" }, { "value": 41, "source": "neiljmcevoy", "target": "Amanwy" }, { "value": 24, "source": "neiljmcevoy", "target": "LeanneWood" }, { "value": 13, "source": "neiljmcevoy", "target": "MarkDrakeford" }, { "value": 8, "source": "neiljmcevoy", "target": "bethanjenkins" }, { "value": 17, "source": "rhi4islwyn", "target": "AMCarwyn" }, { "value": 6, "source": "rhi4islwyn", "target": "Eluned_Morgan" }, { "value": 7, "source": "rhi4islwyn", "target": "JennyRathbone" }, { "value": 6, "source": "rhi4islwyn", "target": "JoyceWatsonam" }, { "value": 5, "source": "rhi4islwyn", "target": "JulieMorganLAB" }, { "value": 8, "source": "rhi4islwyn", "target": "KenSkatesAM" }, { "value": 8, "source": "rhi4islwyn", "target": "LeanneWood" }, { "value": 6, "source": "rhi4islwyn", "target": "LlyrGruffydd" }, { "value": 6, "source": "rhi4islwyn", "target": "MarkReckless" }, { "value": 6, "source": "rhi4islwyn", "target": "NickRamsayAM" }, { "value": 5, "source": "rhi4islwyn", "target": "huw4ogmore" }, { "value": 6, "source": "rhi4islwyn", "target": "siangwenfelin" }, { "value": 9, "source": "rhi4islwyn", "target": "vaughangething" }, { "value": 5, "source": "russ_george", "target": "AlunDaviesAM" }, { "value": 48, "source": "russ_george", "target": "AndrewRTDavies" }, { "value": 8, "source": "russ_george", "target": "AngelaBurnsAM" }, { "value": 26, "source": "russ_george", "target": "DarrenMillarAM" }, { "value": 5, "source": "russ_george", "target": "ElinCeredigion" }, { "value": 7, "source": "russ_george", "target": "ElisThomasD" }, { "value": 9, "source": "russ_george", "target": "LlyrGruffydd" }, { "value": 7, "source": "russ_george", "target": "MarkIsherwoodAM" }, { "value": 9, "source": "russ_george", "target": "RebeccaEvansAM" }, { "value": 6, "source": "russ_george", "target": "SimonThomasAC" }, { "value": 7, "source": "russ_george", "target": "suzydaviesam" }, { "value": 5, "source": "siangwenfelin", "target": "Amanwy" }, { "value": 12, "source": "siangwenfelin", "target": "DaiLloydAM" }, { "value": 13, "source": "siangwenfelin", "target": "ElinCeredigion" }, { "value": 8, "source": "siangwenfelin", "target": "JGriffithsLab" }, { "value": 9, "source": "siangwenfelin", "target": "Jeremy_Miles" }, { "value": 150, "source": "siangwenfelin", "target": "LeanneWood" }, { "value": 24, "source": "siangwenfelin", "target": "LlyrGruffydd" }, { "value": 5, "source": "siangwenfelin", "target": "MarkIsherwoodAM" }, { "value": 43, "source": "siangwenfelin", "target": "RhunapIorwerth" }, { "value": 37, "source": "siangwenfelin", "target": "SimonThomasAC" }, { "value": 48, "source": "siangwenfelin", "target": "_Adam_Price" }, { "value": 9, "source": "siangwenfelin", "target": "bethanjenkins" }, { "value": 5, "source": "siangwenfelin", "target": "huw4ogmore" }, { "value": 15, "source": "siangwenfelin", "target": "neiljmcevoy" }, { "value": 19, "source": "siangwenfelin", "target": "steffanlewis" }, { "value": 5, "source": "siangwenfelin", "target": "vaughangething" }, { "value": 32, "source": "steffanlewis", "target": "LeanneWood" }, { "value": 6, "source": "suzydaviesam", "target": "Amanwy" }, { "value": 61, "source": "suzydaviesam", "target": "AndrewRTDavies" }, { "value": 22, "source": "suzydaviesam", "target": "AngelaBurnsAM" }, { "value": 10, "source": "suzydaviesam", "target": "DaiLloydAM" }, { "value": 7, "source": "suzydaviesam", "target": "DarrenMillarAM" }, { "value": 8, "source": "suzydaviesam", "target": "DavidReesAM" }, { "value": 6, "source": "suzydaviesam", "target": "ElinCeredigion" }, { "value": 6, "source": "suzydaviesam", "target": "Eluned_Morgan" }, { "value": 17, "source": "suzydaviesam", "target": "Jeremy_Miles" }, { "value": 5, "source": "suzydaviesam", "target": "JoyceWatsonam" }, { "value": 8, "source": "suzydaviesam", "target": "JulieJamesAM" }, { "value": 5, "source": "suzydaviesam", "target": "KenSkatesAM" }, { "value": 8, "source": "suzydaviesam", "target": "LeanneWood" }, { "value": 7, "source": "suzydaviesam", "target": "LlyrGruffydd" }, { "value": 8, "source": "suzydaviesam", "target": "MarkIsherwoodAM" }, { "value": 9, "source": "suzydaviesam", "target": "MickAntoniw1" }, { "value": 11, "source": "suzydaviesam", "target": "MikeHedgesAM" }, { "value": 6, "source": "suzydaviesam", "target": "NeilUKIP" }, { "value": 9, "source": "suzydaviesam", "target": "NickRamsayAM" }, { "value": 5, "source": "suzydaviesam", "target": "SimonThomasAC" }, { "value": 11, "source": "suzydaviesam", "target": "_Adam_Price" }, { "value": 58, "source": "suzydaviesam", "target": "bethanjenkins" }, { "value": 10, "source": "suzydaviesam", "target": "hannahblythyn" }, { "value": 8, "source": "suzydaviesam", "target": "huw4ogmore" }, { "value": 6, "source": "suzydaviesam", "target": "russ_george" }, { "value": 5, "source": "suzydaviesam", "target": "steffanlewis" }, { "value": 18, "source": "vaughangething", "target": "AMCarwyn" }, { "value": 8, "source": "vaughangething", "target": "AlunDaviesAM" }, { "value": 34, "source": "vaughangething", "target": "Amanwy" }, { "value": 7, "source": "vaughangething", "target": "DavidReesAM" }, { "value": 27, "source": "vaughangething", "target": "Dawn_Bowden" }, { "value": 8, "source": "vaughangething", "target": "Eluned_Morgan" }, { "value": 30, "source": "vaughangething", "target": "JBryantWales" }, { "value": 44, "source": "vaughangething", "target": "JaneHutt" }, { "value": 22, "source": "vaughangething", "target": "JennyRathbone" }, { "value": 14, "source": "vaughangething", "target": "Jeremy_Miles" }, { "value": 5, "source": "vaughangething", "target": "JoyceWatsonam" }, { "value": 5, "source": "vaughangething", "target": "JulieJamesAM" }, { "value": 8, "source": "vaughangething", "target": "JulieMorganLAB" }, { "value": 6, "source": "vaughangething", "target": "KenSkatesAM" }, { "value": 8, "source": "vaughangething", "target": "MarkDrakeford" }, { "value": 9, "source": "vaughangething", "target": "MickAntoniw1" }, { "value": 16, "source": "vaughangething", "target": "RebeccaEvansAM" }, { "value": 12, "source": "vaughangething", "target": "VikkiHowells" }, { "value": 14, "source": "vaughangething", "target": "ann_jonesam" }, { "value": 13, "source": "vaughangething", "target": "hannahblythyn" }, { "value": 5, "source": "vaughangething", "target": "hef4caerphilly" }, { "value": 7, "source": "vaughangething", "target": "huw4ogmore" }, { "value": 6, "source": "vaughangething", "target": "lesley4wrexham" }, { "value": 5, "source": "vaughangething", "target": "lynne_neagle" } ] } ================================================ FILE: examples/sample-article/media/code/d3/welsh.css ================================================ /* Michael Chorley, MIT License, 2018-04-25 */ /* https://bl.ocks.org/martinjc/7aa53c7bf3e411238ac8aef280bd6581 */ text { font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; } .link { fill: none; stroke: #ddd; stroke-width: 1px; } .node { stroke: #000; stroke-width: 1px; } ================================================ FILE: examples/sample-article/media/code/d3/welsh.js ================================================ /* Michael Chorley, MIT License, 2018-04-25 */ /* https://bl.ocks.org/martinjc/7aa53c7bf3e411238ac8aef280bd6581 */ // dimensions var width = 600; var height = 1200; var margin = { top: 20, bottom: 10, left: 5, right: 120, } // create an svg to draw in var svg = d3.select("#d3-welsh") .append("svg") .attr("width", width) .attr("height", height) .append('g') .attr('transform', 'translate(' + margin.top + ',' + margin.left + ')'); width = width - margin.left - margin.right; height = height - margin.top - margin.bottom; var simulation = d3.forceSimulation() // pull nodes together based on the links between them .force("link", d3.forceLink().id(function(d) { return d.id; }) .strength(0.025)) // push nodes apart to space them out .force("charge", d3.forceManyBody().strength(-300)) // add some collision detection so they don't overlap .force("collide", d3.forceCollide().radius(16)) // and draw them around the centre of the space .force("center", d3.forceCenter(width / 2, height / 2)); // load the graph // maybe this file belongs in the data directory? d3.json("external/code/d3/mention_network.json", function(error, graph) { // set the nodes var nodes = graph.nodes; // links between nodes var links = graph.links; // add the curved links to our graphic var link = svg.selectAll(".link") .data(links) .enter() .append("path") .attr("class", "link") .attr('stroke', function(d){ return "#ddd"; }); // add the nodes to the graphic var node = svg.selectAll(".node") .data(nodes) .enter().append("g") // a circle to represent the node node.append("circle") .attr("class", "node") .attr("r", 8) .attr("fill", function(d) { return d.colour; }) .on("mouseover", mouseOver(.2)) .on("mouseout", mouseOut); // hover text for the node node.append("title") .text(function(d) { return d.twitter; }); // add a label to each node node.append("text") .attr("dx", 12) .attr("dy", ".35em") .text(function(d) { return d.name; }) .style("stroke", "black") .style("stroke-width", 0.5) .style("fill", function(d) { return d.colour; }); // add the nodes to the simulation and // tell it what to do on each tick simulation .nodes(nodes) .on("tick", ticked); // add the links to the simulation simulation .force("link") .links(links); // on each tick, update node and link positions function ticked() { link.attr("d", positionLink); node.attr("transform", positionNode); } // links are drawn as curved paths between nodes, // through the intermediate nodes function positionLink(d) { var offset = 30; var midpoint_x = (d.source.x + d.target.x) / 2; var midpoint_y = (d.source.y + d.target.y) / 2; var dx = (d.target.x - d.source.x); var dy = (d.target.y - d.source.y); var normalise = Math.sqrt((dx * dx) + (dy * dy)); var offSetX = midpoint_x + offset*(dy/normalise); var offSetY = midpoint_y - offset*(dx/normalise); return "M" + d.source.x + "," + d.source.y + "S" + offSetX + "," + offSetY + " " + d.target.x + "," + d.target.y; } // move the node based on forces calculations function positionNode(d) { // keep the node within the boundaries of the svg if (d.x < 0) { d.x = 0 }; if (d.y < 0) { d.y = 0 }; if (d.x > width) { d.x = width }; if (d.y > height) { d.y = height }; return "translate(" + d.x + "," + d.y + ")"; } // build a dictionary of nodes that are linked var linkedByIndex = {}; links.forEach(function(d) { linkedByIndex[d.source.index + "," + d.target.index] = 1; }); // check the dictionary to see if nodes are linked function isConnected(a, b) { return linkedByIndex[a.index + "," + b.index] || linkedByIndex[b.index + "," + a.index] || a.index == b.index; } // fade nodes on hover function mouseOver(opacity) { return function(d) { // check all other nodes to see if they're connected // to this one. if so, keep the opacity at 1, otherwise // fade node.style("stroke-opacity", function(o) { thisOpacity = isConnected(d, o) ? 1 : opacity; return thisOpacity; }); node.style("fill-opacity", function(o) { thisOpacity = isConnected(d, o) ? 1 : opacity; return thisOpacity; }); // also style link accordingly link.style("stroke-opacity", function(o) { return o.source === d || o.target === d ? 1 : opacity; }); link.style("stroke", function(o){ return o.source === d || o.target === d ? o.source.colour : "#ddd"; }); }; } function mouseOut() { node.style("stroke-opacity", 1); node.style("fill-opacity", 1); link.style("stroke-opacity", 1); link.style("stroke", "#ddd"); } }); ================================================ FILE: examples/sample-article/media/code/haynes/3d-direction-vector.js ================================================ var listeners = function(ggb) { const tbody1 = document.getElementById('ggb_2__17_table1').getElementsByTagName('tbody')[0]; const a_to_b = document.getElementById('a_to_b'); // buttons const b_to_a = document.getElementById('b_to_a'); // update html (slate) when diagram changes function coordinates(){ return [[], xyz('A'), xyz('B')] } function cell(r,c) { tbody1.getElementsByTagName('tr')[r].getElementsByTagName('td')[c].innerHTML= coordinates()[r][c]; }; function xyz(obj){ return [[], ggb.getXcoord(obj).toFixed(0), ggb.getYcoord(obj).toFixed(0), ggb.getZcoord(obj).toFixed(0)] }; var updateSlate = function (){ for (let i = 1; i < 3; i++) { for(let j=1; j < 4; j++) cell(i,j) } // GGB booleans decide what to show, only one allowed at a time.; info = document.getElementById('info'); if (ggb.getValue('showAB')==true) { info.innerHTML = "\\[" + ggb.getValueString('textAB') + "\\] \\[" + ggb.getValueString('textABhat') + "\\]" ; } if (ggb.getValue('showBA')==true) { info.innerHTML = "\\[ " + ggb.getValueString('textBA') + "\\] \\[" + ggb.getValueString('textBAhat') + "\\]"; } if (window.MathJax) { MathJax.typesetPromise([info]).then(() => {}); } } a_to_b.addEventListener('click',function () { ggb.evalCommand('RunClickScript(atob)' )}); b_to_a.addEventListener('click',function () { ggb.evalCommand('RunClickScript(btoa)' )}); ggb.registerUpdateListener(updateSlate); updateSlate(); tbody1.getElementsByTagName('tr')[1].style.color='red'; tbody1.getElementsByTagName('tr')[2].style.color='blue'; } ================================================ FILE: examples/sample-article/media/code/jsxgraph/archimedian.js ================================================ /* http://jsxgraph.uni-bayreuth.de/wiki/index.php/Archimedean_spiral */ /* Accessed January 2017 */ var board = JXG.JSXGraph.initBoard('jsxgraph-archimedian-spiral', {boundingbox: [-10, 10, 10, -10]}); var a = board.create('slider', [[1,8],[5,8],[0,1,4]], {name:'a'}); var b = board.create('slider', [[1,9],[5,9],[0,0.25,4]], {name:'b'}); var c = board.create('curve', [function(phi){ return a.Value()+b.Value()*phi; }, [0, 0], 0, 8*Math.PI], {curveType:'polar', strokewidth:4} ); var g = board.create('glider', [c]); var t = board.create('tangent', [g], {dash:2, strokeColor:'#a612a9'}); var n = board.create('normal', [g], {dash:2, strokeColor:'#a612a9'}); ================================================ FILE: examples/sample-article/media/code/jsxgraph/bspline.js ================================================ /* https://jsxgraph.uni-bayreuth.de/wiki/index.php/B-splines */ /* Accessed August 2017 */ var brd = JXG.JSXGraph.initBoard('jsxgraph-bspline', {boundingbox:[-4,4,4,-4],keepaspectratio:true,axis:true}); var p = [], col = 'red'; p.push(brd.create('point',[2,1],{strokeColor:col,fillColor:col})); p.push(brd.create('point',[0.75,2.5],{strokeColor:col,fillColor:col})); p.push(brd.create('point',[-0.3,0.3],{strokeColor:col,fillColor:col})); p.push(brd.create('point',[-3,1],{strokeColor:col,fillColor:col})); p.push(brd.create('point',[-0.75,-2.5],{strokeColor:col,fillColor:col})); p.push(brd.create('point',[1.5,-2.8],{strokeColor:col,fillColor:col})); p.push(brd.create('point',[2,-0.5],{strokeColor:col,fillColor:col})); var c = brd.create('curve', JXG.Math.Numerics.bspline(p,4), {strokecolor:'blue', strokeOpacity:0.6, strokeWidth:5}); var addSegment = function() { brd.suspendUpdate(); p.push(brd.create('point',[Math.random()*8-4,Math.random()*8-4], {strokeColor:col,fillColor:col})); brd.unsuspendUpdate(); }; var removeSegment = function() { brd.suspendUpdate(); if (p.length>2) { brd.removeObject(p[p.length-1]); // remove the last point from the list of objects p.splice(p.length-1,1); // remove the last point from the point array. } brd.unsuspendUpdate(); }; ================================================ FILE: examples/sample-article/media/code/jsxgraph/cts-not-diff-oscillate.jc ================================================ $board.setView([-2,2,2,-2], false); point(0, 0) << id: 'OO', name: 'OO', fixed: true, priv: true, visible: false >>; point(1, 0) << id: 'E1', name: 'E1', fixed: true, priv: true, visible: false >>; point(0, 1) << id: 'E2', name: 'E2', fixed: true, priv: true, visible: false >>; xax = axis(OO, E1) << name: 'x' >>; yax = axis(OO, E2) << name: 'y' >>; xax.visible = false; yax.visible = false; f = function(x) { return x*sin(1/x); }; plot( function(x) {return f(x);} ) << strokeWidth: 2 >>; xax.visible = true; yax.visible = true; point(0,0) << id: "P", size: 2, color: "black", label: false >>; point(1,0) << id: "Q", size: 5, color: "red", label: false >>; Q.glide(xax); point( function() { return Q.X(); }, function() { return f(Q.X()); } ) << id: "R", label: false, size: 2, color: "black" >>; line(P,R) << color: "red", strokeWidth: 1 >>; ================================================ FILE: examples/sample-article/media/code/jsxgraph/fermats-spiral.js ================================================ /* https://jsxgraph.uni-bayreuth.de/wiki/index.php/Fermat%27s_spiral */ /* Accessed August 2017 */ var board = JXG.JSXGraph.initBoard('jsxgraph-fermats-spiral', {boundingbox: [-10, 10, 10, -10]}); var aa = board.create('slider', [[1,9], [5,9], [0,1,4]], {name:'a'}); var c1 = board.create('curve', [function(phi){ return aa.Value()*Math.sqrt(phi); }, [0, 0], 0, 8*Math.PI], {curveType:'polar', strokewidth:4}); var c2 = board.create('curve', [function(phi){ return -aa.Value()*Math.sqrt(phi); }, [0, 0], 0, 8*Math.PI], {curveType:'polar', strokewidth:4}); ================================================ FILE: examples/sample-article/media/code/jsxgraph/infinity.js ================================================ /* http://jsxgraph.uni-bayreuth.de/showcase/infinity.html */ /* Accessed January 2017 */ JXG.Options.renderer = 'canvas'; var board = JXG.JSXGraph.initBoard('jsxgraph-infinity', { boundingbox: [-9, 8, 9, -10], keepaspectreatio: true, axis: false, grid: false, shownavigation: false }); // construction board.suspendUpdate(); var S = board.create('slider', [[-5,-6],[5,-6],[0,0.85,1]], { name:'Whirl' }); var hue = board.create('slider', [[-5,-7],[5,-7],[0,20.5,36]], { name:'Colors' }); var points = new Array(); points[0] = board.create('point',[5, 5], {name:' '}); points[1] = board.create('point',[-5, 5], {name:' '}); points[2] = board.create('point',[-5, -5], {name:' '}); points[3] = board.create('point',[5, -5], {name:' '}); function quadrangle(pt, n) { var col; var arr = new Array(); for(var i = 0; i < 4; i++) { arr[i] = board.create('point', [function(t) { return function () {var x = pt[t].X(); var x1 = pt[(t+1)%4].X(); var s = S.Value(); return x+(x1-x)*s; }}(i), function(t) { return function () {var y = pt[t].Y(); var y1 = pt[(t+1)%4].Y(); var s = S.Value(); return y+(y1-y)*s; }}(i) ], {size:1, name: "", withLabel: false, visible: false}); } col = function(){return JXG.hsv2rgb(hue.Value()*n,0.7,0.9);}; board.create('polygon',pt, {fillColor:col}); if(n>0) quadrangle(arr, --n); } quadrangle(points,30); board.unsuspendUpdate(); ================================================ FILE: examples/sample-article/media/code/jsxgraph/piecewise.js ================================================ /* From Lila Roberts (?), August 2017 */ var board_p3 = JXG.JSXGraph.initBoard('box_p3', {boundingbox: [-6, 8, 4, -8], axis: true,grid:true,showCopyright:false,showNavigation:false}); var board2_p3 = JXG.JSXGraph.initBoard('box2_p3', {boundingbox: [-6, 8, 4, -8],axis:true,grid:true,showCopyright:false,showNavigation:false}); var board3_p3 = JXG.JSXGraph.initBoard('box3_p3', {boundingbox: [-6, 8, 4, -8],axis:true,grid:true,showCopyright:false,showNavigation:false}); board_p3.renderer.container.style.backgroundColor = '#ffcc99'; // background color board board2_p3.renderer.container.style.backgroundColor = '#ffcc99'; board3_p3.renderer.container.style.backgroundColor = '#ffcc99'; var xax1_p3 = board_p3.create('axis', [[0,0], [0,1]]); var yax1_p3 = board_p3.create('axis', [[0,0], [1,0]]); var xax2_p3 = board2_p3.create('axis', [[0,0], [0,1]]); var yax2_p3 = board2_p3.create('axis',[[0,0],[1,0]]); var xax3_p3 = board3_p3.create('axis',[[0,0], [0,1]]); var yax3_p3 = board3_p3.create('axis',[[0,0],[1,0]]); board_p3.create('ticks',[xax1_p3,[-6,-5,-4,-3,-2,-1,0,1,2,3,4]]); board_p3.create('ticks',[yax1_p3,[-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8]]); board2_p3.create('axis', [[0,0], [0,1]]); board2_p3.create('ticks',[xax2_p3,[-6,-5,-4,-3,-2,-1,0,1,2,3,4]]); board2_p3.create('ticks',[yax2_p3,[-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8]]); board3_p3.create('axis',[[0,0],[0,1]]); board3_p3.create('ticks',[xax3_p3,[-6,-5,-4,-3,-2,-1,0,1,2,3,4]]); board3_p3.create('ticks',[yax3_p3,[-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8]]); var f_p3 = function(x) { if (x >=-4 && x < 1) { return -(x+2)*(x+2) + 2; } else if (x >= 1 && x <= 3) { return x*x-x; } else {return -1000; } }; var dfun_p3 = function(x) { if (x>=-4 && x<0.7) { return x; } else if (x> 1.3 && x <= 3) { return x; } else {return -1000; } }; graph_p3=board_p3.create('functiongraph',[f_p3,-4,3],{strokeColor:'#000000'}); var ep1_p3=board_p3.create('point',[-4,-2],{strokeColor:'#000000',fillColor:'#000000',name:''}); var ep2_p3=board_p3.create('point',[1,-7],{strokeColor:'#000000',fillColor:'#FFFFFF',name:''}); var ep3_p3=board_p3.create('point',[1,0],{strokeColor:'#000000',fillColor:'#FFFFFF',name:''}); var ep4_p3=board_p3.create('point',[3,6],{strokeColor:'#000000',fillColor:'#000000',name:''}); ep1_p3.setAttribute({fixed:true}); ep2_p3.setAttribute({fixed:true}); ep3_p3.setAttribute({fixed:true}); ep4_p3.setAttribute({fixed:true}); var s_p3 = board_p3.create('slider',[[-4.5,-7],[-1,-7],[-4,-4,3]]); var tracepoint_p3=board_p3.create('point',[function() {return dfun_p3(s_p3.Value());},function() {return f_p3(s_p3.Value());}],{name:''}); // domain: var b2p1_p3 = board2_p3.create('point', [function(){return tracepoint_p3.X()},0], {fixed: true, trace: true, strokeColor: '#ff0000', name: 'D'}); // cosine: var b2p2_p3 = board3_p3.create('point', [ 0, function(){return tracepoint_p3.Y();}], {fixed: true, trace: true, strokeColor: '#0000ff', fillColor:'#0000ff',name: 'R'}); // Dependencies (only necessary if b2p1 or b2p2 is deleted) board_p3.addChild(board2_p3); board_p3.addChild(board3_p3); function clearTraces_p3() { JXG.JSXGraph.freeBoard(board_p3); JXG.JSXGraph.freeBoard(board2_p3); JXG.JSXGraph.freeBoard(board3_p3); board_p3 = JXG.JSXGraph.initBoard('box_p3', {boundingbox: [-6, 8, 4, -8],axis: true,grid:true,showCopyright:false,showNavigation:false}); board2_p3 = JXG.JSXGraph.initBoard('box2_p3', {boundingbox: [-6, 8, 4, -8],axis:true,grid:true,showCopyright:false,showNavigation:false}); board3_p3 = JXG.JSXGraph.initBoard('box3_p3', {boundingbox: [-6, 8, 4, -8],axis:true,grid:true,showCopyright:false,showNavigation:false}); xax1_p3 = board_p3.create('axis', [[0,0], [0,1]]); yax1_p3 = board_p3.create('axis', [[0,0], [1,0]]); xax2_p3 = board2_p3.create('axis', [[0,0], [0,1]]); yax2_p3 = board2_p3.create('axis',[[0,0],[1,0]]); xax3_p3 = board3_p3.create('axis',[[0,0], [0,1]]); yax3_p3 = board3_p3.create('axis',[[0,0],[1,0]]); board_p3.create('ticks',[xax1_p3,[-6,-5,-4,-3,-2,-1,0,1,2,3,4]]); board_p3.create('ticks',[yax1_p3,[-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8]]); board2_p3.create('axis', [[0,0], [0,1]]); board2_p3.create('ticks',[xax2_p3,[-6,-5,-4,-3,-2,-1,0,1,2,3,4]]); board2_p3.create('ticks',[yax2_p3,[-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8]]); board3_p3.create('axis',[[0,0],[0,1]]); board3_p3.create('ticks',[xax3_p3,[-6,-5,-4,-3,-2,-1,0,1,2,3,4]]); board3_p3.create('ticks',[yax3_p3,[-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8]]); f_p3 = function(x) { if (x >=-4 && x < 1) { return -(x+2)*(x+2) + 2; } else if (x >= 1 && x <= 3) { return x*x-x; } else {return -1000; } }; dfun_p3 = function(x) { if (x>=-4 && x<0.7) { return x; } else if (x> 1.3 && x <= 3) { return x; } else {return -1000; } }; graph_p3=board_p3.create('functiongraph',[f_p3,-4,3],{strokeColor:'#000000'}); ep1_p3=board_p3.create('point',[-4,-2],{strokeColor:'#000000',fillColor:'#000000',name:''}); ep2_p3=board_p3.create('point',[1,-7],{strokeColor:'#000000',fillColor:'#FFFFFF',name:''}); ep3_p3=board_p3.create('point',[1,0],{strokeColor:'#000000',fillColor:'#FFFFFF',name:''}); ep4_p3=board_p3.create('point',[3,6],{strokeColor:'#000000',fillColor:'#000000',name:''}); ep1_p3.setAttribute({fixed:true}); ep2_p3.setAttribute({fixed:true}); ep3_p3.setAttribute({fixed:true}); ep4_p3.setAttribute({fixed:true}); s_p3 = board_p3.create('slider',[[-4.5,-7],[-1,-7],[-4,-4,3]]); tracepoint_p3=board_p3.create('point',[function() {return dfun_p3(s_p3.Value());},function() {return f_p3(s_p3.Value());}],{name:''});// domain: b2p1_p3 = board2_p3.create('point', [function(){return tracepoint_p3.X()},0], {fixed: true, trace: true, strokeColor: '#ff0000', name: 'D'}); // cosine: b2p2_p3 = board3_p3.create('point', [ 0, function(){return tracepoint_p3.Y();}], {fixed: true, trace: true, strokeColor: '#0000ff', fillColor:'#0000ff',name: 'R'}); // Dependencies (only necessary if b2p1 or b2p2 is deleted) board_p3.addChild(board2_p3); board_p3.addChild(board3_p3); } // Animation var animated = false; function animate_p3(point, direction, count) { if(animated) { point.stopAnimation(); animated = false; } else { point.startAnimation(direction, count); animated = true; } } // Generic Hide/Show function toggle(id) { var state = document.getElementById(id).style.display; if (state == 'block') { document.getElementById(id).style.display = 'none'; } else { document.getElementById(id).style.display = 'block'; } } ================================================ FILE: examples/sample-article/media/code/mcclure/slope.css ================================================ /* From Mark McClure, 2018-06-24 */ /* https://marksmath.org/visualization/slope/ */ /* Changes: #h_info_container to 75% width */ body { margin: auto; background: #F0F0F0; font-family: sans-serif; } main { /* overflow: auto; */ border-bottom: 1px solid darkslategray; padding-bottom: 20px; } h1 { padding-left: 10px; border-bottom: 1px solid darkslategray; } .p { padding: 10px; } .em_display { text-align: center; font-style: italic; font-weight: bold; padding: 20px; } .svg_container { margin: 0 auto; } svg { background: white; border: 1px solid darkslategray; margin-top: 20px; margin-bottom: 20px; } .function_radio_container { padding-left: 30px; } #h_info_container { width: 75%; margin: 0 auto; } ================================================ FILE: examples/sample-article/media/code/mcclure/slope.js ================================================ /* From Mark McClure, 2018-06-24 */ /* https://marksmath.org/visualization/slope/ */ /* Changes: body_width and SVG size */ var body_width = 600; $("body").css("width", body_width); var svg_width = 600, svg_height = 400, graph_padding = 20; $("#the_graph").css("margin-left", (body_width-svg_width)/2); var svg = d3.select("#the_graph") .attr("width", svg_width) .attr("height", svg_height); $("#f1").prop('checked',true); // The action! setup_scale_and_axes(); draw("first_time"); // The functions with global variables declared outside the scope of the function var xmin, xmax, ymin, ymax, graph, f, fp; var xScale, xScaleInverse, yScale, yScaleInverse, rScale, pts_to_path; function setup_scale_and_axes() { "use strict"; xmin = -2; xmax = 2; ymin = -0.5; ymax = 2; xScale = d3.scale.linear() .domain([xmin,xmax]) .range([graph_padding, svg_width - graph_padding]); yScale = d3.scale.linear() .domain([ymin,ymax]) .range([svg_height - graph_padding, graph_padding]); xScaleInverse = d3.scale.linear() .range([xmin,xmax]) .domain([graph_padding, svg_width - graph_padding]); yScaleInverse = d3.scale.linear() .range([ymin,ymax]) .domain([svg_height - graph_padding, graph_padding]); rScale = d3.scale.linear() .domain([0,xmax-xmin]) .range([0, svg_width - graph_padding]); pts_to_path = d3.svg.line() .x(function(d) { return xScale(d[0]); }) .y(function(d) { return yScale(d[1]); }) .interpolate("linear"); svg.append("g").append("path") .attr("d", pts_to_path([[xmin,0],[xmax,0]])) .attr("stroke", "#333") .attr("stroke-width", 1) .attr("fill", "none"); svg.append("g").append("path") .attr("d", pts_to_path([[0,ymin],[0,ymax]])) .attr("stroke", "#333") .attr("stroke-width", 1) .attr("fill", "none"); var x_ticks = []; for(var i=xmin; i<=xmax; i=i+0.25){ x_ticks.push([[i,0], [i,-0.05]]) } svg.append("g") .selectAll("path") .data(x_ticks) .enter().append("path") .attr("d", function(d) {return pts_to_path(d)}) .attr("stroke", "black") .attr("stroke-width", 0.4) .attr("class", "ticks"); var tick_labels = [-2,-1,1,2]; svg.append("g") .selectAll("text") .data(tick_labels) .enter().append("text") .attr("text-anchor", "middle") .attr("x", function(d) {return xScale(d)}) .attr("y", yScale(0.14)) .attr("dy", "0.35em") .attr("font-size", "18px") .text(function(d) {return d}); var y_ticks = []; for(var i=ymin; i<=ymax; i=i+0.25){ y_ticks.push([[-0.03,i], [0,i]]) } svg.append("g") .selectAll("path") .data(y_ticks) .enter().append("path") .attr("d", function(d) {return pts_to_path(d)}) .attr("stroke", "black") .attr("stroke-width", 0.4) .attr("class", "ticks"); var tick_labels = [-1,1,2,3]; svg.append("g") .selectAll("text") .data(tick_labels) .enter().append("text") .attr("text-anchor", "middle") .attr("x", xScale(-0.07)) .attr("y", function(d) {return yScale(d)} ) .attr("dy", "0.35em") .attr("font-size", "18px") .text(function(d) {return d}); } function draw() { "use strict"; // Get and define the function define_function(); var graph_points = []; var dx = 0.01; var x,y; for(x = xmin; x<=xmax+dx; x=x+dx) { y = f(x); graph_points.push([x,y]); } graph = svg.append("g") .attr("class", "graph"); graph.append("path") .attr("d", pts_to_path(graph_points)) .attr("stroke", "black") .attr("stroke-width", 3) .attr("fill", "none"); } function draw_transition() { svg.selectAll("circle").remove(); svg.selectAll(".tangent_line_graph") .style("opacity",1) .transition().duration(400) .style("opacity",0); svg.selectAll(".secant_line_graph") .style("opacity",1) .transition().duration(400) .style("opacity",0); window.setTimeout( function() { svg.selectAll(".tangent_line_graph").remove(); svg.selectAll(".secant_line_graph").remove(); }, 200 ); var graph_points1 = []; var graph_points2 = []; var graph_points3 = []; var dx = 0.01; var f1 = f; define_function(); var f2 = f; var x,y; for(x = xmin; x<=xmax+dx; x=x+dx) { y = f1(x); graph_points1.push([x,y]); } for(x = xmin; x<=xmax+dx; x=x+dx) { graph_points2.push([x,0]); } for(x = xmin; x<=xmax+dx; x=x+dx) { y = f2(x); graph_points3.push([x,y]); } svg.selectAll(".graph").remove(); svg.append("g") .attr("class", "graph") .append("path") .attr("stroke", "black") .attr("stroke-width", 3) .attr("fill", "none") .attr("d", pts_to_path(graph_points1)) .transition().duration(600) .attr("d", pts_to_path(graph_points2)) .transition().duration(400) .attr("d", pts_to_path(graph_points3)); window.setTimeout(function () { draw_tangent_line(x0); if($("#show_secant_checkbox").is(':checked')) { draw_secant_line(x0,h) } }, 1000); window.setTimeout(function () { add_xh_marker(x0, h, f1, f2) }, 1000); } function define_function() { var function_input = $("input:radio[name=function]:checked").val(); if(function_input == "f1"){ f = function(x) { return x*x; } fp = function(x) { return 2*x; } } else if(function_input == "f2"){ f = function(x) { return Math.exp(x)/3; } fp = function(x) { return Math.exp(x)/3; } } else if(function_input == "f3"){ f = function(x) { return Math.sin(2*x*x) + x/3;; } fp = function(x) { return 4*x*Math.cos(2*x*x) + 1/3; } } } $(".radio").click(draw_transition); function add_xh_marker(x0_in, h, f1, f2) { svg.selectAll("circle").remove(); var h_active = $("#show_secant_checkbox").is(':checked'); if(f2) { var ff = f2; } else { var ff = f1; } x0=x0_in; x_marker_active = false; x_marker = svg.append("circle") .attr("class", "x_marker") .attr("cx", function(d) { return xScale(x0)}) .attr("cy", function(d) {return yScale(ff(x0))}) .attr("r", function(d) {return rScale(0.02)}) .attr("fill", "lightgreen") .attr("stroke", "black") .attr("stroke-width", 1); if(h_active) { h_marker = svg.append("circle") .attr("class", "h_marker") .attr("cx", function(d) { return xScale(x0+h)}) .attr("cy", function(d) {return yScale(ff(x0+h))}) .attr("r", function(d) {return rScale(0.02)}) .attr("fill", "red") .attr("stroke", "black") .attr("stroke-width", 1); } // x_marker // .on("mouseenter", function() { // x_marker.attr("fill", "black") // }) // .on("mouseleave", function() { // if(x_marker_active == false) { // x_marker.attr("fill", "darkgreen") // } // }); svg .on("mousedown", function() { x_marker_active = true; x_marker.attr("fill", "darkgreen"); var pos = d3.mouse(this); x0=xScaleInverse(pos[0]); x_marker .attr("cx", pos[0]) .attr("cy", yScale(ff(x0))); // h_marker.attr("fill", "black"); if($("#show_secant_checkbox").is(':checked')) { h_marker .attr("cx", xScale(x0+h)) .attr("cy", yScale(ff(x0+h))); draw_secant_line(x0,h); } draw_tangent_line(x0); }) .on("mouseup", function() { x_marker_active = false; x_marker.attr("fill", "lightgreen"); // h_marker.attr("fill", "lightred"); add_xh_marker(x0, h, f); }) .on("mousemove", function() { if(x_marker_active == true){ var pos = d3.mouse(this); x0=xScaleInverse(pos[0]); x_marker .attr("cx", pos[0]) .attr("cy", yScale(ff(x0))); $("#tangent_value_display") .text(math.format(fp(x0,h),{notation: 'fixed', precision: 2})); if($("#show_secant_checkbox").is(':checked')) { $("#secant_value_display") .text(math.format(secant_slope(x0,h),{notation: 'fixed', precision: 2})); h_marker .attr("cx", xScale(x0+h)) .attr("cy", yScale(ff(x0+h))); draw_secant_line(x0,h); } draw_tangent_line(x0); } }) } function tangent_line(x0, x) { return f(x0) + fp(x0)*(x-x0); } function draw_tangent_line(x0) { svg.selectAll(".tangent_line_graph").remove(); var tangent_line_points = []; var dx = 0.1; var x,y; for(x = xmin; x<=xmax+dx; x=x+dx) { y = tangent_line(x0,x); tangent_line_points.push([x,y]); } graph = svg.append("g") .attr("class", "tangent_line_graph"); graph.append("path") .attr("d", pts_to_path(tangent_line_points)) .attr("stroke", "black") .attr("stroke-width", 1) .attr("fill", "none"); } function secant_slope(x0,h) { if(h != 0) { return (f(x0+h)-f(x0))/h; } else {return "error!"} } function secant_line(x,x0,h) { if(h != 0) { return f(x0) + ((f(x0+h)-f(x0))/h)*(x-x0) } } function draw_secant_line(x0,h) { if(h != 0) { svg.selectAll(".secant_line_graph").remove(); var secant_line_points = []; var dx = 0.1; var x,y; for(x = xmin; x<=xmax+dx; x=x+dx) { y = secant_line(x,x0,h); secant_line_points.push([x,y]); } svg.append("g") .attr("class", "secant_line_graph") .append("path") .attr("d", pts_to_path(secant_line_points)) .attr("stroke", "black") .attr("stroke-width", 1) .attr("fill", "none"); } } var x0 = 0.4; var h = 0.3; $("#h_slider") .val(h) .attr("disabled", true) .on("input", function(event) { h = Number(this.value); draw_secant_line(x0,h); add_xh_marker(x0,h,f); $("#h_value_display").text(h); $("#secant_value_display") .text(math.format(secant_slope(x0,h),{notation: 'fixed', precision: 2})); }); $("#h_value_display").text(); //$("#show_secant_checkbox").is(':checked') $("#show_secant_checkbox") .prop('checked', false) .on('click', function() { var is_checked = $("#show_secant_checkbox").is(':checked'); if(is_checked) { draw_secant_line(x0,h); add_xh_marker(x0, h, f); $("#h_slider").attr("disabled", false); $("#h_value_display").text(h); $(".dimit").fadeTo(400,1); $("#secant_value_display") .text(math.format(secant_slope(x0,h),{notation: 'fixed', precision: 2})); } else { svg.selectAll(".secant_line_graph").remove(); svg.selectAll(".h_marker").remove(); $("#h_slider").attr("disabled", true); $("#h_value_display").text(""); $(".dimit").fadeTo(300,0.2) $("#secant_value_display").text(""); } }); draw_tangent_line(x0); $("#tangent_value_display").text(math.format(fp(x0),{notation: 'fixed', precision: 2})); // draw_secant_line(x0,h); add_xh_marker(x0, h, f); $(".dimit").fadeTo(0,0.2); ================================================ FILE: examples/sample-article/media/code/roesler/kinematics.js ================================================ /*************** * kinematics.js * * a jsxgraph interactive demo for 1-dimensional kinematics with constant acceleration * * in this example, a ball is thrown upward with an initial velocity of 30 m/s * * the user can use the time slider in board_t to vary the vertical displacement, velocity * and acceleration in the other boards * * Rick Roesler * San Diego, CA * YourPhysicsCoach@gmail.com * ****************/ const displacement = (v0, a, t) => v0*t + 0.5*a*t*t; const velocity = (v0, a, t) => v0 + a*t; const acceleration = (v0, a, t) => a; // initialize the board; we'll create our own custom axes const newboard = (name,title,yaxislabel,units,tmin,tmax,ymin,ymax,f) => { brd = JXG.JSXGraph.initBoard(name, {boundingbox: [tmin, ymax, tmax, ymin], axis:false, grid:false, showCopyright:false, showNavigation:false }); // add a title to the board in the upper right corner brd.create('text',[5,ymax-0.05*(ymax-ymin),title]); // create the x-axis (time) xaxis = brd.create('axis', [[-0.5, 0], [1,0]], {name:'t (s)', withLabel:true, label: {position: 'rt', offset: [-15, -15]}}); // R. Beezer, 2024-04-19: upgrading JSXGraph to 1.0.8 causes // errors when trying to adjust tick marks, So we comment-out // the manipulations and live with the result, since we cannot // find an adequate way to remove the defaults. In particular // // xaxis.removeTicks(xaxis.defaultTicks); // // as suggested by the JSXGraph wiki does not seem to work. // The only downside is that there are some tickmarks // with negative values // remove default tickmarks // R. Beezer, 2024-04-19: commented-out next line //xaxis.removeAllTicks(); // create custom tickmarks // TODO - these values should not be hard-coded // R. Beezer, 2024-04-19: commented-out next line // brd.create('ticks',[xaxis,[1,2,3,4,5,6]], {drawLabels:true,label: {offset: [-3, -15]}}); // create the y-axis yaxis = brd.create('axis', [[0, 0], [0,1]], {name:yaxislabel + ' ' + units, withLabel:true, label: {position: 'rt', offset: [10, 0]}}); // plot the function brd.create('functiongraph',[t => f(initialVelocity,gravAcceleration,t),0,6],{strokeColor:'#000000'}); // create a gliding point along the function curve const x = brd.create('point',[() => time.Value(), () => f(initialVelocity,gravAcceleration,time.Value())],{name:''}); // create the vector brd.create('arrow',[[-2,0],[-2,() => x.Y()]]); // hide the left-most part of the x (t) axis; we should be able to use xaxis.setStraight(false,true), but it's not working brd.create('polygon',[[-3,-0.5],[-3,0.5],[-0.5,0.5],[-0.5,-0.5],[-3,-0.5]],{color:'white', withLines:false, fillOpacity:1,vertices: {visible:false}}); return brd; } // initialize vertical velocity and gravitational acceleration ("g") const initialVelocity = 30; const gravAcceleration = -10; // create the time slider board; this will be the parent of the other boards // TODO - seems like all this should be delegated to a function const board_t = JXG.JSXGraph.initBoard('box_t', {boundingbox:[-3, 1.5, 7, -1],axis:false,showCopyright:false,showNavigation:false}); // add a title to the time slider board_t.create('text',[5,0.9,'Time']); // create the custom t-axis taxis = board_t.create('axis', [[-0.5, 0], [1,0]], {name:'t (s)',withLabel:true,label: {position: 'rt',offset: [-15, -15]}}); taxis.setStraight(false,true); // R. Beezer, 2024-04-19: commented-out next two lines // taxis.removeAllTicks(); // board_t.create('ticks',[taxis,[1,2,3,4,5,6]], {drawLabels:true,label: {offset: [-3, -15]}}); // create the actual slider; the 'time' variable will be used in the other boards const time = board_t.create('slider',[[0,0],[6,0],[0,0,6]]); // create the displacement board const board_s = newboard('box_s','Displacement','s','(m)',-3,7,-5,50,displacement); board_t.addChild(board_s); // create the velocity board const board_v = newboard('box_v','Velocity','v','(m · s-1)',-3,7,-35,35,velocity); board_t.addChild(board_v); // create the acceleration board const board_a = newboard('box_a','Acceleration','a','(m · s-2)',-3,7,-15,5,acceleration); board_t.addChild(board_a); ================================================ FILE: examples/sample-article/media/code/splice/splice-resize.js ================================================ const bodyEl = document.body; bodyEl.style.background = 'red'; const growBtn = document.createElement('button'); growBtn.textContent = 'Grow'; document.currentScript.parentElement.appendChild(growBtn); growBtn.addEventListener('click', () => { const currentHeight = bodyEl.clientHeight; const newHeight = currentHeight + 100; bodyEl.style.height = `${newHeight}px`; window.parent.postMessage( { subject: 'lti.frameResize', height: newHeight, }, '*' ) }); ================================================ FILE: examples/sample-article/media/code/threejs/catenoid.js ================================================ var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer( { antialias: true } ); renderer.setSize( window.innerWidth, window.innerHeight - 5 ); renderer.setClearColor( 0xfff000, 1 ); // RAB edit 2021-08-10 // document.body.appendChild( renderer.domElement ); var renderDiv = document.getElementById("threejs-catenoid-surface"); renderDiv.appendChild( renderer.domElement ); var options = {"aspect_ratio": [1.0, 1.0, 1.0], "decimals": 2, "frame": true, "axes": false, "axes_labels": ["x", "y", "z"]}; // When animations are supported by the viewer, the value 'false' // will be replaced with an option set in Python by the user var animate = false; // options.animate; var b = [{"x":-10.0676619958, "y":-10.0594971035, "z":-3.0}, {"x":10.0350156701, "y":10.0594971035, "z":3.0}]; // bounds if ( b[0].x === b[1].x ) { b[0].x -= 1; b[1].x += 1; } if ( b[0].y === b[1].y ) { b[0].y -= 1; b[1].y += 1; } if ( b[0].z === b[1].z ) { b[0].z -= 1; b[1].z += 1; } var rRange = Math.sqrt( Math.pow( b[1].x - b[0].x, 2 ) + Math.pow( b[1].x - b[0].x, 2 ) ); var xRange = b[1].x - b[0].x; var yRange = b[1].y - b[0].y; var zRange = b[1].z - b[0].z; var ar = options.aspect_ratio; var a = [ ar[0], ar[1], ar[2] ]; // aspect multipliers var autoAspect = 2.5; if ( zRange > autoAspect * rRange && a[2] === 1 ) a[2] = autoAspect * rRange / zRange; var xMid = ( b[0].x + b[1].x ) / 2; var yMid = ( b[0].y + b[1].y ) / 2; var zMid = ( b[0].z + b[1].z ) / 2; var box = new THREE.Geometry(); box.vertices.push( new THREE.Vector3( a[0]*b[0].x, a[1]*b[0].y, a[2]*b[0].z ) ); box.vertices.push( new THREE.Vector3( a[0]*b[1].x, a[1]*b[1].y, a[2]*b[1].z ) ); var boxMesh = new THREE.LineSegments( box ); if ( options.frame ) scene.add( new THREE.BoxHelper( boxMesh, 'black' ) ); if ( options.axes_labels ) { var d = options.decimals; // decimals var offsetRatio = 0.1; var al = options.axes_labels; var offset = offsetRatio * a[1]*( b[1].y - b[0].y ); var xm = xMid.toFixed(d); if ( /^-0.?0*$/.test(xm) ) xm = xm.substr(1); addLabel( al[0] + '=' + xm, a[0]*xMid, a[1]*b[1].y+offset, a[2]*b[0].z ); addLabel( ( b[0].x ).toFixed(d), a[0]*b[0].x, a[1]*b[1].y+offset, a[2]*b[0].z ); addLabel( ( b[1].x ).toFixed(d), a[0]*b[1].x, a[1]*b[1].y+offset, a[2]*b[0].z ); var offset = offsetRatio * a[0]*( b[1].x - b[0].x ); var ym = yMid.toFixed(d); if ( /^-0.?0*$/.test(ym) ) ym = ym.substr(1); addLabel( al[1] + '=' + ym, a[0]*b[1].x+offset, a[1]*yMid, a[2]*b[0].z ); addLabel( ( b[0].y ).toFixed(d), a[0]*b[1].x+offset, a[1]*b[0].y, a[2]*b[0].z ); addLabel( ( b[1].y ).toFixed(d), a[0]*b[1].x+offset, a[1]*b[1].y, a[2]*b[0].z ); var offset = offsetRatio * a[1]*( b[1].y - b[0].y ); var zm = zMid.toFixed(d); if ( /^-0.?0*$/.test(zm) ) zm = zm.substr(1); addLabel( al[2] + '=' + zm, a[0]*b[1].x, a[1]*b[0].y-offset, a[2]*zMid ); addLabel( ( b[0].z ).toFixed(d), a[0]*b[1].x, a[1]*b[0].y-offset, a[2]*b[0].z ); addLabel( ( b[1].z ).toFixed(d), a[0]*b[1].x, a[1]*b[0].y-offset, a[2]*b[1].z ); } function addLabel( text, x, y, z ) { var fontsize = 14; var canvas = document.createElement( 'canvas' ); canvas.width = 128; canvas.height = 32; // powers of two var context = canvas.getContext( '2d' ); context.fillStyle = 'black'; context.font = fontsize + 'px monospace'; context.textAlign = 'center'; context.textBaseline = 'middle'; context.fillText( text, .5*canvas.width, .5*canvas.height ); var texture = new THREE.Texture( canvas ); texture.needsUpdate = true; var sprite = new THREE.Sprite( new THREE.SpriteMaterial( { map: texture } ) ); sprite.position.set( x, y, z ); sprite.scale.set( 1, .25 ); // ratio of width to height scene.add( sprite ); } if ( options.axes ) scene.add( new THREE.AxisHelper( Math.min( a[0]*b[1].x, a[1]*b[1].y, a[2]*b[1].z ) ) ); var camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 1000 ); camera.up.set( 0, 0, 1 ); camera.position.set( a[0]*(xMid+xRange), a[1]*(yMid+yRange), a[2]*(zMid+zRange) ); var lights = [{"x":-5, "y":3, "z":0, "color":"#7f7f7f", "parent":"camera"}]; for ( var i=0 ; i < lights.length ; i++ ) { var light = new THREE.DirectionalLight( lights[i].color, 1 ); light.position.set( a[0]*lights[i].x, a[1]*lights[i].y, a[2]*lights[i].z ); if ( lights[i].parent === 'camera' ) { light.target.position.set( a[0]*xMid, a[1]*yMid, a[2]*zMid ); scene.add( light.target ); camera.add( light ); } else scene.add( light ); } scene.add( camera ); var ambient = {"color":"#7f7f7f"}; scene.add( new THREE.AmbientLight( ambient.color, 1 ) ); var controls = new THREE.OrbitControls( camera, renderer.domElement ); controls.target.set( a[0]*xMid, a[1]*yMid, a[2]*zMid ); controls.addEventListener( 'change', function() { if ( !animate ) render(); } ); window.addEventListener( 'resize', function() { renderer.setSize( window.innerWidth, window.innerHeight ); camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); if ( !animate ) render(); } ); var texts = []; for ( var i=0 ; i < texts.length ; i++ ) addLabel( texts[i].text, a[0]*texts[i].x, a[1]*texts[i].y, a[2]*texts[i].z ); var points = []; for ( var i=0 ; i < points.length ; i++ ) addPoint( points[i] ); function addPoint( json ) { var geometry = new THREE.Geometry(); var v = json.point; geometry.vertices.push( new THREE.Vector3( a[0]*v[0], a[1]*v[1], a[2]*v[2] ) ); var canvas = document.createElement( 'canvas' ); canvas.width = 128; canvas.height = 128; var context = canvas.getContext( '2d' ); context.arc( 64, 64, 64, 0, 2 * Math.PI ); context.fillStyle = json.color; context.fill(); var texture = new THREE.Texture( canvas ); texture.needsUpdate = true; var transparent = json.opacity < 1 ? true : false; var material = new THREE.PointsMaterial( { size: json.size/100, map: texture, transparent: transparent, opacity: json.opacity, alphaTest: .1 } ); var c = geometry.center().multiplyScalar( -1 ); var mesh = new THREE.Points( geometry, material ); mesh.position.set( c.x, c.y, c.z ); scene.add( mesh ); } var lines = []; for ( var i=0 ; i < lines.length ; i++ ) addLine( lines[i] ); function addLine( json ) { var geometry = new THREE.Geometry(); for ( var i=0 ; i < json.points.length - 1 ; i++ ) { var v = json.points[i]; geometry.vertices.push( new THREE.Vector3( a[0]*v[0], a[1]*v[1], a[2]*v[2] ) ); var v = json.points[i+1]; geometry.vertices.push( new THREE.Vector3( a[0]*v[0], a[1]*v[1], a[2]*v[2] ) ); } var transparent = json.opacity < 1 ? true : false; var material = new THREE.LineBasicMaterial( { color: json.color, linewidth: json.linewidth, transparent: transparent, opacity: json.opacity } ); var c = geometry.center().multiplyScalar( -1 ); var mesh = new THREE.LineSegments( geometry, material ); mesh.position.set( c.x, c.y, c.z ); scene.add( mesh ); } var surfaces = [{"vertices":[{"x":-10.0677,"y":-1.23293e-15,"z":-3},{"x":-9.93729,"y":-1.61497,"z":-3},{"x":-9.54954,"y":-3.18811,"z":-3},{"x":-8.91447,"y":-4.67868,"z":-3},{"x":-8.04852,"y":-6.04807,"z":-3},{"x":-6.97411,"y":-7.26082,"z":-3},{"x":-5.71908,"y":-8.28552,"z":-3},{"x":-4.31593,"y":-9.09563,"z":-3},{"x":-2.801,"y":-9.67017,"z":-3},{"x":-1.21352,"y":-9.99426,"z":-3},{"x":0.405384,"y":-10.0595,"z":-3},{"x":2.01379,"y":-9.8642,"z":-3},{"x":3.57004,"y":-9.41343,"z":-3},{"x":5.03383,"y":-8.71885,"z":-3},{"x":6.36725,"y":-7.79846,"z":-3},{"x":7.53575,"y":-6.67609,"z":-3},{"x":8.50909,"y":-5.38082,"z":-3},{"x":9.26204,"y":-3.94619,"z":-3},{"x":9.77511,"y":-2.40935,"z":-3},{"x":10.035,"y":-0.81011,"z":-3},{"x":10.035,"y":0.81011,"z":-3},{"x":9.77511,"y":2.40935,"z":-3},{"x":9.26204,"y":3.94619,"z":-3},{"x":8.50909,"y":5.38082,"z":-3},{"x":7.53575,"y":6.67609,"z":-3},{"x":6.36725,"y":7.79846,"z":-3},{"x":5.03383,"y":8.71885,"z":-3},{"x":3.57004,"y":9.41343,"z":-3},{"x":2.01379,"y":9.8642,"z":-3},{"x":0.405384,"y":10.0595,"z":-3},{"x":-1.21352,"y":9.99426,"z":-3},{"x":-2.801,"y":9.67017,"z":-3},{"x":-4.31593,"y":9.09563,"z":-3},{"x":-5.71908,"y":8.28552,"z":-3},{"x":-6.97411,"y":7.26082,"z":-3},{"x":-8.04852,"y":6.04807,"z":-3},{"x":-8.91447,"y":4.67868,"z":-3},{"x":-9.54954,"y":3.18811,"z":-3},{"x":-9.93729,"y":1.61497,"z":-3},{"x":-10.0677,"y":1.23293e-15,"z":-3},{"x":-8.63974,"y":-1.05806e-15,"z":-2.84615},{"x":-8.52786,"y":-1.38591,"z":-2.84615},{"x":-8.19511,"y":-2.73593,"z":-2.84615},{"x":-7.65011,"y":-4.01509,"z":-2.84615},{"x":-6.90698,"y":-5.19026,"z":-2.84615},{"x":-5.98496,"y":-6.231,"z":-2.84615},{"x":-4.90793,"y":-7.11037,"z":-2.84615},{"x":-3.70379,"y":-7.80558,"z":-2.84615},{"x":-2.40373,"y":-8.29863,"z":-2.84615},{"x":-1.04141,"y":-8.57675,"z":-2.84615},{"x":0.347887,"y":-8.63274,"z":-2.84615},{"x":1.72817,"y":-8.46514,"z":-2.84615},{"x":3.06369,"y":-8.0783,"z":-2.84615},{"x":4.31987,"y":-7.48224,"z":-2.84615},{"x":5.46417,"y":-6.69239,"z":-2.84615},{"x":6.46694,"y":-5.72921,"z":-2.84615},{"x":7.30222,"y":-4.61765,"z":-2.84615},{"x":7.94839,"y":-3.38649,"z":-2.84615},{"x":8.38869,"y":-2.06763,"z":-2.84615},{"x":8.61173,"y":-0.69521,"z":-2.84615},{"x":8.61173,"y":0.69521,"z":-2.84615},{"x":8.38869,"y":2.06763,"z":-2.84615},{"x":7.94839,"y":3.38649,"z":-2.84615},{"x":7.30222,"y":4.61765,"z":-2.84615},{"x":6.46694,"y":5.72921,"z":-2.84615},{"x":5.46417,"y":6.69239,"z":-2.84615},{"x":4.31987,"y":7.48224,"z":-2.84615},{"x":3.06369,"y":8.0783,"z":-2.84615},{"x":1.72817,"y":8.46514,"z":-2.84615},{"x":0.347887,"y":8.63274,"z":-2.84615},{"x":-1.04141,"y":8.57675,"z":-2.84615},{"x":-2.40373,"y":8.29863,"z":-2.84615},{"x":-3.70379,"y":7.80558,"z":-2.84615},{"x":-4.90793,"y":7.11037,"z":-2.84615},{"x":-5.98496,"y":6.231,"z":-2.84615},{"x":-6.90698,"y":5.19026,"z":-2.84615},{"x":-7.65011,"y":4.01509,"z":-2.84615},{"x":-8.19511,"y":2.73593,"z":-2.84615},{"x":-8.52786,"y":1.38591,"z":-2.84615},{"x":-8.63974,"y":1.05806e-15,"z":-2.84615},{"x":-7.41672,"y":-9.08286e-16,"z":-2.69231},{"x":-7.32067,"y":-1.18973,"z":-2.69231},{"x":-7.03503,"y":-2.34864,"z":-2.69231},{"x":-6.56718,"y":-3.44672,"z":-2.69231},{"x":-5.92924,"y":-4.45554,"z":-2.69231},{"x":-5.13774,"y":-5.34896,"z":-2.69231},{"x":-4.21318,"y":-6.10384,"z":-2.69231},{"x":-3.17949,"y":-6.70064,"z":-2.69231},{"x":-2.06346,"y":-7.12389,"z":-2.69231},{"x":-0.893987,"y":-7.36264,"z":-2.69231},{"x":0.298641,"y":-7.4107,"z":-2.69231},{"x":1.48353,"y":-7.26683,"z":-2.69231},{"x":2.63,"y":-6.93475,"z":-2.69231},{"x":3.70836,"y":-6.42307,"z":-2.69231},{"x":4.69067,"y":-5.74503,"z":-2.69231},{"x":5.55149,"y":-4.91819,"z":-2.69231},{"x":6.26854,"y":-3.96398,"z":-2.69231},{"x":6.82323,"y":-2.90711,"z":-2.69231},{"x":7.2012,"y":-1.77494,"z":-2.69231},{"x":7.39267,"y":-0.596798,"z":-2.69231},{"x":7.39267,"y":0.596798,"z":-2.69231},{"x":7.2012,"y":1.77494,"z":-2.69231},{"x":6.82323,"y":2.90711,"z":-2.69231},{"x":6.26854,"y":3.96398,"z":-2.69231},{"x":5.55149,"y":4.91819,"z":-2.69231},{"x":4.69067,"y":5.74503,"z":-2.69231},{"x":3.70836,"y":6.42307,"z":-2.69231},{"x":2.63,"y":6.93475,"z":-2.69231},{"x":1.48353,"y":7.26683,"z":-2.69231},{"x":0.298641,"y":7.4107,"z":-2.69231},{"x":-0.893987,"y":7.36264,"z":-2.69231},{"x":-2.06346,"y":7.12389,"z":-2.69231},{"x":-3.17949,"y":6.70064,"z":-2.69231},{"x":-4.21318,"y":6.10384,"z":-2.69231},{"x":-5.13774,"y":5.34896,"z":-2.69231},{"x":-5.92924,"y":4.45554,"z":-2.69231},{"x":-6.56718,"y":3.44672,"z":-2.69231},{"x":-7.03503,"y":2.34864,"z":-2.69231},{"x":-7.32067,"y":1.18973,"z":-2.69231},{"x":-7.41672,"y":9.08286e-16,"z":-2.69231},{"x":-6.36958,"y":-7.80049e-16,"z":-2.53846},{"x":-6.2871,"y":-1.02175,"z":-2.53846},{"x":-6.04178,"y":-2.01704,"z":-2.53846},{"x":-5.63999,"y":-2.96009,"z":-2.53846},{"x":-5.09212,"y":-3.82648,"z":-2.53846},{"x":-4.41237,"y":-4.59376,"z":-2.53846},{"x":-3.61834,"y":-5.24206,"z":-2.53846},{"x":-2.73059,"y":-5.7546,"z":-2.53846},{"x":-1.77213,"y":-6.1181,"z":-2.53846},{"x":-0.767768,"y":-6.32314,"z":-2.53846},{"x":0.256477,"y":-6.36442,"z":-2.53846},{"x":1.27408,"y":-6.24086,"z":-2.53846},{"x":2.25869,"y":-5.95566,"z":-2.53846},{"x":3.18479,"y":-5.51622,"z":-2.53846},{"x":4.02841,"y":-4.93391,"z":-2.53846},{"x":4.7677,"y":-4.22382,"z":-2.53846},{"x":5.38351,"y":-3.40432,"z":-2.53846},{"x":5.85989,"y":-2.49666,"z":-2.53846},{"x":6.18449,"y":-1.52434,"z":-2.53846},{"x":6.34893,"y":-0.512539,"z":-2.53846},{"x":6.34893,"y":0.512539,"z":-2.53846},{"x":6.18449,"y":1.52434,"z":-2.53846},{"x":5.85989,"y":2.49666,"z":-2.53846},{"x":5.38351,"y":3.40432,"z":-2.53846},{"x":4.7677,"y":4.22382,"z":-2.53846},{"x":4.02841,"y":4.93391,"z":-2.53846},{"x":3.18479,"y":5.51622,"z":-2.53846},{"x":2.25869,"y":5.95566,"z":-2.53846},{"x":1.27408,"y":6.24086,"z":-2.53846},{"x":0.256477,"y":6.36442,"z":-2.53846},{"x":-0.767768,"y":6.32314,"z":-2.53846},{"x":-1.77213,"y":6.1181,"z":-2.53846},{"x":-2.73059,"y":5.7546,"z":-2.53846},{"x":-3.61834,"y":5.24206,"z":-2.53846},{"x":-4.41237,"y":4.59376,"z":-2.53846},{"x":-5.09212,"y":3.82648,"z":-2.53846},{"x":-5.63999,"y":2.96009,"z":-2.53846},{"x":-6.04178,"y":2.01704,"z":-2.53846},{"x":-6.2871,"y":1.02175,"z":-2.53846},{"x":-6.36958,"y":7.80049e-16,"z":-2.53846},{"x":-5.47351,"y":-6.70311e-16,"z":-2.38462},{"x":-5.40263,"y":-0.878012,"z":-2.38462},{"x":-5.19182,"y":-1.73328,"z":-2.38462},{"x":-4.84655,"y":-2.54366,"z":-2.38462},{"x":-4.37575,"y":-3.28817,"z":-2.38462},{"x":-3.79163,"y":-3.94751,"z":-2.38462},{"x":-3.10931,"y":-4.50461,"z":-2.38462},{"x":-2.34645,"y":-4.94504,"z":-2.38462},{"x":-1.52282,"y":-5.2574,"z":-2.38462},{"x":-0.659758,"y":-5.4336,"z":-2.38462},{"x":0.220396,"y":-5.46907,"z":-2.38462},{"x":1.09484,"y":-5.36289,"z":-2.38462},{"x":1.94093,"y":-5.11782,"z":-2.38462},{"x":2.73675,"y":-4.74019,"z":-2.38462},{"x":3.46169,"y":-4.2398,"z":-2.38462},{"x":4.09698,"y":-3.62961,"z":-2.38462},{"x":4.62615,"y":-2.9254,"z":-2.38462},{"x":5.03551,"y":-2.14543,"z":-2.38462},{"x":5.31446,"y":-1.3099,"z":-2.38462},{"x":5.45576,"y":-0.440434,"z":-2.38462},{"x":5.45576,"y":0.440434,"z":-2.38462},{"x":5.31446,"y":1.3099,"z":-2.38462},{"x":5.03551,"y":2.14543,"z":-2.38462},{"x":4.62615,"y":2.9254,"z":-2.38462},{"x":4.09698,"y":3.62961,"z":-2.38462},{"x":3.46169,"y":4.2398,"z":-2.38462},{"x":2.73675,"y":4.74019,"z":-2.38462},{"x":1.94093,"y":5.11782,"z":-2.38462},{"x":1.09484,"y":5.36289,"z":-2.38462},{"x":0.220396,"y":5.46907,"z":-2.38462},{"x":-0.659758,"y":5.4336,"z":-2.38462},{"x":-1.52282,"y":5.2574,"z":-2.38462},{"x":-2.34645,"y":4.94504,"z":-2.38462},{"x":-3.10931,"y":4.50461,"z":-2.38462},{"x":-3.79163,"y":3.94751,"z":-2.38462},{"x":-4.37575,"y":3.28817,"z":-2.38462},{"x":-4.84655,"y":2.54366,"z":-2.38462},{"x":-5.19182,"y":1.73328,"z":-2.38462},{"x":-5.40263,"y":0.878012,"z":-2.38462},{"x":-5.47351,"y":6.70311e-16,"z":-2.38462},{"x":-4.70723,"y":-5.7647e-16,"z":-2.23077},{"x":-4.64628,"y":-0.755093,"z":-2.23077},{"x":-4.46498,"y":-1.49063,"z":-2.23077},{"x":-4.16805,"y":-2.18756,"z":-2.23077},{"x":-3.76316,"y":-2.82783,"z":-2.23077},{"x":-3.26082,"y":-3.39487,"z":-2.23077},{"x":-2.67401,"y":-3.87398,"z":-2.23077},{"x":-2.01796,"y":-4.25275,"z":-2.23077},{"x":-1.30963,"y":-4.52138,"z":-2.23077},{"x":-0.567394,"y":-4.67291,"z":-2.23077},{"x":0.189541,"y":-4.70342,"z":-2.23077},{"x":0.941568,"y":-4.6121,"z":-2.23077},{"x":1.66921,"y":-4.40134,"z":-2.23077},{"x":2.35362,"y":-4.07658,"z":-2.23077},{"x":2.97707,"y":-3.64625,"z":-2.23077},{"x":3.52342,"y":-3.12147,"z":-2.23077},{"x":3.97851,"y":-2.51586,"z":-2.23077},{"x":4.33056,"y":-1.84508,"z":-2.23077},{"x":4.57045,"y":-1.12651,"z":-2.23077},{"x":4.69197,"y":-0.378775,"z":-2.23077},{"x":4.69197,"y":0.378775,"z":-2.23077},{"x":4.57045,"y":1.12651,"z":-2.23077},{"x":4.33056,"y":1.84508,"z":-2.23077},{"x":3.97851,"y":2.51586,"z":-2.23077},{"x":3.52342,"y":3.12147,"z":-2.23077},{"x":2.97707,"y":3.64625,"z":-2.23077},{"x":2.35362,"y":4.07658,"z":-2.23077},{"x":1.66921,"y":4.40134,"z":-2.23077},{"x":0.941568,"y":4.6121,"z":-2.23077},{"x":0.189541,"y":4.70342,"z":-2.23077},{"x":-0.567394,"y":4.67291,"z":-2.23077},{"x":-1.30963,"y":4.52138,"z":-2.23077},{"x":-2.01796,"y":4.25275,"z":-2.23077},{"x":-2.67401,"y":3.87398,"z":-2.23077},{"x":-3.26082,"y":3.39487,"z":-2.23077},{"x":-3.76316,"y":2.82783,"z":-2.23077},{"x":-4.16805,"y":2.18756,"z":-2.23077},{"x":-4.46498,"y":1.49063,"z":-2.23077},{"x":-4.64628,"y":0.755093,"z":-2.23077},{"x":-4.70723,"y":5.7647e-16,"z":-2.23077},{"x":-4.0526,"y":-4.963e-16,"z":-2.07692},{"x":-4.00012,"y":-0.650082,"z":-2.07692},{"x":-3.84404,"y":-1.28333,"z":-2.07692},{"x":-3.5884,"y":-1.88334,"z":-2.07692},{"x":-3.23982,"y":-2.43457,"z":-2.07692},{"x":-2.80733,"y":-2.92274,"z":-2.07692},{"x":-2.30214,"y":-3.33522,"z":-2.07692},{"x":-1.73732,"y":-3.66132,"z":-2.07692},{"x":-1.1275,"y":-3.89259,"z":-2.07692},{"x":-0.488487,"y":-4.02305,"z":-2.07692},{"x":0.163182,"y":-4.04931,"z":-2.07692},{"x":0.810623,"y":-3.9707,"z":-2.07692},{"x":1.43707,"y":-3.78924,"z":-2.07692},{"x":2.0263,"y":-3.50965,"z":-2.07692},{"x":2.56305,"y":-3.13916,"z":-2.07692},{"x":3.03341,"y":-2.68737,"z":-2.07692},{"x":3.42521,"y":-2.16597,"z":-2.07692},{"x":3.72831,"y":-1.58848,"z":-2.07692},{"x":3.93484,"y":-0.96985,"z":-2.07692},{"x":4.03946,"y":-0.326099,"z":-2.07692},{"x":4.03946,"y":0.326099,"z":-2.07692},{"x":3.93484,"y":0.96985,"z":-2.07692},{"x":3.72831,"y":1.58848,"z":-2.07692},{"x":3.42521,"y":2.16597,"z":-2.07692},{"x":3.03341,"y":2.68737,"z":-2.07692},{"x":2.56305,"y":3.13916,"z":-2.07692},{"x":2.0263,"y":3.50965,"z":-2.07692},{"x":1.43707,"y":3.78924,"z":-2.07692},{"x":0.810623,"y":3.9707,"z":-2.07692},{"x":0.163182,"y":4.04931,"z":-2.07692},{"x":-0.488487,"y":4.02305,"z":-2.07692},{"x":-1.1275,"y":3.89259,"z":-2.07692},{"x":-1.73732,"y":3.66132,"z":-2.07692},{"x":-2.30214,"y":3.33522,"z":-2.07692},{"x":-2.80733,"y":2.92274,"z":-2.07692},{"x":-3.23982,"y":2.43457,"z":-2.07692},{"x":-3.5884,"y":1.88334,"z":-2.07692},{"x":-3.84404,"y":1.28333,"z":-2.07692},{"x":-4.00012,"y":0.650082,"z":-2.07692},{"x":-4.0526,"y":4.963e-16,"z":-2.07692},{"x":-3.49407,"y":-4.279e-16,"z":-1.92308},{"x":-3.44882,"y":-0.560488,"z":-1.92308},{"x":-3.31425,"y":-1.10646,"z":-1.92308},{"x":-3.09384,"y":-1.62377,"z":-1.92308},{"x":-2.79331,"y":-2.09903,"z":-1.92308},{"x":-2.42043,"y":-2.51993,"z":-1.92308},{"x":-1.98486,"y":-2.87556,"z":-1.92308},{"x":-1.49788,"y":-3.15672,"z":-1.92308},{"x":-0.972111,"y":-3.35612,"z":-1.92308},{"x":-0.421163,"y":-3.46859,"z":-1.92308},{"x":0.140692,"y":-3.49123,"z":-1.92308},{"x":0.698903,"y":-3.42345,"z":-1.92308},{"x":1.23901,"y":-3.26701,"z":-1.92308},{"x":1.74703,"y":-3.02595,"z":-1.92308},{"x":2.20981,"y":-2.70652,"z":-1.92308},{"x":2.61535,"y":-2.317,"z":-1.92308},{"x":2.95315,"y":-1.86746,"z":-1.92308},{"x":3.21447,"y":-1.36956,"z":-1.92308},{"x":3.39254,"y":-0.836185,"z":-1.92308},{"x":3.48274,"y":-0.281156,"z":-1.92308},{"x":3.48274,"y":0.281156,"z":-1.92308},{"x":3.39254,"y":0.836185,"z":-1.92308},{"x":3.21447,"y":1.36956,"z":-1.92308},{"x":2.95315,"y":1.86746,"z":-1.92308},{"x":2.61535,"y":2.317,"z":-1.92308},{"x":2.20981,"y":2.70652,"z":-1.92308},{"x":1.74703,"y":3.02595,"z":-1.92308},{"x":1.23901,"y":3.26701,"z":-1.92308},{"x":0.698903,"y":3.42345,"z":-1.92308},{"x":0.140692,"y":3.49123,"z":-1.92308},{"x":-0.421163,"y":3.46859,"z":-1.92308},{"x":-0.972111,"y":3.35612,"z":-1.92308},{"x":-1.49788,"y":3.15672,"z":-1.92308},{"x":-1.98486,"y":2.87556,"z":-1.92308},{"x":-2.42043,"y":2.51993,"z":-1.92308},{"x":-2.79331,"y":2.09903,"z":-1.92308},{"x":-3.09384,"y":1.62377,"z":-1.92308},{"x":-3.31425,"y":1.10646,"z":-1.92308},{"x":-3.44882,"y":0.560488,"z":-1.92308},{"x":-3.49407,"y":4.279e-16,"z":-1.92308},{"x":-3.0184,"y":-3.69648e-16,"z":-1.76923},{"x":-2.97931,"y":-0.484186,"z":-1.76923},{"x":-2.86306,"y":-0.955831,"z":-1.76923},{"x":-2.67266,"y":-1.40272,"z":-1.76923},{"x":-2.41304,"y":-1.81328,"z":-1.76923},{"x":-2.09092,"y":-2.17688,"z":-1.76923},{"x":-1.71465,"y":-2.4841,"z":-1.76923},{"x":-1.29397,"y":-2.72698,"z":-1.76923},{"x":-0.839772,"y":-2.89923,"z":-1.76923},{"x":-0.363828,"y":-2.99639,"z":-1.76923},{"x":0.121539,"y":-3.01595,"z":-1.76923},{"x":0.603758,"y":-2.9574,"z":-1.76923},{"x":1.07034,"y":-2.82225,"z":-1.76923},{"x":1.5092,"y":-2.61401,"z":-1.76923},{"x":1.90897,"y":-2.33807,"z":-1.76923},{"x":2.25931,"y":-2.00157,"z":-1.76923},{"x":2.55112,"y":-1.61323,"z":-1.76923},{"x":2.77687,"y":-1.18311,"z":-1.76923},{"x":2.93069,"y":-0.722351,"z":-1.76923},{"x":3.00861,"y":-0.24288,"z":-1.76923},{"x":3.00861,"y":0.24288,"z":-1.76923},{"x":2.93069,"y":0.722351,"z":-1.76923},{"x":2.77687,"y":1.18311,"z":-1.76923},{"x":2.55112,"y":1.61323,"z":-1.76923},{"x":2.25931,"y":2.00157,"z":-1.76923},{"x":1.90897,"y":2.33807,"z":-1.76923},{"x":1.5092,"y":2.61401,"z":-1.76923},{"x":1.07034,"y":2.82225,"z":-1.76923},{"x":0.603758,"y":2.9574,"z":-1.76923},{"x":0.121539,"y":3.01595,"z":-1.76923},{"x":-0.363828,"y":2.99639,"z":-1.76923},{"x":-0.839772,"y":2.89923,"z":-1.76923},{"x":-1.29397,"y":2.72698,"z":-1.76923},{"x":-1.71465,"y":2.4841,"z":-1.76923},{"x":-2.09092,"y":2.17688,"z":-1.76923},{"x":-2.41304,"y":1.81328,"z":-1.76923},{"x":-2.67266,"y":1.40272,"z":-1.76923},{"x":-2.86306,"y":0.955831,"z":-1.76923},{"x":-2.97931,"y":0.484186,"z":-1.76923},{"x":-3.0184,"y":3.69648e-16,"z":-1.76923},{"x":-2.61432,"y":-3.20162e-16,"z":-1.61538},{"x":-2.58046,"y":-0.419366,"z":-1.61538},{"x":-2.47978,"y":-0.827871,"z":-1.61538},{"x":-2.31486,"y":-1.21493,"z":-1.61538},{"x":-2.09,"y":-1.57053,"z":-1.61538},{"x":-1.811,"y":-1.88545,"z":-1.61538},{"x":-1.4851,"y":-2.15154,"z":-1.61538},{"x":-1.12074,"y":-2.36191,"z":-1.61538},{"x":-0.727349,"y":-2.5111,"z":-1.61538},{"x":-0.315121,"y":-2.59526,"z":-1.61538},{"x":0.105268,"y":-2.6122,"z":-1.61538},{"x":0.522931,"y":-2.56148,"z":-1.61538},{"x":0.92705,"y":-2.44443,"z":-1.61538},{"x":1.30716,"y":-2.26407,"z":-1.61538},{"x":1.65341,"y":-2.02506,"z":-1.61538},{"x":1.95685,"y":-1.73361,"z":-1.61538},{"x":2.2096,"y":-1.39726,"z":-1.61538},{"x":2.40512,"y":-1.02473,"z":-1.61538},{"x":2.53835,"y":-0.625647,"z":-1.61538},{"x":2.60584,"y":-0.210365,"z":-1.61538},{"x":2.60584,"y":0.210365,"z":-1.61538},{"x":2.53835,"y":0.625647,"z":-1.61538},{"x":2.40512,"y":1.02473,"z":-1.61538},{"x":2.2096,"y":1.39726,"z":-1.61538},{"x":1.95685,"y":1.73361,"z":-1.61538},{"x":1.65341,"y":2.02506,"z":-1.61538},{"x":1.30716,"y":2.26407,"z":-1.61538},{"x":0.92705,"y":2.44443,"z":-1.61538},{"x":0.522931,"y":2.56148,"z":-1.61538},{"x":0.105268,"y":2.6122,"z":-1.61538},{"x":-0.315121,"y":2.59526,"z":-1.61538},{"x":-0.727349,"y":2.5111,"z":-1.61538},{"x":-1.12074,"y":2.36191,"z":-1.61538},{"x":-1.4851,"y":2.15154,"z":-1.61538},{"x":-1.811,"y":1.88545,"z":-1.61538},{"x":-2.09,"y":1.57053,"z":-1.61538},{"x":-2.31486,"y":1.21493,"z":-1.61538},{"x":-2.47978,"y":0.827871,"z":-1.61538},{"x":-2.58046,"y":0.419366,"z":-1.61538},{"x":-2.61432,"y":3.20162e-16,"z":-1.61538},{"x":-2.27223,"y":-2.78268e-16,"z":-1.46154},{"x":-2.24281,"y":-0.364492,"z":-1.46154},{"x":-2.1553,"y":-0.719544,"z":-1.46154},{"x":-2.01196,"y":-1.05596,"z":-1.46154},{"x":-1.81652,"y":-1.36503,"z":-1.46154},{"x":-1.57403,"y":-1.63874,"z":-1.46154},{"x":-1.29078,"y":-1.87001,"z":-1.46154},{"x":-0.97409,"y":-2.05285,"z":-1.46154},{"x":-0.632175,"y":-2.18252,"z":-1.46154},{"x":-0.273888,"y":-2.25567,"z":-1.46154},{"x":0.0914936,"y":-2.27039,"z":-1.46154},{"x":0.454505,"y":-2.22631,"z":-1.46154},{"x":0.805745,"y":-2.12458,"z":-1.46154},{"x":1.13612,"y":-1.96781,"z":-1.46154},{"x":1.43706,"y":-1.76008,"z":-1.46154},{"x":1.70079,"y":-1.50677,"z":-1.46154},{"x":1.92047,"y":-1.21443,"z":-1.46154},{"x":2.09041,"y":-0.89064,"z":-1.46154},{"x":2.20621,"y":-0.543781,"z":-1.46154},{"x":2.26487,"y":-0.182839,"z":-1.46154},{"x":2.26487,"y":0.182839,"z":-1.46154},{"x":2.20621,"y":0.543781,"z":-1.46154},{"x":2.09041,"y":0.89064,"z":-1.46154},{"x":1.92047,"y":1.21443,"z":-1.46154},{"x":1.70079,"y":1.50677,"z":-1.46154},{"x":1.43706,"y":1.76008,"z":-1.46154},{"x":1.13612,"y":1.96781,"z":-1.46154},{"x":0.805745,"y":2.12458,"z":-1.46154},{"x":0.454505,"y":2.22631,"z":-1.46154},{"x":0.0914936,"y":2.27039,"z":-1.46154},{"x":-0.273888,"y":2.25567,"z":-1.46154},{"x":-0.632175,"y":2.18252,"z":-1.46154},{"x":-0.97409,"y":2.05285,"z":-1.46154},{"x":-1.29078,"y":1.87001,"z":-1.46154},{"x":-1.57403,"y":1.63874,"z":-1.46154},{"x":-1.81652,"y":1.36503,"z":-1.46154},{"x":-2.01196,"y":1.05596,"z":-1.46154},{"x":-2.1553,"y":0.719544,"z":-1.46154},{"x":-2.24281,"y":0.364492,"z":-1.46154},{"x":-2.27223,"y":2.78268e-16,"z":-1.46154},{"x":-1.98404,"y":-2.42974e-16,"z":-1.30769},{"x":-1.95834,"y":-0.318262,"z":-1.30769},{"x":-1.88193,"y":-0.628281,"z":-1.30769},{"x":-1.75678,"y":-0.922028,"z":-1.30769},{"x":-1.58612,"y":-1.19189,"z":-1.30769},{"x":-1.37439,"y":-1.43089,"z":-1.30769},{"x":-1.12706,"y":-1.63283,"z":-1.30769},{"x":-0.850542,"y":-1.79248,"z":-1.30769},{"x":-0.551994,"y":-1.9057,"z":-1.30769},{"x":-0.239149,"y":-1.96957,"z":-1.30769},{"x":0.0798891,"y":-1.98243,"z":-1.30769},{"x":0.396858,"y":-1.94394,"z":-1.30769},{"x":0.703549,"y":-1.85511,"z":-1.30769},{"x":0.992019,"y":-1.71823,"z":-1.30769},{"x":1.2548,"y":-1.53685,"z":-1.30769},{"x":1.48507,"y":-1.31566,"z":-1.30769},{"x":1.67689,"y":-1.0604,"z":-1.30769},{"x":1.82527,"y":-0.777676,"z":-1.30769},{"x":1.92638,"y":-0.474811,"z":-1.30769},{"x":1.9776,"y":-0.159649,"z":-1.30769},{"x":1.9776,"y":0.159649,"z":-1.30769},{"x":1.92638,"y":0.474811,"z":-1.30769},{"x":1.82527,"y":0.777676,"z":-1.30769},{"x":1.67689,"y":1.0604,"z":-1.30769},{"x":1.48507,"y":1.31566,"z":-1.30769},{"x":1.2548,"y":1.53685,"z":-1.30769},{"x":0.992019,"y":1.71823,"z":-1.30769},{"x":0.703549,"y":1.85511,"z":-1.30769},{"x":0.396858,"y":1.94394,"z":-1.30769},{"x":0.0798891,"y":1.98243,"z":-1.30769},{"x":-0.239149,"y":1.96957,"z":-1.30769},{"x":-0.551994,"y":1.9057,"z":-1.30769},{"x":-0.850542,"y":1.79248,"z":-1.30769},{"x":-1.12706,"y":1.63283,"z":-1.30769},{"x":-1.37439,"y":1.43089,"z":-1.30769},{"x":-1.58612,"y":1.19189,"z":-1.30769},{"x":-1.75678,"y":0.922028,"z":-1.30769},{"x":-1.88193,"y":0.628281,"z":-1.30769},{"x":-1.95834,"y":0.318262,"z":-1.30769},{"x":-1.98404,"y":2.42974e-16,"z":-1.30769},{"x":-1.74289,"y":-2.13443e-16,"z":-1.15385},{"x":-1.72032,"y":-0.27958,"z":-1.15385},{"x":-1.6532,"y":-0.551918,"z":-1.15385},{"x":-1.54325,"y":-0.809962,"z":-1.15385},{"x":-1.39334,"y":-1.04703,"z":-1.15385},{"x":-1.20734,"y":-1.25698,"z":-1.15385},{"x":-0.990076,"y":-1.43437,"z":-1.15385},{"x":-0.747165,"y":-1.57462,"z":-1.15385},{"x":-0.484903,"y":-1.67408,"z":-1.15385},{"x":-0.210082,"y":-1.73018,"z":-1.15385},{"x":0.0701792,"y":-1.74148,"z":-1.15385},{"x":0.348623,"y":-1.70767,"z":-1.15385},{"x":0.618038,"y":-1.62963,"z":-1.15385},{"x":0.871446,"y":-1.50939,"z":-1.15385},{"x":1.10228,"y":-1.35005,"z":-1.15385},{"x":1.30457,"y":-1.15575,"z":-1.15385},{"x":1.47308,"y":-0.931516,"z":-1.15385},{"x":1.60343,"y":-0.683156,"z":-1.15385},{"x":1.69225,"y":-0.417101,"z":-1.15385},{"x":1.73724,"y":-0.140245,"z":-1.15385},{"x":1.73724,"y":0.140245,"z":-1.15385},{"x":1.69225,"y":0.417101,"z":-1.15385},{"x":1.60343,"y":0.683156,"z":-1.15385},{"x":1.47308,"y":0.931516,"z":-1.15385},{"x":1.30457,"y":1.15575,"z":-1.15385},{"x":1.10228,"y":1.35005,"z":-1.15385},{"x":0.871446,"y":1.50939,"z":-1.15385},{"x":0.618038,"y":1.62963,"z":-1.15385},{"x":0.348623,"y":1.70767,"z":-1.15385},{"x":0.0701792,"y":1.74148,"z":-1.15385},{"x":-0.210082,"y":1.73018,"z":-1.15385},{"x":-0.484903,"y":1.67408,"z":-1.15385},{"x":-0.747165,"y":1.57462,"z":-1.15385},{"x":-0.990076,"y":1.43437,"z":-1.15385},{"x":-1.20734,"y":1.25698,"z":-1.15385},{"x":-1.39334,"y":1.04703,"z":-1.15385},{"x":-1.54325,"y":0.809962,"z":-1.15385},{"x":-1.6532,"y":0.551918,"z":-1.15385},{"x":-1.72032,"y":0.27958,"z":-1.15385},{"x":-1.74289,"y":2.13443e-16,"z":-1.15385},{"x":-1.54308,"y":-1.88973e-16,"z":-1},{"x":-1.5231,"y":-0.247528,"z":-1},{"x":-1.46367,"y":-0.488644,"z":-1},{"x":-1.36633,"y":-0.717105,"z":-1},{"x":-1.2336,"y":-0.926994,"z":-1},{"x":-1.06893,"y":-1.11287,"z":-1},{"x":-0.87657,"y":-1.26993,"z":-1},{"x":-0.661507,"y":-1.3941,"z":-1},{"x":-0.429312,"y":-1.48216,"z":-1},{"x":-0.185998,"y":-1.53183,"z":-1},{"x":0.0621336,"y":-1.54183,"z":-1},{"x":0.308656,"y":-1.5119,"z":-1},{"x":0.547184,"y":-1.44281,"z":-1},{"x":0.77154,"y":-1.33635,"z":-1},{"x":0.975914,"y":-1.19528,"z":-1},{"x":1.15501,"y":-1.02325,"z":-1},{"x":1.3042,"y":-0.824724,"z":-1},{"x":1.4196,"y":-0.604836,"z":-1},{"x":1.49824,"y":-0.369283,"z":-1},{"x":1.53808,"y":-0.124166,"z":-1},{"x":1.53808,"y":0.124166,"z":-1},{"x":1.49824,"y":0.369283,"z":-1},{"x":1.4196,"y":0.604836,"z":-1},{"x":1.3042,"y":0.824724,"z":-1},{"x":1.15501,"y":1.02325,"z":-1},{"x":0.975914,"y":1.19528,"z":-1},{"x":0.77154,"y":1.33635,"z":-1},{"x":0.547184,"y":1.44281,"z":-1},{"x":0.308656,"y":1.5119,"z":-1},{"x":0.0621336,"y":1.54183,"z":-1},{"x":-0.185998,"y":1.53183,"z":-1},{"x":-0.429312,"y":1.48216,"z":-1},{"x":-0.661507,"y":1.3941,"z":-1},{"x":-0.87657,"y":1.26993,"z":-1},{"x":-1.06893,"y":1.11287,"z":-1},{"x":-1.2336,"y":0.926994,"z":-1},{"x":-1.36633,"y":0.717105,"z":-1},{"x":-1.46367,"y":0.488644,"z":-1},{"x":-1.5231,"y":0.247528,"z":-1},{"x":-1.54308,"y":1.88973e-16,"z":-1},{"x":-1.37986,"y":-1.68985e-16,"z":-0.846154},{"x":-1.36199,"y":-0.221346,"z":-0.846154},{"x":-1.30885,"y":-0.436959,"z":-0.846154},{"x":-1.22181,"y":-0.641255,"z":-0.846154},{"x":-1.10312,"y":-0.828942,"z":-0.846154},{"x":-0.955865,"y":-0.995161,"z":-0.846154},{"x":-0.783852,"y":-1.13561,"z":-0.846154},{"x":-0.591537,"y":-1.24664,"z":-0.846154},{"x":-0.383902,"y":-1.32538,"z":-0.846154},{"x":-0.166324,"y":-1.3698,"z":-0.846154},{"x":0.0555615,"y":-1.37874,"z":-0.846154},{"x":0.276008,"y":-1.35198,"z":-0.846154},{"x":0.489306,"y":-1.2902,"z":-0.846154},{"x":0.689932,"y":-1.195,"z":-0.846154},{"x":0.872688,"y":-1.06885,"z":-0.846154},{"x":1.03284,"y":-0.915019,"z":-0.846154},{"x":1.16625,"y":-0.73749,"z":-0.846154},{"x":1.26945,"y":-0.540861,"z":-0.846154},{"x":1.33977,"y":-0.330223,"z":-0.846154},{"x":1.37539,"y":-0.111033,"z":-0.846154},{"x":1.37539,"y":0.111033,"z":-0.846154},{"x":1.33977,"y":0.330223,"z":-0.846154},{"x":1.26945,"y":0.540861,"z":-0.846154},{"x":1.16625,"y":0.73749,"z":-0.846154},{"x":1.03284,"y":0.915019,"z":-0.846154},{"x":0.872688,"y":1.06885,"z":-0.846154},{"x":0.689932,"y":1.195,"z":-0.846154},{"x":0.489306,"y":1.2902,"z":-0.846154},{"x":0.276008,"y":1.35198,"z":-0.846154},{"x":0.0555615,"y":1.37874,"z":-0.846154},{"x":-0.166324,"y":1.3698,"z":-0.846154},{"x":-0.383902,"y":1.32538,"z":-0.846154},{"x":-0.591537,"y":1.24664,"z":-0.846154},{"x":-0.783852,"y":1.13561,"z":-0.846154},{"x":-0.955865,"y":0.995161,"z":-0.846154},{"x":-1.10312,"y":0.828942,"z":-0.846154},{"x":-1.22181,"y":0.641255,"z":-0.846154},{"x":-1.30885,"y":0.436959,"z":-0.846154},{"x":-1.36199,"y":0.221346,"z":-0.846154},{"x":-1.37986,"y":1.68985e-16,"z":-0.846154},{"x":-1.24937,"y":-1.53004e-16,"z":-0.692308},{"x":-1.23319,"y":-0.200413,"z":-0.692308},{"x":-1.18507,"y":-0.395636,"z":-0.692308},{"x":-1.10626,"y":-0.580612,"z":-0.692308},{"x":-0.9988,"y":-0.75055,"z":-0.692308},{"x":-0.86547,"y":-0.901049,"z":-0.692308},{"x":-0.709724,"y":-1.02821,"z":-0.692308},{"x":-0.535596,"y":-1.12874,"z":-0.692308},{"x":-0.347597,"y":-1.20004,"z":-0.692308},{"x":-0.150595,"y":-1.24026,"z":-0.692308},{"x":0.0503071,"y":-1.24836,"z":-0.692308},{"x":0.249906,"y":-1.22412,"z":-0.692308},{"x":0.443033,"y":-1.16818,"z":-0.692308},{"x":0.624685,"y":-1.08199,"z":-0.692308},{"x":0.790159,"y":-0.967769,"z":-0.692308},{"x":0.935167,"y":-0.828486,"z":-0.692308},{"x":1.05596,"y":-0.667746,"z":-0.692308},{"x":1.1494,"y":-0.489712,"z":-0.692308},{"x":1.21307,"y":-0.298994,"z":-0.692308},{"x":1.24532,"y":-0.100533,"z":-0.692308},{"x":1.24532,"y":0.100533,"z":-0.692308},{"x":1.21307,"y":0.298994,"z":-0.692308},{"x":1.1494,"y":0.489712,"z":-0.692308},{"x":1.05596,"y":0.667746,"z":-0.692308},{"x":0.935167,"y":0.828486,"z":-0.692308},{"x":0.790159,"y":0.967769,"z":-0.692308},{"x":0.624685,"y":1.08199,"z":-0.692308},{"x":0.443033,"y":1.16818,"z":-0.692308},{"x":0.249906,"y":1.22412,"z":-0.692308},{"x":0.0503071,"y":1.24836,"z":-0.692308},{"x":-0.150595,"y":1.24026,"z":-0.692308},{"x":-0.347597,"y":1.20004,"z":-0.692308},{"x":-0.535596,"y":1.12874,"z":-0.692308},{"x":-0.709724,"y":1.02821,"z":-0.692308},{"x":-0.86547,"y":0.901049,"z":-0.692308},{"x":-0.9988,"y":0.75055,"z":-0.692308},{"x":-1.10626,"y":0.580612,"z":-0.692308},{"x":-1.18507,"y":0.395636,"z":-0.692308},{"x":-1.23319,"y":0.200413,"z":-0.692308},{"x":-1.24937,"y":1.53004e-16,"z":-0.692308},{"x":-1.14851,"y":-1.40652e-16,"z":-0.538462},{"x":-1.13363,"y":-0.184234,"z":-0.538462},{"x":-1.0894,"y":-0.363695,"z":-0.538462},{"x":-1.01695,"y":-0.533738,"z":-0.538462},{"x":-0.918166,"y":-0.689957,"z":-0.538462},{"x":-0.795599,"y":-0.828306,"z":-0.538462},{"x":-0.652426,"y":-0.945203,"z":-0.538462},{"x":-0.492356,"y":-1.03762,"z":-0.538462},{"x":-0.319535,"y":-1.10316,"z":-0.538462},{"x":-0.138437,"y":-1.14013,"z":-0.538462},{"x":0.0462457,"y":-1.14758,"z":-0.538462},{"x":0.229731,"y":-1.1253,"z":-0.538462},{"x":0.407266,"y":-1.07387,"z":-0.538462},{"x":0.574254,"y":-0.994636,"z":-0.538462},{"x":0.726368,"y":-0.889639,"z":-0.538462},{"x":0.85967,"y":-0.761601,"z":-0.538462},{"x":0.970707,"y":-0.613838,"z":-0.538462},{"x":1.0566,"y":-0.450176,"z":-0.538462},{"x":1.11513,"y":-0.274856,"z":-0.538462},{"x":1.14478,"y":-0.0924164,"z":-0.538462},{"x":1.14478,"y":0.0924164,"z":-0.538462},{"x":1.11513,"y":0.274856,"z":-0.538462},{"x":1.0566,"y":0.450176,"z":-0.538462},{"x":0.970707,"y":0.613838,"z":-0.538462},{"x":0.85967,"y":0.761601,"z":-0.538462},{"x":0.726368,"y":0.889639,"z":-0.538462},{"x":0.574254,"y":0.994636,"z":-0.538462},{"x":0.407266,"y":1.07387,"z":-0.538462},{"x":0.229731,"y":1.1253,"z":-0.538462},{"x":0.0462457,"y":1.14758,"z":-0.538462},{"x":-0.138437,"y":1.14013,"z":-0.538462},{"x":-0.319535,"y":1.10316,"z":-0.538462},{"x":-0.492356,"y":1.03762,"z":-0.538462},{"x":-0.652426,"y":0.945203,"z":-0.538462},{"x":-0.795599,"y":0.828306,"z":-0.538462},{"x":-0.918166,"y":0.689957,"z":-0.538462},{"x":-1.01695,"y":0.533738,"z":-0.538462},{"x":-1.0894,"y":0.363695,"z":-0.538462},{"x":-1.13363,"y":0.184234,"z":-0.538462},{"x":-1.14851,"y":1.40652e-16,"z":-0.538462},{"x":-1.07488,"y":-1.31635e-16,"z":-0.384615},{"x":-1.06096,"y":-0.172423,"z":-0.384615},{"x":-1.01956,"y":-0.34038,"z":-0.384615},{"x":-0.95176,"y":-0.499522,"z":-0.384615},{"x":-0.859306,"y":-0.645726,"z":-0.384615},{"x":-0.744596,"y":-0.775207,"z":-0.384615},{"x":-0.610602,"y":-0.88461,"z":-0.384615},{"x":-0.460793,"y":-0.971102,"z":-0.384615},{"x":-0.299051,"y":-1.03244,"z":-0.384615},{"x":-0.129563,"y":-1.06704,"z":-0.384615},{"x":0.0432811,"y":-1.07401,"z":-0.384615},{"x":0.215004,"y":-1.05316,"z":-0.384615},{"x":0.381158,"y":-1.00503,"z":-0.384615},{"x":0.53744,"y":-0.930874,"z":-0.384615},{"x":0.679803,"y":-0.832608,"z":-0.384615},{"x":0.80456,"y":-0.712778,"z":-0.384615},{"x":0.908479,"y":-0.574487,"z":-0.384615},{"x":0.988868,"y":-0.421317,"z":-0.384615},{"x":1.04365,"y":-0.257236,"z":-0.384615},{"x":1.0714,"y":-0.086492,"z":-0.384615},{"x":1.0714,"y":0.086492,"z":-0.384615},{"x":1.04365,"y":0.257236,"z":-0.384615},{"x":0.988868,"y":0.421317,"z":-0.384615},{"x":0.908479,"y":0.574487,"z":-0.384615},{"x":0.80456,"y":0.712778,"z":-0.384615},{"x":0.679803,"y":0.832608,"z":-0.384615},{"x":0.53744,"y":0.930874,"z":-0.384615},{"x":0.381158,"y":1.00503,"z":-0.384615},{"x":0.215004,"y":1.05316,"z":-0.384615},{"x":0.0432811,"y":1.07401,"z":-0.384615},{"x":-0.129563,"y":1.06704,"z":-0.384615},{"x":-0.299051,"y":1.03244,"z":-0.384615},{"x":-0.460793,"y":0.971102,"z":-0.384615},{"x":-0.610602,"y":0.88461,"z":-0.384615},{"x":-0.744596,"y":0.775207,"z":-0.384615},{"x":-0.859306,"y":0.645726,"z":-0.384615},{"x":-0.95176,"y":0.499522,"z":-0.384615},{"x":-1.01956,"y":0.34038,"z":-0.384615},{"x":-1.06096,"y":0.172423,"z":-0.384615},{"x":-1.07488,"y":1.31635e-16,"z":-0.384615},{"x":-1.02675,"y":-1.2574e-16,"z":-0.230769},{"x":-1.01345,"y":-0.164702,"z":-0.230769},{"x":-0.973906,"y":-0.325137,"z":-0.230769},{"x":-0.909138,"y":-0.477152,"z":-0.230769},{"x":-0.820824,"y":-0.616809,"z":-0.230769},{"x":-0.711252,"y":-0.740491,"z":-0.230769},{"x":-0.583258,"y":-0.844995,"z":-0.230769},{"x":-0.440158,"y":-0.927614,"z":-0.230769},{"x":-0.285659,"y":-0.986208,"z":-0.230769},{"x":-0.123761,"y":-1.01926,"z":-0.230769},{"x":0.0413429,"y":-1.02591,"z":-0.230769},{"x":0.205376,"y":-1.006,"z":-0.230769},{"x":0.364089,"y":-0.960024,"z":-0.230769},{"x":0.513373,"y":-0.889188,"z":-0.230769},{"x":0.649361,"y":-0.795322,"z":-0.230769},{"x":0.76853,"y":-0.680858,"z":-0.230769},{"x":0.867795,"y":-0.54876,"z":-0.230769},{"x":0.944585,"y":-0.40245,"z":-0.230769},{"x":0.99691,"y":-0.245716,"z":-0.230769},{"x":1.02342,"y":-0.0826187,"z":-0.230769},{"x":1.02342,"y":0.0826187,"z":-0.230769},{"x":0.99691,"y":0.245716,"z":-0.230769},{"x":0.944585,"y":0.40245,"z":-0.230769},{"x":0.867795,"y":0.54876,"z":-0.230769},{"x":0.76853,"y":0.680858,"z":-0.230769},{"x":0.649361,"y":0.795322,"z":-0.230769},{"x":0.513373,"y":0.889188,"z":-0.230769},{"x":0.364089,"y":0.960024,"z":-0.230769},{"x":0.205376,"y":1.006,"z":-0.230769},{"x":0.0413429,"y":1.02591,"z":-0.230769},{"x":-0.123761,"y":1.01926,"z":-0.230769},{"x":-0.285659,"y":0.986208,"z":-0.230769},{"x":-0.440158,"y":0.927614,"z":-0.230769},{"x":-0.583258,"y":0.844995,"z":-0.230769},{"x":-0.711252,"y":0.740491,"z":-0.230769},{"x":-0.820824,"y":0.616809,"z":-0.230769},{"x":-0.909138,"y":0.477152,"z":-0.230769},{"x":-0.973906,"y":0.325137,"z":-0.230769},{"x":-1.01345,"y":0.164702,"z":-0.230769},{"x":-1.02675,"y":1.2574e-16,"z":-0.230769},{"x":-1.00296,"y":-1.22827e-16,"z":-0.0769231},{"x":-0.989972,"y":-0.160886,"z":-0.0769231},{"x":-0.951344,"y":-0.317605,"z":-0.0769231},{"x":-0.888077,"y":-0.466099,"z":-0.0769231},{"x":-0.801809,"y":-0.60252,"z":-0.0769231},{"x":-0.694775,"y":-0.723337,"z":-0.0769231},{"x":-0.569746,"y":-0.82542,"z":-0.0769231},{"x":-0.429962,"y":-0.906125,"z":-0.0769231},{"x":-0.279041,"y":-0.963361,"z":-0.0769231},{"x":-0.120893,"y":-0.995647,"z":-0.0769231},{"x":0.0403851,"y":-1.00215,"z":-0.0769231},{"x":0.200618,"y":-0.982691,"z":-0.0769231},{"x":0.355655,"y":-0.937784,"z":-0.0769231},{"x":0.50148,"y":-0.868589,"z":-0.0769231},{"x":0.634317,"y":-0.776898,"z":-0.0769231},{"x":0.750726,"y":-0.665086,"z":-0.0769231},{"x":0.847692,"y":-0.536048,"z":-0.0769231},{"x":0.922703,"y":-0.393127,"z":-0.0769231},{"x":0.973816,"y":-0.240024,"z":-0.0769231},{"x":0.999708,"y":-0.0807048,"z":-0.0769231},{"x":0.999708,"y":0.0807048,"z":-0.0769231},{"x":0.973816,"y":0.240024,"z":-0.0769231},{"x":0.922703,"y":0.393127,"z":-0.0769231},{"x":0.847692,"y":0.536048,"z":-0.0769231},{"x":0.750726,"y":0.665086,"z":-0.0769231},{"x":0.634317,"y":0.776898,"z":-0.0769231},{"x":0.50148,"y":0.868589,"z":-0.0769231},{"x":0.355655,"y":0.937784,"z":-0.0769231},{"x":0.200618,"y":0.982691,"z":-0.0769231},{"x":0.0403851,"y":1.00215,"z":-0.0769231},{"x":-0.120893,"y":0.995647,"z":-0.0769231},{"x":-0.279041,"y":0.963361,"z":-0.0769231},{"x":-0.429962,"y":0.906125,"z":-0.0769231},{"x":-0.569746,"y":0.82542,"z":-0.0769231},{"x":-0.694775,"y":0.723337,"z":-0.0769231},{"x":-0.801809,"y":0.60252,"z":-0.0769231},{"x":-0.888077,"y":0.466099,"z":-0.0769231},{"x":-0.951344,"y":0.317605,"z":-0.0769231},{"x":-0.989972,"y":0.160886,"z":-0.0769231},{"x":-1.00296,"y":1.22827e-16,"z":-0.0769231},{"x":-1.00296,"y":-1.22827e-16,"z":0.0769231},{"x":-0.989972,"y":-0.160886,"z":0.0769231},{"x":-0.951344,"y":-0.317605,"z":0.0769231},{"x":-0.888077,"y":-0.466099,"z":0.0769231},{"x":-0.801809,"y":-0.60252,"z":0.0769231},{"x":-0.694775,"y":-0.723337,"z":0.0769231},{"x":-0.569746,"y":-0.82542,"z":0.0769231},{"x":-0.429962,"y":-0.906125,"z":0.0769231},{"x":-0.279041,"y":-0.963361,"z":0.0769231},{"x":-0.120893,"y":-0.995647,"z":0.0769231},{"x":0.0403851,"y":-1.00215,"z":0.0769231},{"x":0.200618,"y":-0.982691,"z":0.0769231},{"x":0.355655,"y":-0.937784,"z":0.0769231},{"x":0.50148,"y":-0.868589,"z":0.0769231},{"x":0.634317,"y":-0.776898,"z":0.0769231},{"x":0.750726,"y":-0.665086,"z":0.0769231},{"x":0.847692,"y":-0.536048,"z":0.0769231},{"x":0.922703,"y":-0.393127,"z":0.0769231},{"x":0.973816,"y":-0.240024,"z":0.0769231},{"x":0.999708,"y":-0.0807048,"z":0.0769231},{"x":0.999708,"y":0.0807048,"z":0.0769231},{"x":0.973816,"y":0.240024,"z":0.0769231},{"x":0.922703,"y":0.393127,"z":0.0769231},{"x":0.847692,"y":0.536048,"z":0.0769231},{"x":0.750726,"y":0.665086,"z":0.0769231},{"x":0.634317,"y":0.776898,"z":0.0769231},{"x":0.50148,"y":0.868589,"z":0.0769231},{"x":0.355655,"y":0.937784,"z":0.0769231},{"x":0.200618,"y":0.982691,"z":0.0769231},{"x":0.0403851,"y":1.00215,"z":0.0769231},{"x":-0.120893,"y":0.995647,"z":0.0769231},{"x":-0.279041,"y":0.963361,"z":0.0769231},{"x":-0.429962,"y":0.906125,"z":0.0769231},{"x":-0.569746,"y":0.82542,"z":0.0769231},{"x":-0.694775,"y":0.723337,"z":0.0769231},{"x":-0.801809,"y":0.60252,"z":0.0769231},{"x":-0.888077,"y":0.466099,"z":0.0769231},{"x":-0.951344,"y":0.317605,"z":0.0769231},{"x":-0.989972,"y":0.160886,"z":0.0769231},{"x":-1.00296,"y":1.22827e-16,"z":0.0769231},{"x":-1.02675,"y":-1.2574e-16,"z":0.230769},{"x":-1.01345,"y":-0.164702,"z":0.230769},{"x":-0.973906,"y":-0.325137,"z":0.230769},{"x":-0.909138,"y":-0.477152,"z":0.230769},{"x":-0.820824,"y":-0.616809,"z":0.230769},{"x":-0.711252,"y":-0.740491,"z":0.230769},{"x":-0.583258,"y":-0.844995,"z":0.230769},{"x":-0.440158,"y":-0.927614,"z":0.230769},{"x":-0.285659,"y":-0.986208,"z":0.230769},{"x":-0.123761,"y":-1.01926,"z":0.230769},{"x":0.0413429,"y":-1.02591,"z":0.230769},{"x":0.205376,"y":-1.006,"z":0.230769},{"x":0.364089,"y":-0.960024,"z":0.230769},{"x":0.513373,"y":-0.889188,"z":0.230769},{"x":0.649361,"y":-0.795322,"z":0.230769},{"x":0.76853,"y":-0.680858,"z":0.230769},{"x":0.867795,"y":-0.54876,"z":0.230769},{"x":0.944585,"y":-0.40245,"z":0.230769},{"x":0.99691,"y":-0.245716,"z":0.230769},{"x":1.02342,"y":-0.0826187,"z":0.230769},{"x":1.02342,"y":0.0826187,"z":0.230769},{"x":0.99691,"y":0.245716,"z":0.230769},{"x":0.944585,"y":0.40245,"z":0.230769},{"x":0.867795,"y":0.54876,"z":0.230769},{"x":0.76853,"y":0.680858,"z":0.230769},{"x":0.649361,"y":0.795322,"z":0.230769},{"x":0.513373,"y":0.889188,"z":0.230769},{"x":0.364089,"y":0.960024,"z":0.230769},{"x":0.205376,"y":1.006,"z":0.230769},{"x":0.0413429,"y":1.02591,"z":0.230769},{"x":-0.123761,"y":1.01926,"z":0.230769},{"x":-0.285659,"y":0.986208,"z":0.230769},{"x":-0.440158,"y":0.927614,"z":0.230769},{"x":-0.583258,"y":0.844995,"z":0.230769},{"x":-0.711252,"y":0.740491,"z":0.230769},{"x":-0.820824,"y":0.616809,"z":0.230769},{"x":-0.909138,"y":0.477152,"z":0.230769},{"x":-0.973906,"y":0.325137,"z":0.230769},{"x":-1.01345,"y":0.164702,"z":0.230769},{"x":-1.02675,"y":1.2574e-16,"z":0.230769},{"x":-1.07488,"y":-1.31635e-16,"z":0.384615},{"x":-1.06096,"y":-0.172423,"z":0.384615},{"x":-1.01956,"y":-0.34038,"z":0.384615},{"x":-0.95176,"y":-0.499522,"z":0.384615},{"x":-0.859306,"y":-0.645726,"z":0.384615},{"x":-0.744596,"y":-0.775207,"z":0.384615},{"x":-0.610602,"y":-0.88461,"z":0.384615},{"x":-0.460793,"y":-0.971102,"z":0.384615},{"x":-0.299051,"y":-1.03244,"z":0.384615},{"x":-0.129563,"y":-1.06704,"z":0.384615},{"x":0.0432811,"y":-1.07401,"z":0.384615},{"x":0.215004,"y":-1.05316,"z":0.384615},{"x":0.381158,"y":-1.00503,"z":0.384615},{"x":0.53744,"y":-0.930874,"z":0.384615},{"x":0.679803,"y":-0.832608,"z":0.384615},{"x":0.80456,"y":-0.712778,"z":0.384615},{"x":0.908479,"y":-0.574487,"z":0.384615},{"x":0.988868,"y":-0.421317,"z":0.384615},{"x":1.04365,"y":-0.257236,"z":0.384615},{"x":1.0714,"y":-0.086492,"z":0.384615},{"x":1.0714,"y":0.086492,"z":0.384615},{"x":1.04365,"y":0.257236,"z":0.384615},{"x":0.988868,"y":0.421317,"z":0.384615},{"x":0.908479,"y":0.574487,"z":0.384615},{"x":0.80456,"y":0.712778,"z":0.384615},{"x":0.679803,"y":0.832608,"z":0.384615},{"x":0.53744,"y":0.930874,"z":0.384615},{"x":0.381158,"y":1.00503,"z":0.384615},{"x":0.215004,"y":1.05316,"z":0.384615},{"x":0.0432811,"y":1.07401,"z":0.384615},{"x":-0.129563,"y":1.06704,"z":0.384615},{"x":-0.299051,"y":1.03244,"z":0.384615},{"x":-0.460793,"y":0.971102,"z":0.384615},{"x":-0.610602,"y":0.88461,"z":0.384615},{"x":-0.744596,"y":0.775207,"z":0.384615},{"x":-0.859306,"y":0.645726,"z":0.384615},{"x":-0.95176,"y":0.499522,"z":0.384615},{"x":-1.01956,"y":0.34038,"z":0.384615},{"x":-1.06096,"y":0.172423,"z":0.384615},{"x":-1.07488,"y":1.31635e-16,"z":0.384615},{"x":-1.14851,"y":-1.40652e-16,"z":0.538462},{"x":-1.13363,"y":-0.184234,"z":0.538462},{"x":-1.0894,"y":-0.363695,"z":0.538462},{"x":-1.01695,"y":-0.533738,"z":0.538462},{"x":-0.918166,"y":-0.689957,"z":0.538462},{"x":-0.795599,"y":-0.828306,"z":0.538462},{"x":-0.652426,"y":-0.945203,"z":0.538462},{"x":-0.492356,"y":-1.03762,"z":0.538462},{"x":-0.319535,"y":-1.10316,"z":0.538462},{"x":-0.138437,"y":-1.14013,"z":0.538462},{"x":0.0462457,"y":-1.14758,"z":0.538462},{"x":0.229731,"y":-1.1253,"z":0.538462},{"x":0.407266,"y":-1.07387,"z":0.538462},{"x":0.574254,"y":-0.994636,"z":0.538462},{"x":0.726368,"y":-0.889639,"z":0.538462},{"x":0.85967,"y":-0.761601,"z":0.538462},{"x":0.970707,"y":-0.613838,"z":0.538462},{"x":1.0566,"y":-0.450176,"z":0.538462},{"x":1.11513,"y":-0.274856,"z":0.538462},{"x":1.14478,"y":-0.0924164,"z":0.538462},{"x":1.14478,"y":0.0924164,"z":0.538462},{"x":1.11513,"y":0.274856,"z":0.538462},{"x":1.0566,"y":0.450176,"z":0.538462},{"x":0.970707,"y":0.613838,"z":0.538462},{"x":0.85967,"y":0.761601,"z":0.538462},{"x":0.726368,"y":0.889639,"z":0.538462},{"x":0.574254,"y":0.994636,"z":0.538462},{"x":0.407266,"y":1.07387,"z":0.538462},{"x":0.229731,"y":1.1253,"z":0.538462},{"x":0.0462457,"y":1.14758,"z":0.538462},{"x":-0.138437,"y":1.14013,"z":0.538462},{"x":-0.319535,"y":1.10316,"z":0.538462},{"x":-0.492356,"y":1.03762,"z":0.538462},{"x":-0.652426,"y":0.945203,"z":0.538462},{"x":-0.795599,"y":0.828306,"z":0.538462},{"x":-0.918166,"y":0.689957,"z":0.538462},{"x":-1.01695,"y":0.533738,"z":0.538462},{"x":-1.0894,"y":0.363695,"z":0.538462},{"x":-1.13363,"y":0.184234,"z":0.538462},{"x":-1.14851,"y":1.40652e-16,"z":0.538462},{"x":-1.24937,"y":-1.53004e-16,"z":0.692308},{"x":-1.23319,"y":-0.200413,"z":0.692308},{"x":-1.18507,"y":-0.395636,"z":0.692308},{"x":-1.10626,"y":-0.580612,"z":0.692308},{"x":-0.9988,"y":-0.75055,"z":0.692308},{"x":-0.86547,"y":-0.901049,"z":0.692308},{"x":-0.709724,"y":-1.02821,"z":0.692308},{"x":-0.535596,"y":-1.12874,"z":0.692308},{"x":-0.347597,"y":-1.20004,"z":0.692308},{"x":-0.150595,"y":-1.24026,"z":0.692308},{"x":0.0503071,"y":-1.24836,"z":0.692308},{"x":0.249906,"y":-1.22412,"z":0.692308},{"x":0.443033,"y":-1.16818,"z":0.692308},{"x":0.624685,"y":-1.08199,"z":0.692308},{"x":0.790159,"y":-0.967769,"z":0.692308},{"x":0.935167,"y":-0.828486,"z":0.692308},{"x":1.05596,"y":-0.667746,"z":0.692308},{"x":1.1494,"y":-0.489712,"z":0.692308},{"x":1.21307,"y":-0.298994,"z":0.692308},{"x":1.24532,"y":-0.100533,"z":0.692308},{"x":1.24532,"y":0.100533,"z":0.692308},{"x":1.21307,"y":0.298994,"z":0.692308},{"x":1.1494,"y":0.489712,"z":0.692308},{"x":1.05596,"y":0.667746,"z":0.692308},{"x":0.935167,"y":0.828486,"z":0.692308},{"x":0.790159,"y":0.967769,"z":0.692308},{"x":0.624685,"y":1.08199,"z":0.692308},{"x":0.443033,"y":1.16818,"z":0.692308},{"x":0.249906,"y":1.22412,"z":0.692308},{"x":0.0503071,"y":1.24836,"z":0.692308},{"x":-0.150595,"y":1.24026,"z":0.692308},{"x":-0.347597,"y":1.20004,"z":0.692308},{"x":-0.535596,"y":1.12874,"z":0.692308},{"x":-0.709724,"y":1.02821,"z":0.692308},{"x":-0.86547,"y":0.901049,"z":0.692308},{"x":-0.9988,"y":0.75055,"z":0.692308},{"x":-1.10626,"y":0.580612,"z":0.692308},{"x":-1.18507,"y":0.395636,"z":0.692308},{"x":-1.23319,"y":0.200413,"z":0.692308},{"x":-1.24937,"y":1.53004e-16,"z":0.692308},{"x":-1.37986,"y":-1.68985e-16,"z":0.846154},{"x":-1.36199,"y":-0.221346,"z":0.846154},{"x":-1.30885,"y":-0.436959,"z":0.846154},{"x":-1.22181,"y":-0.641255,"z":0.846154},{"x":-1.10312,"y":-0.828942,"z":0.846154},{"x":-0.955865,"y":-0.995161,"z":0.846154},{"x":-0.783852,"y":-1.13561,"z":0.846154},{"x":-0.591537,"y":-1.24664,"z":0.846154},{"x":-0.383902,"y":-1.32538,"z":0.846154},{"x":-0.166324,"y":-1.3698,"z":0.846154},{"x":0.0555615,"y":-1.37874,"z":0.846154},{"x":0.276008,"y":-1.35198,"z":0.846154},{"x":0.489306,"y":-1.2902,"z":0.846154},{"x":0.689932,"y":-1.195,"z":0.846154},{"x":0.872688,"y":-1.06885,"z":0.846154},{"x":1.03284,"y":-0.915019,"z":0.846154},{"x":1.16625,"y":-0.73749,"z":0.846154},{"x":1.26945,"y":-0.540861,"z":0.846154},{"x":1.33977,"y":-0.330223,"z":0.846154},{"x":1.37539,"y":-0.111033,"z":0.846154},{"x":1.37539,"y":0.111033,"z":0.846154},{"x":1.33977,"y":0.330223,"z":0.846154},{"x":1.26945,"y":0.540861,"z":0.846154},{"x":1.16625,"y":0.73749,"z":0.846154},{"x":1.03284,"y":0.915019,"z":0.846154},{"x":0.872688,"y":1.06885,"z":0.846154},{"x":0.689932,"y":1.195,"z":0.846154},{"x":0.489306,"y":1.2902,"z":0.846154},{"x":0.276008,"y":1.35198,"z":0.846154},{"x":0.0555615,"y":1.37874,"z":0.846154},{"x":-0.166324,"y":1.3698,"z":0.846154},{"x":-0.383902,"y":1.32538,"z":0.846154},{"x":-0.591537,"y":1.24664,"z":0.846154},{"x":-0.783852,"y":1.13561,"z":0.846154},{"x":-0.955865,"y":0.995161,"z":0.846154},{"x":-1.10312,"y":0.828942,"z":0.846154},{"x":-1.22181,"y":0.641255,"z":0.846154},{"x":-1.30885,"y":0.436959,"z":0.846154},{"x":-1.36199,"y":0.221346,"z":0.846154},{"x":-1.37986,"y":1.68985e-16,"z":0.846154},{"x":-1.54308,"y":-1.88973e-16,"z":1},{"x":-1.5231,"y":-0.247528,"z":1},{"x":-1.46367,"y":-0.488644,"z":1},{"x":-1.36633,"y":-0.717105,"z":1},{"x":-1.2336,"y":-0.926994,"z":1},{"x":-1.06893,"y":-1.11287,"z":1},{"x":-0.87657,"y":-1.26993,"z":1},{"x":-0.661507,"y":-1.3941,"z":1},{"x":-0.429312,"y":-1.48216,"z":1},{"x":-0.185998,"y":-1.53183,"z":1},{"x":0.0621336,"y":-1.54183,"z":1},{"x":0.308656,"y":-1.5119,"z":1},{"x":0.547184,"y":-1.44281,"z":1},{"x":0.77154,"y":-1.33635,"z":1},{"x":0.975914,"y":-1.19528,"z":1},{"x":1.15501,"y":-1.02325,"z":1},{"x":1.3042,"y":-0.824724,"z":1},{"x":1.4196,"y":-0.604836,"z":1},{"x":1.49824,"y":-0.369283,"z":1},{"x":1.53808,"y":-0.124166,"z":1},{"x":1.53808,"y":0.124166,"z":1},{"x":1.49824,"y":0.369283,"z":1},{"x":1.4196,"y":0.604836,"z":1},{"x":1.3042,"y":0.824724,"z":1},{"x":1.15501,"y":1.02325,"z":1},{"x":0.975914,"y":1.19528,"z":1},{"x":0.77154,"y":1.33635,"z":1},{"x":0.547184,"y":1.44281,"z":1},{"x":0.308656,"y":1.5119,"z":1},{"x":0.0621336,"y":1.54183,"z":1},{"x":-0.185998,"y":1.53183,"z":1},{"x":-0.429312,"y":1.48216,"z":1},{"x":-0.661507,"y":1.3941,"z":1},{"x":-0.87657,"y":1.26993,"z":1},{"x":-1.06893,"y":1.11287,"z":1},{"x":-1.2336,"y":0.926994,"z":1},{"x":-1.36633,"y":0.717105,"z":1},{"x":-1.46367,"y":0.488644,"z":1},{"x":-1.5231,"y":0.247528,"z":1},{"x":-1.54308,"y":1.88973e-16,"z":1},{"x":-1.74289,"y":-2.13443e-16,"z":1.15385},{"x":-1.72032,"y":-0.27958,"z":1.15385},{"x":-1.6532,"y":-0.551918,"z":1.15385},{"x":-1.54325,"y":-0.809962,"z":1.15385},{"x":-1.39334,"y":-1.04703,"z":1.15385},{"x":-1.20734,"y":-1.25698,"z":1.15385},{"x":-0.990076,"y":-1.43437,"z":1.15385},{"x":-0.747165,"y":-1.57462,"z":1.15385},{"x":-0.484903,"y":-1.67408,"z":1.15385},{"x":-0.210082,"y":-1.73018,"z":1.15385},{"x":0.0701792,"y":-1.74148,"z":1.15385},{"x":0.348623,"y":-1.70767,"z":1.15385},{"x":0.618038,"y":-1.62963,"z":1.15385},{"x":0.871446,"y":-1.50939,"z":1.15385},{"x":1.10228,"y":-1.35005,"z":1.15385},{"x":1.30457,"y":-1.15575,"z":1.15385},{"x":1.47308,"y":-0.931516,"z":1.15385},{"x":1.60343,"y":-0.683156,"z":1.15385},{"x":1.69225,"y":-0.417101,"z":1.15385},{"x":1.73724,"y":-0.140245,"z":1.15385},{"x":1.73724,"y":0.140245,"z":1.15385},{"x":1.69225,"y":0.417101,"z":1.15385},{"x":1.60343,"y":0.683156,"z":1.15385},{"x":1.47308,"y":0.931516,"z":1.15385},{"x":1.30457,"y":1.15575,"z":1.15385},{"x":1.10228,"y":1.35005,"z":1.15385},{"x":0.871446,"y":1.50939,"z":1.15385},{"x":0.618038,"y":1.62963,"z":1.15385},{"x":0.348623,"y":1.70767,"z":1.15385},{"x":0.0701792,"y":1.74148,"z":1.15385},{"x":-0.210082,"y":1.73018,"z":1.15385},{"x":-0.484903,"y":1.67408,"z":1.15385},{"x":-0.747165,"y":1.57462,"z":1.15385},{"x":-0.990076,"y":1.43437,"z":1.15385},{"x":-1.20734,"y":1.25698,"z":1.15385},{"x":-1.39334,"y":1.04703,"z":1.15385},{"x":-1.54325,"y":0.809962,"z":1.15385},{"x":-1.6532,"y":0.551918,"z":1.15385},{"x":-1.72032,"y":0.27958,"z":1.15385},{"x":-1.74289,"y":2.13443e-16,"z":1.15385},{"x":-1.98404,"y":-2.42974e-16,"z":1.30769},{"x":-1.95834,"y":-0.318262,"z":1.30769},{"x":-1.88193,"y":-0.628281,"z":1.30769},{"x":-1.75678,"y":-0.922028,"z":1.30769},{"x":-1.58612,"y":-1.19189,"z":1.30769},{"x":-1.37439,"y":-1.43089,"z":1.30769},{"x":-1.12706,"y":-1.63283,"z":1.30769},{"x":-0.850542,"y":-1.79248,"z":1.30769},{"x":-0.551994,"y":-1.9057,"z":1.30769},{"x":-0.239149,"y":-1.96957,"z":1.30769},{"x":0.0798891,"y":-1.98243,"z":1.30769},{"x":0.396858,"y":-1.94394,"z":1.30769},{"x":0.703549,"y":-1.85511,"z":1.30769},{"x":0.992019,"y":-1.71823,"z":1.30769},{"x":1.2548,"y":-1.53685,"z":1.30769},{"x":1.48507,"y":-1.31566,"z":1.30769},{"x":1.67689,"y":-1.0604,"z":1.30769},{"x":1.82527,"y":-0.777676,"z":1.30769},{"x":1.92638,"y":-0.474811,"z":1.30769},{"x":1.9776,"y":-0.159649,"z":1.30769},{"x":1.9776,"y":0.159649,"z":1.30769},{"x":1.92638,"y":0.474811,"z":1.30769},{"x":1.82527,"y":0.777676,"z":1.30769},{"x":1.67689,"y":1.0604,"z":1.30769},{"x":1.48507,"y":1.31566,"z":1.30769},{"x":1.2548,"y":1.53685,"z":1.30769},{"x":0.992019,"y":1.71823,"z":1.30769},{"x":0.703549,"y":1.85511,"z":1.30769},{"x":0.396858,"y":1.94394,"z":1.30769},{"x":0.0798891,"y":1.98243,"z":1.30769},{"x":-0.239149,"y":1.96957,"z":1.30769},{"x":-0.551994,"y":1.9057,"z":1.30769},{"x":-0.850542,"y":1.79248,"z":1.30769},{"x":-1.12706,"y":1.63283,"z":1.30769},{"x":-1.37439,"y":1.43089,"z":1.30769},{"x":-1.58612,"y":1.19189,"z":1.30769},{"x":-1.75678,"y":0.922028,"z":1.30769},{"x":-1.88193,"y":0.628281,"z":1.30769},{"x":-1.95834,"y":0.318262,"z":1.30769},{"x":-1.98404,"y":2.42974e-16,"z":1.30769},{"x":-2.27223,"y":-2.78268e-16,"z":1.46154},{"x":-2.24281,"y":-0.364492,"z":1.46154},{"x":-2.1553,"y":-0.719544,"z":1.46154},{"x":-2.01196,"y":-1.05596,"z":1.46154},{"x":-1.81652,"y":-1.36503,"z":1.46154},{"x":-1.57403,"y":-1.63874,"z":1.46154},{"x":-1.29078,"y":-1.87001,"z":1.46154},{"x":-0.97409,"y":-2.05285,"z":1.46154},{"x":-0.632175,"y":-2.18252,"z":1.46154},{"x":-0.273888,"y":-2.25567,"z":1.46154},{"x":0.0914936,"y":-2.27039,"z":1.46154},{"x":0.454505,"y":-2.22631,"z":1.46154},{"x":0.805745,"y":-2.12458,"z":1.46154},{"x":1.13612,"y":-1.96781,"z":1.46154},{"x":1.43706,"y":-1.76008,"z":1.46154},{"x":1.70079,"y":-1.50677,"z":1.46154},{"x":1.92047,"y":-1.21443,"z":1.46154},{"x":2.09041,"y":-0.89064,"z":1.46154},{"x":2.20621,"y":-0.543781,"z":1.46154},{"x":2.26487,"y":-0.182839,"z":1.46154},{"x":2.26487,"y":0.182839,"z":1.46154},{"x":2.20621,"y":0.543781,"z":1.46154},{"x":2.09041,"y":0.89064,"z":1.46154},{"x":1.92047,"y":1.21443,"z":1.46154},{"x":1.70079,"y":1.50677,"z":1.46154},{"x":1.43706,"y":1.76008,"z":1.46154},{"x":1.13612,"y":1.96781,"z":1.46154},{"x":0.805745,"y":2.12458,"z":1.46154},{"x":0.454505,"y":2.22631,"z":1.46154},{"x":0.0914936,"y":2.27039,"z":1.46154},{"x":-0.273888,"y":2.25567,"z":1.46154},{"x":-0.632175,"y":2.18252,"z":1.46154},{"x":-0.97409,"y":2.05285,"z":1.46154},{"x":-1.29078,"y":1.87001,"z":1.46154},{"x":-1.57403,"y":1.63874,"z":1.46154},{"x":-1.81652,"y":1.36503,"z":1.46154},{"x":-2.01196,"y":1.05596,"z":1.46154},{"x":-2.1553,"y":0.719544,"z":1.46154},{"x":-2.24281,"y":0.364492,"z":1.46154},{"x":-2.27223,"y":2.78268e-16,"z":1.46154},{"x":-2.61432,"y":-3.20162e-16,"z":1.61538},{"x":-2.58046,"y":-0.419366,"z":1.61538},{"x":-2.47978,"y":-0.827871,"z":1.61538},{"x":-2.31486,"y":-1.21493,"z":1.61538},{"x":-2.09,"y":-1.57053,"z":1.61538},{"x":-1.811,"y":-1.88545,"z":1.61538},{"x":-1.4851,"y":-2.15154,"z":1.61538},{"x":-1.12074,"y":-2.36191,"z":1.61538},{"x":-0.727349,"y":-2.5111,"z":1.61538},{"x":-0.315121,"y":-2.59526,"z":1.61538},{"x":0.105268,"y":-2.6122,"z":1.61538},{"x":0.522931,"y":-2.56148,"z":1.61538},{"x":0.92705,"y":-2.44443,"z":1.61538},{"x":1.30716,"y":-2.26407,"z":1.61538},{"x":1.65341,"y":-2.02506,"z":1.61538},{"x":1.95685,"y":-1.73361,"z":1.61538},{"x":2.2096,"y":-1.39726,"z":1.61538},{"x":2.40512,"y":-1.02473,"z":1.61538},{"x":2.53835,"y":-0.625647,"z":1.61538},{"x":2.60584,"y":-0.210365,"z":1.61538},{"x":2.60584,"y":0.210365,"z":1.61538},{"x":2.53835,"y":0.625647,"z":1.61538},{"x":2.40512,"y":1.02473,"z":1.61538},{"x":2.2096,"y":1.39726,"z":1.61538},{"x":1.95685,"y":1.73361,"z":1.61538},{"x":1.65341,"y":2.02506,"z":1.61538},{"x":1.30716,"y":2.26407,"z":1.61538},{"x":0.92705,"y":2.44443,"z":1.61538},{"x":0.522931,"y":2.56148,"z":1.61538},{"x":0.105268,"y":2.6122,"z":1.61538},{"x":-0.315121,"y":2.59526,"z":1.61538},{"x":-0.727349,"y":2.5111,"z":1.61538},{"x":-1.12074,"y":2.36191,"z":1.61538},{"x":-1.4851,"y":2.15154,"z":1.61538},{"x":-1.811,"y":1.88545,"z":1.61538},{"x":-2.09,"y":1.57053,"z":1.61538},{"x":-2.31486,"y":1.21493,"z":1.61538},{"x":-2.47978,"y":0.827871,"z":1.61538},{"x":-2.58046,"y":0.419366,"z":1.61538},{"x":-2.61432,"y":3.20162e-16,"z":1.61538},{"x":-3.0184,"y":-3.69648e-16,"z":1.76923},{"x":-2.97931,"y":-0.484186,"z":1.76923},{"x":-2.86306,"y":-0.955831,"z":1.76923},{"x":-2.67266,"y":-1.40272,"z":1.76923},{"x":-2.41304,"y":-1.81328,"z":1.76923},{"x":-2.09092,"y":-2.17688,"z":1.76923},{"x":-1.71465,"y":-2.4841,"z":1.76923},{"x":-1.29397,"y":-2.72698,"z":1.76923},{"x":-0.839772,"y":-2.89923,"z":1.76923},{"x":-0.363828,"y":-2.99639,"z":1.76923},{"x":0.121539,"y":-3.01595,"z":1.76923},{"x":0.603758,"y":-2.9574,"z":1.76923},{"x":1.07034,"y":-2.82225,"z":1.76923},{"x":1.5092,"y":-2.61401,"z":1.76923},{"x":1.90897,"y":-2.33807,"z":1.76923},{"x":2.25931,"y":-2.00157,"z":1.76923},{"x":2.55112,"y":-1.61323,"z":1.76923},{"x":2.77687,"y":-1.18311,"z":1.76923},{"x":2.93069,"y":-0.722351,"z":1.76923},{"x":3.00861,"y":-0.24288,"z":1.76923},{"x":3.00861,"y":0.24288,"z":1.76923},{"x":2.93069,"y":0.722351,"z":1.76923},{"x":2.77687,"y":1.18311,"z":1.76923},{"x":2.55112,"y":1.61323,"z":1.76923},{"x":2.25931,"y":2.00157,"z":1.76923},{"x":1.90897,"y":2.33807,"z":1.76923},{"x":1.5092,"y":2.61401,"z":1.76923},{"x":1.07034,"y":2.82225,"z":1.76923},{"x":0.603758,"y":2.9574,"z":1.76923},{"x":0.121539,"y":3.01595,"z":1.76923},{"x":-0.363828,"y":2.99639,"z":1.76923},{"x":-0.839772,"y":2.89923,"z":1.76923},{"x":-1.29397,"y":2.72698,"z":1.76923},{"x":-1.71465,"y":2.4841,"z":1.76923},{"x":-2.09092,"y":2.17688,"z":1.76923},{"x":-2.41304,"y":1.81328,"z":1.76923},{"x":-2.67266,"y":1.40272,"z":1.76923},{"x":-2.86306,"y":0.955831,"z":1.76923},{"x":-2.97931,"y":0.484186,"z":1.76923},{"x":-3.0184,"y":3.69648e-16,"z":1.76923},{"x":-3.49407,"y":-4.279e-16,"z":1.92308},{"x":-3.44882,"y":-0.560488,"z":1.92308},{"x":-3.31425,"y":-1.10646,"z":1.92308},{"x":-3.09384,"y":-1.62377,"z":1.92308},{"x":-2.79331,"y":-2.09903,"z":1.92308},{"x":-2.42043,"y":-2.51993,"z":1.92308},{"x":-1.98486,"y":-2.87556,"z":1.92308},{"x":-1.49788,"y":-3.15672,"z":1.92308},{"x":-0.972111,"y":-3.35612,"z":1.92308},{"x":-0.421163,"y":-3.46859,"z":1.92308},{"x":0.140692,"y":-3.49123,"z":1.92308},{"x":0.698903,"y":-3.42345,"z":1.92308},{"x":1.23901,"y":-3.26701,"z":1.92308},{"x":1.74703,"y":-3.02595,"z":1.92308},{"x":2.20981,"y":-2.70652,"z":1.92308},{"x":2.61535,"y":-2.317,"z":1.92308},{"x":2.95315,"y":-1.86746,"z":1.92308},{"x":3.21447,"y":-1.36956,"z":1.92308},{"x":3.39254,"y":-0.836185,"z":1.92308},{"x":3.48274,"y":-0.281156,"z":1.92308},{"x":3.48274,"y":0.281156,"z":1.92308},{"x":3.39254,"y":0.836185,"z":1.92308},{"x":3.21447,"y":1.36956,"z":1.92308},{"x":2.95315,"y":1.86746,"z":1.92308},{"x":2.61535,"y":2.317,"z":1.92308},{"x":2.20981,"y":2.70652,"z":1.92308},{"x":1.74703,"y":3.02595,"z":1.92308},{"x":1.23901,"y":3.26701,"z":1.92308},{"x":0.698903,"y":3.42345,"z":1.92308},{"x":0.140692,"y":3.49123,"z":1.92308},{"x":-0.421163,"y":3.46859,"z":1.92308},{"x":-0.972111,"y":3.35612,"z":1.92308},{"x":-1.49788,"y":3.15672,"z":1.92308},{"x":-1.98486,"y":2.87556,"z":1.92308},{"x":-2.42043,"y":2.51993,"z":1.92308},{"x":-2.79331,"y":2.09903,"z":1.92308},{"x":-3.09384,"y":1.62377,"z":1.92308},{"x":-3.31425,"y":1.10646,"z":1.92308},{"x":-3.44882,"y":0.560488,"z":1.92308},{"x":-3.49407,"y":4.279e-16,"z":1.92308},{"x":-4.0526,"y":-4.963e-16,"z":2.07692},{"x":-4.00012,"y":-0.650082,"z":2.07692},{"x":-3.84404,"y":-1.28333,"z":2.07692},{"x":-3.5884,"y":-1.88334,"z":2.07692},{"x":-3.23982,"y":-2.43457,"z":2.07692},{"x":-2.80733,"y":-2.92274,"z":2.07692},{"x":-2.30214,"y":-3.33522,"z":2.07692},{"x":-1.73732,"y":-3.66132,"z":2.07692},{"x":-1.1275,"y":-3.89259,"z":2.07692},{"x":-0.488487,"y":-4.02305,"z":2.07692},{"x":0.163182,"y":-4.04931,"z":2.07692},{"x":0.810623,"y":-3.9707,"z":2.07692},{"x":1.43707,"y":-3.78924,"z":2.07692},{"x":2.0263,"y":-3.50965,"z":2.07692},{"x":2.56305,"y":-3.13916,"z":2.07692},{"x":3.03341,"y":-2.68737,"z":2.07692},{"x":3.42521,"y":-2.16597,"z":2.07692},{"x":3.72831,"y":-1.58848,"z":2.07692},{"x":3.93484,"y":-0.96985,"z":2.07692},{"x":4.03946,"y":-0.326099,"z":2.07692},{"x":4.03946,"y":0.326099,"z":2.07692},{"x":3.93484,"y":0.96985,"z":2.07692},{"x":3.72831,"y":1.58848,"z":2.07692},{"x":3.42521,"y":2.16597,"z":2.07692},{"x":3.03341,"y":2.68737,"z":2.07692},{"x":2.56305,"y":3.13916,"z":2.07692},{"x":2.0263,"y":3.50965,"z":2.07692},{"x":1.43707,"y":3.78924,"z":2.07692},{"x":0.810623,"y":3.9707,"z":2.07692},{"x":0.163182,"y":4.04931,"z":2.07692},{"x":-0.488487,"y":4.02305,"z":2.07692},{"x":-1.1275,"y":3.89259,"z":2.07692},{"x":-1.73732,"y":3.66132,"z":2.07692},{"x":-2.30214,"y":3.33522,"z":2.07692},{"x":-2.80733,"y":2.92274,"z":2.07692},{"x":-3.23982,"y":2.43457,"z":2.07692},{"x":-3.5884,"y":1.88334,"z":2.07692},{"x":-3.84404,"y":1.28333,"z":2.07692},{"x":-4.00012,"y":0.650082,"z":2.07692},{"x":-4.0526,"y":4.963e-16,"z":2.07692},{"x":-4.70723,"y":-5.7647e-16,"z":2.23077},{"x":-4.64628,"y":-0.755093,"z":2.23077},{"x":-4.46498,"y":-1.49063,"z":2.23077},{"x":-4.16805,"y":-2.18756,"z":2.23077},{"x":-3.76316,"y":-2.82783,"z":2.23077},{"x":-3.26082,"y":-3.39487,"z":2.23077},{"x":-2.67401,"y":-3.87398,"z":2.23077},{"x":-2.01796,"y":-4.25275,"z":2.23077},{"x":-1.30963,"y":-4.52138,"z":2.23077},{"x":-0.567394,"y":-4.67291,"z":2.23077},{"x":0.189541,"y":-4.70342,"z":2.23077},{"x":0.941568,"y":-4.6121,"z":2.23077},{"x":1.66921,"y":-4.40134,"z":2.23077},{"x":2.35362,"y":-4.07658,"z":2.23077},{"x":2.97707,"y":-3.64625,"z":2.23077},{"x":3.52342,"y":-3.12147,"z":2.23077},{"x":3.97851,"y":-2.51586,"z":2.23077},{"x":4.33056,"y":-1.84508,"z":2.23077},{"x":4.57045,"y":-1.12651,"z":2.23077},{"x":4.69197,"y":-0.378775,"z":2.23077},{"x":4.69197,"y":0.378775,"z":2.23077},{"x":4.57045,"y":1.12651,"z":2.23077},{"x":4.33056,"y":1.84508,"z":2.23077},{"x":3.97851,"y":2.51586,"z":2.23077},{"x":3.52342,"y":3.12147,"z":2.23077},{"x":2.97707,"y":3.64625,"z":2.23077},{"x":2.35362,"y":4.07658,"z":2.23077},{"x":1.66921,"y":4.40134,"z":2.23077},{"x":0.941568,"y":4.6121,"z":2.23077},{"x":0.189541,"y":4.70342,"z":2.23077},{"x":-0.567394,"y":4.67291,"z":2.23077},{"x":-1.30963,"y":4.52138,"z":2.23077},{"x":-2.01796,"y":4.25275,"z":2.23077},{"x":-2.67401,"y":3.87398,"z":2.23077},{"x":-3.26082,"y":3.39487,"z":2.23077},{"x":-3.76316,"y":2.82783,"z":2.23077},{"x":-4.16805,"y":2.18756,"z":2.23077},{"x":-4.46498,"y":1.49063,"z":2.23077},{"x":-4.64628,"y":0.755093,"z":2.23077},{"x":-4.70723,"y":5.7647e-16,"z":2.23077},{"x":-5.47351,"y":-6.70311e-16,"z":2.38462},{"x":-5.40263,"y":-0.878012,"z":2.38462},{"x":-5.19182,"y":-1.73328,"z":2.38462},{"x":-4.84655,"y":-2.54366,"z":2.38462},{"x":-4.37575,"y":-3.28817,"z":2.38462},{"x":-3.79163,"y":-3.94751,"z":2.38462},{"x":-3.10931,"y":-4.50461,"z":2.38462},{"x":-2.34645,"y":-4.94504,"z":2.38462},{"x":-1.52282,"y":-5.2574,"z":2.38462},{"x":-0.659758,"y":-5.4336,"z":2.38462},{"x":0.220396,"y":-5.46907,"z":2.38462},{"x":1.09484,"y":-5.36289,"z":2.38462},{"x":1.94093,"y":-5.11782,"z":2.38462},{"x":2.73675,"y":-4.74019,"z":2.38462},{"x":3.46169,"y":-4.2398,"z":2.38462},{"x":4.09698,"y":-3.62961,"z":2.38462},{"x":4.62615,"y":-2.9254,"z":2.38462},{"x":5.03551,"y":-2.14543,"z":2.38462},{"x":5.31446,"y":-1.3099,"z":2.38462},{"x":5.45576,"y":-0.440434,"z":2.38462},{"x":5.45576,"y":0.440434,"z":2.38462},{"x":5.31446,"y":1.3099,"z":2.38462},{"x":5.03551,"y":2.14543,"z":2.38462},{"x":4.62615,"y":2.9254,"z":2.38462},{"x":4.09698,"y":3.62961,"z":2.38462},{"x":3.46169,"y":4.2398,"z":2.38462},{"x":2.73675,"y":4.74019,"z":2.38462},{"x":1.94093,"y":5.11782,"z":2.38462},{"x":1.09484,"y":5.36289,"z":2.38462},{"x":0.220396,"y":5.46907,"z":2.38462},{"x":-0.659758,"y":5.4336,"z":2.38462},{"x":-1.52282,"y":5.2574,"z":2.38462},{"x":-2.34645,"y":4.94504,"z":2.38462},{"x":-3.10931,"y":4.50461,"z":2.38462},{"x":-3.79163,"y":3.94751,"z":2.38462},{"x":-4.37575,"y":3.28817,"z":2.38462},{"x":-4.84655,"y":2.54366,"z":2.38462},{"x":-5.19182,"y":1.73328,"z":2.38462},{"x":-5.40263,"y":0.878012,"z":2.38462},{"x":-5.47351,"y":6.70311e-16,"z":2.38462},{"x":-6.36958,"y":-7.80049e-16,"z":2.53846},{"x":-6.2871,"y":-1.02175,"z":2.53846},{"x":-6.04178,"y":-2.01704,"z":2.53846},{"x":-5.63999,"y":-2.96009,"z":2.53846},{"x":-5.09212,"y":-3.82648,"z":2.53846},{"x":-4.41237,"y":-4.59376,"z":2.53846},{"x":-3.61834,"y":-5.24206,"z":2.53846},{"x":-2.73059,"y":-5.7546,"z":2.53846},{"x":-1.77213,"y":-6.1181,"z":2.53846},{"x":-0.767768,"y":-6.32314,"z":2.53846},{"x":0.256477,"y":-6.36442,"z":2.53846},{"x":1.27408,"y":-6.24086,"z":2.53846},{"x":2.25869,"y":-5.95566,"z":2.53846},{"x":3.18479,"y":-5.51622,"z":2.53846},{"x":4.02841,"y":-4.93391,"z":2.53846},{"x":4.7677,"y":-4.22382,"z":2.53846},{"x":5.38351,"y":-3.40432,"z":2.53846},{"x":5.85989,"y":-2.49666,"z":2.53846},{"x":6.18449,"y":-1.52434,"z":2.53846},{"x":6.34893,"y":-0.512539,"z":2.53846},{"x":6.34893,"y":0.512539,"z":2.53846},{"x":6.18449,"y":1.52434,"z":2.53846},{"x":5.85989,"y":2.49666,"z":2.53846},{"x":5.38351,"y":3.40432,"z":2.53846},{"x":4.7677,"y":4.22382,"z":2.53846},{"x":4.02841,"y":4.93391,"z":2.53846},{"x":3.18479,"y":5.51622,"z":2.53846},{"x":2.25869,"y":5.95566,"z":2.53846},{"x":1.27408,"y":6.24086,"z":2.53846},{"x":0.256477,"y":6.36442,"z":2.53846},{"x":-0.767768,"y":6.32314,"z":2.53846},{"x":-1.77213,"y":6.1181,"z":2.53846},{"x":-2.73059,"y":5.7546,"z":2.53846},{"x":-3.61834,"y":5.24206,"z":2.53846},{"x":-4.41237,"y":4.59376,"z":2.53846},{"x":-5.09212,"y":3.82648,"z":2.53846},{"x":-5.63999,"y":2.96009,"z":2.53846},{"x":-6.04178,"y":2.01704,"z":2.53846},{"x":-6.2871,"y":1.02175,"z":2.53846},{"x":-6.36958,"y":7.80049e-16,"z":2.53846},{"x":-7.41672,"y":-9.08286e-16,"z":2.69231},{"x":-7.32067,"y":-1.18973,"z":2.69231},{"x":-7.03503,"y":-2.34864,"z":2.69231},{"x":-6.56718,"y":-3.44672,"z":2.69231},{"x":-5.92924,"y":-4.45554,"z":2.69231},{"x":-5.13774,"y":-5.34896,"z":2.69231},{"x":-4.21318,"y":-6.10384,"z":2.69231},{"x":-3.17949,"y":-6.70064,"z":2.69231},{"x":-2.06346,"y":-7.12389,"z":2.69231},{"x":-0.893987,"y":-7.36264,"z":2.69231},{"x":0.298641,"y":-7.4107,"z":2.69231},{"x":1.48353,"y":-7.26683,"z":2.69231},{"x":2.63,"y":-6.93475,"z":2.69231},{"x":3.70836,"y":-6.42307,"z":2.69231},{"x":4.69067,"y":-5.74503,"z":2.69231},{"x":5.55149,"y":-4.91819,"z":2.69231},{"x":6.26854,"y":-3.96398,"z":2.69231},{"x":6.82323,"y":-2.90711,"z":2.69231},{"x":7.2012,"y":-1.77494,"z":2.69231},{"x":7.39267,"y":-0.596798,"z":2.69231},{"x":7.39267,"y":0.596798,"z":2.69231},{"x":7.2012,"y":1.77494,"z":2.69231},{"x":6.82323,"y":2.90711,"z":2.69231},{"x":6.26854,"y":3.96398,"z":2.69231},{"x":5.55149,"y":4.91819,"z":2.69231},{"x":4.69067,"y":5.74503,"z":2.69231},{"x":3.70836,"y":6.42307,"z":2.69231},{"x":2.63,"y":6.93475,"z":2.69231},{"x":1.48353,"y":7.26683,"z":2.69231},{"x":0.298641,"y":7.4107,"z":2.69231},{"x":-0.893987,"y":7.36264,"z":2.69231},{"x":-2.06346,"y":7.12389,"z":2.69231},{"x":-3.17949,"y":6.70064,"z":2.69231},{"x":-4.21318,"y":6.10384,"z":2.69231},{"x":-5.13774,"y":5.34896,"z":2.69231},{"x":-5.92924,"y":4.45554,"z":2.69231},{"x":-6.56718,"y":3.44672,"z":2.69231},{"x":-7.03503,"y":2.34864,"z":2.69231},{"x":-7.32067,"y":1.18973,"z":2.69231},{"x":-7.41672,"y":9.08286e-16,"z":2.69231},{"x":-8.63974,"y":-1.05806e-15,"z":2.84615},{"x":-8.52786,"y":-1.38591,"z":2.84615},{"x":-8.19511,"y":-2.73593,"z":2.84615},{"x":-7.65011,"y":-4.01509,"z":2.84615},{"x":-6.90698,"y":-5.19026,"z":2.84615},{"x":-5.98496,"y":-6.231,"z":2.84615},{"x":-4.90793,"y":-7.11037,"z":2.84615},{"x":-3.70379,"y":-7.80558,"z":2.84615},{"x":-2.40373,"y":-8.29863,"z":2.84615},{"x":-1.04141,"y":-8.57675,"z":2.84615},{"x":0.347887,"y":-8.63274,"z":2.84615},{"x":1.72817,"y":-8.46514,"z":2.84615},{"x":3.06369,"y":-8.0783,"z":2.84615},{"x":4.31987,"y":-7.48224,"z":2.84615},{"x":5.46417,"y":-6.69239,"z":2.84615},{"x":6.46694,"y":-5.72921,"z":2.84615},{"x":7.30222,"y":-4.61765,"z":2.84615},{"x":7.94839,"y":-3.38649,"z":2.84615},{"x":8.38869,"y":-2.06763,"z":2.84615},{"x":8.61173,"y":-0.69521,"z":2.84615},{"x":8.61173,"y":0.69521,"z":2.84615},{"x":8.38869,"y":2.06763,"z":2.84615},{"x":7.94839,"y":3.38649,"z":2.84615},{"x":7.30222,"y":4.61765,"z":2.84615},{"x":6.46694,"y":5.72921,"z":2.84615},{"x":5.46417,"y":6.69239,"z":2.84615},{"x":4.31987,"y":7.48224,"z":2.84615},{"x":3.06369,"y":8.0783,"z":2.84615},{"x":1.72817,"y":8.46514,"z":2.84615},{"x":0.347887,"y":8.63274,"z":2.84615},{"x":-1.04141,"y":8.57675,"z":2.84615},{"x":-2.40373,"y":8.29863,"z":2.84615},{"x":-3.70379,"y":7.80558,"z":2.84615},{"x":-4.90793,"y":7.11037,"z":2.84615},{"x":-5.98496,"y":6.231,"z":2.84615},{"x":-6.90698,"y":5.19026,"z":2.84615},{"x":-7.65011,"y":4.01509,"z":2.84615},{"x":-8.19511,"y":2.73593,"z":2.84615},{"x":-8.52786,"y":1.38591,"z":2.84615},{"x":-8.63974,"y":1.05806e-15,"z":2.84615},{"x":-10.0677,"y":-1.23293e-15,"z":3},{"x":-9.93729,"y":-1.61497,"z":3},{"x":-9.54954,"y":-3.18811,"z":3},{"x":-8.91447,"y":-4.67868,"z":3},{"x":-8.04852,"y":-6.04807,"z":3},{"x":-6.97411,"y":-7.26082,"z":3},{"x":-5.71908,"y":-8.28552,"z":3},{"x":-4.31593,"y":-9.09563,"z":3},{"x":-2.801,"y":-9.67017,"z":3},{"x":-1.21352,"y":-9.99426,"z":3},{"x":0.405384,"y":-10.0595,"z":3},{"x":2.01379,"y":-9.8642,"z":3},{"x":3.57004,"y":-9.41343,"z":3},{"x":5.03383,"y":-8.71885,"z":3},{"x":6.36725,"y":-7.79846,"z":3},{"x":7.53575,"y":-6.67609,"z":3},{"x":8.50909,"y":-5.38082,"z":3},{"x":9.26204,"y":-3.94619,"z":3},{"x":9.77511,"y":-2.40935,"z":3},{"x":10.035,"y":-0.81011,"z":3},{"x":10.035,"y":0.81011,"z":3},{"x":9.77511,"y":2.40935,"z":3},{"x":9.26204,"y":3.94619,"z":3},{"x":8.50909,"y":5.38082,"z":3},{"x":7.53575,"y":6.67609,"z":3},{"x":6.36725,"y":7.79846,"z":3},{"x":5.03383,"y":8.71885,"z":3},{"x":3.57004,"y":9.41343,"z":3},{"x":2.01379,"y":9.8642,"z":3},{"x":0.405384,"y":10.0595,"z":3},{"x":-1.21352,"y":9.99426,"z":3},{"x":-2.801,"y":9.67017,"z":3},{"x":-4.31593,"y":9.09563,"z":3},{"x":-5.71908,"y":8.28552,"z":3},{"x":-6.97411,"y":7.26082,"z":3},{"x":-8.04852,"y":6.04807,"z":3},{"x":-8.91447,"y":4.67868,"z":3},{"x":-9.54954,"y":3.18811,"z":3},{"x":-9.93729,"y":1.61497,"z":3},{"x":-10.0677,"y":1.23293e-15,"z":3}], "faces":[[0,1,41,40],[1,2,42,41],[2,3,43,42],[3,4,44,43],[4,5,45,44],[5,6,46,45],[6,7,47,46],[7,8,48,47],[8,9,49,48],[9,10,50,49],[10,11,51,50],[11,12,52,51],[12,13,53,52],[13,14,54,53],[14,15,55,54],[15,16,56,55],[16,17,57,56],[17,18,58,57],[18,19,59,58],[19,20,60,59],[20,21,61,60],[21,22,62,61],[22,23,63,62],[23,24,64,63],[24,25,65,64],[25,26,66,65],[26,27,67,66],[27,28,68,67],[28,29,69,68],[29,30,70,69],[30,31,71,70],[31,32,72,71],[32,33,73,72],[33,34,74,73],[34,35,75,74],[35,36,76,75],[36,37,77,76],[37,38,78,77],[38,39,79,78],[40,41,81,80],[41,42,82,81],[42,43,83,82],[43,44,84,83],[44,45,85,84],[45,46,86,85],[46,47,87,86],[47,48,88,87],[48,49,89,88],[49,50,90,89],[50,51,91,90],[51,52,92,91],[52,53,93,92],[53,54,94,93],[54,55,95,94],[55,56,96,95],[56,57,97,96],[57,58,98,97],[58,59,99,98],[59,60,100,99],[60,61,101,100],[61,62,102,101],[62,63,103,102],[63,64,104,103],[64,65,105,104],[65,66,106,105],[66,67,107,106],[67,68,108,107],[68,69,109,108],[69,70,110,109],[70,71,111,110],[71,72,112,111],[72,73,113,112],[73,74,114,113],[74,75,115,114],[75,76,116,115],[76,77,117,116],[77,78,118,117],[78,79,119,118],[80,81,121,120],[81,82,122,121],[82,83,123,122],[83,84,124,123],[84,85,125,124],[85,86,126,125],[86,87,127,126],[87,88,128,127],[88,89,129,128],[89,90,130,129],[90,91,131,130],[91,92,132,131],[92,93,133,132],[93,94,134,133],[94,95,135,134],[95,96,136,135],[96,97,137,136],[97,98,138,137],[98,99,139,138],[99,100,140,139],[100,101,141,140],[101,102,142,141],[102,103,143,142],[103,104,144,143],[104,105,145,144],[105,106,146,145],[106,107,147,146],[107,108,148,147],[108,109,149,148],[109,110,150,149],[110,111,151,150],[111,112,152,151],[112,113,153,152],[113,114,154,153],[114,115,155,154],[115,116,156,155],[116,117,157,156],[117,118,158,157],[118,119,159,158],[120,121,161,160],[121,122,162,161],[122,123,163,162],[123,124,164,163],[124,125,165,164],[125,126,166,165],[126,127,167,166],[127,128,168,167],[128,129,169,168],[129,130,170,169],[130,131,171,170],[131,132,172,171],[132,133,173,172],[133,134,174,173],[134,135,175,174],[135,136,176,175],[136,137,177,176],[137,138,178,177],[138,139,179,178],[139,140,180,179],[140,141,181,180],[141,142,182,181],[142,143,183,182],[143,144,184,183],[144,145,185,184],[145,146,186,185],[146,147,187,186],[147,148,188,187],[148,149,189,188],[149,150,190,189],[150,151,191,190],[151,152,192,191],[152,153,193,192],[153,154,194,193],[154,155,195,194],[155,156,196,195],[156,157,197,196],[157,158,198,197],[158,159,199,198],[160,161,201,200],[161,162,202,201],[162,163,203,202],[163,164,204,203],[164,165,205,204],[165,166,206,205],[166,167,207,206],[167,168,208,207],[168,169,209,208],[169,170,210,209],[170,171,211,210],[171,172,212,211],[172,173,213,212],[173,174,214,213],[174,175,215,214],[175,176,216,215],[176,177,217,216],[177,178,218,217],[178,179,219,218],[179,180,220,219],[180,181,221,220],[181,182,222,221],[182,183,223,222],[183,184,224,223],[184,185,225,224],[185,186,226,225],[186,187,227,226],[187,188,228,227],[188,189,229,228],[189,190,230,229],[190,191,231,230],[191,192,232,231],[192,193,233,232],[193,194,234,233],[194,195,235,234],[195,196,236,235],[196,197,237,236],[197,198,238,237],[198,199,239,238],[200,201,241,240],[201,202,242,241],[202,203,243,242],[203,204,244,243],[204,205,245,244],[205,206,246,245],[206,207,247,246],[207,208,248,247],[208,209,249,248],[209,210,250,249],[210,211,251,250],[211,212,252,251],[212,213,253,252],[213,214,254,253],[214,215,255,254],[215,216,256,255],[216,217,257,256],[217,218,258,257],[218,219,259,258],[219,220,260,259],[220,221,261,260],[221,222,262,261],[222,223,263,262],[223,224,264,263],[224,225,265,264],[225,226,266,265],[226,227,267,266],[227,228,268,267],[228,229,269,268],[229,230,270,269],[230,231,271,270],[231,232,272,271],[232,233,273,272],[233,234,274,273],[234,235,275,274],[235,236,276,275],[236,237,277,276],[237,238,278,277],[238,239,279,278],[240,241,281,280],[241,242,282,281],[242,243,283,282],[243,244,284,283],[244,245,285,284],[245,246,286,285],[246,247,287,286],[247,248,288,287],[248,249,289,288],[249,250,290,289],[250,251,291,290],[251,252,292,291],[252,253,293,292],[253,254,294,293],[254,255,295,294],[255,256,296,295],[256,257,297,296],[257,258,298,297],[258,259,299,298],[259,260,300,299],[260,261,301,300],[261,262,302,301],[262,263,303,302],[263,264,304,303],[264,265,305,304],[265,266,306,305],[266,267,307,306],[267,268,308,307],[268,269,309,308],[269,270,310,309],[270,271,311,310],[271,272,312,311],[272,273,313,312],[273,274,314,313],[274,275,315,314],[275,276,316,315],[276,277,317,316],[277,278,318,317],[278,279,319,318],[280,281,321,320],[281,282,322,321],[282,283,323,322],[283,284,324,323],[284,285,325,324],[285,286,326,325],[286,287,327,326],[287,288,328,327],[288,289,329,328],[289,290,330,329],[290,291,331,330],[291,292,332,331],[292,293,333,332],[293,294,334,333],[294,295,335,334],[295,296,336,335],[296,297,337,336],[297,298,338,337],[298,299,339,338],[299,300,340,339],[300,301,341,340],[301,302,342,341],[302,303,343,342],[303,304,344,343],[304,305,345,344],[305,306,346,345],[306,307,347,346],[307,308,348,347],[308,309,349,348],[309,310,350,349],[310,311,351,350],[311,312,352,351],[312,313,353,352],[313,314,354,353],[314,315,355,354],[315,316,356,355],[316,317,357,356],[317,318,358,357],[318,319,359,358],[320,321,361,360],[321,322,362,361],[322,323,363,362],[323,324,364,363],[324,325,365,364],[325,326,366,365],[326,327,367,366],[327,328,368,367],[328,329,369,368],[329,330,370,369],[330,331,371,370],[331,332,372,371],[332,333,373,372],[333,334,374,373],[334,335,375,374],[335,336,376,375],[336,337,377,376],[337,338,378,377],[338,339,379,378],[339,340,380,379],[340,341,381,380],[341,342,382,381],[342,343,383,382],[343,344,384,383],[344,345,385,384],[345,346,386,385],[346,347,387,386],[347,348,388,387],[348,349,389,388],[349,350,390,389],[350,351,391,390],[351,352,392,391],[352,353,393,392],[353,354,394,393],[354,355,395,394],[355,356,396,395],[356,357,397,396],[357,358,398,397],[358,359,399,398],[360,361,401,400],[361,362,402,401],[362,363,403,402],[363,364,404,403],[364,365,405,404],[365,366,406,405],[366,367,407,406],[367,368,408,407],[368,369,409,408],[369,370,410,409],[370,371,411,410],[371,372,412,411],[372,373,413,412],[373,374,414,413],[374,375,415,414],[375,376,416,415],[376,377,417,416],[377,378,418,417],[378,379,419,418],[379,380,420,419],[380,381,421,420],[381,382,422,421],[382,383,423,422],[383,384,424,423],[384,385,425,424],[385,386,426,425],[386,387,427,426],[387,388,428,427],[388,389,429,428],[389,390,430,429],[390,391,431,430],[391,392,432,431],[392,393,433,432],[393,394,434,433],[394,395,435,434],[395,396,436,435],[396,397,437,436],[397,398,438,437],[398,399,439,438],[400,401,441,440],[401,402,442,441],[402,403,443,442],[403,404,444,443],[404,405,445,444],[405,406,446,445],[406,407,447,446],[407,408,448,447],[408,409,449,448],[409,410,450,449],[410,411,451,450],[411,412,452,451],[412,413,453,452],[413,414,454,453],[414,415,455,454],[415,416,456,455],[416,417,457,456],[417,418,458,457],[418,419,459,458],[419,420,460,459],[420,421,461,460],[421,422,462,461],[422,423,463,462],[423,424,464,463],[424,425,465,464],[425,426,466,465],[426,427,467,466],[427,428,468,467],[428,429,469,468],[429,430,470,469],[430,431,471,470],[431,432,472,471],[432,433,473,472],[433,434,474,473],[434,435,475,474],[435,436,476,475],[436,437,477,476],[437,438,478,477],[438,439,479,478],[440,441,481,480],[441,442,482,481],[442,443,483,482],[443,444,484,483],[444,445,485,484],[445,446,486,485],[446,447,487,486],[447,448,488,487],[448,449,489,488],[449,450,490,489],[450,451,491,490],[451,452,492,491],[452,453,493,492],[453,454,494,493],[454,455,495,494],[455,456,496,495],[456,457,497,496],[457,458,498,497],[458,459,499,498],[459,460,500,499],[460,461,501,500],[461,462,502,501],[462,463,503,502],[463,464,504,503],[464,465,505,504],[465,466,506,505],[466,467,507,506],[467,468,508,507],[468,469,509,508],[469,470,510,509],[470,471,511,510],[471,472,512,511],[472,473,513,512],[473,474,514,513],[474,475,515,514],[475,476,516,515],[476,477,517,516],[477,478,518,517],[478,479,519,518],[480,481,521,520],[481,482,522,521],[482,483,523,522],[483,484,524,523],[484,485,525,524],[485,486,526,525],[486,487,527,526],[487,488,528,527],[488,489,529,528],[489,490,530,529],[490,491,531,530],[491,492,532,531],[492,493,533,532],[493,494,534,533],[494,495,535,534],[495,496,536,535],[496,497,537,536],[497,498,538,537],[498,499,539,538],[499,500,540,539],[500,501,541,540],[501,502,542,541],[502,503,543,542],[503,504,544,543],[504,505,545,544],[505,506,546,545],[506,507,547,546],[507,508,548,547],[508,509,549,548],[509,510,550,549],[510,511,551,550],[511,512,552,551],[512,513,553,552],[513,514,554,553],[514,515,555,554],[515,516,556,555],[516,517,557,556],[517,518,558,557],[518,519,559,558],[520,521,561,560],[521,522,562,561],[522,523,563,562],[523,524,564,563],[524,525,565,564],[525,526,566,565],[526,527,567,566],[527,528,568,567],[528,529,569,568],[529,530,570,569],[530,531,571,570],[531,532,572,571],[532,533,573,572],[533,534,574,573],[534,535,575,574],[535,536,576,575],[536,537,577,576],[537,538,578,577],[538,539,579,578],[539,540,580,579],[540,541,581,580],[541,542,582,581],[542,543,583,582],[543,544,584,583],[544,545,585,584],[545,546,586,585],[546,547,587,586],[547,548,588,587],[548,549,589,588],[549,550,590,589],[550,551,591,590],[551,552,592,591],[552,553,593,592],[553,554,594,593],[554,555,595,594],[555,556,596,595],[556,557,597,596],[557,558,598,597],[558,559,599,598],[560,561,601,600],[561,562,602,601],[562,563,603,602],[563,564,604,603],[564,565,605,604],[565,566,606,605],[566,567,607,606],[567,568,608,607],[568,569,609,608],[569,570,610,609],[570,571,611,610],[571,572,612,611],[572,573,613,612],[573,574,614,613],[574,575,615,614],[575,576,616,615],[576,577,617,616],[577,578,618,617],[578,579,619,618],[579,580,620,619],[580,581,621,620],[581,582,622,621],[582,583,623,622],[583,584,624,623],[584,585,625,624],[585,586,626,625],[586,587,627,626],[587,588,628,627],[588,589,629,628],[589,590,630,629],[590,591,631,630],[591,592,632,631],[592,593,633,632],[593,594,634,633],[594,595,635,634],[595,596,636,635],[596,597,637,636],[597,598,638,637],[598,599,639,638],[600,601,641,640],[601,602,642,641],[602,603,643,642],[603,604,644,643],[604,605,645,644],[605,606,646,645],[606,607,647,646],[607,608,648,647],[608,609,649,648],[609,610,650,649],[610,611,651,650],[611,612,652,651],[612,613,653,652],[613,614,654,653],[614,615,655,654],[615,616,656,655],[616,617,657,656],[617,618,658,657],[618,619,659,658],[619,620,660,659],[620,621,661,660],[621,622,662,661],[622,623,663,662],[623,624,664,663],[624,625,665,664],[625,626,666,665],[626,627,667,666],[627,628,668,667],[628,629,669,668],[629,630,670,669],[630,631,671,670],[631,632,672,671],[632,633,673,672],[633,634,674,673],[634,635,675,674],[635,636,676,675],[636,637,677,676],[637,638,678,677],[638,639,679,678],[640,641,681,680],[641,642,682,681],[642,643,683,682],[643,644,684,683],[644,645,685,684],[645,646,686,685],[646,647,687,686],[647,648,688,687],[648,649,689,688],[649,650,690,689],[650,651,691,690],[651,652,692,691],[652,653,693,692],[653,654,694,693],[654,655,695,694],[655,656,696,695],[656,657,697,696],[657,658,698,697],[658,659,699,698],[659,660,700,699],[660,661,701,700],[661,662,702,701],[662,663,703,702],[663,664,704,703],[664,665,705,704],[665,666,706,705],[666,667,707,706],[667,668,708,707],[668,669,709,708],[669,670,710,709],[670,671,711,710],[671,672,712,711],[672,673,713,712],[673,674,714,713],[674,675,715,714],[675,676,716,715],[676,677,717,716],[677,678,718,717],[678,679,719,718],[680,681,721,720],[681,682,722,721],[682,683,723,722],[683,684,724,723],[684,685,725,724],[685,686,726,725],[686,687,727,726],[687,688,728,727],[688,689,729,728],[689,690,730,729],[690,691,731,730],[691,692,732,731],[692,693,733,732],[693,694,734,733],[694,695,735,734],[695,696,736,735],[696,697,737,736],[697,698,738,737],[698,699,739,738],[699,700,740,739],[700,701,741,740],[701,702,742,741],[702,703,743,742],[703,704,744,743],[704,705,745,744],[705,706,746,745],[706,707,747,746],[707,708,748,747],[708,709,749,748],[709,710,750,749],[710,711,751,750],[711,712,752,751],[712,713,753,752],[713,714,754,753],[714,715,755,754],[715,716,756,755],[716,717,757,756],[717,718,758,757],[718,719,759,758],[720,721,761,760],[721,722,762,761],[722,723,763,762],[723,724,764,763],[724,725,765,764],[725,726,766,765],[726,727,767,766],[727,728,768,767],[728,729,769,768],[729,730,770,769],[730,731,771,770],[731,732,772,771],[732,733,773,772],[733,734,774,773],[734,735,775,774],[735,736,776,775],[736,737,777,776],[737,738,778,777],[738,739,779,778],[739,740,780,779],[740,741,781,780],[741,742,782,781],[742,743,783,782],[743,744,784,783],[744,745,785,784],[745,746,786,785],[746,747,787,786],[747,748,788,787],[748,749,789,788],[749,750,790,789],[750,751,791,790],[751,752,792,791],[752,753,793,792],[753,754,794,793],[754,755,795,794],[755,756,796,795],[756,757,797,796],[757,758,798,797],[758,759,799,798],[760,761,801,800],[761,762,802,801],[762,763,803,802],[763,764,804,803],[764,765,805,804],[765,766,806,805],[766,767,807,806],[767,768,808,807],[768,769,809,808],[769,770,810,809],[770,771,811,810],[771,772,812,811],[772,773,813,812],[773,774,814,813],[774,775,815,814],[775,776,816,815],[776,777,817,816],[777,778,818,817],[778,779,819,818],[779,780,820,819],[780,781,821,820],[781,782,822,821],[782,783,823,822],[783,784,824,823],[784,785,825,824],[785,786,826,825],[786,787,827,826],[787,788,828,827],[788,789,829,828],[789,790,830,829],[790,791,831,830],[791,792,832,831],[792,793,833,832],[793,794,834,833],[794,795,835,834],[795,796,836,835],[796,797,837,836],[797,798,838,837],[798,799,839,838],[800,801,841,840],[801,802,842,841],[802,803,843,842],[803,804,844,843],[804,805,845,844],[805,806,846,845],[806,807,847,846],[807,808,848,847],[808,809,849,848],[809,810,850,849],[810,811,851,850],[811,812,852,851],[812,813,853,852],[813,814,854,853],[814,815,855,854],[815,816,856,855],[816,817,857,856],[817,818,858,857],[818,819,859,858],[819,820,860,859],[820,821,861,860],[821,822,862,861],[822,823,863,862],[823,824,864,863],[824,825,865,864],[825,826,866,865],[826,827,867,866],[827,828,868,867],[828,829,869,868],[829,830,870,869],[830,831,871,870],[831,832,872,871],[832,833,873,872],[833,834,874,873],[834,835,875,874],[835,836,876,875],[836,837,877,876],[837,838,878,877],[838,839,879,878],[840,841,881,880],[841,842,882,881],[842,843,883,882],[843,844,884,883],[844,845,885,884],[845,846,886,885],[846,847,887,886],[847,848,888,887],[848,849,889,888],[849,850,890,889],[850,851,891,890],[851,852,892,891],[852,853,893,892],[853,854,894,893],[854,855,895,894],[855,856,896,895],[856,857,897,896],[857,858,898,897],[858,859,899,898],[859,860,900,899],[860,861,901,900],[861,862,902,901],[862,863,903,902],[863,864,904,903],[864,865,905,904],[865,866,906,905],[866,867,907,906],[867,868,908,907],[868,869,909,908],[869,870,910,909],[870,871,911,910],[871,872,912,911],[872,873,913,912],[873,874,914,913],[874,875,915,914],[875,876,916,915],[876,877,917,916],[877,878,918,917],[878,879,919,918],[880,881,921,920],[881,882,922,921],[882,883,923,922],[883,884,924,923],[884,885,925,924],[885,886,926,925],[886,887,927,926],[887,888,928,927],[888,889,929,928],[889,890,930,929],[890,891,931,930],[891,892,932,931],[892,893,933,932],[893,894,934,933],[894,895,935,934],[895,896,936,935],[896,897,937,936],[897,898,938,937],[898,899,939,938],[899,900,940,939],[900,901,941,940],[901,902,942,941],[902,903,943,942],[903,904,944,943],[904,905,945,944],[905,906,946,945],[906,907,947,946],[907,908,948,947],[908,909,949,948],[909,910,950,949],[910,911,951,950],[911,912,952,951],[912,913,953,952],[913,914,954,953],[914,915,955,954],[915,916,956,955],[916,917,957,956],[917,918,958,957],[918,919,959,958],[920,921,961,960],[921,922,962,961],[922,923,963,962],[923,924,964,963],[924,925,965,964],[925,926,966,965],[926,927,967,966],[927,928,968,967],[928,929,969,968],[929,930,970,969],[930,931,971,970],[931,932,972,971],[932,933,973,972],[933,934,974,973],[934,935,975,974],[935,936,976,975],[936,937,977,976],[937,938,978,977],[938,939,979,978],[939,940,980,979],[940,941,981,980],[941,942,982,981],[942,943,983,982],[943,944,984,983],[944,945,985,984],[945,946,986,985],[946,947,987,986],[947,948,988,987],[948,949,989,988],[949,950,990,989],[950,951,991,990],[951,952,992,991],[952,953,993,992],[953,954,994,993],[954,955,995,994],[955,956,996,995],[956,957,997,996],[957,958,998,997],[958,959,999,998],[960,961,1001,1000],[961,962,1002,1001],[962,963,1003,1002],[963,964,1004,1003],[964,965,1005,1004],[965,966,1006,1005],[966,967,1007,1006],[967,968,1008,1007],[968,969,1009,1008],[969,970,1010,1009],[970,971,1011,1010],[971,972,1012,1011],[972,973,1013,1012],[973,974,1014,1013],[974,975,1015,1014],[975,976,1016,1015],[976,977,1017,1016],[977,978,1018,1017],[978,979,1019,1018],[979,980,1020,1019],[980,981,1021,1020],[981,982,1022,1021],[982,983,1023,1022],[983,984,1024,1023],[984,985,1025,1024],[985,986,1026,1025],[986,987,1027,1026],[987,988,1028,1027],[988,989,1029,1028],[989,990,1030,1029],[990,991,1031,1030],[991,992,1032,1031],[992,993,1033,1032],[993,994,1034,1033],[994,995,1035,1034],[995,996,1036,1035],[996,997,1037,1036],[997,998,1038,1037],[998,999,1039,1038],[1000,1001,1041,1040],[1001,1002,1042,1041],[1002,1003,1043,1042],[1003,1004,1044,1043],[1004,1005,1045,1044],[1005,1006,1046,1045],[1006,1007,1047,1046],[1007,1008,1048,1047],[1008,1009,1049,1048],[1009,1010,1050,1049],[1010,1011,1051,1050],[1011,1012,1052,1051],[1012,1013,1053,1052],[1013,1014,1054,1053],[1014,1015,1055,1054],[1015,1016,1056,1055],[1016,1017,1057,1056],[1017,1018,1058,1057],[1018,1019,1059,1058],[1019,1020,1060,1059],[1020,1021,1061,1060],[1021,1022,1062,1061],[1022,1023,1063,1062],[1023,1024,1064,1063],[1024,1025,1065,1064],[1025,1026,1066,1065],[1026,1027,1067,1066],[1027,1028,1068,1067],[1028,1029,1069,1068],[1029,1030,1070,1069],[1030,1031,1071,1070],[1031,1032,1072,1071],[1032,1033,1073,1072],[1033,1034,1074,1073],[1034,1035,1075,1074],[1035,1036,1076,1075],[1036,1037,1077,1076],[1037,1038,1078,1077],[1038,1039,1079,1078],[1040,1041,1081,1080],[1041,1042,1082,1081],[1042,1043,1083,1082],[1043,1044,1084,1083],[1044,1045,1085,1084],[1045,1046,1086,1085],[1046,1047,1087,1086],[1047,1048,1088,1087],[1048,1049,1089,1088],[1049,1050,1090,1089],[1050,1051,1091,1090],[1051,1052,1092,1091],[1052,1053,1093,1092],[1053,1054,1094,1093],[1054,1055,1095,1094],[1055,1056,1096,1095],[1056,1057,1097,1096],[1057,1058,1098,1097],[1058,1059,1099,1098],[1059,1060,1100,1099],[1060,1061,1101,1100],[1061,1062,1102,1101],[1062,1063,1103,1102],[1063,1064,1104,1103],[1064,1065,1105,1104],[1065,1066,1106,1105],[1066,1067,1107,1106],[1067,1068,1108,1107],[1068,1069,1109,1108],[1069,1070,1110,1109],[1070,1071,1111,1110],[1071,1072,1112,1111],[1072,1073,1113,1112],[1073,1074,1114,1113],[1074,1075,1115,1114],[1075,1076,1116,1115],[1076,1077,1117,1116],[1077,1078,1118,1117],[1078,1079,1119,1118],[1080,1081,1121,1120],[1081,1082,1122,1121],[1082,1083,1123,1122],[1083,1084,1124,1123],[1084,1085,1125,1124],[1085,1086,1126,1125],[1086,1087,1127,1126],[1087,1088,1128,1127],[1088,1089,1129,1128],[1089,1090,1130,1129],[1090,1091,1131,1130],[1091,1092,1132,1131],[1092,1093,1133,1132],[1093,1094,1134,1133],[1094,1095,1135,1134],[1095,1096,1136,1135],[1096,1097,1137,1136],[1097,1098,1138,1137],[1098,1099,1139,1138],[1099,1100,1140,1139],[1100,1101,1141,1140],[1101,1102,1142,1141],[1102,1103,1143,1142],[1103,1104,1144,1143],[1104,1105,1145,1144],[1105,1106,1146,1145],[1106,1107,1147,1146],[1107,1108,1148,1147],[1108,1109,1149,1148],[1109,1110,1150,1149],[1110,1111,1151,1150],[1111,1112,1152,1151],[1112,1113,1153,1152],[1113,1114,1154,1153],[1114,1115,1155,1154],[1115,1116,1156,1155],[1116,1117,1157,1156],[1117,1118,1158,1157],[1118,1119,1159,1158],[1120,1121,1161,1160],[1121,1122,1162,1161],[1122,1123,1163,1162],[1123,1124,1164,1163],[1124,1125,1165,1164],[1125,1126,1166,1165],[1126,1127,1167,1166],[1127,1128,1168,1167],[1128,1129,1169,1168],[1129,1130,1170,1169],[1130,1131,1171,1170],[1131,1132,1172,1171],[1132,1133,1173,1172],[1133,1134,1174,1173],[1134,1135,1175,1174],[1135,1136,1176,1175],[1136,1137,1177,1176],[1137,1138,1178,1177],[1138,1139,1179,1178],[1139,1140,1180,1179],[1140,1141,1181,1180],[1141,1142,1182,1181],[1142,1143,1183,1182],[1143,1144,1184,1183],[1144,1145,1185,1184],[1145,1146,1186,1185],[1146,1147,1187,1186],[1147,1148,1188,1187],[1148,1149,1189,1188],[1149,1150,1190,1189],[1150,1151,1191,1190],[1151,1152,1192,1191],[1152,1153,1193,1192],[1153,1154,1194,1193],[1154,1155,1195,1194],[1155,1156,1196,1195],[1156,1157,1197,1196],[1157,1158,1198,1197],[1158,1159,1199,1198],[1160,1161,1201,1200],[1161,1162,1202,1201],[1162,1163,1203,1202],[1163,1164,1204,1203],[1164,1165,1205,1204],[1165,1166,1206,1205],[1166,1167,1207,1206],[1167,1168,1208,1207],[1168,1169,1209,1208],[1169,1170,1210,1209],[1170,1171,1211,1210],[1171,1172,1212,1211],[1172,1173,1213,1212],[1173,1174,1214,1213],[1174,1175,1215,1214],[1175,1176,1216,1215],[1176,1177,1217,1216],[1177,1178,1218,1217],[1178,1179,1219,1218],[1179,1180,1220,1219],[1180,1181,1221,1220],[1181,1182,1222,1221],[1182,1183,1223,1222],[1183,1184,1224,1223],[1184,1185,1225,1224],[1185,1186,1226,1225],[1186,1187,1227,1226],[1187,1188,1228,1227],[1188,1189,1229,1228],[1189,1190,1230,1229],[1190,1191,1231,1230],[1191,1192,1232,1231],[1192,1193,1233,1232],[1193,1194,1234,1233],[1194,1195,1235,1234],[1195,1196,1236,1235],[1196,1197,1237,1236],[1197,1198,1238,1237],[1198,1199,1239,1238],[1200,1201,1241,1240],[1201,1202,1242,1241],[1202,1203,1243,1242],[1203,1204,1244,1243],[1204,1205,1245,1244],[1205,1206,1246,1245],[1206,1207,1247,1246],[1207,1208,1248,1247],[1208,1209,1249,1248],[1209,1210,1250,1249],[1210,1211,1251,1250],[1211,1212,1252,1251],[1212,1213,1253,1252],[1213,1214,1254,1253],[1214,1215,1255,1254],[1215,1216,1256,1255],[1216,1217,1257,1256],[1217,1218,1258,1257],[1218,1219,1259,1258],[1219,1220,1260,1259],[1220,1221,1261,1260],[1221,1222,1262,1261],[1222,1223,1263,1262],[1223,1224,1264,1263],[1224,1225,1265,1264],[1225,1226,1266,1265],[1226,1227,1267,1266],[1227,1228,1268,1267],[1228,1229,1269,1268],[1229,1230,1270,1269],[1230,1231,1271,1270],[1231,1232,1272,1271],[1232,1233,1273,1272],[1233,1234,1274,1273],[1234,1235,1275,1274],[1235,1236,1276,1275],[1236,1237,1277,1276],[1237,1238,1278,1277],[1238,1239,1279,1278],[1240,1241,1281,1280],[1241,1242,1282,1281],[1242,1243,1283,1282],[1243,1244,1284,1283],[1244,1245,1285,1284],[1245,1246,1286,1285],[1246,1247,1287,1286],[1247,1248,1288,1287],[1248,1249,1289,1288],[1249,1250,1290,1289],[1250,1251,1291,1290],[1251,1252,1292,1291],[1252,1253,1293,1292],[1253,1254,1294,1293],[1254,1255,1295,1294],[1255,1256,1296,1295],[1256,1257,1297,1296],[1257,1258,1298,1297],[1258,1259,1299,1298],[1259,1260,1300,1299],[1260,1261,1301,1300],[1261,1262,1302,1301],[1262,1263,1303,1302],[1263,1264,1304,1303],[1264,1265,1305,1304],[1265,1266,1306,1305],[1266,1267,1307,1306],[1267,1268,1308,1307],[1268,1269,1309,1308],[1269,1270,1310,1309],[1270,1271,1311,1310],[1271,1272,1312,1311],[1272,1273,1313,1312],[1273,1274,1314,1313],[1274,1275,1315,1314],[1275,1276,1316,1315],[1276,1277,1317,1316],[1277,1278,1318,1317],[1278,1279,1319,1318],[1280,1281,1321,1320],[1281,1282,1322,1321],[1282,1283,1323,1322],[1283,1284,1324,1323],[1284,1285,1325,1324],[1285,1286,1326,1325],[1286,1287,1327,1326],[1287,1288,1328,1327],[1288,1289,1329,1328],[1289,1290,1330,1329],[1290,1291,1331,1330],[1291,1292,1332,1331],[1292,1293,1333,1332],[1293,1294,1334,1333],[1294,1295,1335,1334],[1295,1296,1336,1335],[1296,1297,1337,1336],[1297,1298,1338,1337],[1298,1299,1339,1338],[1299,1300,1340,1339],[1300,1301,1341,1340],[1301,1302,1342,1341],[1302,1303,1343,1342],[1303,1304,1344,1343],[1304,1305,1345,1344],[1305,1306,1346,1345],[1306,1307,1347,1346],[1307,1308,1348,1347],[1308,1309,1349,1348],[1309,1310,1350,1349],[1310,1311,1351,1350],[1311,1312,1352,1351],[1312,1313,1353,1352],[1313,1314,1354,1353],[1314,1315,1355,1354],[1315,1316,1356,1355],[1316,1317,1357,1356],[1317,1318,1358,1357],[1318,1319,1359,1358],[1320,1321,1361,1360],[1321,1322,1362,1361],[1322,1323,1363,1362],[1323,1324,1364,1363],[1324,1325,1365,1364],[1325,1326,1366,1365],[1326,1327,1367,1366],[1327,1328,1368,1367],[1328,1329,1369,1368],[1329,1330,1370,1369],[1330,1331,1371,1370],[1331,1332,1372,1371],[1332,1333,1373,1372],[1333,1334,1374,1373],[1334,1335,1375,1374],[1335,1336,1376,1375],[1336,1337,1377,1376],[1337,1338,1378,1377],[1338,1339,1379,1378],[1339,1340,1380,1379],[1340,1341,1381,1380],[1341,1342,1382,1381],[1342,1343,1383,1382],[1343,1344,1384,1383],[1344,1345,1385,1384],[1345,1346,1386,1385],[1346,1347,1387,1386],[1347,1348,1388,1387],[1348,1349,1389,1388],[1349,1350,1390,1389],[1350,1351,1391,1390],[1351,1352,1392,1391],[1352,1353,1393,1392],[1353,1354,1394,1393],[1354,1355,1395,1394],[1355,1356,1396,1395],[1356,1357,1397,1396],[1357,1358,1398,1397],[1358,1359,1399,1398],[1360,1361,1401,1400],[1361,1362,1402,1401],[1362,1363,1403,1402],[1363,1364,1404,1403],[1364,1365,1405,1404],[1365,1366,1406,1405],[1366,1367,1407,1406],[1367,1368,1408,1407],[1368,1369,1409,1408],[1369,1370,1410,1409],[1370,1371,1411,1410],[1371,1372,1412,1411],[1372,1373,1413,1412],[1373,1374,1414,1413],[1374,1375,1415,1414],[1375,1376,1416,1415],[1376,1377,1417,1416],[1377,1378,1418,1417],[1378,1379,1419,1418],[1379,1380,1420,1419],[1380,1381,1421,1420],[1381,1382,1422,1421],[1382,1383,1423,1422],[1383,1384,1424,1423],[1384,1385,1425,1424],[1385,1386,1426,1425],[1386,1387,1427,1426],[1387,1388,1428,1427],[1388,1389,1429,1428],[1389,1390,1430,1429],[1390,1391,1431,1430],[1391,1392,1432,1431],[1392,1393,1433,1432],[1393,1394,1434,1433],[1394,1395,1435,1434],[1395,1396,1436,1435],[1396,1397,1437,1436],[1397,1398,1438,1437],[1398,1399,1439,1438],[1400,1401,1441,1440],[1401,1402,1442,1441],[1402,1403,1443,1442],[1403,1404,1444,1443],[1404,1405,1445,1444],[1405,1406,1446,1445],[1406,1407,1447,1446],[1407,1408,1448,1447],[1408,1409,1449,1448],[1409,1410,1450,1449],[1410,1411,1451,1450],[1411,1412,1452,1451],[1412,1413,1453,1452],[1413,1414,1454,1453],[1414,1415,1455,1454],[1415,1416,1456,1455],[1416,1417,1457,1456],[1417,1418,1458,1457],[1418,1419,1459,1458],[1419,1420,1460,1459],[1420,1421,1461,1460],[1421,1422,1462,1461],[1422,1423,1463,1462],[1423,1424,1464,1463],[1424,1425,1465,1464],[1425,1426,1466,1465],[1426,1427,1467,1466],[1427,1428,1468,1467],[1428,1429,1469,1468],[1429,1430,1470,1469],[1430,1431,1471,1470],[1431,1432,1472,1471],[1432,1433,1473,1472],[1433,1434,1474,1473],[1434,1435,1475,1474],[1435,1436,1476,1475],[1436,1437,1477,1476],[1437,1438,1478,1477],[1438,1439,1479,1478],[1440,1441,1481,1480],[1441,1442,1482,1481],[1442,1443,1483,1482],[1443,1444,1484,1483],[1444,1445,1485,1484],[1445,1446,1486,1485],[1446,1447,1487,1486],[1447,1448,1488,1487],[1448,1449,1489,1488],[1449,1450,1490,1489],[1450,1451,1491,1490],[1451,1452,1492,1491],[1452,1453,1493,1492],[1453,1454,1494,1493],[1454,1455,1495,1494],[1455,1456,1496,1495],[1456,1457,1497,1496],[1457,1458,1498,1497],[1458,1459,1499,1498],[1459,1460,1500,1499],[1460,1461,1501,1500],[1461,1462,1502,1501],[1462,1463,1503,1502],[1463,1464,1504,1503],[1464,1465,1505,1504],[1465,1466,1506,1505],[1466,1467,1507,1506],[1467,1468,1508,1507],[1468,1469,1509,1508],[1469,1470,1510,1509],[1470,1471,1511,1510],[1471,1472,1512,1511],[1472,1473,1513,1512],[1473,1474,1514,1513],[1474,1475,1515,1514],[1475,1476,1516,1515],[1476,1477,1517,1516],[1477,1478,1518,1517],[1478,1479,1519,1518],[1480,1481,1521,1520],[1481,1482,1522,1521],[1482,1483,1523,1522],[1483,1484,1524,1523],[1484,1485,1525,1524],[1485,1486,1526,1525],[1486,1487,1527,1526],[1487,1488,1528,1527],[1488,1489,1529,1528],[1489,1490,1530,1529],[1490,1491,1531,1530],[1491,1492,1532,1531],[1492,1493,1533,1532],[1493,1494,1534,1533],[1494,1495,1535,1534],[1495,1496,1536,1535],[1496,1497,1537,1536],[1497,1498,1538,1537],[1498,1499,1539,1538],[1499,1500,1540,1539],[1500,1501,1541,1540],[1501,1502,1542,1541],[1502,1503,1543,1542],[1503,1504,1544,1543],[1504,1505,1545,1544],[1505,1506,1546,1545],[1506,1507,1547,1546],[1507,1508,1548,1547],[1508,1509,1549,1548],[1509,1510,1550,1549],[1510,1511,1551,1550],[1511,1512,1552,1551],[1512,1513,1553,1552],[1513,1514,1554,1553],[1514,1515,1555,1554],[1515,1516,1556,1555],[1516,1517,1557,1556],[1517,1518,1558,1557],[1518,1519,1559,1558],[1520,1521,1561,1560],[1521,1522,1562,1561],[1522,1523,1563,1562],[1523,1524,1564,1563],[1524,1525,1565,1564],[1525,1526,1566,1565],[1526,1527,1567,1566],[1527,1528,1568,1567],[1528,1529,1569,1568],[1529,1530,1570,1569],[1530,1531,1571,1570],[1531,1532,1572,1571],[1532,1533,1573,1572],[1533,1534,1574,1573],[1534,1535,1575,1574],[1535,1536,1576,1575],[1536,1537,1577,1576],[1537,1538,1578,1577],[1538,1539,1579,1578],[1539,1540,1580,1579],[1540,1541,1581,1580],[1541,1542,1582,1581],[1542,1543,1583,1582],[1543,1544,1584,1583],[1544,1545,1585,1584],[1545,1546,1586,1585],[1546,1547,1587,1586],[1547,1548,1588,1587],[1548,1549,1589,1588],[1549,1550,1590,1589],[1550,1551,1591,1590],[1551,1552,1592,1591],[1552,1553,1593,1592],[1553,1554,1594,1593],[1554,1555,1595,1594],[1555,1556,1596,1595],[1556,1557,1597,1596],[1557,1558,1598,1597],[1558,1559,1599,1598]], "color":"#ffff00", "opacity":1}]; for ( var i=0 ; i < surfaces.length ; i++ ) addSurface( surfaces[i] ); function addSurface( json ) { var geometry = new THREE.Geometry(); for ( var i=0 ; i < json.vertices.length ; i++ ) { var v = json.vertices[i]; geometry.vertices.push( new THREE.Vector3( a[0]*v.x, a[1]*v.y, a[2]*v.z ) ); } for ( var i=0 ; i < json.faces.length ; i++ ) { var f = json.faces[i]; for ( var j=0 ; j < f.length - 2 ; j++ ) { geometry.faces.push( new THREE.Face3( f[0], f[j+1], f[j+2] ) ); } } geometry.computeVertexNormals(); var transparent = json.opacity < 1 ? true : false; var material = new THREE.MeshPhongMaterial( { color: json.color, side: THREE.DoubleSide, transparent: transparent, opacity: json.opacity, shininess: 20 } ); var c = geometry.center().multiplyScalar( -1 ); var mesh = new THREE.Mesh( geometry, material ); mesh.position.set( c.x, c.y, c.z ); scene.add( mesh ); } var scratch = new THREE.Vector3(); function render() { if ( animate ) requestAnimationFrame( render ); renderer.render( scene, camera ); for ( var i=0 ; i < scene.children.length ; i++ ) { if ( scene.children[i].type === 'Sprite' ) { var sprite = scene.children[i]; var adjust = scratch.addVectors( sprite.position, scene.position ) .sub( camera.position ).length() / 5; sprite.scale.set( adjust, .25*adjust ); // ratio of canvas width to height } } } render(); controls.update(); if ( !animate ) render(); ================================================ FILE: examples/sample-article/media/code/threejs/saddle.js ================================================ var options = {"animate": false, "animationControls": true, "aspectRatio": [1.0, 1.0, 1.0], "autoPlay": true, "axes": false, "axesLabels": ["x", "y", "z"], "axesLabelsStyle": null, "decimals": 2, "delay": 20, "frame": true, "loop": true, "projection": "perspective", "theme": "light", "viewpoint": false}; var animate = options.animate; if ( options.theme === 'dark' ) document.body.className = 'dark-theme'; var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer( { antialias: true, preserveDrawingBuffer: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.setClearColor( options.theme === 'dark' ? 0 : 0xffffff, 1 ); // RAB edit 2022-01-10 // document.body.appendChild( renderer.domElement ); var renderDiv = document.getElementById("threejs-saddle"); renderDiv.appendChild( renderer.domElement ); renderer.domElement.style.display = 'block'; // Prevents scroll bars var b = [{"x":-1.0, "y":-1.0, "z":-0.9993425378040762}, {"x":1.0, "y":1.0, "z":0.9993425378040762}]; // bounds if ( b[0].x === b[1].x ) { b[0].x -= 1; b[1].x += 1; } if ( b[0].y === b[1].y ) { b[0].y -= 1; b[1].y += 1; } if ( b[0].z === b[1].z ) { b[0].z -= 1; b[1].z += 1; } var rRange = Math.sqrt( Math.pow( b[1].x - b[0].x, 2 ) + Math.pow( b[1].y - b[0].y, 2 ) ); var xRange = b[1].x - b[0].x; var yRange = b[1].y - b[0].y; var zRange = b[1].z - b[0].z; var ar = options.aspectRatio; var a = [ ar[0], ar[1], ar[2] ]; // aspect multipliers var autoAspect = 2.5; if ( zRange > autoAspect * rRange && a[2] === 1 ) a[2] = autoAspect * rRange / zRange; // Distance from (xMid,yMid,zMid) to any corner of the bounding box, after applying aspectRatio var midToCorner = Math.sqrt( a[0]*a[0]*xRange*xRange + a[1]*a[1]*yRange*yRange + a[2]*a[2]*zRange*zRange ) / 2; var xMid = ( b[0].x + b[1].x ) / 2; var yMid = ( b[0].y + b[1].y ) / 2; var zMid = ( b[0].z + b[1].z ) / 2; var box = new THREE.Geometry(); box.vertices.push( new THREE.Vector3( a[0]*b[0].x, a[1]*b[0].y, a[2]*b[0].z ) ); box.vertices.push( new THREE.Vector3( a[0]*b[1].x, a[1]*b[1].y, a[2]*b[1].z ) ); var boxMesh = new THREE.Line( box ); var boxColor = options.theme === 'dark' ? 'white' : 'black'; if ( options.frame ) scene.add( new THREE.BoxHelper( boxMesh, boxColor ) ); if ( options.axesLabels ) { var d = options.decimals; // decimals var offsetRatio = 0.1; var al = options.axesLabels; var als = options.axesLabelsStyle || [{}, {}, {}]; var offset = offsetRatio * a[1]*( b[1].y - b[0].y ); var xm = xMid.toFixed(d); if ( /^-0.?0*$/.test(xm) ) xm = xm.substr(1); addLabel( al[0] + '=' + xm, a[0]*xMid, a[1]*b[1].y+offset, a[2]*b[0].z, als[0] ); addLabel( ( b[0].x ).toFixed(d), a[0]*b[0].x, a[1]*b[1].y+offset, a[2]*b[0].z, als[0] ); addLabel( ( b[1].x ).toFixed(d), a[0]*b[1].x, a[1]*b[1].y+offset, a[2]*b[0].z, als[0] ); var offset = offsetRatio * a[0]*( b[1].x - b[0].x ); var ym = yMid.toFixed(d); if ( /^-0.?0*$/.test(ym) ) ym = ym.substr(1); addLabel( al[1] + '=' + ym, a[0]*b[1].x+offset, a[1]*yMid, a[2]*b[0].z, als[1] ); addLabel( ( b[0].y ).toFixed(d), a[0]*b[1].x+offset, a[1]*b[0].y, a[2]*b[0].z, als[1] ); addLabel( ( b[1].y ).toFixed(d), a[0]*b[1].x+offset, a[1]*b[1].y, a[2]*b[0].z, als[1] ); var offset = offsetRatio * a[1]*( b[1].y - b[0].y ); var zm = zMid.toFixed(d); if ( /^-0.?0*$/.test(zm) ) zm = zm.substr(1); addLabel( al[2] + '=' + zm, a[0]*b[1].x, a[1]*b[0].y-offset, a[2]*zMid, als[2] ); addLabel( ( b[0].z ).toFixed(d), a[0]*b[1].x, a[1]*b[0].y-offset, a[2]*b[0].z, als[2] ); addLabel( ( b[1].z ).toFixed(d), a[0]*b[1].x, a[1]*b[0].y-offset, a[2]*b[1].z, als[2] ); } function addLabel( text, x, y, z, style ) { var color = style.color || 'black'; var fontSize = style.fontSize || 14; var fontFamily = style.fontFamily || 'monospace'; var fontStyle = style.fontStyle || 'normal'; var fontWeight = style.fontWeight || 'normal'; var opacity = style.opacity || 1; if ( options.theme === 'dark' ) if ( color === 'black' || color === '#000000' ) color = 'white'; if ( Array.isArray( fontStyle ) ) { fontFamily = fontFamily.map( function( f ) { // Need to put quotes around fonts that have whitespace in their names. return /\s/.test( f ) ? '"' + f + '"' : f; }).join(', '); } var canvas = document.createElement( 'canvas' ); var context = canvas.getContext( '2d' ); var pixelRatio = Math.round( window.devicePixelRatio ); // For example: italic bold 20px "Times New Roman", Georgia, serif var font = [fontStyle, fontWeight, fontSize + 'px', fontFamily].join(' '); context.font = font; var width = context.measureText( text ).width; var height = fontSize; // The dimensions of the canvas's underlying image data need to be powers // of two in order for the resulting texture to support mipmapping. canvas.width = THREE.MathUtils.ceilPowerOfTwo( width * pixelRatio ); canvas.height = THREE.MathUtils.ceilPowerOfTwo( height * pixelRatio ); // Re-compute the unscaled dimensions after the power of two conversion. width = canvas.width / pixelRatio; height = canvas.height / pixelRatio; canvas.style.width = width + 'px'; canvas.style.height = height + 'px'; context.scale( pixelRatio, pixelRatio ); context.fillStyle = color; context.font = font; // Must be set again after measureText. context.textAlign = 'center'; context.textBaseline = 'middle'; context.fillText( text, width/2, height/2 ); var texture = new THREE.Texture( canvas ); texture.needsUpdate = true; var materialOptions = { map: texture, sizeAttenuation: false, depthWrite: false }; if ( opacity < 1 ) { // Setting opacity=1 would cause the texture's alpha component to be // discarded, giving the text a black background instead of the // background being transparent. materialOptions.opacity = opacity; } var sprite = new THREE.Sprite( new THREE.SpriteMaterial( materialOptions ) ); sprite.position.set( x, y, z ); // Scaling factor, chosen somewhat arbitrarily so that the size of the text // is consistent with previously generated plots. var scale = 1/625; if ( options.projection === 'orthographic' ) { scale = midToCorner/256; // Needs to scale along with the plot itself. } sprite.scale.set( scale * width, scale * height, 1 ); scene.add( sprite ); return sprite; } if ( options.axes ) scene.add( new THREE.AxesHelper( Math.min( a[0]*b[1].x, a[1]*b[1].y, a[2]*b[1].z ) ) ); var camera = createCamera(); camera.up.set( 0, 0, 1 ); camera.position.set( a[0]*xMid, a[1]*yMid, a[2]*zMid ); var offset = new THREE.Vector3( a[0]*xRange, a[1]*yRange, a[2]*zRange ); if ( options.viewpoint ) { var aa = options.viewpoint; var axis = new THREE.Vector3( aa[0][0], aa[0][1], aa[0][2] ).normalize(); var angle = aa[1] * Math.PI / 180; var q = new THREE.Quaternion().setFromAxisAngle( axis, angle ).inverse(); offset.set( 0, 0, offset.length() ); offset.applyQuaternion( q ); } camera.position.add( offset ); function createCamera() { var aspect = window.innerWidth / window.innerHeight; // Scale the near and far clipping planes along with the overall plot size. var nearClip = 0.01 * midToCorner; var farClip = 100 * midToCorner; if ( options.projection === 'orthographic' ) { var camera = new THREE.OrthographicCamera( -1, 1, 1, -1, -farClip, farClip ); updateCameraAspect( camera, aspect ); return camera; } return new THREE.PerspectiveCamera( 45, aspect, nearClip, farClip ); } function updateCameraAspect( camera, aspect ) { if ( camera.isPerspectiveCamera ) { camera.aspect = aspect; } else if ( camera.isOrthographicCamera ) { // Fit the camera frustum to the bounding box's diagonal so that the entire plot fits // within at the default zoom level and camera position. if ( aspect > 1 ) { // Wide window camera.top = midToCorner; camera.right = midToCorner * aspect; } else { // Tall or square window camera.top = midToCorner / aspect; camera.right = midToCorner; } camera.bottom = -camera.top; camera.left = -camera.right; } camera.updateProjectionMatrix(); } var lights = [{"x":-5, "y":3, "z":0, "color":"#7f7f7f", "parent":"camera"}]; for ( var i=0 ; i < lights.length ; i++ ) { var light = new THREE.DirectionalLight( lights[i].color, 1 ); light.position.set( a[0]*lights[i].x, a[1]*lights[i].y, a[2]*lights[i].z ); if ( lights[i].parent === 'camera' ) { light.target.position.set( a[0]*xMid, a[1]*yMid, a[2]*zMid ); scene.add( light.target ); camera.add( light ); } else scene.add( light ); } scene.add( camera ); var ambient = {"color":"#7f7f7f"}; scene.add( new THREE.AmbientLight( ambient.color, 1 ) ); var controls = new THREE.OrbitControls( camera, renderer.domElement ); controls.target.set( a[0]*xMid, a[1]*yMid, a[2]*zMid ); controls.addEventListener( 'change', function() { if ( !animate ) render(); } ); window.addEventListener( 'resize', function() { renderer.setSize( window.innerWidth, window.innerHeight ); updateCameraAspect( camera, window.innerWidth / window.innerHeight ); if ( window.rescaleFatLines ) rescaleFatLines(); if ( !animate ) render(); } ); var texts = []; for ( var i=0 ; i < texts.length ; i++ ) addText( texts[i] ); function addText( json ) { var sprite = addLabel( json.text, a[0]*json.x, a[1]*json.y, a[2]*json.z, json ); sprite.userData = json; } var points = []; for ( var i=0 ; i < points.length ; i++ ) addPoint( points[i] ); function addPoint( json ) { var geometry = new THREE.Geometry(); var v = json.point; geometry.vertices.push( new THREE.Vector3( a[0]*v[0], a[1]*v[1], a[2]*v[2] ) ); var canvas = document.createElement( 'canvas' ); canvas.width = 128; canvas.height = 128; var context = canvas.getContext( '2d' ); context.arc( 64, 64, 64, 0, 2 * Math.PI ); context.fillStyle = json.color; context.fill(); var texture = new THREE.Texture( canvas ); texture.needsUpdate = true; var transparent = json.opacity < 1 ? true : false; var size = camera.isOrthographicCamera ? json.size : json.size/100; var material = new THREE.PointsMaterial( { size: size, map: texture, transparent: transparent, opacity: json.opacity, alphaTest: .1 } ); var c = new THREE.Vector3(); geometry.computeBoundingBox(); geometry.boundingBox.getCenter( c ); geometry.translate( -c.x, -c.y, -c.z ); var mesh = new THREE.Points( geometry, material ); mesh.position.set( c.x, c.y, c.z ); mesh.userData = json; scene.add( mesh ); } var lines = []; for ( var i=0 ; i < lines.length ; i++ ) addLine( lines[i] ); function addLine( json ) { var geometry = new THREE.Geometry(); for ( var i=0 ; i < json.points.length ; i++ ) { var v = json.points[i]; geometry.vertices.push( new THREE.Vector3( a[0]*v[0], a[1]*v[1], a[2]*v[2] ) ); } var c = new THREE.Vector3(); geometry.computeBoundingBox(); geometry.boundingBox.getCenter( c ); geometry.translate( -c.x, -c.y, -c.z ); var transparent = json.opacity < 1 ? true : false; var materialOptions = { color: json.color, linewidth: json.linewidth, transparent: transparent, opacity: json.opacity }; var mesh; if ( json.linewidth > 1 && window.createFatLineStrip ) { mesh = createFatLineStrip( geometry, materialOptions ); } else { var material = new THREE.LineBasicMaterial( materialOptions ); mesh = new THREE.Line( geometry, material ); } mesh.position.set( c.x, c.y, c.z ); mesh.userData = json; scene.add( mesh ); } var surfaces = [{"vertices": [{"x": -1.0, "y": -1.0, "z": 0.0}, {"x": -1.0, "y": -0.9487179487179487, "z": 0.09993425378040766}, {"x": -0.9487179487179487, "y": -0.9487179487179487, "z": 0.0}, {"x": -0.9487179487179487, "y": -1.0, "z": -0.09993425378040766}, {"x": -1.0, "y": -0.8974358974358974, "z": 0.19460880999342556}, {"x": -0.9487179487179487, "y": -0.8974358974358974, "z": 0.0946745562130179}, {"x": -1.0, "y": -0.846153846153846, "z": 0.2840236686390535}, {"x": -0.9487179487179487, "y": -0.846153846153846, "z": 0.18408941485864583}, {"x": -1.0, "y": -0.7948717948717947, "z": 0.36817882971729154}, {"x": -0.9487179487179487, "y": -0.7948717948717947, "z": 0.2682445759368839}, {"x": -1.0, "y": -0.7435897435897434, "z": 0.44707429322813963}, {"x": -0.9487179487179487, "y": -0.7435897435897434, "z": 0.347140039447732}, {"x": -1.0, "y": -0.6923076923076921, "z": 0.520710059171598}, {"x": -0.9487179487179487, "y": -0.6923076923076921, "z": 0.4207758053911903}, {"x": -1.0, "y": -0.6410256410256407, "z": 0.5890861275476664}, {"x": -0.9487179487179487, "y": -0.6410256410256407, "z": 0.4891518737672587}, {"x": -1.0, "y": -0.5897435897435894, "z": 0.6522024983563448}, {"x": -0.9487179487179487, "y": -0.5897435897435894, "z": 0.5522682445759373}, {"x": -1.0, "y": -0.5384615384615381, "z": 0.7100591715976335}, {"x": -0.9487179487179487, "y": -0.5384615384615381, "z": 0.6101249178172259}, {"x": -1.0, "y": -0.48717948717948684, "z": 0.7626561472715322}, {"x": -0.9487179487179487, "y": -0.48717948717948684, "z": 0.6627218934911245}, {"x": -1.0, "y": -0.43589743589743557, "z": 0.8099934253780411}, {"x": -0.9487179487179487, "y": -0.43589743589743557, "z": 0.7100591715976334}, {"x": -1.0, "y": -0.3846153846153843, "z": 0.85207100591716}, {"x": -0.9487179487179487, "y": -0.3846153846153843, "z": 0.7521367521367524}, {"x": -1.0, "y": -0.33333333333333304, "z": 0.8888888888888891}, {"x": -0.9487179487179487, "y": -0.33333333333333304, "z": 0.7889546351084814}, {"x": -1.0, "y": -0.28205128205128177, "z": 0.9204470742932283}, {"x": -0.9487179487179487, "y": -0.28205128205128177, "z": 0.8205128205128206}, {"x": -1.0, "y": -0.2307692307692305, "z": 0.9467455621301777}, {"x": -0.9487179487179487, "y": -0.2307692307692305, "z": 0.84681130834977}, {"x": -1.0, "y": -0.17948717948717924, "z": 0.9677843523997371}, {"x": -0.9487179487179487, "y": -0.17948717948717924, "z": 0.8678500986193295}, {"x": -1.0, "y": -0.12820512820512797, "z": 0.9835634451019067}, {"x": -0.9487179487179487, "y": -0.12820512820512797, "z": 0.8836291913214991}, {"x": -1.0, "y": -0.07692307692307669, "z": 0.9940828402366865}, {"x": -0.9487179487179487, "y": -0.07692307692307669, "z": 0.8941485864562788}, {"x": -1.0, "y": -0.02564102564102541, "z": 0.9993425378040762}, {"x": -0.9487179487179487, "y": -0.02564102564102541, "z": 0.8994082840236686}, {"x": -1.0, "y": 0.02564102564102587, "z": 0.9993425378040762}, {"x": -0.9487179487179487, "y": 0.02564102564102587, "z": 0.8994082840236686}, {"x": -1.0, "y": 0.07692307692307715, "z": 0.9940828402366864}, {"x": -0.9487179487179487, "y": 0.07692307692307715, "z": 0.8941485864562787}, {"x": -1.0, "y": 0.12820512820512842, "z": 0.9835634451019066}, {"x": -0.9487179487179487, "y": 0.12820512820512842, "z": 0.883629191321499}, {"x": -1.0, "y": 0.17948717948717968, "z": 0.9677843523997369}, {"x": -0.9487179487179487, "y": 0.17948717948717968, "z": 0.8678500986193293}, {"x": -1.0, "y": 0.23076923076923095, "z": 0.9467455621301775}, {"x": -0.9487179487179487, "y": 0.23076923076923095, "z": 0.8468113083497698}, {"x": -1.0, "y": 0.2820512820512822, "z": 0.920447074293228}, {"x": -0.9487179487179487, "y": 0.2820512820512822, "z": 0.8205128205128204}, {"x": -1.0, "y": 0.3333333333333335, "z": 0.8888888888888888}, {"x": -0.9487179487179487, "y": 0.3333333333333335, "z": 0.7889546351084811}, {"x": -1.0, "y": 0.38461538461538475, "z": 0.8520710059171597}, {"x": -0.9487179487179487, "y": 0.38461538461538475, "z": 0.752136752136752}, {"x": -1.0, "y": 0.435897435897436, "z": 0.8099934253780406}, {"x": -0.9487179487179487, "y": 0.435897435897436, "z": 0.710059171597633}, {"x": -1.0, "y": 0.4871794871794873, "z": 0.7626561472715317}, {"x": -0.9487179487179487, "y": 0.4871794871794873, "z": 0.6627218934911241}, {"x": -1.0, "y": 0.5384615384615385, "z": 0.710059171597633}, {"x": -0.9487179487179487, "y": 0.5384615384615385, "z": 0.6101249178172254}, {"x": -1.0, "y": 0.5897435897435899, "z": 0.6522024983563444}, {"x": -0.9487179487179487, "y": 0.5897435897435899, "z": 0.5522682445759367}, {"x": -1.0, "y": 0.6410256410256412, "z": 0.5890861275476658}, {"x": -0.9487179487179487, "y": 0.6410256410256412, "z": 0.48915187376725816}, {"x": -1.0, "y": 0.6923076923076925, "z": 0.5207100591715974}, {"x": -0.9487179487179487, "y": 0.6923076923076925, "z": 0.4207758053911897}, {"x": -1.0, "y": 0.7435897435897438, "z": 0.44707429322813896}, {"x": -0.9487179487179487, "y": 0.7435897435897438, "z": 0.3471400394477313}, {"x": -1.0, "y": 0.7948717948717952, "z": 0.36817882971729077}, {"x": -0.9487179487179487, "y": 0.7948717948717952, "z": 0.2682445759368831}, {"x": -1.0, "y": 0.8461538461538465, "z": 0.2840236686390527}, {"x": -0.9487179487179487, "y": 0.8461538461538465, "z": 0.18408941485864505}, {"x": -1.0, "y": 0.8974358974358978, "z": 0.19460880999342467}, {"x": -0.9487179487179487, "y": 0.8974358974358978, "z": 0.09467455621301701}, {"x": -1.0, "y": 0.9487179487179491, "z": 0.09993425378040688}, {"x": -0.9487179487179487, "y": 0.9487179487179491, "z": -7.771561172376096e-16}, {"x": -1.0, "y": 1.0, "z": 0.0}, {"x": -0.9487179487179487, "y": 1.0, "z": -0.09993425378040766}, {"x": -0.8974358974358974, "y": -0.9487179487179487, "z": -0.0946745562130179}, {"x": -0.8974358974358974, "y": -1.0, "z": -0.19460880999342556}, {"x": -0.8974358974358974, "y": -0.8974358974358974, "z": 0.0}, {"x": -0.8974358974358974, "y": -0.846153846153846, "z": 0.08941485864562793}, {"x": -0.8974358974358974, "y": -0.7948717948717947, "z": 0.173570019723866}, {"x": -0.8974358974358974, "y": -0.7435897435897434, "z": 0.25246548323471407}, {"x": -0.8974358974358974, "y": -0.6923076923076921, "z": 0.3261012491781724}, {"x": -0.8974358974358974, "y": -0.6410256410256407, "z": 0.3944773175542408}, {"x": -0.8974358974358974, "y": -0.5897435897435894, "z": 0.4575936883629193}, {"x": -0.8974358974358974, "y": -0.5384615384615381, "z": 0.515450361604208}, {"x": -0.8974358974358974, "y": -0.48717948717948684, "z": 0.5680473372781066}, {"x": -0.8974358974358974, "y": -0.43589743589743557, "z": 0.6153846153846155}, {"x": -0.8974358974358974, "y": -0.3846153846153843, "z": 0.6574621959237344}, {"x": -0.8974358974358974, "y": -0.33333333333333304, "z": 0.6942800788954635}, {"x": -0.8974358974358974, "y": -0.28205128205128177, "z": 0.7258382642998027}, {"x": -0.8974358974358974, "y": -0.2307692307692305, "z": 0.7521367521367521}, {"x": -0.8974358974358974, "y": -0.17948717948717924, "z": 0.7731755424063116}, {"x": -0.8974358974358974, "y": -0.12820512820512797, "z": 0.7889546351084812}, {"x": -0.8974358974358974, "y": -0.07692307692307669, "z": 0.7994740302432609}, {"x": -0.8974358974358974, "y": -0.02564102564102541, "z": 0.8047337278106507}, {"x": -0.8974358974358974, "y": 0.02564102564102587, "z": 0.8047337278106507}, {"x": -0.8974358974358974, "y": 0.07692307692307715, "z": 0.7994740302432608}, {"x": -0.8974358974358974, "y": 0.12820512820512842, "z": 0.7889546351084811}, {"x": -0.8974358974358974, "y": 0.17948717948717968, "z": 0.7731755424063114}, {"x": -0.8974358974358974, "y": 0.23076923076923095, "z": 0.7521367521367519}, {"x": -0.8974358974358974, "y": 0.2820512820512822, "z": 0.7258382642998025}, {"x": -0.8974358974358974, "y": 0.3333333333333335, "z": 0.6942800788954633}, {"x": -0.8974358974358974, "y": 0.38461538461538475, "z": 0.6574621959237341}, {"x": -0.8974358974358974, "y": 0.435897435897436, "z": 0.6153846153846151}, {"x": -0.8974358974358974, "y": 0.4871794871794873, "z": 0.5680473372781062}, {"x": -0.8974358974358974, "y": 0.5384615384615385, "z": 0.5154503616042074}, {"x": -0.8974358974358974, "y": 0.5897435897435899, "z": 0.4575936883629188}, {"x": -0.8974358974358974, "y": 0.6410256410256412, "z": 0.39447731755424026}, {"x": -0.8974358974358974, "y": 0.6923076923076925, "z": 0.3261012491781718}, {"x": -0.8974358974358974, "y": 0.7435897435897438, "z": 0.2524654832347134}, {"x": -0.8974358974358974, "y": 0.7948717948717952, "z": 0.1735700197238652}, {"x": -0.8974358974358974, "y": 0.8461538461538465, "z": 0.08941485864562715}, {"x": -0.8974358974358974, "y": 0.8974358974358978, "z": -8.881784197001252e-16}, {"x": -0.8974358974358974, "y": 0.9487179487179491, "z": -0.09467455621301868}, {"x": -0.8974358974358974, "y": 1.0, "z": -0.19460880999342556}, {"x": -0.846153846153846, "y": -0.9487179487179487, "z": -0.18408941485864583}, {"x": -0.846153846153846, "y": -1.0, "z": -0.2840236686390535}, {"x": -0.846153846153846, "y": -0.8974358974358974, "z": -0.08941485864562793}, {"x": -0.846153846153846, "y": -0.846153846153846, "z": 0.0}, {"x": -0.846153846153846, "y": -0.7948717948717947, "z": 0.08415516107823806}, {"x": -0.846153846153846, "y": -0.7435897435897434, "z": 0.16305062458908615}, {"x": -0.846153846153846, "y": -0.6923076923076921, "z": 0.23668639053254448}, {"x": -0.846153846153846, "y": -0.6410256410256407, "z": 0.3050624589086129}, {"x": -0.846153846153846, "y": -0.5897435897435894, "z": 0.3681788297172914}, {"x": -0.846153846153846, "y": -0.5384615384615381, "z": 0.42603550295858006}, {"x": -0.846153846153846, "y": -0.48717948717948684, "z": 0.4786324786324787}, {"x": -0.846153846153846, "y": -0.43589743589743557, "z": 0.5259697567389876}, {"x": -0.846153846153846, "y": -0.3846153846153843, "z": 0.5680473372781065}, {"x": -0.846153846153846, "y": -0.33333333333333304, "z": 0.6048652202498356}, {"x": -0.846153846153846, "y": -0.28205128205128177, "z": 0.6364234056541748}, {"x": -0.846153846153846, "y": -0.2307692307692305, "z": 0.6627218934911242}, {"x": -0.846153846153846, "y": -0.17948717948717924, "z": 0.6837606837606837}, {"x": -0.846153846153846, "y": -0.12820512820512797, "z": 0.6995397764628533}, {"x": -0.846153846153846, "y": -0.07692307692307669, "z": 0.710059171597633}, {"x": -0.846153846153846, "y": -0.02564102564102541, "z": 0.7153188691650227}, {"x": -0.846153846153846, "y": 0.02564102564102587, "z": 0.7153188691650227}, {"x": -0.846153846153846, "y": 0.07692307692307715, "z": 0.7100591715976329}, {"x": -0.846153846153846, "y": 0.12820512820512842, "z": 0.6995397764628531}, {"x": -0.846153846153846, "y": 0.17948717948717968, "z": 0.6837606837606834}, {"x": -0.846153846153846, "y": 0.23076923076923095, "z": 0.662721893491124}, {"x": -0.846153846153846, "y": 0.2820512820512822, "z": 0.6364234056541745}, {"x": -0.846153846153846, "y": 0.3333333333333335, "z": 0.6048652202498352}, {"x": -0.846153846153846, "y": 0.38461538461538475, "z": 0.5680473372781062}, {"x": -0.846153846153846, "y": 0.435897435897436, "z": 0.5259697567389872}, {"x": -0.846153846153846, "y": 0.4871794871794873, "z": 0.47863247863247826}, {"x": -0.846153846153846, "y": 0.5384615384615385, "z": 0.42603550295857956}, {"x": -0.846153846153846, "y": 0.5897435897435899, "z": 0.3681788297172909}, {"x": -0.846153846153846, "y": 0.6410256410256412, "z": 0.30506245890861233}, {"x": -0.846153846153846, "y": 0.6923076923076925, "z": 0.23668639053254387}, {"x": -0.846153846153846, "y": 0.7435897435897438, "z": 0.16305062458908548}, {"x": -0.846153846153846, "y": 0.7948717948717952, "z": 0.08415516107823728}, {"x": -0.846153846153846, "y": 0.8461538461538465, "z": -7.771561172376096e-16}, {"x": -0.846153846153846, "y": 0.8974358974358978, "z": -0.08941485864562881}, {"x": -0.846153846153846, "y": 0.9487179487179491, "z": -0.1840894148586466}, {"x": -0.846153846153846, "y": 1.0, "z": -0.2840236686390535}, {"x": -0.7948717948717947, "y": -0.9487179487179487, "z": -0.2682445759368839}, {"x": -0.7948717948717947, "y": -1.0, "z": -0.36817882971729154}, {"x": -0.7948717948717947, "y": -0.8974358974358974, "z": -0.173570019723866}, {"x": -0.7948717948717947, "y": -0.846153846153846, "z": -0.08415516107823806}, {"x": -0.7948717948717947, "y": -0.7948717948717947, "z": 0.0}, {"x": -0.7948717948717947, "y": -0.7435897435897434, "z": 0.07889546351084809}, {"x": -0.7948717948717947, "y": -0.6923076923076921, "z": 0.15253122945430642}, {"x": -0.7948717948717947, "y": -0.6410256410256407, "z": 0.22090729783037483}, {"x": -0.7948717948717947, "y": -0.5897435897435894, "z": 0.2840236686390533}, {"x": -0.7948717948717947, "y": -0.5384615384615381, "z": 0.341880341880342}, {"x": -0.7948717948717947, "y": -0.48717948717948684, "z": 0.39447731755424065}, {"x": -0.7948717948717947, "y": -0.43589743589743557, "z": 0.44181459566074954}, {"x": -0.7948717948717947, "y": -0.3846153846153843, "z": 0.48389217619986846}, {"x": -0.7948717948717947, "y": -0.33333333333333304, "z": 0.5207100591715975}, {"x": -0.7948717948717947, "y": -0.28205128205128177, "z": 0.5522682445759367}, {"x": -0.7948717948717947, "y": -0.2307692307692305, "z": 0.5785667324128861}, {"x": -0.7948717948717947, "y": -0.17948717948717924, "z": 0.5996055226824456}, {"x": -0.7948717948717947, "y": -0.12820512820512797, "z": 0.6153846153846152}, {"x": -0.7948717948717947, "y": -0.07692307692307669, "z": 0.6259040105193949}, {"x": -0.7948717948717947, "y": -0.02564102564102541, "z": 0.6311637080867847}, {"x": -0.7948717948717947, "y": 0.02564102564102587, "z": 0.6311637080867847}, {"x": -0.7948717948717947, "y": 0.07692307692307715, "z": 0.6259040105193948}, {"x": -0.7948717948717947, "y": 0.12820512820512842, "z": 0.6153846153846151}, {"x": -0.7948717948717947, "y": 0.17948717948717968, "z": 0.5996055226824454}, {"x": -0.7948717948717947, "y": 0.23076923076923095, "z": 0.5785667324128859}, {"x": -0.7948717948717947, "y": 0.2820512820512822, "z": 0.5522682445759365}, {"x": -0.7948717948717947, "y": 0.3333333333333335, "z": 0.5207100591715972}, {"x": -0.7948717948717947, "y": 0.38461538461538475, "z": 0.48389217619986813}, {"x": -0.7948717948717947, "y": 0.435897435897436, "z": 0.4418145956607491}, {"x": -0.7948717948717947, "y": 0.4871794871794873, "z": 0.3944773175542402}, {"x": -0.7948717948717947, "y": 0.5384615384615385, "z": 0.3418803418803415}, {"x": -0.7948717948717947, "y": 0.5897435897435899, "z": 0.2840236686390528}, {"x": -0.7948717948717947, "y": 0.6410256410256412, "z": 0.22090729783037427}, {"x": -0.7948717948717947, "y": 0.6923076923076925, "z": 0.1525312294543058}, {"x": -0.7948717948717947, "y": 0.7435897435897438, "z": 0.07889546351084742}, {"x": -0.7948717948717947, "y": 0.7948717948717952, "z": -7.771561172376096e-16}, {"x": -0.7948717948717947, "y": 0.8461538461538465, "z": -0.08415516107823884}, {"x": -0.7948717948717947, "y": 0.8974358974358978, "z": -0.17357001972386688}, {"x": -0.7948717948717947, "y": 0.9487179487179491, "z": -0.26824457593688467}, {"x": -0.7948717948717947, "y": 1.0, "z": -0.36817882971729154}, {"x": -0.7435897435897434, "y": -0.9487179487179487, "z": -0.347140039447732}, {"x": -0.7435897435897434, "y": -1.0, "z": -0.44707429322813963}, {"x": -0.7435897435897434, "y": -0.8974358974358974, "z": -0.25246548323471407}, {"x": -0.7435897435897434, "y": -0.846153846153846, "z": -0.16305062458908615}, {"x": -0.7435897435897434, "y": -0.7948717948717947, "z": -0.07889546351084809}, {"x": -0.7435897435897434, "y": -0.7435897435897434, "z": 0.0}, {"x": -0.7435897435897434, "y": -0.6923076923076921, "z": 0.07363576594345833}, {"x": -0.7435897435897434, "y": -0.6410256410256407, "z": 0.14201183431952674}, {"x": -0.7435897435897434, "y": -0.5897435897435894, "z": 0.20512820512820523}, {"x": -0.7435897435897434, "y": -0.5384615384615381, "z": 0.2629848783694939}, {"x": -0.7435897435897434, "y": -0.48717948717948684, "z": 0.31558185404339256}, {"x": -0.7435897435897434, "y": -0.43589743589743557, "z": 0.36291913214990146}, {"x": -0.7435897435897434, "y": -0.3846153846153843, "z": 0.4049967126890204}, {"x": -0.7435897435897434, "y": -0.33333333333333304, "z": 0.44181459566074943}, {"x": -0.7435897435897434, "y": -0.28205128205128177, "z": 0.4733727810650887}, {"x": -0.7435897435897434, "y": -0.2307692307692305, "z": 0.499671268902038}, {"x": -0.7435897435897434, "y": -0.17948717948717924, "z": 0.5207100591715975}, {"x": -0.7435897435897434, "y": -0.12820512820512797, "z": 0.5364891518737671}, {"x": -0.7435897435897434, "y": -0.07692307692307669, "z": 0.5470085470085468}, {"x": -0.7435897435897434, "y": -0.02564102564102541, "z": 0.5522682445759366}, {"x": -0.7435897435897434, "y": 0.02564102564102587, "z": 0.5522682445759366}, {"x": -0.7435897435897434, "y": 0.07692307692307715, "z": 0.5470085470085467}, {"x": -0.7435897435897434, "y": 0.12820512820512842, "z": 0.536489151873767}, {"x": -0.7435897435897434, "y": 0.17948717948717968, "z": 0.5207100591715973}, {"x": -0.7435897435897434, "y": 0.23076923076923095, "z": 0.4996712689020378}, {"x": -0.7435897435897434, "y": 0.2820512820512822, "z": 0.4733727810650884}, {"x": -0.7435897435897434, "y": 0.3333333333333335, "z": 0.44181459566074915}, {"x": -0.7435897435897434, "y": 0.38461538461538475, "z": 0.40499671268902004}, {"x": -0.7435897435897434, "y": 0.435897435897436, "z": 0.362919132149901}, {"x": -0.7435897435897434, "y": 0.4871794871794873, "z": 0.3155818540433921}, {"x": -0.7435897435897434, "y": 0.5384615384615385, "z": 0.2629848783694934}, {"x": -0.7435897435897434, "y": 0.5897435897435899, "z": 0.20512820512820473}, {"x": -0.7435897435897434, "y": 0.6410256410256412, "z": 0.1420118343195262}, {"x": -0.7435897435897434, "y": 0.6923076923076925, "z": 0.07363576594345772}, {"x": -0.7435897435897434, "y": 0.7435897435897438, "z": -6.661338147750939e-16}, {"x": -0.7435897435897434, "y": 0.7948717948717952, "z": -0.07889546351084886}, {"x": -0.7435897435897434, "y": 0.8461538461538465, "z": -0.16305062458908692}, {"x": -0.7435897435897434, "y": 0.8974358974358978, "z": -0.25246548323471496}, {"x": -0.7435897435897434, "y": 0.9487179487179491, "z": -0.34714003944773275}, {"x": -0.7435897435897434, "y": 1.0, "z": -0.44707429322813963}, {"x": -0.6923076923076921, "y": -0.9487179487179487, "z": -0.4207758053911903}, {"x": -0.6923076923076921, "y": -1.0, "z": -0.520710059171598}, {"x": -0.6923076923076921, "y": -0.8974358974358974, "z": -0.3261012491781724}, {"x": -0.6923076923076921, "y": -0.846153846153846, "z": -0.23668639053254448}, {"x": -0.6923076923076921, "y": -0.7948717948717947, "z": -0.15253122945430642}, {"x": -0.6923076923076921, "y": -0.7435897435897434, "z": -0.07363576594345833}, {"x": -0.6923076923076921, "y": -0.6923076923076921, "z": 0.0}, {"x": -0.6923076923076921, "y": -0.6410256410256407, "z": 0.06837606837606841}, {"x": -0.6923076923076921, "y": -0.5897435897435894, "z": 0.1314924391847469}, {"x": -0.6923076923076921, "y": -0.5384615384615381, "z": 0.18934911242603558}, {"x": -0.6923076923076921, "y": -0.48717948717948684, "z": 0.24194608809993426}, {"x": -0.6923076923076921, "y": -0.43589743589743557, "z": 0.2892833662064431}, {"x": -0.6923076923076921, "y": -0.3846153846153843, "z": 0.33136094674556205}, {"x": -0.6923076923076921, "y": -0.33333333333333304, "z": 0.3681788297172911}, {"x": -0.6923076923076921, "y": -0.28205128205128177, "z": 0.39973701512163035}, {"x": -0.6923076923076921, "y": -0.2307692307692305, "z": 0.42603550295857967}, {"x": -0.6923076923076921, "y": -0.17948717948717924, "z": 0.44707429322813913}, {"x": -0.6923076923076921, "y": -0.12820512820512797, "z": 0.4628533859303087}, {"x": -0.6923076923076921, "y": -0.07692307692307669, "z": 0.47337278106508845}, {"x": -0.6923076923076921, "y": -0.02564102564102541, "z": 0.4786324786324783}, {"x": -0.6923076923076921, "y": 0.02564102564102587, "z": 0.4786324786324783}, {"x": -0.6923076923076921, "y": 0.07692307692307715, "z": 0.4733727810650884}, {"x": -0.6923076923076921, "y": 0.12820512820512842, "z": 0.4628533859303086}, {"x": -0.6923076923076921, "y": 0.17948717948717968, "z": 0.44707429322813896}, {"x": -0.6923076923076921, "y": 0.23076923076923095, "z": 0.42603550295857945}, {"x": -0.6923076923076921, "y": 0.2820512820512822, "z": 0.39973701512163007}, {"x": -0.6923076923076921, "y": 0.3333333333333335, "z": 0.3681788297172908}, {"x": -0.6923076923076921, "y": 0.38461538461538475, "z": 0.3313609467455617}, {"x": -0.6923076923076921, "y": 0.435897435897436, "z": 0.2892833662064427}, {"x": -0.6923076923076921, "y": 0.4871794871794873, "z": 0.24194608809993381}, {"x": -0.6923076923076921, "y": 0.5384615384615385, "z": 0.18934911242603508}, {"x": -0.6923076923076921, "y": 0.5897435897435899, "z": 0.1314924391847464}, {"x": -0.6923076923076921, "y": 0.6410256410256412, "z": 0.06837606837606786}, {"x": -0.6923076923076921, "y": 0.6923076923076925, "z": -6.106226635438361e-16}, {"x": -0.6923076923076921, "y": 0.7435897435897438, "z": -0.073635765943459}, {"x": -0.6923076923076921, "y": 0.7948717948717952, "z": -0.1525312294543072}, {"x": -0.6923076923076921, "y": 0.8461538461538465, "z": -0.23668639053254525}, {"x": -0.6923076923076921, "y": 0.8974358974358978, "z": -0.3261012491781733}, {"x": -0.6923076923076921, "y": 0.9487179487179491, "z": -0.4207758053911911}, {"x": -0.6923076923076921, "y": 1.0, "z": -0.520710059171598}, {"x": -0.6410256410256407, "y": -0.9487179487179487, "z": -0.4891518737672587}, {"x": -0.6410256410256407, "y": -1.0, "z": -0.5890861275476664}, {"x": -0.6410256410256407, "y": -0.8974358974358974, "z": -0.3944773175542408}, {"x": -0.6410256410256407, "y": -0.846153846153846, "z": -0.3050624589086129}, {"x": -0.6410256410256407, "y": -0.7948717948717947, "z": -0.22090729783037483}, {"x": -0.6410256410256407, "y": -0.7435897435897434, "z": -0.14201183431952674}, {"x": -0.6410256410256407, "y": -0.6923076923076921, "z": -0.06837606837606841}, {"x": -0.6410256410256407, "y": -0.6410256410256407, "z": 0.0}, {"x": -0.6410256410256407, "y": -0.5897435897435894, "z": 0.06311637080867849}, {"x": -0.6410256410256407, "y": -0.5384615384615381, "z": 0.12097304404996717}, {"x": -0.6410256410256407, "y": -0.48717948717948684, "z": 0.17357001972386585}, {"x": -0.6410256410256407, "y": -0.43589743589743557, "z": 0.2209072978303747}, {"x": -0.6410256410256407, "y": -0.3846153846153843, "z": 0.26298487836949364}, {"x": -0.6410256410256407, "y": -0.33333333333333304, "z": 0.29980276134122275}, {"x": -0.6410256410256407, "y": -0.28205128205128177, "z": 0.33136094674556194}, {"x": -0.6410256410256407, "y": -0.2307692307692305, "z": 0.35765943458251126}, {"x": -0.6410256410256407, "y": -0.17948717948717924, "z": 0.3786982248520707}, {"x": -0.6410256410256407, "y": -0.12820512820512797, "z": 0.3944773175542403}, {"x": -0.6410256410256407, "y": -0.07692307692307669, "z": 0.40499671268902004}, {"x": -0.6410256410256407, "y": -0.02564102564102541, "z": 0.4102564102564099}, {"x": -0.6410256410256407, "y": 0.02564102564102587, "z": 0.4102564102564099}, {"x": -0.6410256410256407, "y": 0.07692307692307715, "z": 0.40499671268902}, {"x": -0.6410256410256407, "y": 0.12820512820512842, "z": 0.3944773175542402}, {"x": -0.6410256410256407, "y": 0.17948717948717968, "z": 0.37869822485207055}, {"x": -0.6410256410256407, "y": 0.23076923076923095, "z": 0.35765943458251104}, {"x": -0.6410256410256407, "y": 0.2820512820512822, "z": 0.33136094674556166}, {"x": -0.6410256410256407, "y": 0.3333333333333335, "z": 0.2998027613412224}, {"x": -0.6410256410256407, "y": 0.38461538461538475, "z": 0.2629848783694933}, {"x": -0.6410256410256407, "y": 0.435897435897436, "z": 0.2209072978303743}, {"x": -0.6410256410256407, "y": 0.4871794871794873, "z": 0.1735700197238654}, {"x": -0.6410256410256407, "y": 0.5384615384615385, "z": 0.12097304404996667}, {"x": -0.6410256410256407, "y": 0.5897435897435899, "z": 0.06311637080867799}, {"x": -0.6410256410256407, "y": 0.6410256410256412, "z": -5.551115123125783e-16}, {"x": -0.6410256410256407, "y": 0.6923076923076925, "z": -0.06837606837606902}, {"x": -0.6410256410256407, "y": 0.7435897435897438, "z": -0.1420118343195274}, {"x": -0.6410256410256407, "y": 0.7948717948717952, "z": -0.2209072978303756}, {"x": -0.6410256410256407, "y": 0.8461538461538465, "z": -0.30506245890861367}, {"x": -0.6410256410256407, "y": 0.8974358974358978, "z": -0.3944773175542417}, {"x": -0.6410256410256407, "y": 0.9487179487179491, "z": -0.4891518737672595}, {"x": -0.6410256410256407, "y": 1.0, "z": -0.5890861275476664}, {"x": -0.5897435897435894, "y": -0.9487179487179487, "z": -0.5522682445759373}, {"x": -0.5897435897435894, "y": -1.0, "z": -0.6522024983563448}, {"x": -0.5897435897435894, "y": -0.8974358974358974, "z": -0.4575936883629193}, {"x": -0.5897435897435894, "y": -0.846153846153846, "z": -0.3681788297172914}, {"x": -0.5897435897435894, "y": -0.7948717948717947, "z": -0.2840236686390533}, {"x": -0.5897435897435894, "y": -0.7435897435897434, "z": -0.20512820512820523}, {"x": -0.5897435897435894, "y": -0.6923076923076921, "z": -0.1314924391847469}, {"x": -0.5897435897435894, "y": -0.6410256410256407, "z": -0.06311637080867849}, {"x": -0.5897435897435894, "y": -0.5897435897435894, "z": 0.0}, {"x": -0.5897435897435894, "y": -0.5384615384615381, "z": 0.05785667324128868}, {"x": -0.5897435897435894, "y": -0.48717948717948684, "z": 0.11045364891518736}, {"x": -0.5897435897435894, "y": -0.43589743589743557, "z": 0.1577909270216962}, {"x": -0.5897435897435894, "y": -0.3846153846153843, "z": 0.19986850756081515}, {"x": -0.5897435897435894, "y": -0.33333333333333304, "z": 0.23668639053254423}, {"x": -0.5897435897435894, "y": -0.28205128205128177, "z": 0.26824457593688344}, {"x": -0.5897435897435894, "y": -0.2307692307692305, "z": 0.29454306377383277}, {"x": -0.5897435897435894, "y": -0.17948717948717924, "z": 0.31558185404339223}, {"x": -0.5897435897435894, "y": -0.12820512820512797, "z": 0.3313609467455618}, {"x": -0.5897435897435894, "y": -0.07692307692307669, "z": 0.34188034188034155}, {"x": -0.5897435897435894, "y": -0.02564102564102541, "z": 0.3471400394477314}, {"x": -0.5897435897435894, "y": 0.02564102564102587, "z": 0.3471400394477314}, {"x": -0.5897435897435894, "y": 0.07692307692307715, "z": 0.3418803418803415}, {"x": -0.5897435897435894, "y": 0.12820512820512842, "z": 0.3313609467455617}, {"x": -0.5897435897435894, "y": 0.17948717948717968, "z": 0.31558185404339206}, {"x": -0.5897435897435894, "y": 0.23076923076923095, "z": 0.29454306377383255}, {"x": -0.5897435897435894, "y": 0.2820512820512822, "z": 0.26824457593688317}, {"x": -0.5897435897435894, "y": 0.3333333333333335, "z": 0.23668639053254392}, {"x": -0.5897435897435894, "y": 0.38461538461538475, "z": 0.1998685075608148}, {"x": -0.5897435897435894, "y": 0.435897435897436, "z": 0.1577909270216958}, {"x": -0.5897435897435894, "y": 0.4871794871794873, "z": 0.11045364891518691}, {"x": -0.5897435897435894, "y": 0.5384615384615385, "z": 0.05785667324128818}, {"x": -0.5897435897435894, "y": 0.5897435897435899, "z": -4.996003610813204e-16}, {"x": -0.5897435897435894, "y": 0.6410256410256412, "z": -0.06311637080867905}, {"x": -0.5897435897435894, "y": 0.6923076923076925, "z": -0.1314924391847475}, {"x": -0.5897435897435894, "y": 0.7435897435897438, "z": -0.2051282051282059}, {"x": -0.5897435897435894, "y": 0.7948717948717952, "z": -0.2840236686390541}, {"x": -0.5897435897435894, "y": 0.8461538461538465, "z": -0.36817882971729216}, {"x": -0.5897435897435894, "y": 0.8974358974358978, "z": -0.4575936883629202}, {"x": -0.5897435897435894, "y": 0.9487179487179491, "z": -0.5522682445759379}, {"x": -0.5897435897435894, "y": 1.0, "z": -0.6522024983563448}, {"x": -0.5384615384615381, "y": -0.9487179487179487, "z": -0.6101249178172259}, {"x": -0.5384615384615381, "y": -1.0, "z": -0.7100591715976335}, {"x": -0.5384615384615381, "y": -0.8974358974358974, "z": -0.515450361604208}, {"x": -0.5384615384615381, "y": -0.846153846153846, "z": -0.42603550295858006}, {"x": -0.5384615384615381, "y": -0.7948717948717947, "z": -0.341880341880342}, {"x": -0.5384615384615381, "y": -0.7435897435897434, "z": -0.2629848783694939}, {"x": -0.5384615384615381, "y": -0.6923076923076921, "z": -0.18934911242603558}, {"x": -0.5384615384615381, "y": -0.6410256410256407, "z": -0.12097304404996717}, {"x": -0.5384615384615381, "y": -0.5897435897435894, "z": -0.05785667324128868}, {"x": -0.5384615384615381, "y": -0.5384615384615381, "z": 0.0}, {"x": -0.5384615384615381, "y": -0.48717948717948684, "z": 0.05259697567389868}, {"x": -0.5384615384615381, "y": -0.43589743589743557, "z": 0.09993425378040752}, {"x": -0.5384615384615381, "y": -0.3846153846153843, "z": 0.14201183431952646}, {"x": -0.5384615384615381, "y": -0.33333333333333304, "z": 0.17882971729125555}, {"x": -0.5384615384615381, "y": -0.28205128205128177, "z": 0.21038790269559476}, {"x": -0.5384615384615381, "y": -0.2307692307692305, "z": 0.2366863905325441}, {"x": -0.5384615384615381, "y": -0.17948717948717924, "z": 0.25772518080210355}, {"x": -0.5384615384615381, "y": -0.12820512820512797, "z": 0.27350427350427314}, {"x": -0.5384615384615381, "y": -0.07692307692307669, "z": 0.2840236686390529}, {"x": -0.5384615384615381, "y": -0.02564102564102541, "z": 0.28928336620644274}, {"x": -0.5384615384615381, "y": 0.02564102564102587, "z": 0.28928336620644274}, {"x": -0.5384615384615381, "y": 0.07692307692307715, "z": 0.2840236686390528}, {"x": -0.5384615384615381, "y": 0.12820512820512842, "z": 0.27350427350427303}, {"x": -0.5384615384615381, "y": 0.17948717948717968, "z": 0.2577251808021034}, {"x": -0.5384615384615381, "y": 0.23076923076923095, "z": 0.2366863905325439}, {"x": -0.5384615384615381, "y": 0.2820512820512822, "z": 0.2103879026955945}, {"x": -0.5384615384615381, "y": 0.3333333333333335, "z": 0.17882971729125524}, {"x": -0.5384615384615381, "y": 0.38461538461538475, "z": 0.14201183431952613}, {"x": -0.5384615384615381, "y": 0.435897435897436, "z": 0.09993425378040713}, {"x": -0.5384615384615381, "y": 0.4871794871794873, "z": 0.05259697567389823}, {"x": -0.5384615384615381, "y": 0.5384615384615385, "z": -4.996003610813204e-16}, {"x": -0.5384615384615381, "y": 0.5897435897435899, "z": -0.05785667324128918}, {"x": -0.5384615384615381, "y": 0.6410256410256412, "z": -0.12097304404996773}, {"x": -0.5384615384615381, "y": 0.6923076923076925, "z": -0.1893491124260362}, {"x": -0.5384615384615381, "y": 0.7435897435897438, "z": -0.2629848783694946}, {"x": -0.5384615384615381, "y": 0.7948717948717952, "z": -0.3418803418803428}, {"x": -0.5384615384615381, "y": 0.8461538461538465, "z": -0.42603550295858084}, {"x": -0.5384615384615381, "y": 0.8974358974358978, "z": -0.5154503616042089}, {"x": -0.5384615384615381, "y": 0.9487179487179491, "z": -0.6101249178172267}, {"x": -0.5384615384615381, "y": 1.0, "z": -0.7100591715976335}, {"x": -0.48717948717948684, "y": -0.9487179487179487, "z": -0.6627218934911245}, {"x": -0.48717948717948684, "y": -1.0, "z": -0.7626561472715322}, {"x": -0.48717948717948684, "y": -0.8974358974358974, "z": -0.5680473372781066}, {"x": -0.48717948717948684, "y": -0.846153846153846, "z": -0.4786324786324787}, {"x": -0.48717948717948684, "y": -0.7948717948717947, "z": -0.39447731755424065}, {"x": -0.48717948717948684, "y": -0.7435897435897434, "z": -0.31558185404339256}, {"x": -0.48717948717948684, "y": -0.6923076923076921, "z": -0.24194608809993426}, {"x": -0.48717948717948684, "y": -0.6410256410256407, "z": -0.17357001972386585}, {"x": -0.48717948717948684, "y": -0.5897435897435894, "z": -0.11045364891518736}, {"x": -0.48717948717948684, "y": -0.5384615384615381, "z": -0.05259697567389868}, {"x": -0.48717948717948684, "y": -0.48717948717948684, "z": 0.0}, {"x": -0.48717948717948684, "y": -0.43589743589743557, "z": 0.04733727810650884}, {"x": -0.48717948717948684, "y": -0.3846153846153843, "z": 0.08941485864562779}, {"x": -0.48717948717948684, "y": -0.33333333333333304, "z": 0.12623274161735687}, {"x": -0.48717948717948684, "y": -0.28205128205128177, "z": 0.15779092702169606}, {"x": -0.48717948717948684, "y": -0.2307692307692305, "z": 0.1840894148586454}, {"x": -0.48717948717948684, "y": -0.17948717948717924, "z": 0.2051282051282049}, {"x": -0.48717948717948684, "y": -0.12820512820512797, "z": 0.2209072978303745}, {"x": -0.48717948717948684, "y": -0.07692307692307669, "z": 0.2314266929651542}, {"x": -0.48717948717948684, "y": -0.02564102564102541, "z": 0.23668639053254406}, {"x": -0.48717948717948684, "y": 0.02564102564102587, "z": 0.23668639053254403}, {"x": -0.48717948717948684, "y": 0.07692307692307715, "z": 0.23142669296515414}, {"x": -0.48717948717948684, "y": 0.12820512820512842, "z": 0.22090729783037436}, {"x": -0.48717948717948684, "y": 0.17948717948717968, "z": 0.20512820512820473}, {"x": -0.48717948717948684, "y": 0.23076923076923095, "z": 0.18408941485864522}, {"x": -0.48717948717948684, "y": 0.2820512820512822, "z": 0.15779092702169584}, {"x": -0.48717948717948684, "y": 0.3333333333333335, "z": 0.12623274161735656}, {"x": -0.48717948717948684, "y": 0.38461538461538475, "z": 0.08941485864562745}, {"x": -0.48717948717948684, "y": 0.435897435897436, "z": 0.04733727810650845}, {"x": -0.48717948717948684, "y": 0.4871794871794873, "z": -4.440892098500626e-16}, {"x": -0.48717948717948684, "y": 0.5384615384615385, "z": -0.05259697567389918}, {"x": -0.48717948717948684, "y": 0.5897435897435899, "z": -0.11045364891518786}, {"x": -0.48717948717948684, "y": 0.6410256410256412, "z": -0.1735700197238664}, {"x": -0.48717948717948684, "y": 0.6923076923076925, "z": -0.24194608809993487}, {"x": -0.48717948717948684, "y": 0.7435897435897438, "z": -0.31558185404339323}, {"x": -0.48717948717948684, "y": 0.7948717948717952, "z": -0.3944773175542414}, {"x": -0.48717948717948684, "y": 0.8461538461538465, "z": -0.4786324786324795}, {"x": -0.48717948717948684, "y": 0.8974358974358978, "z": -0.5680473372781075}, {"x": -0.48717948717948684, "y": 0.9487179487179491, "z": -0.6627218934911253}, {"x": -0.48717948717948684, "y": 1.0, "z": -0.7626561472715322}, {"x": -0.43589743589743557, "y": -0.9487179487179487, "z": -0.7100591715976334}, {"x": -0.43589743589743557, "y": -1.0, "z": -0.8099934253780411}, {"x": -0.43589743589743557, "y": -0.8974358974358974, "z": -0.6153846153846155}, {"x": -0.43589743589743557, "y": -0.846153846153846, "z": -0.5259697567389876}, {"x": -0.43589743589743557, "y": -0.7948717948717947, "z": -0.44181459566074954}, {"x": -0.43589743589743557, "y": -0.7435897435897434, "z": -0.36291913214990146}, {"x": -0.43589743589743557, "y": -0.6923076923076921, "z": -0.2892833662064431}, {"x": -0.43589743589743557, "y": -0.6410256410256407, "z": -0.2209072978303747}, {"x": -0.43589743589743557, "y": -0.5897435897435894, "z": -0.1577909270216962}, {"x": -0.43589743589743557, "y": -0.5384615384615381, "z": -0.09993425378040752}, {"x": -0.43589743589743557, "y": -0.48717948717948684, "z": -0.04733727810650884}, {"x": -0.43589743589743557, "y": -0.43589743589743557, "z": 0.0}, {"x": -0.43589743589743557, "y": -0.3846153846153843, "z": 0.04207758053911895}, {"x": -0.43589743589743557, "y": -0.33333333333333304, "z": 0.07889546351084803}, {"x": -0.43589743589743557, "y": -0.28205128205128177, "z": 0.11045364891518723}, {"x": -0.43589743589743557, "y": -0.2307692307692305, "z": 0.13675213675213657}, {"x": -0.43589743589743557, "y": -0.17948717948717924, "z": 0.15779092702169606}, {"x": -0.43589743589743557, "y": -0.12820512820512797, "z": 0.17357001972386565}, {"x": -0.43589743589743557, "y": -0.07692307692307669, "z": 0.18408941485864536}, {"x": -0.43589743589743557, "y": -0.02564102564102541, "z": 0.18934911242603522}, {"x": -0.43589743589743557, "y": 0.02564102564102587, "z": 0.1893491124260352}, {"x": -0.43589743589743557, "y": 0.07692307692307715, "z": 0.1840894148586453}, {"x": -0.43589743589743557, "y": 0.12820512820512842, "z": 0.17357001972386552}, {"x": -0.43589743589743557, "y": 0.17948717948717968, "z": 0.1577909270216959}, {"x": -0.43589743589743557, "y": 0.23076923076923095, "z": 0.13675213675213638}, {"x": -0.43589743589743557, "y": 0.2820512820512822, "z": 0.11045364891518698}, {"x": -0.43589743589743557, "y": 0.3333333333333335, "z": 0.07889546351084772}, {"x": -0.43589743589743557, "y": 0.38461538461538475, "z": 0.042077580539118614}, {"x": -0.43589743589743557, "y": 0.435897435897436, "z": -3.885780586188048e-16}, {"x": -0.43589743589743557, "y": 0.4871794871794873, "z": -0.047337278106509284}, {"x": -0.43589743589743557, "y": 0.5384615384615385, "z": -0.09993425378040802}, {"x": -0.43589743589743557, "y": 0.5897435897435899, "z": -0.1577909270216967}, {"x": -0.43589743589743557, "y": 0.6410256410256412, "z": -0.22090729783037524}, {"x": -0.43589743589743557, "y": 0.6923076923076925, "z": -0.2892833662064437}, {"x": -0.43589743589743557, "y": 0.7435897435897438, "z": -0.3629191321499021}, {"x": -0.43589743589743557, "y": 0.7948717948717952, "z": -0.4418145956607503}, {"x": -0.43589743589743557, "y": 0.8461538461538465, "z": -0.5259697567389884}, {"x": -0.43589743589743557, "y": 0.8974358974358978, "z": -0.6153846153846164}, {"x": -0.43589743589743557, "y": 0.9487179487179491, "z": -0.7100591715976342}, {"x": -0.43589743589743557, "y": 1.0, "z": -0.8099934253780411}, {"x": -0.3846153846153843, "y": -0.9487179487179487, "z": -0.7521367521367524}, {"x": -0.3846153846153843, "y": -1.0, "z": -0.85207100591716}, {"x": -0.3846153846153843, "y": -0.8974358974358974, "z": -0.6574621959237344}, {"x": -0.3846153846153843, "y": -0.846153846153846, "z": -0.5680473372781065}, {"x": -0.3846153846153843, "y": -0.7948717948717947, "z": -0.48389217619986846}, {"x": -0.3846153846153843, "y": -0.7435897435897434, "z": -0.4049967126890204}, {"x": -0.3846153846153843, "y": -0.6923076923076921, "z": -0.33136094674556205}, {"x": -0.3846153846153843, "y": -0.6410256410256407, "z": -0.26298487836949364}, {"x": -0.3846153846153843, "y": -0.5897435897435894, "z": -0.19986850756081515}, {"x": -0.3846153846153843, "y": -0.5384615384615381, "z": -0.14201183431952646}, {"x": -0.3846153846153843, "y": -0.48717948717948684, "z": -0.08941485864562779}, {"x": -0.3846153846153843, "y": -0.43589743589743557, "z": -0.04207758053911895}, {"x": -0.3846153846153843, "y": -0.3846153846153843, "z": 0.0}, {"x": -0.3846153846153843, "y": -0.33333333333333304, "z": 0.03681788297172908}, {"x": -0.3846153846153843, "y": -0.28205128205128177, "z": 0.06837606837606829}, {"x": -0.3846153846153843, "y": -0.2307692307692305, "z": 0.09467455621301762}, {"x": -0.3846153846153843, "y": -0.17948717948717924, "z": 0.1157133464825771}, {"x": -0.3846153846153843, "y": -0.12820512820512797, "z": 0.13149243918474668}, {"x": -0.3846153846153843, "y": -0.07692307692307669, "z": 0.1420118343195264}, {"x": -0.3846153846153843, "y": -0.02564102564102541, "z": 0.14727153188691627}, {"x": -0.3846153846153843, "y": 0.02564102564102587, "z": 0.14727153188691625}, {"x": -0.3846153846153843, "y": 0.07692307692307715, "z": 0.14201183431952635}, {"x": -0.3846153846153843, "y": 0.12820512820512842, "z": 0.13149243918474657}, {"x": -0.3846153846153843, "y": 0.17948717948717968, "z": 0.11571334648257695}, {"x": -0.3846153846153843, "y": 0.23076923076923095, "z": 0.09467455621301743}, {"x": -0.3846153846153843, "y": 0.2820512820512822, "z": 0.06837606837606804}, {"x": -0.3846153846153843, "y": 0.3333333333333335, "z": 0.03681788297172878}, {"x": -0.3846153846153843, "y": 0.38461538461538475, "z": -3.3306690738754696e-16}, {"x": -0.3846153846153843, "y": 0.435897435897436, "z": -0.042077580539119336}, {"x": -0.3846153846153843, "y": 0.4871794871794873, "z": -0.08941485864562823}, {"x": -0.3846153846153843, "y": 0.5384615384615385, "z": -0.14201183431952696}, {"x": -0.3846153846153843, "y": 0.5897435897435899, "z": -0.19986850756081564}, {"x": -0.3846153846153843, "y": 0.6410256410256412, "z": -0.2629848783694942}, {"x": -0.3846153846153843, "y": 0.6923076923076925, "z": -0.33136094674556266}, {"x": -0.3846153846153843, "y": 0.7435897435897438, "z": -0.40499671268902104}, {"x": -0.3846153846153843, "y": 0.7948717948717952, "z": -0.48389217619986924}, {"x": -0.3846153846153843, "y": 0.8461538461538465, "z": -0.5680473372781073}, {"x": -0.3846153846153843, "y": 0.8974358974358978, "z": -0.6574621959237353}, {"x": -0.3846153846153843, "y": 0.9487179487179491, "z": -0.7521367521367531}, {"x": -0.3846153846153843, "y": 1.0, "z": -0.85207100591716}, {"x": -0.33333333333333304, "y": -0.9487179487179487, "z": -0.7889546351084814}, {"x": -0.33333333333333304, "y": -1.0, "z": -0.8888888888888891}, {"x": -0.33333333333333304, "y": -0.8974358974358974, "z": -0.6942800788954635}, {"x": -0.33333333333333304, "y": -0.846153846153846, "z": -0.6048652202498356}, {"x": -0.33333333333333304, "y": -0.7948717948717947, "z": -0.5207100591715975}, {"x": -0.33333333333333304, "y": -0.7435897435897434, "z": -0.44181459566074943}, {"x": -0.33333333333333304, "y": -0.6923076923076921, "z": -0.3681788297172911}, {"x": -0.33333333333333304, "y": -0.6410256410256407, "z": -0.29980276134122275}, {"x": -0.33333333333333304, "y": -0.5897435897435894, "z": -0.23668639053254423}, {"x": -0.33333333333333304, "y": -0.5384615384615381, "z": -0.17882971729125555}, {"x": -0.33333333333333304, "y": -0.48717948717948684, "z": -0.12623274161735687}, {"x": -0.33333333333333304, "y": -0.43589743589743557, "z": -0.07889546351084803}, {"x": -0.33333333333333304, "y": -0.3846153846153843, "z": -0.03681788297172908}, {"x": -0.33333333333333304, "y": -0.33333333333333304, "z": 0.0}, {"x": -0.33333333333333304, "y": -0.28205128205128177, "z": 0.031558185404339203}, {"x": -0.33333333333333304, "y": -0.2307692307692305, "z": 0.05785667324128855}, {"x": -0.33333333333333304, "y": -0.17948717948717924, "z": 0.07889546351084802}, {"x": -0.33333333333333304, "y": -0.12820512820512797, "z": 0.09467455621301761}, {"x": -0.33333333333333304, "y": -0.07692307692307669, "z": 0.10519395134779734}, {"x": -0.33333333333333304, "y": -0.02564102564102541, "z": 0.11045364891518719}, {"x": -0.33333333333333304, "y": 0.02564102564102587, "z": 0.11045364891518716}, {"x": -0.33333333333333304, "y": 0.07692307692307715, "z": 0.10519395134779727}, {"x": -0.33333333333333304, "y": 0.12820512820512842, "z": 0.0946745562130175}, {"x": -0.33333333333333304, "y": 0.17948717948717968, "z": 0.07889546351084786}, {"x": -0.33333333333333304, "y": 0.23076923076923095, "z": 0.05785667324128834}, {"x": -0.33333333333333304, "y": 0.2820512820512822, "z": 0.031558185404338954}, {"x": -0.33333333333333304, "y": 0.3333333333333335, "z": -3.0531133177191805e-16}, {"x": -0.33333333333333304, "y": 0.38461538461538475, "z": -0.036817882971729415}, {"x": -0.33333333333333304, "y": 0.435897435897436, "z": -0.07889546351084842}, {"x": -0.33333333333333304, "y": 0.4871794871794873, "z": -0.1262327416173573}, {"x": -0.33333333333333304, "y": 0.5384615384615385, "z": -0.17882971729125605}, {"x": -0.33333333333333304, "y": 0.5897435897435899, "z": -0.23668639053254473}, {"x": -0.33333333333333304, "y": 0.6410256410256412, "z": -0.2998027613412233}, {"x": -0.33333333333333304, "y": 0.6923076923076925, "z": -0.36817882971729177}, {"x": -0.33333333333333304, "y": 0.7435897435897438, "z": -0.4418145956607501}, {"x": -0.33333333333333304, "y": 0.7948717948717952, "z": -0.5207100591715983}, {"x": -0.33333333333333304, "y": 0.8461538461538465, "z": -0.6048652202498364}, {"x": -0.33333333333333304, "y": 0.8974358974358978, "z": -0.6942800788954644}, {"x": -0.33333333333333304, "y": 0.9487179487179491, "z": -0.7889546351084822}, {"x": -0.33333333333333304, "y": 1.0, "z": -0.8888888888888891}, {"x": -0.28205128205128177, "y": -0.9487179487179487, "z": -0.8205128205128206}, {"x": -0.28205128205128177, "y": -1.0, "z": -0.9204470742932283}, {"x": -0.28205128205128177, "y": -0.8974358974358974, "z": -0.7258382642998027}, {"x": -0.28205128205128177, "y": -0.846153846153846, "z": -0.6364234056541748}, {"x": -0.28205128205128177, "y": -0.7948717948717947, "z": -0.5522682445759367}, {"x": -0.28205128205128177, "y": -0.7435897435897434, "z": -0.4733727810650887}, {"x": -0.28205128205128177, "y": -0.6923076923076921, "z": -0.39973701512163035}, {"x": -0.28205128205128177, "y": -0.6410256410256407, "z": -0.33136094674556194}, {"x": -0.28205128205128177, "y": -0.5897435897435894, "z": -0.26824457593688344}, {"x": -0.28205128205128177, "y": -0.5384615384615381, "z": -0.21038790269559476}, {"x": -0.28205128205128177, "y": -0.48717948717948684, "z": -0.15779092702169606}, {"x": -0.28205128205128177, "y": -0.43589743589743557, "z": -0.11045364891518723}, {"x": -0.28205128205128177, "y": -0.3846153846153843, "z": -0.06837606837606829}, {"x": -0.28205128205128177, "y": -0.33333333333333304, "z": -0.031558185404339203}, {"x": -0.28205128205128177, "y": -0.28205128205128177, "z": 0.0}, {"x": -0.28205128205128177, "y": -0.2307692307692305, "z": 0.026298487836949345}, {"x": -0.28205128205128177, "y": -0.17948717948717924, "z": 0.04733727810650881}, {"x": -0.28205128205128177, "y": -0.12820512820512797, "z": 0.06311637080867841}, {"x": -0.28205128205128177, "y": -0.07692307692307669, "z": 0.07363576594345814}, {"x": -0.28205128205128177, "y": -0.02564102564102541, "z": 0.07889546351084799}, {"x": -0.28205128205128177, "y": 0.02564102564102587, "z": 0.07889546351084796}, {"x": -0.28205128205128177, "y": 0.07692307692307715, "z": 0.07363576594345807}, {"x": -0.28205128205128177, "y": 0.12820512820512842, "z": 0.0631163708086783}, {"x": -0.28205128205128177, "y": 0.17948717948717968, "z": 0.04733727810650865}, {"x": -0.28205128205128177, "y": 0.23076923076923095, "z": 0.026298487836949137}, {"x": -0.28205128205128177, "y": 0.2820512820512822, "z": -2.498001805406602e-16}, {"x": -0.28205128205128177, "y": 0.3333333333333335, "z": -0.03155818540433951}, {"x": -0.28205128205128177, "y": 0.38461538461538475, "z": -0.06837606837606862}, {"x": -0.28205128205128177, "y": 0.435897435897436, "z": -0.11045364891518762}, {"x": -0.28205128205128177, "y": 0.4871794871794873, "z": -0.1577909270216965}, {"x": -0.28205128205128177, "y": 0.5384615384615385, "z": -0.21038790269559526}, {"x": -0.28205128205128177, "y": 0.5897435897435899, "z": -0.26824457593688394}, {"x": -0.28205128205128177, "y": 0.6410256410256412, "z": -0.3313609467455625}, {"x": -0.28205128205128177, "y": 0.6923076923076925, "z": -0.39973701512163096}, {"x": -0.28205128205128177, "y": 0.7435897435897438, "z": -0.47337278106508934}, {"x": -0.28205128205128177, "y": 0.7948717948717952, "z": -0.5522682445759375}, {"x": -0.28205128205128177, "y": 0.8461538461538465, "z": -0.6364234056541755}, {"x": -0.28205128205128177, "y": 0.8974358974358978, "z": -0.7258382642998036}, {"x": -0.28205128205128177, "y": 0.9487179487179491, "z": -0.8205128205128214}, {"x": -0.28205128205128177, "y": 1.0, "z": -0.9204470742932283}, {"x": -0.2307692307692305, "y": -0.9487179487179487, "z": -0.84681130834977}, {"x": -0.2307692307692305, "y": -1.0, "z": -0.9467455621301777}, {"x": -0.2307692307692305, "y": -0.8974358974358974, "z": -0.7521367521367521}, {"x": -0.2307692307692305, "y": -0.846153846153846, "z": -0.6627218934911242}, {"x": -0.2307692307692305, "y": -0.7948717948717947, "z": -0.5785667324128861}, {"x": -0.2307692307692305, "y": -0.7435897435897434, "z": -0.499671268902038}, {"x": -0.2307692307692305, "y": -0.6923076923076921, "z": -0.42603550295857967}, {"x": -0.2307692307692305, "y": -0.6410256410256407, "z": -0.35765943458251126}, {"x": -0.2307692307692305, "y": -0.5897435897435894, "z": -0.29454306377383277}, {"x": -0.2307692307692305, "y": -0.5384615384615381, "z": -0.2366863905325441}, {"x": -0.2307692307692305, "y": -0.48717948717948684, "z": -0.1840894148586454}, {"x": -0.2307692307692305, "y": -0.43589743589743557, "z": -0.13675213675213657}, {"x": -0.2307692307692305, "y": -0.3846153846153843, "z": -0.09467455621301762}, {"x": -0.2307692307692305, "y": -0.33333333333333304, "z": -0.05785667324128855}, {"x": -0.2307692307692305, "y": -0.28205128205128177, "z": -0.026298487836949345}, {"x": -0.2307692307692305, "y": -0.2307692307692305, "z": 0.0}, {"x": -0.2307692307692305, "y": -0.17948717948717924, "z": 0.021038790269559467}, {"x": -0.2307692307692305, "y": -0.12820512820512797, "z": 0.03681788297172906}, {"x": -0.2307692307692305, "y": -0.07692307692307669, "z": 0.047337278106508784}, {"x": -0.2307692307692305, "y": -0.02564102564102541, "z": 0.05259697567389864}, {"x": -0.2307692307692305, "y": 0.02564102564102587, "z": 0.052596975673898615}, {"x": -0.2307692307692305, "y": 0.07692307692307715, "z": 0.047337278106508715}, {"x": -0.2307692307692305, "y": 0.12820512820512842, "z": 0.036817882971728944}, {"x": -0.2307692307692305, "y": 0.17948717948717968, "z": 0.021038790269559307}, {"x": -0.2307692307692305, "y": 0.23076923076923095, "z": -2.0816681711721685e-16}, {"x": -0.2307692307692305, "y": 0.2820512820512822, "z": -0.026298487836949595}, {"x": -0.2307692307692305, "y": 0.3333333333333335, "z": -0.057856673241288854}, {"x": -0.2307692307692305, "y": 0.38461538461538475, "z": -0.09467455621301796}, {"x": -0.2307692307692305, "y": 0.435897435897436, "z": -0.13675213675213696}, {"x": -0.2307692307692305, "y": 0.4871794871794873, "z": -0.18408941485864586}, {"x": -0.2307692307692305, "y": 0.5384615384615385, "z": -0.2366863905325446}, {"x": -0.2307692307692305, "y": 0.5897435897435899, "z": -0.29454306377383327}, {"x": -0.2307692307692305, "y": 0.6410256410256412, "z": -0.3576594345825118}, {"x": -0.2307692307692305, "y": 0.6923076923076925, "z": -0.4260355029585803}, {"x": -0.2307692307692305, "y": 0.7435897435897438, "z": -0.49967126890203867}, {"x": -0.2307692307692305, "y": 0.7948717948717952, "z": -0.5785667324128869}, {"x": -0.2307692307692305, "y": 0.8461538461538465, "z": -0.662721893491125}, {"x": -0.2307692307692305, "y": 0.8974358974358978, "z": -0.752136752136753}, {"x": -0.2307692307692305, "y": 0.9487179487179491, "z": -0.8468113083497708}, {"x": -0.2307692307692305, "y": 1.0, "z": -0.9467455621301777}, {"x": -0.17948717948717924, "y": -0.9487179487179487, "z": -0.8678500986193295}, {"x": -0.17948717948717924, "y": -1.0, "z": -0.9677843523997371}, {"x": -0.17948717948717924, "y": -0.8974358974358974, "z": -0.7731755424063116}, {"x": -0.17948717948717924, "y": -0.846153846153846, "z": -0.6837606837606837}, {"x": -0.17948717948717924, "y": -0.7948717948717947, "z": -0.5996055226824456}, {"x": -0.17948717948717924, "y": -0.7435897435897434, "z": -0.5207100591715975}, {"x": -0.17948717948717924, "y": -0.6923076923076921, "z": -0.44707429322813913}, {"x": -0.17948717948717924, "y": -0.6410256410256407, "z": -0.3786982248520707}, {"x": -0.17948717948717924, "y": -0.5897435897435894, "z": -0.31558185404339223}, {"x": -0.17948717948717924, "y": -0.5384615384615381, "z": -0.25772518080210355}, {"x": -0.17948717948717924, "y": -0.48717948717948684, "z": -0.2051282051282049}, {"x": -0.17948717948717924, "y": -0.43589743589743557, "z": -0.15779092702169606}, {"x": -0.17948717948717924, "y": -0.3846153846153843, "z": -0.1157133464825771}, {"x": -0.17948717948717924, "y": -0.33333333333333304, "z": -0.07889546351084802}, {"x": -0.17948717948717924, "y": -0.28205128205128177, "z": -0.04733727810650881}, {"x": -0.17948717948717924, "y": -0.2307692307692305, "z": -0.021038790269559467}, {"x": -0.17948717948717924, "y": -0.17948717948717924, "z": 0.0}, {"x": -0.17948717948717924, "y": -0.12820512820512797, "z": 0.015779092702169595}, {"x": -0.17948717948717924, "y": -0.07692307692307669, "z": 0.02629848783694932}, {"x": -0.17948717948717924, "y": -0.02564102564102541, "z": 0.031558185404339176}, {"x": -0.17948717948717924, "y": 0.02564102564102587, "z": 0.03155818540433915}, {"x": -0.17948717948717924, "y": 0.07692307692307715, "z": 0.026298487836949252}, {"x": -0.17948717948717924, "y": 0.12820512820512842, "z": 0.01577909270216948}, {"x": -0.17948717948717924, "y": 0.17948717948717968, "z": -1.5959455978986625e-16}, {"x": -0.17948717948717924, "y": 0.23076923076923095, "z": -0.021038790269559675}, {"x": -0.17948717948717924, "y": 0.2820512820512822, "z": -0.04733727810650906}, {"x": -0.17948717948717924, "y": 0.3333333333333335, "z": -0.07889546351084832}, {"x": -0.17948717948717924, "y": 0.38461538461538475, "z": -0.11571334648257743}, {"x": -0.17948717948717924, "y": 0.435897435897436, "z": -0.15779092702169645}, {"x": -0.17948717948717924, "y": 0.4871794871794873, "z": -0.20512820512820534}, {"x": -0.17948717948717924, "y": 0.5384615384615385, "z": -0.25772518080210405}, {"x": -0.17948717948717924, "y": 0.5897435897435899, "z": -0.31558185404339273}, {"x": -0.17948717948717924, "y": 0.6410256410256412, "z": -0.3786982248520713}, {"x": -0.17948717948717924, "y": 0.6923076923076925, "z": -0.44707429322813974}, {"x": -0.17948717948717924, "y": 0.7435897435897438, "z": -0.5207100591715982}, {"x": -0.17948717948717924, "y": 0.7948717948717952, "z": -0.5996055226824464}, {"x": -0.17948717948717924, "y": 0.8461538461538465, "z": -0.6837606837606844}, {"x": -0.17948717948717924, "y": 0.8974358974358978, "z": -0.7731755424063125}, {"x": -0.17948717948717924, "y": 0.9487179487179491, "z": -0.8678500986193303}, {"x": -0.17948717948717924, "y": 1.0, "z": -0.9677843523997371}, {"x": -0.12820512820512797, "y": -0.9487179487179487, "z": -0.8836291913214991}, {"x": -0.12820512820512797, "y": -1.0, "z": -0.9835634451019067}, {"x": -0.12820512820512797, "y": -0.8974358974358974, "z": -0.7889546351084812}, {"x": -0.12820512820512797, "y": -0.846153846153846, "z": -0.6995397764628533}, {"x": -0.12820512820512797, "y": -0.7948717948717947, "z": -0.6153846153846152}, {"x": -0.12820512820512797, "y": -0.7435897435897434, "z": -0.5364891518737671}, {"x": -0.12820512820512797, "y": -0.6923076923076921, "z": -0.4628533859303087}, {"x": -0.12820512820512797, "y": -0.6410256410256407, "z": -0.3944773175542403}, {"x": -0.12820512820512797, "y": -0.5897435897435894, "z": -0.3313609467455618}, {"x": -0.12820512820512797, "y": -0.5384615384615381, "z": -0.27350427350427314}, {"x": -0.12820512820512797, "y": -0.48717948717948684, "z": -0.2209072978303745}, {"x": -0.12820512820512797, "y": -0.43589743589743557, "z": -0.17357001972386565}, {"x": -0.12820512820512797, "y": -0.3846153846153843, "z": -0.13149243918474668}, {"x": -0.12820512820512797, "y": -0.33333333333333304, "z": -0.09467455621301761}, {"x": -0.12820512820512797, "y": -0.28205128205128177, "z": -0.06311637080867841}, {"x": -0.12820512820512797, "y": -0.2307692307692305, "z": -0.03681788297172906}, {"x": -0.12820512820512797, "y": -0.17948717948717924, "z": -0.015779092702169595}, {"x": -0.12820512820512797, "y": -0.12820512820512797, "z": 0.0}, {"x": -0.12820512820512797, "y": -0.07692307692307669, "z": 0.010519395134779726}, {"x": -0.12820512820512797, "y": -0.02564102564102541, "z": 0.015779092702169577}, {"x": -0.12820512820512797, "y": 0.02564102564102587, "z": 0.015779092702169553}, {"x": -0.12820512820512797, "y": 0.07692307692307715, "z": 0.010519395134779657}, {"x": -0.12820512820512797, "y": 0.12820512820512842, "z": -1.1449174941446927e-16}, {"x": -0.12820512820512797, "y": 0.17948717948717968, "z": -0.015779092702169754}, {"x": -0.12820512820512797, "y": 0.23076923076923095, "z": -0.03681788297172927}, {"x": -0.12820512820512797, "y": 0.2820512820512822, "z": -0.06311637080867866}, {"x": -0.12820512820512797, "y": 0.3333333333333335, "z": -0.09467455621301792}, {"x": -0.12820512820512797, "y": 0.38461538461538475, "z": -0.131492439184747}, {"x": -0.12820512820512797, "y": 0.435897435897436, "z": -0.17357001972386604}, {"x": -0.12820512820512797, "y": 0.4871794871794873, "z": -0.22090729783037494}, {"x": -0.12820512820512797, "y": 0.5384615384615385, "z": -0.27350427350427364}, {"x": -0.12820512820512797, "y": 0.5897435897435899, "z": -0.3313609467455623}, {"x": -0.12820512820512797, "y": 0.6410256410256412, "z": -0.39447731755424087}, {"x": -0.12820512820512797, "y": 0.6923076923076925, "z": -0.46285338593030934}, {"x": -0.12820512820512797, "y": 0.7435897435897438, "z": -0.5364891518737678}, {"x": -0.12820512820512797, "y": 0.7948717948717952, "z": -0.615384615384616}, {"x": -0.12820512820512797, "y": 0.8461538461538465, "z": -0.699539776462854}, {"x": -0.12820512820512797, "y": 0.8974358974358978, "z": -0.7889546351084821}, {"x": -0.12820512820512797, "y": 0.9487179487179491, "z": -0.8836291913214999}, {"x": -0.12820512820512797, "y": 1.0, "z": -0.9835634451019067}, {"x": -0.07692307692307669, "y": -0.9487179487179487, "z": -0.8941485864562788}, {"x": -0.07692307692307669, "y": -1.0, "z": -0.9940828402366865}, {"x": -0.07692307692307669, "y": -0.8974358974358974, "z": -0.7994740302432609}, {"x": -0.07692307692307669, "y": -0.846153846153846, "z": -0.710059171597633}, {"x": -0.07692307692307669, "y": -0.7948717948717947, "z": -0.6259040105193949}, {"x": -0.07692307692307669, "y": -0.7435897435897434, "z": -0.5470085470085468}, {"x": -0.07692307692307669, "y": -0.6923076923076921, "z": -0.47337278106508845}, {"x": -0.07692307692307669, "y": -0.6410256410256407, "z": -0.40499671268902004}, {"x": -0.07692307692307669, "y": -0.5897435897435894, "z": -0.34188034188034155}, {"x": -0.07692307692307669, "y": -0.5384615384615381, "z": -0.2840236686390529}, {"x": -0.07692307692307669, "y": -0.48717948717948684, "z": -0.2314266929651542}, {"x": -0.07692307692307669, "y": -0.43589743589743557, "z": -0.18408941485864536}, {"x": -0.07692307692307669, "y": -0.3846153846153843, "z": -0.1420118343195264}, {"x": -0.07692307692307669, "y": -0.33333333333333304, "z": -0.10519395134779734}, {"x": -0.07692307692307669, "y": -0.28205128205128177, "z": -0.07363576594345814}, {"x": -0.07692307692307669, "y": -0.2307692307692305, "z": -0.047337278106508784}, {"x": -0.07692307692307669, "y": -0.17948717948717924, "z": -0.02629848783694932}, {"x": -0.07692307692307669, "y": -0.12820512820512797, "z": -0.010519395134779726}, {"x": -0.07692307692307669, "y": -0.07692307692307669, "z": 0.0}, {"x": -0.07692307692307669, "y": -0.02564102564102541, "z": 0.005259697567389851}, {"x": -0.07692307692307669, "y": 0.02564102564102587, "z": 0.005259697567389828}, {"x": -0.07692307692307669, "y": 0.07692307692307715, "z": -7.025630077706069e-17}, {"x": -0.07692307692307669, "y": 0.12820512820512842, "z": -0.010519395134779841}, {"x": -0.07692307692307669, "y": 0.17948717948717968, "z": -0.02629848783694948}, {"x": -0.07692307692307669, "y": 0.23076923076923095, "z": -0.04733727810650899}, {"x": -0.07692307692307669, "y": 0.2820512820512822, "z": -0.07363576594345839}, {"x": -0.07692307692307669, "y": 0.3333333333333335, "z": -0.10519395134779765}, {"x": -0.07692307692307669, "y": 0.38461538461538475, "z": -0.14201183431952674}, {"x": -0.07692307692307669, "y": 0.435897435897436, "z": -0.18408941485864574}, {"x": -0.07692307692307669, "y": 0.4871794871794873, "z": -0.23142669296515464}, {"x": -0.07692307692307669, "y": 0.5384615384615385, "z": -0.2840236686390534}, {"x": -0.07692307692307669, "y": 0.5897435897435899, "z": -0.34188034188034205}, {"x": -0.07692307692307669, "y": 0.6410256410256412, "z": -0.4049967126890206}, {"x": -0.07692307692307669, "y": 0.6923076923076925, "z": -0.47337278106508907}, {"x": -0.07692307692307669, "y": 0.7435897435897438, "z": -0.5470085470085475}, {"x": -0.07692307692307669, "y": 0.7948717948717952, "z": -0.6259040105193957}, {"x": -0.07692307692307669, "y": 0.8461538461538465, "z": -0.7100591715976338}, {"x": -0.07692307692307669, "y": 0.8974358974358978, "z": -0.7994740302432618}, {"x": -0.07692307692307669, "y": 0.9487179487179491, "z": -0.8941485864562796}, {"x": -0.07692307692307669, "y": 1.0, "z": -0.9940828402366865}, {"x": -0.02564102564102541, "y": -0.9487179487179487, "z": -0.8994082840236686}, {"x": -0.02564102564102541, "y": -1.0, "z": -0.9993425378040762}, {"x": -0.02564102564102541, "y": -0.8974358974358974, "z": -0.8047337278106507}, {"x": -0.02564102564102541, "y": -0.846153846153846, "z": -0.7153188691650227}, {"x": -0.02564102564102541, "y": -0.7948717948717947, "z": -0.6311637080867847}, {"x": -0.02564102564102541, "y": -0.7435897435897434, "z": -0.5522682445759366}, {"x": -0.02564102564102541, "y": -0.6923076923076921, "z": -0.4786324786324783}, {"x": -0.02564102564102541, "y": -0.6410256410256407, "z": -0.4102564102564099}, {"x": -0.02564102564102541, "y": -0.5897435897435894, "z": -0.3471400394477314}, {"x": -0.02564102564102541, "y": -0.5384615384615381, "z": -0.28928336620644274}, {"x": -0.02564102564102541, "y": -0.48717948717948684, "z": -0.23668639053254406}, {"x": -0.02564102564102541, "y": -0.43589743589743557, "z": -0.18934911242603522}, {"x": -0.02564102564102541, "y": -0.3846153846153843, "z": -0.14727153188691627}, {"x": -0.02564102564102541, "y": -0.33333333333333304, "z": -0.11045364891518719}, {"x": -0.02564102564102541, "y": -0.28205128205128177, "z": -0.07889546351084799}, {"x": -0.02564102564102541, "y": -0.2307692307692305, "z": -0.05259697567389864}, {"x": -0.02564102564102541, "y": -0.17948717948717924, "z": -0.031558185404339176}, {"x": -0.02564102564102541, "y": -0.12820512820512797, "z": -0.015779092702169577}, {"x": -0.02564102564102541, "y": -0.07692307692307669, "z": -0.005259697567389851}, {"x": -0.02564102564102541, "y": -0.02564102564102541, "z": 0.0}, {"x": -0.02564102564102541, "y": 0.02564102564102587, "z": -2.3527187142935446e-17}, {"x": -0.02564102564102541, "y": 0.07692307692307715, "z": -0.005259697567389921}, {"x": -0.02564102564102541, "y": 0.12820512820512842, "z": -0.015779092702169692}, {"x": -0.02564102564102541, "y": 0.17948717948717968, "z": -0.031558185404339335}, {"x": -0.02564102564102541, "y": 0.23076923076923095, "z": -0.05259697567389885}, {"x": -0.02564102564102541, "y": 0.2820512820512822, "z": -0.07889546351084824}, {"x": -0.02564102564102541, "y": 0.3333333333333335, "z": -0.1104536489151875}, {"x": -0.02564102564102541, "y": 0.38461538461538475, "z": -0.1472715318869166}, {"x": -0.02564102564102541, "y": 0.435897435897436, "z": -0.1893491124260356}, {"x": -0.02564102564102541, "y": 0.4871794871794873, "z": -0.2366863905325445}, {"x": -0.02564102564102541, "y": 0.5384615384615385, "z": -0.28928336620644324}, {"x": -0.02564102564102541, "y": 0.5897435897435899, "z": -0.3471400394477319}, {"x": -0.02564102564102541, "y": 0.6410256410256412, "z": -0.41025641025641046}, {"x": -0.02564102564102541, "y": 0.6923076923076925, "z": -0.47863247863247893}, {"x": -0.02564102564102541, "y": 0.7435897435897438, "z": -0.5522682445759373}, {"x": -0.02564102564102541, "y": 0.7948717948717952, "z": -0.6311637080867855}, {"x": -0.02564102564102541, "y": 0.8461538461538465, "z": -0.7153188691650235}, {"x": -0.02564102564102541, "y": 0.8974358974358978, "z": -0.8047337278106516}, {"x": -0.02564102564102541, "y": 0.9487179487179491, "z": -0.8994082840236693}, {"x": -0.02564102564102541, "y": 1.0, "z": -0.9993425378040762}, {"x": 0.02564102564102587, "y": -0.9487179487179487, "z": -0.8994082840236686}, {"x": 0.02564102564102587, "y": -1.0, "z": -0.9993425378040762}, {"x": 0.02564102564102587, "y": -0.8974358974358974, "z": -0.8047337278106507}, {"x": 0.02564102564102587, "y": -0.846153846153846, "z": -0.7153188691650227}, {"x": 0.02564102564102587, "y": -0.7948717948717947, "z": -0.6311637080867847}, {"x": 0.02564102564102587, "y": -0.7435897435897434, "z": -0.5522682445759366}, {"x": 0.02564102564102587, "y": -0.6923076923076921, "z": -0.4786324786324783}, {"x": 0.02564102564102587, "y": -0.6410256410256407, "z": -0.4102564102564099}, {"x": 0.02564102564102587, "y": -0.5897435897435894, "z": -0.3471400394477314}, {"x": 0.02564102564102587, "y": -0.5384615384615381, "z": -0.28928336620644274}, {"x": 0.02564102564102587, "y": -0.48717948717948684, "z": -0.23668639053254403}, {"x": 0.02564102564102587, "y": -0.43589743589743557, "z": -0.1893491124260352}, {"x": 0.02564102564102587, "y": -0.3846153846153843, "z": -0.14727153188691625}, {"x": 0.02564102564102587, "y": -0.33333333333333304, "z": -0.11045364891518716}, {"x": 0.02564102564102587, "y": -0.28205128205128177, "z": -0.07889546351084796}, {"x": 0.02564102564102587, "y": -0.2307692307692305, "z": -0.052596975673898615}, {"x": 0.02564102564102587, "y": -0.17948717948717924, "z": -0.03155818540433915}, {"x": 0.02564102564102587, "y": -0.12820512820512797, "z": -0.015779092702169553}, {"x": 0.02564102564102587, "y": -0.07692307692307669, "z": -0.005259697567389828}, {"x": 0.02564102564102587, "y": -0.02564102564102541, "z": 2.3527187142935446e-17}, {"x": 0.02564102564102587, "y": 0.02564102564102587, "z": 0.0}, {"x": 0.02564102564102587, "y": 0.07692307692307715, "z": -0.005259697567389898}, {"x": 0.02564102564102587, "y": 0.12820512820512842, "z": -0.015779092702169668}, {"x": 0.02564102564102587, "y": 0.17948717948717968, "z": -0.03155818540433931}, {"x": 0.02564102564102587, "y": 0.23076923076923095, "z": -0.05259697567389882}, {"x": 0.02564102564102587, "y": 0.2820512820512822, "z": -0.07889546351084821}, {"x": 0.02564102564102587, "y": 0.3333333333333335, "z": -0.11045364891518747}, {"x": 0.02564102564102587, "y": 0.38461538461538475, "z": -0.14727153188691658}, {"x": 0.02564102564102587, "y": 0.435897435897436, "z": -0.18934911242603558}, {"x": 0.02564102564102587, "y": 0.4871794871794873, "z": -0.23668639053254448}, {"x": 0.02564102564102587, "y": 0.5384615384615385, "z": -0.28928336620644324}, {"x": 0.02564102564102587, "y": 0.5897435897435899, "z": -0.3471400394477319}, {"x": 0.02564102564102587, "y": 0.6410256410256412, "z": -0.41025641025641046}, {"x": 0.02564102564102587, "y": 0.6923076923076925, "z": -0.47863247863247893}, {"x": 0.02564102564102587, "y": 0.7435897435897438, "z": -0.5522682445759373}, {"x": 0.02564102564102587, "y": 0.7948717948717952, "z": -0.6311637080867855}, {"x": 0.02564102564102587, "y": 0.8461538461538465, "z": -0.7153188691650235}, {"x": 0.02564102564102587, "y": 0.8974358974358978, "z": -0.8047337278106516}, {"x": 0.02564102564102587, "y": 0.9487179487179491, "z": -0.8994082840236693}, {"x": 0.02564102564102587, "y": 1.0, "z": -0.9993425378040762}, {"x": 0.07692307692307715, "y": -0.9487179487179487, "z": -0.8941485864562787}, {"x": 0.07692307692307715, "y": -1.0, "z": -0.9940828402366864}, {"x": 0.07692307692307715, "y": -0.8974358974358974, "z": -0.7994740302432608}, {"x": 0.07692307692307715, "y": -0.846153846153846, "z": -0.7100591715976329}, {"x": 0.07692307692307715, "y": -0.7948717948717947, "z": -0.6259040105193948}, {"x": 0.07692307692307715, "y": -0.7435897435897434, "z": -0.5470085470085467}, {"x": 0.07692307692307715, "y": -0.6923076923076921, "z": -0.4733727810650884}, {"x": 0.07692307692307715, "y": -0.6410256410256407, "z": -0.40499671268902}, {"x": 0.07692307692307715, "y": -0.5897435897435894, "z": -0.3418803418803415}, {"x": 0.07692307692307715, "y": -0.5384615384615381, "z": -0.2840236686390528}, {"x": 0.07692307692307715, "y": -0.48717948717948684, "z": -0.23142669296515414}, {"x": 0.07692307692307715, "y": -0.43589743589743557, "z": -0.1840894148586453}, {"x": 0.07692307692307715, "y": -0.3846153846153843, "z": -0.14201183431952635}, {"x": 0.07692307692307715, "y": -0.33333333333333304, "z": -0.10519395134779727}, {"x": 0.07692307692307715, "y": -0.28205128205128177, "z": -0.07363576594345807}, {"x": 0.07692307692307715, "y": -0.2307692307692305, "z": -0.047337278106508715}, {"x": 0.07692307692307715, "y": -0.17948717948717924, "z": -0.026298487836949252}, {"x": 0.07692307692307715, "y": -0.12820512820512797, "z": -0.010519395134779657}, {"x": 0.07692307692307715, "y": -0.07692307692307669, "z": 7.025630077706069e-17}, {"x": 0.07692307692307715, "y": -0.02564102564102541, "z": 0.005259697567389921}, {"x": 0.07692307692307715, "y": 0.02564102564102587, "z": 0.005259697567389898}, {"x": 0.07692307692307715, "y": 0.07692307692307715, "z": 0.0}, {"x": 0.07692307692307715, "y": 0.12820512820512842, "z": -0.010519395134779772}, {"x": 0.07692307692307715, "y": 0.17948717948717968, "z": -0.02629848783694941}, {"x": 0.07692307692307715, "y": 0.23076923076923095, "z": -0.04733727810650892}, {"x": 0.07692307692307715, "y": 0.2820512820512822, "z": -0.07363576594345832}, {"x": 0.07692307692307715, "y": 0.3333333333333335, "z": -0.10519395134779758}, {"x": 0.07692307692307715, "y": 0.38461538461538475, "z": -0.1420118343195267}, {"x": 0.07692307692307715, "y": 0.435897435897436, "z": -0.1840894148586457}, {"x": 0.07692307692307715, "y": 0.4871794871794873, "z": -0.23142669296515458}, {"x": 0.07692307692307715, "y": 0.5384615384615385, "z": -0.2840236686390533}, {"x": 0.07692307692307715, "y": 0.5897435897435899, "z": -0.341880341880342}, {"x": 0.07692307692307715, "y": 0.6410256410256412, "z": -0.40499671268902054}, {"x": 0.07692307692307715, "y": 0.6923076923076925, "z": -0.473372781065089}, {"x": 0.07692307692307715, "y": 0.7435897435897438, "z": -0.5470085470085474}, {"x": 0.07692307692307715, "y": 0.7948717948717952, "z": -0.6259040105193956}, {"x": 0.07692307692307715, "y": 0.8461538461538465, "z": -0.7100591715976337}, {"x": 0.07692307692307715, "y": 0.8974358974358978, "z": -0.7994740302432617}, {"x": 0.07692307692307715, "y": 0.9487179487179491, "z": -0.8941485864562795}, {"x": 0.07692307692307715, "y": 1.0, "z": -0.9940828402366864}, {"x": 0.12820512820512842, "y": -0.9487179487179487, "z": -0.883629191321499}, {"x": 0.12820512820512842, "y": -1.0, "z": -0.9835634451019066}, {"x": 0.12820512820512842, "y": -0.8974358974358974, "z": -0.7889546351084811}, {"x": 0.12820512820512842, "y": -0.846153846153846, "z": -0.6995397764628531}, {"x": 0.12820512820512842, "y": -0.7948717948717947, "z": -0.6153846153846151}, {"x": 0.12820512820512842, "y": -0.7435897435897434, "z": -0.536489151873767}, {"x": 0.12820512820512842, "y": -0.6923076923076921, "z": -0.4628533859303086}, {"x": 0.12820512820512842, "y": -0.6410256410256407, "z": -0.3944773175542402}, {"x": 0.12820512820512842, "y": -0.5897435897435894, "z": -0.3313609467455617}, {"x": 0.12820512820512842, "y": -0.5384615384615381, "z": -0.27350427350427303}, {"x": 0.12820512820512842, "y": -0.48717948717948684, "z": -0.22090729783037436}, {"x": 0.12820512820512842, "y": -0.43589743589743557, "z": -0.17357001972386552}, {"x": 0.12820512820512842, "y": -0.3846153846153843, "z": -0.13149243918474657}, {"x": 0.12820512820512842, "y": -0.33333333333333304, "z": -0.0946745562130175}, {"x": 0.12820512820512842, "y": -0.28205128205128177, "z": -0.0631163708086783}, {"x": 0.12820512820512842, "y": -0.2307692307692305, "z": -0.036817882971728944}, {"x": 0.12820512820512842, "y": -0.17948717948717924, "z": -0.01577909270216948}, {"x": 0.12820512820512842, "y": -0.12820512820512797, "z": 1.1449174941446927e-16}, {"x": 0.12820512820512842, "y": -0.07692307692307669, "z": 0.010519395134779841}, {"x": 0.12820512820512842, "y": -0.02564102564102541, "z": 0.015779092702169692}, {"x": 0.12820512820512842, "y": 0.02564102564102587, "z": 0.015779092702169668}, {"x": 0.12820512820512842, "y": 0.07692307692307715, "z": 0.010519395134779772}, {"x": 0.12820512820512842, "y": 0.12820512820512842, "z": 0.0}, {"x": 0.12820512820512842, "y": 0.17948717948717968, "z": -0.01577909270216964}, {"x": 0.12820512820512842, "y": 0.23076923076923095, "z": -0.03681788297172915}, {"x": 0.12820512820512842, "y": 0.2820512820512822, "z": -0.06311637080867855}, {"x": 0.12820512820512842, "y": 0.3333333333333335, "z": -0.0946745562130178}, {"x": 0.12820512820512842, "y": 0.38461538461538475, "z": -0.1314924391847469}, {"x": 0.12820512820512842, "y": 0.435897435897436, "z": -0.1735700197238659}, {"x": 0.12820512820512842, "y": 0.4871794871794873, "z": -0.2209072978303748}, {"x": 0.12820512820512842, "y": 0.5384615384615385, "z": -0.27350427350427353}, {"x": 0.12820512820512842, "y": 0.5897435897435899, "z": -0.3313609467455622}, {"x": 0.12820512820512842, "y": 0.6410256410256412, "z": -0.39447731755424076}, {"x": 0.12820512820512842, "y": 0.6923076923076925, "z": -0.4628533859303092}, {"x": 0.12820512820512842, "y": 0.7435897435897438, "z": -0.5364891518737677}, {"x": 0.12820512820512842, "y": 0.7948717948717952, "z": -0.6153846153846159}, {"x": 0.12820512820512842, "y": 0.8461538461538465, "z": -0.6995397764628539}, {"x": 0.12820512820512842, "y": 0.8974358974358978, "z": -0.788954635108482}, {"x": 0.12820512820512842, "y": 0.9487179487179491, "z": -0.8836291913214998}, {"x": 0.12820512820512842, "y": 1.0, "z": -0.9835634451019066}, {"x": 0.17948717948717968, "y": -0.9487179487179487, "z": -0.8678500986193293}, {"x": 0.17948717948717968, "y": -1.0, "z": -0.9677843523997369}, {"x": 0.17948717948717968, "y": -0.8974358974358974, "z": -0.7731755424063114}, {"x": 0.17948717948717968, "y": -0.846153846153846, "z": -0.6837606837606834}, {"x": 0.17948717948717968, "y": -0.7948717948717947, "z": -0.5996055226824454}, {"x": 0.17948717948717968, "y": -0.7435897435897434, "z": -0.5207100591715973}, {"x": 0.17948717948717968, "y": -0.6923076923076921, "z": -0.44707429322813896}, {"x": 0.17948717948717968, "y": -0.6410256410256407, "z": -0.37869822485207055}, {"x": 0.17948717948717968, "y": -0.5897435897435894, "z": -0.31558185404339206}, {"x": 0.17948717948717968, "y": -0.5384615384615381, "z": -0.2577251808021034}, {"x": 0.17948717948717968, "y": -0.48717948717948684, "z": -0.20512820512820473}, {"x": 0.17948717948717968, "y": -0.43589743589743557, "z": -0.1577909270216959}, {"x": 0.17948717948717968, "y": -0.3846153846153843, "z": -0.11571334648257695}, {"x": 0.17948717948717968, "y": -0.33333333333333304, "z": -0.07889546351084786}, {"x": 0.17948717948717968, "y": -0.28205128205128177, "z": -0.04733727810650865}, {"x": 0.17948717948717968, "y": -0.2307692307692305, "z": -0.021038790269559307}, {"x": 0.17948717948717968, "y": -0.17948717948717924, "z": 1.5959455978986625e-16}, {"x": 0.17948717948717968, "y": -0.12820512820512797, "z": 0.015779092702169754}, {"x": 0.17948717948717968, "y": -0.07692307692307669, "z": 0.02629848783694948}, {"x": 0.17948717948717968, "y": -0.02564102564102541, "z": 0.031558185404339335}, {"x": 0.17948717948717968, "y": 0.02564102564102587, "z": 0.03155818540433931}, {"x": 0.17948717948717968, "y": 0.07692307692307715, "z": 0.02629848783694941}, {"x": 0.17948717948717968, "y": 0.12820512820512842, "z": 0.01577909270216964}, {"x": 0.17948717948717968, "y": 0.17948717948717968, "z": 0.0}, {"x": 0.17948717948717968, "y": 0.23076923076923095, "z": -0.021038790269559515}, {"x": 0.17948717948717968, "y": 0.2820512820512822, "z": -0.0473372781065089}, {"x": 0.17948717948717968, "y": 0.3333333333333335, "z": -0.07889546351084817}, {"x": 0.17948717948717968, "y": 0.38461538461538475, "z": -0.11571334648257728}, {"x": 0.17948717948717968, "y": 0.435897435897436, "z": -0.15779092702169628}, {"x": 0.17948717948717968, "y": 0.4871794871794873, "z": -0.20512820512820518}, {"x": 0.17948717948717968, "y": 0.5384615384615385, "z": -0.2577251808021039}, {"x": 0.17948717948717968, "y": 0.5897435897435899, "z": -0.31558185404339256}, {"x": 0.17948717948717968, "y": 0.6410256410256412, "z": -0.3786982248520711}, {"x": 0.17948717948717968, "y": 0.6923076923076925, "z": -0.4470742932281396}, {"x": 0.17948717948717968, "y": 0.7435897435897438, "z": -0.520710059171598}, {"x": 0.17948717948717968, "y": 0.7948717948717952, "z": -0.5996055226824462}, {"x": 0.17948717948717968, "y": 0.8461538461538465, "z": -0.6837606837606842}, {"x": 0.17948717948717968, "y": 0.8974358974358978, "z": -0.7731755424063123}, {"x": 0.17948717948717968, "y": 0.9487179487179491, "z": -0.86785009861933}, {"x": 0.17948717948717968, "y": 1.0, "z": -0.9677843523997369}, {"x": 0.23076923076923095, "y": -0.9487179487179487, "z": -0.8468113083497698}, {"x": 0.23076923076923095, "y": -1.0, "z": -0.9467455621301775}, {"x": 0.23076923076923095, "y": -0.8974358974358974, "z": -0.7521367521367519}, {"x": 0.23076923076923095, "y": -0.846153846153846, "z": -0.662721893491124}, {"x": 0.23076923076923095, "y": -0.7948717948717947, "z": -0.5785667324128859}, {"x": 0.23076923076923095, "y": -0.7435897435897434, "z": -0.4996712689020378}, {"x": 0.23076923076923095, "y": -0.6923076923076921, "z": -0.42603550295857945}, {"x": 0.23076923076923095, "y": -0.6410256410256407, "z": -0.35765943458251104}, {"x": 0.23076923076923095, "y": -0.5897435897435894, "z": -0.29454306377383255}, {"x": 0.23076923076923095, "y": -0.5384615384615381, "z": -0.2366863905325439}, {"x": 0.23076923076923095, "y": -0.48717948717948684, "z": -0.18408941485864522}, {"x": 0.23076923076923095, "y": -0.43589743589743557, "z": -0.13675213675213638}, {"x": 0.23076923076923095, "y": -0.3846153846153843, "z": -0.09467455621301743}, {"x": 0.23076923076923095, "y": -0.33333333333333304, "z": -0.05785667324128834}, {"x": 0.23076923076923095, "y": -0.28205128205128177, "z": -0.026298487836949137}, {"x": 0.23076923076923095, "y": -0.2307692307692305, "z": 2.0816681711721685e-16}, {"x": 0.23076923076923095, "y": -0.17948717948717924, "z": 0.021038790269559675}, {"x": 0.23076923076923095, "y": -0.12820512820512797, "z": 0.03681788297172927}, {"x": 0.23076923076923095, "y": -0.07692307692307669, "z": 0.04733727810650899}, {"x": 0.23076923076923095, "y": -0.02564102564102541, "z": 0.05259697567389885}, {"x": 0.23076923076923095, "y": 0.02564102564102587, "z": 0.05259697567389882}, {"x": 0.23076923076923095, "y": 0.07692307692307715, "z": 0.04733727810650892}, {"x": 0.23076923076923095, "y": 0.12820512820512842, "z": 0.03681788297172915}, {"x": 0.23076923076923095, "y": 0.17948717948717968, "z": 0.021038790269559515}, {"x": 0.23076923076923095, "y": 0.23076923076923095, "z": 0.0}, {"x": 0.23076923076923095, "y": 0.2820512820512822, "z": -0.026298487836949387}, {"x": 0.23076923076923095, "y": 0.3333333333333335, "z": -0.057856673241288646}, {"x": 0.23076923076923095, "y": 0.38461538461538475, "z": -0.09467455621301776}, {"x": 0.23076923076923095, "y": 0.435897435897436, "z": -0.13675213675213677}, {"x": 0.23076923076923095, "y": 0.4871794871794873, "z": -0.18408941485864566}, {"x": 0.23076923076923095, "y": 0.5384615384615385, "z": -0.2366863905325444}, {"x": 0.23076923076923095, "y": 0.5897435897435899, "z": -0.29454306377383305}, {"x": 0.23076923076923095, "y": 0.6410256410256412, "z": -0.3576594345825116}, {"x": 0.23076923076923095, "y": 0.6923076923076925, "z": -0.42603550295858006}, {"x": 0.23076923076923095, "y": 0.7435897435897438, "z": -0.49967126890203845}, {"x": 0.23076923076923095, "y": 0.7948717948717952, "z": -0.5785667324128867}, {"x": 0.23076923076923095, "y": 0.8461538461538465, "z": -0.6627218934911248}, {"x": 0.23076923076923095, "y": 0.8974358974358978, "z": -0.7521367521367528}, {"x": 0.23076923076923095, "y": 0.9487179487179491, "z": -0.8468113083497706}, {"x": 0.23076923076923095, "y": 1.0, "z": -0.9467455621301775}, {"x": 0.2820512820512822, "y": -0.9487179487179487, "z": -0.8205128205128204}, {"x": 0.2820512820512822, "y": -1.0, "z": -0.920447074293228}, {"x": 0.2820512820512822, "y": -0.8974358974358974, "z": -0.7258382642998025}, {"x": 0.2820512820512822, "y": -0.846153846153846, "z": -0.6364234056541745}, {"x": 0.2820512820512822, "y": -0.7948717948717947, "z": -0.5522682445759365}, {"x": 0.2820512820512822, "y": -0.7435897435897434, "z": -0.4733727810650884}, {"x": 0.2820512820512822, "y": -0.6923076923076921, "z": -0.39973701512163007}, {"x": 0.2820512820512822, "y": -0.6410256410256407, "z": -0.33136094674556166}, {"x": 0.2820512820512822, "y": -0.5897435897435894, "z": -0.26824457593688317}, {"x": 0.2820512820512822, "y": -0.5384615384615381, "z": -0.2103879026955945}, {"x": 0.2820512820512822, "y": -0.48717948717948684, "z": -0.15779092702169584}, {"x": 0.2820512820512822, "y": -0.43589743589743557, "z": -0.11045364891518698}, {"x": 0.2820512820512822, "y": -0.3846153846153843, "z": -0.06837606837606804}, {"x": 0.2820512820512822, "y": -0.33333333333333304, "z": -0.031558185404338954}, {"x": 0.2820512820512822, "y": -0.28205128205128177, "z": 2.498001805406602e-16}, {"x": 0.2820512820512822, "y": -0.2307692307692305, "z": 0.026298487836949595}, {"x": 0.2820512820512822, "y": -0.17948717948717924, "z": 0.04733727810650906}, {"x": 0.2820512820512822, "y": -0.12820512820512797, "z": 0.06311637080867866}, {"x": 0.2820512820512822, "y": -0.07692307692307669, "z": 0.07363576594345839}, {"x": 0.2820512820512822, "y": -0.02564102564102541, "z": 0.07889546351084824}, {"x": 0.2820512820512822, "y": 0.02564102564102587, "z": 0.07889546351084821}, {"x": 0.2820512820512822, "y": 0.07692307692307715, "z": 0.07363576594345832}, {"x": 0.2820512820512822, "y": 0.12820512820512842, "z": 0.06311637080867855}, {"x": 0.2820512820512822, "y": 0.17948717948717968, "z": 0.0473372781065089}, {"x": 0.2820512820512822, "y": 0.23076923076923095, "z": 0.026298487836949387}, {"x": 0.2820512820512822, "y": 0.2820512820512822, "z": 0.0}, {"x": 0.2820512820512822, "y": 0.3333333333333335, "z": -0.03155818540433926}, {"x": 0.2820512820512822, "y": 0.38461538461538475, "z": -0.06837606837606837}, {"x": 0.2820512820512822, "y": 0.435897435897436, "z": -0.11045364891518737}, {"x": 0.2820512820512822, "y": 0.4871794871794873, "z": -0.15779092702169628}, {"x": 0.2820512820512822, "y": 0.5384615384615385, "z": -0.21038790269559499}, {"x": 0.2820512820512822, "y": 0.5897435897435899, "z": -0.26824457593688367}, {"x": 0.2820512820512822, "y": 0.6410256410256412, "z": -0.3313609467455622}, {"x": 0.2820512820512822, "y": 0.6923076923076925, "z": -0.3997370151216307}, {"x": 0.2820512820512822, "y": 0.7435897435897438, "z": -0.47337278106508907}, {"x": 0.2820512820512822, "y": 0.7948717948717952, "z": -0.5522682445759373}, {"x": 0.2820512820512822, "y": 0.8461538461538465, "z": -0.6364234056541753}, {"x": 0.2820512820512822, "y": 0.8974358974358978, "z": -0.7258382642998034}, {"x": 0.2820512820512822, "y": 0.9487179487179491, "z": -0.8205128205128212}, {"x": 0.2820512820512822, "y": 1.0, "z": -0.920447074293228}, {"x": 0.3333333333333335, "y": -0.9487179487179487, "z": -0.7889546351084811}, {"x": 0.3333333333333335, "y": -1.0, "z": -0.8888888888888888}, {"x": 0.3333333333333335, "y": -0.8974358974358974, "z": -0.6942800788954633}, {"x": 0.3333333333333335, "y": -0.846153846153846, "z": -0.6048652202498352}, {"x": 0.3333333333333335, "y": -0.7948717948717947, "z": -0.5207100591715972}, {"x": 0.3333333333333335, "y": -0.7435897435897434, "z": -0.44181459566074915}, {"x": 0.3333333333333335, "y": -0.6923076923076921, "z": -0.3681788297172908}, {"x": 0.3333333333333335, "y": -0.6410256410256407, "z": -0.2998027613412224}, {"x": 0.3333333333333335, "y": -0.5897435897435894, "z": -0.23668639053254392}, {"x": 0.3333333333333335, "y": -0.5384615384615381, "z": -0.17882971729125524}, {"x": 0.3333333333333335, "y": -0.48717948717948684, "z": -0.12623274161735656}, {"x": 0.3333333333333335, "y": -0.43589743589743557, "z": -0.07889546351084772}, {"x": 0.3333333333333335, "y": -0.3846153846153843, "z": -0.03681788297172878}, {"x": 0.3333333333333335, "y": -0.33333333333333304, "z": 3.0531133177191805e-16}, {"x": 0.3333333333333335, "y": -0.28205128205128177, "z": 0.03155818540433951}, {"x": 0.3333333333333335, "y": -0.2307692307692305, "z": 0.057856673241288854}, {"x": 0.3333333333333335, "y": -0.17948717948717924, "z": 0.07889546351084832}, {"x": 0.3333333333333335, "y": -0.12820512820512797, "z": 0.09467455621301792}, {"x": 0.3333333333333335, "y": -0.07692307692307669, "z": 0.10519395134779765}, {"x": 0.3333333333333335, "y": -0.02564102564102541, "z": 0.1104536489151875}, {"x": 0.3333333333333335, "y": 0.02564102564102587, "z": 0.11045364891518747}, {"x": 0.3333333333333335, "y": 0.07692307692307715, "z": 0.10519395134779758}, {"x": 0.3333333333333335, "y": 0.12820512820512842, "z": 0.0946745562130178}, {"x": 0.3333333333333335, "y": 0.17948717948717968, "z": 0.07889546351084817}, {"x": 0.3333333333333335, "y": 0.23076923076923095, "z": 0.057856673241288646}, {"x": 0.3333333333333335, "y": 0.2820512820512822, "z": 0.03155818540433926}, {"x": 0.3333333333333335, "y": 0.3333333333333335, "z": 0.0}, {"x": 0.3333333333333335, "y": 0.38461538461538475, "z": -0.03681788297172911}, {"x": 0.3333333333333335, "y": 0.435897435897436, "z": -0.07889546351084811}, {"x": 0.3333333333333335, "y": 0.4871794871794873, "z": -0.126232741617357}, {"x": 0.3333333333333335, "y": 0.5384615384615385, "z": -0.17882971729125574}, {"x": 0.3333333333333335, "y": 0.5897435897435899, "z": -0.23668639053254442}, {"x": 0.3333333333333335, "y": 0.6410256410256412, "z": -0.29980276134122297}, {"x": 0.3333333333333335, "y": 0.6923076923076925, "z": -0.36817882971729143}, {"x": 0.3333333333333335, "y": 0.7435897435897438, "z": -0.4418145956607498}, {"x": 0.3333333333333335, "y": 0.7948717948717952, "z": -0.5207100591715981}, {"x": 0.3333333333333335, "y": 0.8461538461538465, "z": -0.6048652202498361}, {"x": 0.3333333333333335, "y": 0.8974358974358978, "z": -0.6942800788954642}, {"x": 0.3333333333333335, "y": 0.9487179487179491, "z": -0.788954635108482}, {"x": 0.3333333333333335, "y": 1.0, "z": -0.8888888888888888}, {"x": 0.38461538461538475, "y": -0.9487179487179487, "z": -0.752136752136752}, {"x": 0.38461538461538475, "y": -1.0, "z": -0.8520710059171597}, {"x": 0.38461538461538475, "y": -0.8974358974358974, "z": -0.6574621959237341}, {"x": 0.38461538461538475, "y": -0.846153846153846, "z": -0.5680473372781062}, {"x": 0.38461538461538475, "y": -0.7948717948717947, "z": -0.48389217619986813}, {"x": 0.38461538461538475, "y": -0.7435897435897434, "z": -0.40499671268902004}, {"x": 0.38461538461538475, "y": -0.6923076923076921, "z": -0.3313609467455617}, {"x": 0.38461538461538475, "y": -0.6410256410256407, "z": -0.2629848783694933}, {"x": 0.38461538461538475, "y": -0.5897435897435894, "z": -0.1998685075608148}, {"x": 0.38461538461538475, "y": -0.5384615384615381, "z": -0.14201183431952613}, {"x": 0.38461538461538475, "y": -0.48717948717948684, "z": -0.08941485864562745}, {"x": 0.38461538461538475, "y": -0.43589743589743557, "z": -0.042077580539118614}, {"x": 0.38461538461538475, "y": -0.3846153846153843, "z": 3.3306690738754696e-16}, {"x": 0.38461538461538475, "y": -0.33333333333333304, "z": 0.036817882971729415}, {"x": 0.38461538461538475, "y": -0.28205128205128177, "z": 0.06837606837606862}, {"x": 0.38461538461538475, "y": -0.2307692307692305, "z": 0.09467455621301796}, {"x": 0.38461538461538475, "y": -0.17948717948717924, "z": 0.11571334648257743}, {"x": 0.38461538461538475, "y": -0.12820512820512797, "z": 0.131492439184747}, {"x": 0.38461538461538475, "y": -0.07692307692307669, "z": 0.14201183431952674}, {"x": 0.38461538461538475, "y": -0.02564102564102541, "z": 0.1472715318869166}, {"x": 0.38461538461538475, "y": 0.02564102564102587, "z": 0.14727153188691658}, {"x": 0.38461538461538475, "y": 0.07692307692307715, "z": 0.1420118343195267}, {"x": 0.38461538461538475, "y": 0.12820512820512842, "z": 0.1314924391847469}, {"x": 0.38461538461538475, "y": 0.17948717948717968, "z": 0.11571334648257728}, {"x": 0.38461538461538475, "y": 0.23076923076923095, "z": 0.09467455621301776}, {"x": 0.38461538461538475, "y": 0.2820512820512822, "z": 0.06837606837606837}, {"x": 0.38461538461538475, "y": 0.3333333333333335, "z": 0.03681788297172911}, {"x": 0.38461538461538475, "y": 0.38461538461538475, "z": 0.0}, {"x": 0.38461538461538475, "y": 0.435897435897436, "z": -0.042077580539119}, {"x": 0.38461538461538475, "y": 0.4871794871794873, "z": -0.0894148586456279}, {"x": 0.38461538461538475, "y": 0.5384615384615385, "z": -0.14201183431952663}, {"x": 0.38461538461538475, "y": 0.5897435897435899, "z": -0.1998685075608153}, {"x": 0.38461538461538475, "y": 0.6410256410256412, "z": -0.26298487836949386}, {"x": 0.38461538461538475, "y": 0.6923076923076925, "z": -0.3313609467455623}, {"x": 0.38461538461538475, "y": 0.7435897435897438, "z": -0.4049967126890207}, {"x": 0.38461538461538475, "y": 0.7948717948717952, "z": -0.4838921761998689}, {"x": 0.38461538461538475, "y": 0.8461538461538465, "z": -0.568047337278107}, {"x": 0.38461538461538475, "y": 0.8974358974358978, "z": -0.657462195923735}, {"x": 0.38461538461538475, "y": 0.9487179487179491, "z": -0.7521367521367528}, {"x": 0.38461538461538475, "y": 1.0, "z": -0.8520710059171597}, {"x": 0.435897435897436, "y": -0.9487179487179487, "z": -0.710059171597633}, {"x": 0.435897435897436, "y": -1.0, "z": -0.8099934253780406}, {"x": 0.435897435897436, "y": -0.8974358974358974, "z": -0.6153846153846151}, {"x": 0.435897435897436, "y": -0.846153846153846, "z": -0.5259697567389872}, {"x": 0.435897435897436, "y": -0.7948717948717947, "z": -0.4418145956607491}, {"x": 0.435897435897436, "y": -0.7435897435897434, "z": -0.362919132149901}, {"x": 0.435897435897436, "y": -0.6923076923076921, "z": -0.2892833662064427}, {"x": 0.435897435897436, "y": -0.6410256410256407, "z": -0.2209072978303743}, {"x": 0.435897435897436, "y": -0.5897435897435894, "z": -0.1577909270216958}, {"x": 0.435897435897436, "y": -0.5384615384615381, "z": -0.09993425378040713}, {"x": 0.435897435897436, "y": -0.48717948717948684, "z": -0.04733727810650845}, {"x": 0.435897435897436, "y": -0.43589743589743557, "z": 3.885780586188048e-16}, {"x": 0.435897435897436, "y": -0.3846153846153843, "z": 0.042077580539119336}, {"x": 0.435897435897436, "y": -0.33333333333333304, "z": 0.07889546351084842}, {"x": 0.435897435897436, "y": -0.28205128205128177, "z": 0.11045364891518762}, {"x": 0.435897435897436, "y": -0.2307692307692305, "z": 0.13675213675213696}, {"x": 0.435897435897436, "y": -0.17948717948717924, "z": 0.15779092702169645}, {"x": 0.435897435897436, "y": -0.12820512820512797, "z": 0.17357001972386604}, {"x": 0.435897435897436, "y": -0.07692307692307669, "z": 0.18408941485864574}, {"x": 0.435897435897436, "y": -0.02564102564102541, "z": 0.1893491124260356}, {"x": 0.435897435897436, "y": 0.02564102564102587, "z": 0.18934911242603558}, {"x": 0.435897435897436, "y": 0.07692307692307715, "z": 0.1840894148586457}, {"x": 0.435897435897436, "y": 0.12820512820512842, "z": 0.1735700197238659}, {"x": 0.435897435897436, "y": 0.17948717948717968, "z": 0.15779092702169628}, {"x": 0.435897435897436, "y": 0.23076923076923095, "z": 0.13675213675213677}, {"x": 0.435897435897436, "y": 0.2820512820512822, "z": 0.11045364891518737}, {"x": 0.435897435897436, "y": 0.3333333333333335, "z": 0.07889546351084811}, {"x": 0.435897435897436, "y": 0.38461538461538475, "z": 0.042077580539119}, {"x": 0.435897435897436, "y": 0.435897435897436, "z": 0.0}, {"x": 0.435897435897436, "y": 0.4871794871794873, "z": -0.047337278106508895}, {"x": 0.435897435897436, "y": 0.5384615384615385, "z": -0.09993425378040763}, {"x": 0.435897435897436, "y": 0.5897435897435899, "z": -0.1577909270216963}, {"x": 0.435897435897436, "y": 0.6410256410256412, "z": -0.22090729783037485}, {"x": 0.435897435897436, "y": 0.6923076923076925, "z": -0.28928336620644335}, {"x": 0.435897435897436, "y": 0.7435897435897438, "z": -0.3629191321499017}, {"x": 0.435897435897436, "y": 0.7948717948717952, "z": -0.4418145956607499}, {"x": 0.435897435897436, "y": 0.8461538461538465, "z": -0.5259697567389879}, {"x": 0.435897435897436, "y": 0.8974358974358978, "z": -0.615384615384616}, {"x": 0.435897435897436, "y": 0.9487179487179491, "z": -0.7100591715976338}, {"x": 0.435897435897436, "y": 1.0, "z": -0.8099934253780406}, {"x": 0.4871794871794873, "y": -0.9487179487179487, "z": -0.6627218934911241}, {"x": 0.4871794871794873, "y": -1.0, "z": -0.7626561472715317}, {"x": 0.4871794871794873, "y": -0.8974358974358974, "z": -0.5680473372781062}, {"x": 0.4871794871794873, "y": -0.846153846153846, "z": -0.47863247863247826}, {"x": 0.4871794871794873, "y": -0.7948717948717947, "z": -0.3944773175542402}, {"x": 0.4871794871794873, "y": -0.7435897435897434, "z": -0.3155818540433921}, {"x": 0.4871794871794873, "y": -0.6923076923076921, "z": -0.24194608809993381}, {"x": 0.4871794871794873, "y": -0.6410256410256407, "z": -0.1735700197238654}, {"x": 0.4871794871794873, "y": -0.5897435897435894, "z": -0.11045364891518691}, {"x": 0.4871794871794873, "y": -0.5384615384615381, "z": -0.05259697567389823}, {"x": 0.4871794871794873, "y": -0.48717948717948684, "z": 4.440892098500626e-16}, {"x": 0.4871794871794873, "y": -0.43589743589743557, "z": 0.047337278106509284}, {"x": 0.4871794871794873, "y": -0.3846153846153843, "z": 0.08941485864562823}, {"x": 0.4871794871794873, "y": -0.33333333333333304, "z": 0.1262327416173573}, {"x": 0.4871794871794873, "y": -0.28205128205128177, "z": 0.1577909270216965}, {"x": 0.4871794871794873, "y": -0.2307692307692305, "z": 0.18408941485864586}, {"x": 0.4871794871794873, "y": -0.17948717948717924, "z": 0.20512820512820534}, {"x": 0.4871794871794873, "y": -0.12820512820512797, "z": 0.22090729783037494}, {"x": 0.4871794871794873, "y": -0.07692307692307669, "z": 0.23142669296515464}, {"x": 0.4871794871794873, "y": -0.02564102564102541, "z": 0.2366863905325445}, {"x": 0.4871794871794873, "y": 0.02564102564102587, "z": 0.23668639053254448}, {"x": 0.4871794871794873, "y": 0.07692307692307715, "z": 0.23142669296515458}, {"x": 0.4871794871794873, "y": 0.12820512820512842, "z": 0.2209072978303748}, {"x": 0.4871794871794873, "y": 0.17948717948717968, "z": 0.20512820512820518}, {"x": 0.4871794871794873, "y": 0.23076923076923095, "z": 0.18408941485864566}, {"x": 0.4871794871794873, "y": 0.2820512820512822, "z": 0.15779092702169628}, {"x": 0.4871794871794873, "y": 0.3333333333333335, "z": 0.126232741617357}, {"x": 0.4871794871794873, "y": 0.38461538461538475, "z": 0.0894148586456279}, {"x": 0.4871794871794873, "y": 0.435897435897436, "z": 0.047337278106508895}, {"x": 0.4871794871794873, "y": 0.4871794871794873, "z": 0.0}, {"x": 0.4871794871794873, "y": 0.5384615384615385, "z": -0.05259697567389873}, {"x": 0.4871794871794873, "y": 0.5897435897435899, "z": -0.11045364891518741}, {"x": 0.4871794871794873, "y": 0.6410256410256412, "z": -0.17357001972386596}, {"x": 0.4871794871794873, "y": 0.6923076923076925, "z": -0.24194608809993443}, {"x": 0.4871794871794873, "y": 0.7435897435897438, "z": -0.3155818540433928}, {"x": 0.4871794871794873, "y": 0.7948717948717952, "z": -0.394477317554241}, {"x": 0.4871794871794873, "y": 0.8461538461538465, "z": -0.47863247863247904}, {"x": 0.4871794871794873, "y": 0.8974358974358978, "z": -0.5680473372781071}, {"x": 0.4871794871794873, "y": 0.9487179487179491, "z": -0.6627218934911249}, {"x": 0.4871794871794873, "y": 1.0, "z": -0.7626561472715317}, {"x": 0.5384615384615385, "y": -0.9487179487179487, "z": -0.6101249178172254}, {"x": 0.5384615384615385, "y": -1.0, "z": -0.710059171597633}, {"x": 0.5384615384615385, "y": -0.8974358974358974, "z": -0.5154503616042074}, {"x": 0.5384615384615385, "y": -0.846153846153846, "z": -0.42603550295857956}, {"x": 0.5384615384615385, "y": -0.7948717948717947, "z": -0.3418803418803415}, {"x": 0.5384615384615385, "y": -0.7435897435897434, "z": -0.2629848783694934}, {"x": 0.5384615384615385, "y": -0.6923076923076921, "z": -0.18934911242603508}, {"x": 0.5384615384615385, "y": -0.6410256410256407, "z": -0.12097304404996667}, {"x": 0.5384615384615385, "y": -0.5897435897435894, "z": -0.05785667324128818}, {"x": 0.5384615384615385, "y": -0.5384615384615381, "z": 4.996003610813204e-16}, {"x": 0.5384615384615385, "y": -0.48717948717948684, "z": 0.05259697567389918}, {"x": 0.5384615384615385, "y": -0.43589743589743557, "z": 0.09993425378040802}, {"x": 0.5384615384615385, "y": -0.3846153846153843, "z": 0.14201183431952696}, {"x": 0.5384615384615385, "y": -0.33333333333333304, "z": 0.17882971729125605}, {"x": 0.5384615384615385, "y": -0.28205128205128177, "z": 0.21038790269559526}, {"x": 0.5384615384615385, "y": -0.2307692307692305, "z": 0.2366863905325446}, {"x": 0.5384615384615385, "y": -0.17948717948717924, "z": 0.25772518080210405}, {"x": 0.5384615384615385, "y": -0.12820512820512797, "z": 0.27350427350427364}, {"x": 0.5384615384615385, "y": -0.07692307692307669, "z": 0.2840236686390534}, {"x": 0.5384615384615385, "y": -0.02564102564102541, "z": 0.28928336620644324}, {"x": 0.5384615384615385, "y": 0.02564102564102587, "z": 0.28928336620644324}, {"x": 0.5384615384615385, "y": 0.07692307692307715, "z": 0.2840236686390533}, {"x": 0.5384615384615385, "y": 0.12820512820512842, "z": 0.27350427350427353}, {"x": 0.5384615384615385, "y": 0.17948717948717968, "z": 0.2577251808021039}, {"x": 0.5384615384615385, "y": 0.23076923076923095, "z": 0.2366863905325444}, {"x": 0.5384615384615385, "y": 0.2820512820512822, "z": 0.21038790269559499}, {"x": 0.5384615384615385, "y": 0.3333333333333335, "z": 0.17882971729125574}, {"x": 0.5384615384615385, "y": 0.38461538461538475, "z": 0.14201183431952663}, {"x": 0.5384615384615385, "y": 0.435897435897436, "z": 0.09993425378040763}, {"x": 0.5384615384615385, "y": 0.4871794871794873, "z": 0.05259697567389873}, {"x": 0.5384615384615385, "y": 0.5384615384615385, "z": 0.0}, {"x": 0.5384615384615385, "y": 0.5897435897435899, "z": -0.05785667324128868}, {"x": 0.5384615384615385, "y": 0.6410256410256412, "z": -0.12097304404996723}, {"x": 0.5384615384615385, "y": 0.6923076923076925, "z": -0.1893491124260357}, {"x": 0.5384615384615385, "y": 0.7435897435897438, "z": -0.2629848783694941}, {"x": 0.5384615384615385, "y": 0.7948717948717952, "z": -0.3418803418803423}, {"x": 0.5384615384615385, "y": 0.8461538461538465, "z": -0.42603550295858034}, {"x": 0.5384615384615385, "y": 0.8974358974358978, "z": -0.5154503616042083}, {"x": 0.5384615384615385, "y": 0.9487179487179491, "z": -0.6101249178172261}, {"x": 0.5384615384615385, "y": 1.0, "z": -0.710059171597633}, {"x": 0.5897435897435899, "y": -0.9487179487179487, "z": -0.5522682445759367}, {"x": 0.5897435897435899, "y": -1.0, "z": -0.6522024983563444}, {"x": 0.5897435897435899, "y": -0.8974358974358974, "z": -0.4575936883629188}, {"x": 0.5897435897435899, "y": -0.846153846153846, "z": -0.3681788297172909}, {"x": 0.5897435897435899, "y": -0.7948717948717947, "z": -0.2840236686390528}, {"x": 0.5897435897435899, "y": -0.7435897435897434, "z": -0.20512820512820473}, {"x": 0.5897435897435899, "y": -0.6923076923076921, "z": -0.1314924391847464}, {"x": 0.5897435897435899, "y": -0.6410256410256407, "z": -0.06311637080867799}, {"x": 0.5897435897435899, "y": -0.5897435897435894, "z": 4.996003610813204e-16}, {"x": 0.5897435897435899, "y": -0.5384615384615381, "z": 0.05785667324128918}, {"x": 0.5897435897435899, "y": -0.48717948717948684, "z": 0.11045364891518786}, {"x": 0.5897435897435899, "y": -0.43589743589743557, "z": 0.1577909270216967}, {"x": 0.5897435897435899, "y": -0.3846153846153843, "z": 0.19986850756081564}, {"x": 0.5897435897435899, "y": -0.33333333333333304, "z": 0.23668639053254473}, {"x": 0.5897435897435899, "y": -0.28205128205128177, "z": 0.26824457593688394}, {"x": 0.5897435897435899, "y": -0.2307692307692305, "z": 0.29454306377383327}, {"x": 0.5897435897435899, "y": -0.17948717948717924, "z": 0.31558185404339273}, {"x": 0.5897435897435899, "y": -0.12820512820512797, "z": 0.3313609467455623}, {"x": 0.5897435897435899, "y": -0.07692307692307669, "z": 0.34188034188034205}, {"x": 0.5897435897435899, "y": -0.02564102564102541, "z": 0.3471400394477319}, {"x": 0.5897435897435899, "y": 0.02564102564102587, "z": 0.3471400394477319}, {"x": 0.5897435897435899, "y": 0.07692307692307715, "z": 0.341880341880342}, {"x": 0.5897435897435899, "y": 0.12820512820512842, "z": 0.3313609467455622}, {"x": 0.5897435897435899, "y": 0.17948717948717968, "z": 0.31558185404339256}, {"x": 0.5897435897435899, "y": 0.23076923076923095, "z": 0.29454306377383305}, {"x": 0.5897435897435899, "y": 0.2820512820512822, "z": 0.26824457593688367}, {"x": 0.5897435897435899, "y": 0.3333333333333335, "z": 0.23668639053254442}, {"x": 0.5897435897435899, "y": 0.38461538461538475, "z": 0.1998685075608153}, {"x": 0.5897435897435899, "y": 0.435897435897436, "z": 0.1577909270216963}, {"x": 0.5897435897435899, "y": 0.4871794871794873, "z": 0.11045364891518741}, {"x": 0.5897435897435899, "y": 0.5384615384615385, "z": 0.05785667324128868}, {"x": 0.5897435897435899, "y": 0.5897435897435899, "z": 0.0}, {"x": 0.5897435897435899, "y": 0.6410256410256412, "z": -0.06311637080867855}, {"x": 0.5897435897435899, "y": 0.6923076923076925, "z": -0.131492439184747}, {"x": 0.5897435897435899, "y": 0.7435897435897438, "z": -0.2051282051282054}, {"x": 0.5897435897435899, "y": 0.7948717948717952, "z": -0.2840236686390536}, {"x": 0.5897435897435899, "y": 0.8461538461538465, "z": -0.36817882971729166}, {"x": 0.5897435897435899, "y": 0.8974358974358978, "z": -0.4575936883629197}, {"x": 0.5897435897435899, "y": 0.9487179487179491, "z": -0.5522682445759375}, {"x": 0.5897435897435899, "y": 1.0, "z": -0.6522024983563444}, {"x": 0.6410256410256412, "y": -0.9487179487179487, "z": -0.48915187376725816}, {"x": 0.6410256410256412, "y": -1.0, "z": -0.5890861275476658}, {"x": 0.6410256410256412, "y": -0.8974358974358974, "z": -0.39447731755424026}, {"x": 0.6410256410256412, "y": -0.846153846153846, "z": -0.30506245890861233}, {"x": 0.6410256410256412, "y": -0.7948717948717947, "z": -0.22090729783037427}, {"x": 0.6410256410256412, "y": -0.7435897435897434, "z": -0.1420118343195262}, {"x": 0.6410256410256412, "y": -0.6923076923076921, "z": -0.06837606837606786}, {"x": 0.6410256410256412, "y": -0.6410256410256407, "z": 5.551115123125783e-16}, {"x": 0.6410256410256412, "y": -0.5897435897435894, "z": 0.06311637080867905}, {"x": 0.6410256410256412, "y": -0.5384615384615381, "z": 0.12097304404996773}, {"x": 0.6410256410256412, "y": -0.48717948717948684, "z": 0.1735700197238664}, {"x": 0.6410256410256412, "y": -0.43589743589743557, "z": 0.22090729783037524}, {"x": 0.6410256410256412, "y": -0.3846153846153843, "z": 0.2629848783694942}, {"x": 0.6410256410256412, "y": -0.33333333333333304, "z": 0.2998027613412233}, {"x": 0.6410256410256412, "y": -0.28205128205128177, "z": 0.3313609467455625}, {"x": 0.6410256410256412, "y": -0.2307692307692305, "z": 0.3576594345825118}, {"x": 0.6410256410256412, "y": -0.17948717948717924, "z": 0.3786982248520713}, {"x": 0.6410256410256412, "y": -0.12820512820512797, "z": 0.39447731755424087}, {"x": 0.6410256410256412, "y": -0.07692307692307669, "z": 0.4049967126890206}, {"x": 0.6410256410256412, "y": -0.02564102564102541, "z": 0.41025641025641046}, {"x": 0.6410256410256412, "y": 0.02564102564102587, "z": 0.41025641025641046}, {"x": 0.6410256410256412, "y": 0.07692307692307715, "z": 0.40499671268902054}, {"x": 0.6410256410256412, "y": 0.12820512820512842, "z": 0.39447731755424076}, {"x": 0.6410256410256412, "y": 0.17948717948717968, "z": 0.3786982248520711}, {"x": 0.6410256410256412, "y": 0.23076923076923095, "z": 0.3576594345825116}, {"x": 0.6410256410256412, "y": 0.2820512820512822, "z": 0.3313609467455622}, {"x": 0.6410256410256412, "y": 0.3333333333333335, "z": 0.29980276134122297}, {"x": 0.6410256410256412, "y": 0.38461538461538475, "z": 0.26298487836949386}, {"x": 0.6410256410256412, "y": 0.435897435897436, "z": 0.22090729783037485}, {"x": 0.6410256410256412, "y": 0.4871794871794873, "z": 0.17357001972386596}, {"x": 0.6410256410256412, "y": 0.5384615384615385, "z": 0.12097304404996723}, {"x": 0.6410256410256412, "y": 0.5897435897435899, "z": 0.06311637080867855}, {"x": 0.6410256410256412, "y": 0.6410256410256412, "z": 0.0}, {"x": 0.6410256410256412, "y": 0.6923076923076925, "z": -0.06837606837606847}, {"x": 0.6410256410256412, "y": 0.7435897435897438, "z": -0.14201183431952685}, {"x": 0.6410256410256412, "y": 0.7948717948717952, "z": -0.22090729783037505}, {"x": 0.6410256410256412, "y": 0.8461538461538465, "z": -0.3050624589086131}, {"x": 0.6410256410256412, "y": 0.8974358974358978, "z": -0.39447731755424115}, {"x": 0.6410256410256412, "y": 0.9487179487179491, "z": -0.48915187376725894}, {"x": 0.6410256410256412, "y": 1.0, "z": -0.5890861275476658}, {"x": 0.6923076923076925, "y": -0.9487179487179487, "z": -0.4207758053911897}, {"x": 0.6923076923076925, "y": -1.0, "z": -0.5207100591715974}, {"x": 0.6923076923076925, "y": -0.8974358974358974, "z": -0.3261012491781718}, {"x": 0.6923076923076925, "y": -0.846153846153846, "z": -0.23668639053254387}, {"x": 0.6923076923076925, "y": -0.7948717948717947, "z": -0.1525312294543058}, {"x": 0.6923076923076925, "y": -0.7435897435897434, "z": -0.07363576594345772}, {"x": 0.6923076923076925, "y": -0.6923076923076921, "z": 6.106226635438361e-16}, {"x": 0.6923076923076925, "y": -0.6410256410256407, "z": 0.06837606837606902}, {"x": 0.6923076923076925, "y": -0.5897435897435894, "z": 0.1314924391847475}, {"x": 0.6923076923076925, "y": -0.5384615384615381, "z": 0.1893491124260362}, {"x": 0.6923076923076925, "y": -0.48717948717948684, "z": 0.24194608809993487}, {"x": 0.6923076923076925, "y": -0.43589743589743557, "z": 0.2892833662064437}, {"x": 0.6923076923076925, "y": -0.3846153846153843, "z": 0.33136094674556266}, {"x": 0.6923076923076925, "y": -0.33333333333333304, "z": 0.36817882971729177}, {"x": 0.6923076923076925, "y": -0.28205128205128177, "z": 0.39973701512163096}, {"x": 0.6923076923076925, "y": -0.2307692307692305, "z": 0.4260355029585803}, {"x": 0.6923076923076925, "y": -0.17948717948717924, "z": 0.44707429322813974}, {"x": 0.6923076923076925, "y": -0.12820512820512797, "z": 0.46285338593030934}, {"x": 0.6923076923076925, "y": -0.07692307692307669, "z": 0.47337278106508907}, {"x": 0.6923076923076925, "y": -0.02564102564102541, "z": 0.47863247863247893}, {"x": 0.6923076923076925, "y": 0.02564102564102587, "z": 0.47863247863247893}, {"x": 0.6923076923076925, "y": 0.07692307692307715, "z": 0.473372781065089}, {"x": 0.6923076923076925, "y": 0.12820512820512842, "z": 0.4628533859303092}, {"x": 0.6923076923076925, "y": 0.17948717948717968, "z": 0.4470742932281396}, {"x": 0.6923076923076925, "y": 0.23076923076923095, "z": 0.42603550295858006}, {"x": 0.6923076923076925, "y": 0.2820512820512822, "z": 0.3997370151216307}, {"x": 0.6923076923076925, "y": 0.3333333333333335, "z": 0.36817882971729143}, {"x": 0.6923076923076925, "y": 0.38461538461538475, "z": 0.3313609467455623}, {"x": 0.6923076923076925, "y": 0.435897435897436, "z": 0.28928336620644335}, {"x": 0.6923076923076925, "y": 0.4871794871794873, "z": 0.24194608809993443}, {"x": 0.6923076923076925, "y": 0.5384615384615385, "z": 0.1893491124260357}, {"x": 0.6923076923076925, "y": 0.5897435897435899, "z": 0.131492439184747}, {"x": 0.6923076923076925, "y": 0.6410256410256412, "z": 0.06837606837606847}, {"x": 0.6923076923076925, "y": 0.6923076923076925, "z": 0.0}, {"x": 0.6923076923076925, "y": 0.7435897435897438, "z": -0.07363576594345839}, {"x": 0.6923076923076925, "y": 0.7948717948717952, "z": -0.15253122945430658}, {"x": 0.6923076923076925, "y": 0.8461538461538465, "z": -0.23668639053254464}, {"x": 0.6923076923076925, "y": 0.8974358974358978, "z": -0.3261012491781727}, {"x": 0.6923076923076925, "y": 0.9487179487179491, "z": -0.42077580539119047}, {"x": 0.6923076923076925, "y": 1.0, "z": -0.5207100591715974}, {"x": 0.7435897435897438, "y": -0.9487179487179487, "z": -0.3471400394477313}, {"x": 0.7435897435897438, "y": -1.0, "z": -0.44707429322813896}, {"x": 0.7435897435897438, "y": -0.8974358974358974, "z": -0.2524654832347134}, {"x": 0.7435897435897438, "y": -0.846153846153846, "z": -0.16305062458908548}, {"x": 0.7435897435897438, "y": -0.7948717948717947, "z": -0.07889546351084742}, {"x": 0.7435897435897438, "y": -0.7435897435897434, "z": 6.661338147750939e-16}, {"x": 0.7435897435897438, "y": -0.6923076923076921, "z": 0.073635765943459}, {"x": 0.7435897435897438, "y": -0.6410256410256407, "z": 0.1420118343195274}, {"x": 0.7435897435897438, "y": -0.5897435897435894, "z": 0.2051282051282059}, {"x": 0.7435897435897438, "y": -0.5384615384615381, "z": 0.2629848783694946}, {"x": 0.7435897435897438, "y": -0.48717948717948684, "z": 0.31558185404339323}, {"x": 0.7435897435897438, "y": -0.43589743589743557, "z": 0.3629191321499021}, {"x": 0.7435897435897438, "y": -0.3846153846153843, "z": 0.40499671268902104}, {"x": 0.7435897435897438, "y": -0.33333333333333304, "z": 0.4418145956607501}, {"x": 0.7435897435897438, "y": -0.28205128205128177, "z": 0.47337278106508934}, {"x": 0.7435897435897438, "y": -0.2307692307692305, "z": 0.49967126890203867}, {"x": 0.7435897435897438, "y": -0.17948717948717924, "z": 0.5207100591715982}, {"x": 0.7435897435897438, "y": -0.12820512820512797, "z": 0.5364891518737678}, {"x": 0.7435897435897438, "y": -0.07692307692307669, "z": 0.5470085470085475}, {"x": 0.7435897435897438, "y": -0.02564102564102541, "z": 0.5522682445759373}, {"x": 0.7435897435897438, "y": 0.02564102564102587, "z": 0.5522682445759373}, {"x": 0.7435897435897438, "y": 0.07692307692307715, "z": 0.5470085470085474}, {"x": 0.7435897435897438, "y": 0.12820512820512842, "z": 0.5364891518737677}, {"x": 0.7435897435897438, "y": 0.17948717948717968, "z": 0.520710059171598}, {"x": 0.7435897435897438, "y": 0.23076923076923095, "z": 0.49967126890203845}, {"x": 0.7435897435897438, "y": 0.2820512820512822, "z": 0.47337278106508907}, {"x": 0.7435897435897438, "y": 0.3333333333333335, "z": 0.4418145956607498}, {"x": 0.7435897435897438, "y": 0.38461538461538475, "z": 0.4049967126890207}, {"x": 0.7435897435897438, "y": 0.435897435897436, "z": 0.3629191321499017}, {"x": 0.7435897435897438, "y": 0.4871794871794873, "z": 0.3155818540433928}, {"x": 0.7435897435897438, "y": 0.5384615384615385, "z": 0.2629848783694941}, {"x": 0.7435897435897438, "y": 0.5897435897435899, "z": 0.2051282051282054}, {"x": 0.7435897435897438, "y": 0.6410256410256412, "z": 0.14201183431952685}, {"x": 0.7435897435897438, "y": 0.6923076923076925, "z": 0.07363576594345839}, {"x": 0.7435897435897438, "y": 0.7435897435897438, "z": 0.0}, {"x": 0.7435897435897438, "y": 0.7948717948717952, "z": -0.0788954635108482}, {"x": 0.7435897435897438, "y": 0.8461538461538465, "z": -0.16305062458908626}, {"x": 0.7435897435897438, "y": 0.8974358974358978, "z": -0.2524654832347143}, {"x": 0.7435897435897438, "y": 0.9487179487179491, "z": -0.3471400394477321}, {"x": 0.7435897435897438, "y": 1.0, "z": -0.44707429322813896}, {"x": 0.7948717948717952, "y": -0.9487179487179487, "z": -0.2682445759368831}, {"x": 0.7948717948717952, "y": -1.0, "z": -0.36817882971729077}, {"x": 0.7948717948717952, "y": -0.8974358974358974, "z": -0.1735700197238652}, {"x": 0.7948717948717952, "y": -0.846153846153846, "z": -0.08415516107823728}, {"x": 0.7948717948717952, "y": -0.7948717948717947, "z": 7.771561172376096e-16}, {"x": 0.7948717948717952, "y": -0.7435897435897434, "z": 0.07889546351084886}, {"x": 0.7948717948717952, "y": -0.6923076923076921, "z": 0.1525312294543072}, {"x": 0.7948717948717952, "y": -0.6410256410256407, "z": 0.2209072978303756}, {"x": 0.7948717948717952, "y": -0.5897435897435894, "z": 0.2840236686390541}, {"x": 0.7948717948717952, "y": -0.5384615384615381, "z": 0.3418803418803428}, {"x": 0.7948717948717952, "y": -0.48717948717948684, "z": 0.3944773175542414}, {"x": 0.7948717948717952, "y": -0.43589743589743557, "z": 0.4418145956607503}, {"x": 0.7948717948717952, "y": -0.3846153846153843, "z": 0.48389217619986924}, {"x": 0.7948717948717952, "y": -0.33333333333333304, "z": 0.5207100591715983}, {"x": 0.7948717948717952, "y": -0.28205128205128177, "z": 0.5522682445759375}, {"x": 0.7948717948717952, "y": -0.2307692307692305, "z": 0.5785667324128869}, {"x": 0.7948717948717952, "y": -0.17948717948717924, "z": 0.5996055226824464}, {"x": 0.7948717948717952, "y": -0.12820512820512797, "z": 0.615384615384616}, {"x": 0.7948717948717952, "y": -0.07692307692307669, "z": 0.6259040105193957}, {"x": 0.7948717948717952, "y": -0.02564102564102541, "z": 0.6311637080867855}, {"x": 0.7948717948717952, "y": 0.02564102564102587, "z": 0.6311637080867855}, {"x": 0.7948717948717952, "y": 0.07692307692307715, "z": 0.6259040105193956}, {"x": 0.7948717948717952, "y": 0.12820512820512842, "z": 0.6153846153846159}, {"x": 0.7948717948717952, "y": 0.17948717948717968, "z": 0.5996055226824462}, {"x": 0.7948717948717952, "y": 0.23076923076923095, "z": 0.5785667324128867}, {"x": 0.7948717948717952, "y": 0.2820512820512822, "z": 0.5522682445759373}, {"x": 0.7948717948717952, "y": 0.3333333333333335, "z": 0.5207100591715981}, {"x": 0.7948717948717952, "y": 0.38461538461538475, "z": 0.4838921761998689}, {"x": 0.7948717948717952, "y": 0.435897435897436, "z": 0.4418145956607499}, {"x": 0.7948717948717952, "y": 0.4871794871794873, "z": 0.394477317554241}, {"x": 0.7948717948717952, "y": 0.5384615384615385, "z": 0.3418803418803423}, {"x": 0.7948717948717952, "y": 0.5897435897435899, "z": 0.2840236686390536}, {"x": 0.7948717948717952, "y": 0.6410256410256412, "z": 0.22090729783037505}, {"x": 0.7948717948717952, "y": 0.6923076923076925, "z": 0.15253122945430658}, {"x": 0.7948717948717952, "y": 0.7435897435897438, "z": 0.0788954635108482}, {"x": 0.7948717948717952, "y": 0.7948717948717952, "z": 0.0}, {"x": 0.7948717948717952, "y": 0.8461538461538465, "z": -0.08415516107823806}, {"x": 0.7948717948717952, "y": 0.8974358974358978, "z": -0.1735700197238661}, {"x": 0.7948717948717952, "y": 0.9487179487179491, "z": -0.2682445759368839}, {"x": 0.7948717948717952, "y": 1.0, "z": -0.36817882971729077}, {"x": 0.8461538461538465, "y": -0.9487179487179487, "z": -0.18408941485864505}, {"x": 0.8461538461538465, "y": -1.0, "z": -0.2840236686390527}, {"x": 0.8461538461538465, "y": -0.8974358974358974, "z": -0.08941485864562715}, {"x": 0.8461538461538465, "y": -0.846153846153846, "z": 7.771561172376096e-16}, {"x": 0.8461538461538465, "y": -0.7948717948717947, "z": 0.08415516107823884}, {"x": 0.8461538461538465, "y": -0.7435897435897434, "z": 0.16305062458908692}, {"x": 0.8461538461538465, "y": -0.6923076923076921, "z": 0.23668639053254525}, {"x": 0.8461538461538465, "y": -0.6410256410256407, "z": 0.30506245890861367}, {"x": 0.8461538461538465, "y": -0.5897435897435894, "z": 0.36817882971729216}, {"x": 0.8461538461538465, "y": -0.5384615384615381, "z": 0.42603550295858084}, {"x": 0.8461538461538465, "y": -0.48717948717948684, "z": 0.4786324786324795}, {"x": 0.8461538461538465, "y": -0.43589743589743557, "z": 0.5259697567389884}, {"x": 0.8461538461538465, "y": -0.3846153846153843, "z": 0.5680473372781073}, {"x": 0.8461538461538465, "y": -0.33333333333333304, "z": 0.6048652202498364}, {"x": 0.8461538461538465, "y": -0.28205128205128177, "z": 0.6364234056541755}, {"x": 0.8461538461538465, "y": -0.2307692307692305, "z": 0.662721893491125}, {"x": 0.8461538461538465, "y": -0.17948717948717924, "z": 0.6837606837606844}, {"x": 0.8461538461538465, "y": -0.12820512820512797, "z": 0.699539776462854}, {"x": 0.8461538461538465, "y": -0.07692307692307669, "z": 0.7100591715976338}, {"x": 0.8461538461538465, "y": -0.02564102564102541, "z": 0.7153188691650235}, {"x": 0.8461538461538465, "y": 0.02564102564102587, "z": 0.7153188691650235}, {"x": 0.8461538461538465, "y": 0.07692307692307715, "z": 0.7100591715976337}, {"x": 0.8461538461538465, "y": 0.12820512820512842, "z": 0.6995397764628539}, {"x": 0.8461538461538465, "y": 0.17948717948717968, "z": 0.6837606837606842}, {"x": 0.8461538461538465, "y": 0.23076923076923095, "z": 0.6627218934911248}, {"x": 0.8461538461538465, "y": 0.2820512820512822, "z": 0.6364234056541753}, {"x": 0.8461538461538465, "y": 0.3333333333333335, "z": 0.6048652202498361}, {"x": 0.8461538461538465, "y": 0.38461538461538475, "z": 0.568047337278107}, {"x": 0.8461538461538465, "y": 0.435897435897436, "z": 0.5259697567389879}, {"x": 0.8461538461538465, "y": 0.4871794871794873, "z": 0.47863247863247904}, {"x": 0.8461538461538465, "y": 0.5384615384615385, "z": 0.42603550295858034}, {"x": 0.8461538461538465, "y": 0.5897435897435899, "z": 0.36817882971729166}, {"x": 0.8461538461538465, "y": 0.6410256410256412, "z": 0.3050624589086131}, {"x": 0.8461538461538465, "y": 0.6923076923076925, "z": 0.23668639053254464}, {"x": 0.8461538461538465, "y": 0.7435897435897438, "z": 0.16305062458908626}, {"x": 0.8461538461538465, "y": 0.7948717948717952, "z": 0.08415516107823806}, {"x": 0.8461538461538465, "y": 0.8461538461538465, "z": 0.0}, {"x": 0.8461538461538465, "y": 0.8974358974358978, "z": -0.08941485864562804}, {"x": 0.8461538461538465, "y": 0.9487179487179491, "z": -0.18408941485864583}, {"x": 0.8461538461538465, "y": 1.0, "z": -0.2840236686390527}, {"x": 0.8974358974358978, "y": -0.9487179487179487, "z": -0.09467455621301701}, {"x": 0.8974358974358978, "y": -1.0, "z": -0.19460880999342467}, {"x": 0.8974358974358978, "y": -0.8974358974358974, "z": 8.881784197001252e-16}, {"x": 0.8974358974358978, "y": -0.846153846153846, "z": 0.08941485864562881}, {"x": 0.8974358974358978, "y": -0.7948717948717947, "z": 0.17357001972386688}, {"x": 0.8974358974358978, "y": -0.7435897435897434, "z": 0.25246548323471496}, {"x": 0.8974358974358978, "y": -0.6923076923076921, "z": 0.3261012491781733}, {"x": 0.8974358974358978, "y": -0.6410256410256407, "z": 0.3944773175542417}, {"x": 0.8974358974358978, "y": -0.5897435897435894, "z": 0.4575936883629202}, {"x": 0.8974358974358978, "y": -0.5384615384615381, "z": 0.5154503616042089}, {"x": 0.8974358974358978, "y": -0.48717948717948684, "z": 0.5680473372781075}, {"x": 0.8974358974358978, "y": -0.43589743589743557, "z": 0.6153846153846164}, {"x": 0.8974358974358978, "y": -0.3846153846153843, "z": 0.6574621959237353}, {"x": 0.8974358974358978, "y": -0.33333333333333304, "z": 0.6942800788954644}, {"x": 0.8974358974358978, "y": -0.28205128205128177, "z": 0.7258382642998036}, {"x": 0.8974358974358978, "y": -0.2307692307692305, "z": 0.752136752136753}, {"x": 0.8974358974358978, "y": -0.17948717948717924, "z": 0.7731755424063125}, {"x": 0.8974358974358978, "y": -0.12820512820512797, "z": 0.7889546351084821}, {"x": 0.8974358974358978, "y": -0.07692307692307669, "z": 0.7994740302432618}, {"x": 0.8974358974358978, "y": -0.02564102564102541, "z": 0.8047337278106516}, {"x": 0.8974358974358978, "y": 0.02564102564102587, "z": 0.8047337278106516}, {"x": 0.8974358974358978, "y": 0.07692307692307715, "z": 0.7994740302432617}, {"x": 0.8974358974358978, "y": 0.12820512820512842, "z": 0.788954635108482}, {"x": 0.8974358974358978, "y": 0.17948717948717968, "z": 0.7731755424063123}, {"x": 0.8974358974358978, "y": 0.23076923076923095, "z": 0.7521367521367528}, {"x": 0.8974358974358978, "y": 0.2820512820512822, "z": 0.7258382642998034}, {"x": 0.8974358974358978, "y": 0.3333333333333335, "z": 0.6942800788954642}, {"x": 0.8974358974358978, "y": 0.38461538461538475, "z": 0.657462195923735}, {"x": 0.8974358974358978, "y": 0.435897435897436, "z": 0.615384615384616}, {"x": 0.8974358974358978, "y": 0.4871794871794873, "z": 0.5680473372781071}, {"x": 0.8974358974358978, "y": 0.5384615384615385, "z": 0.5154503616042083}, {"x": 0.8974358974358978, "y": 0.5897435897435899, "z": 0.4575936883629197}, {"x": 0.8974358974358978, "y": 0.6410256410256412, "z": 0.39447731755424115}, {"x": 0.8974358974358978, "y": 0.6923076923076925, "z": 0.3261012491781727}, {"x": 0.8974358974358978, "y": 0.7435897435897438, "z": 0.2524654832347143}, {"x": 0.8974358974358978, "y": 0.7948717948717952, "z": 0.1735700197238661}, {"x": 0.8974358974358978, "y": 0.8461538461538465, "z": 0.08941485864562804}, {"x": 0.8974358974358978, "y": 0.8974358974358978, "z": 0.0}, {"x": 0.8974358974358978, "y": 0.9487179487179491, "z": -0.09467455621301779}, {"x": 0.8974358974358978, "y": 1.0, "z": -0.19460880999342467}, {"x": 0.9487179487179491, "y": -0.9487179487179487, "z": 7.771561172376096e-16}, {"x": 0.9487179487179491, "y": -1.0, "z": -0.09993425378040688}, {"x": 0.9487179487179491, "y": -0.8974358974358974, "z": 0.09467455621301868}, {"x": 0.9487179487179491, "y": -0.846153846153846, "z": 0.1840894148586466}, {"x": 0.9487179487179491, "y": -0.7948717948717947, "z": 0.26824457593688467}, {"x": 0.9487179487179491, "y": -0.7435897435897434, "z": 0.34714003944773275}, {"x": 0.9487179487179491, "y": -0.6923076923076921, "z": 0.4207758053911911}, {"x": 0.9487179487179491, "y": -0.6410256410256407, "z": 0.4891518737672595}, {"x": 0.9487179487179491, "y": -0.5897435897435894, "z": 0.5522682445759379}, {"x": 0.9487179487179491, "y": -0.5384615384615381, "z": 0.6101249178172267}, {"x": 0.9487179487179491, "y": -0.48717948717948684, "z": 0.6627218934911253}, {"x": 0.9487179487179491, "y": -0.43589743589743557, "z": 0.7100591715976342}, {"x": 0.9487179487179491, "y": -0.3846153846153843, "z": 0.7521367521367531}, {"x": 0.9487179487179491, "y": -0.33333333333333304, "z": 0.7889546351084822}, {"x": 0.9487179487179491, "y": -0.28205128205128177, "z": 0.8205128205128214}, {"x": 0.9487179487179491, "y": -0.2307692307692305, "z": 0.8468113083497708}, {"x": 0.9487179487179491, "y": -0.17948717948717924, "z": 0.8678500986193303}, {"x": 0.9487179487179491, "y": -0.12820512820512797, "z": 0.8836291913214999}, {"x": 0.9487179487179491, "y": -0.07692307692307669, "z": 0.8941485864562796}, {"x": 0.9487179487179491, "y": -0.02564102564102541, "z": 0.8994082840236693}, {"x": 0.9487179487179491, "y": 0.02564102564102587, "z": 0.8994082840236693}, {"x": 0.9487179487179491, "y": 0.07692307692307715, "z": 0.8941485864562795}, {"x": 0.9487179487179491, "y": 0.12820512820512842, "z": 0.8836291913214998}, {"x": 0.9487179487179491, "y": 0.17948717948717968, "z": 0.86785009861933}, {"x": 0.9487179487179491, "y": 0.23076923076923095, "z": 0.8468113083497706}, {"x": 0.9487179487179491, "y": 0.2820512820512822, "z": 0.8205128205128212}, {"x": 0.9487179487179491, "y": 0.3333333333333335, "z": 0.788954635108482}, {"x": 0.9487179487179491, "y": 0.38461538461538475, "z": 0.7521367521367528}, {"x": 0.9487179487179491, "y": 0.435897435897436, "z": 0.7100591715976338}, {"x": 0.9487179487179491, "y": 0.4871794871794873, "z": 0.6627218934911249}, {"x": 0.9487179487179491, "y": 0.5384615384615385, "z": 0.6101249178172261}, {"x": 0.9487179487179491, "y": 0.5897435897435899, "z": 0.5522682445759375}, {"x": 0.9487179487179491, "y": 0.6410256410256412, "z": 0.48915187376725894}, {"x": 0.9487179487179491, "y": 0.6923076923076925, "z": 0.42077580539119047}, {"x": 0.9487179487179491, "y": 0.7435897435897438, "z": 0.3471400394477321}, {"x": 0.9487179487179491, "y": 0.7948717948717952, "z": 0.2682445759368839}, {"x": 0.9487179487179491, "y": 0.8461538461538465, "z": 0.18408941485864583}, {"x": 0.9487179487179491, "y": 0.8974358974358978, "z": 0.09467455621301779}, {"x": 0.9487179487179491, "y": 0.9487179487179491, "z": 0.0}, {"x": 0.9487179487179491, "y": 1.0, "z": -0.09993425378040688}, {"x": 1.0, "y": -0.9487179487179487, "z": 0.09993425378040766}, {"x": 1.0, "y": -1.0, "z": 0.0}, {"x": 1.0, "y": -0.8974358974358974, "z": 0.19460880999342556}, {"x": 1.0, "y": -0.846153846153846, "z": 0.2840236686390535}, {"x": 1.0, "y": -0.7948717948717947, "z": 0.36817882971729154}, {"x": 1.0, "y": -0.7435897435897434, "z": 0.44707429322813963}, {"x": 1.0, "y": -0.6923076923076921, "z": 0.520710059171598}, {"x": 1.0, "y": -0.6410256410256407, "z": 0.5890861275476664}, {"x": 1.0, "y": -0.5897435897435894, "z": 0.6522024983563448}, {"x": 1.0, "y": -0.5384615384615381, "z": 0.7100591715976335}, {"x": 1.0, "y": -0.48717948717948684, "z": 0.7626561472715322}, {"x": 1.0, "y": -0.43589743589743557, "z": 0.8099934253780411}, {"x": 1.0, "y": -0.3846153846153843, "z": 0.85207100591716}, {"x": 1.0, "y": -0.33333333333333304, "z": 0.8888888888888891}, {"x": 1.0, "y": -0.28205128205128177, "z": 0.9204470742932283}, {"x": 1.0, "y": -0.2307692307692305, "z": 0.9467455621301777}, {"x": 1.0, "y": -0.17948717948717924, "z": 0.9677843523997371}, {"x": 1.0, "y": -0.12820512820512797, "z": 0.9835634451019067}, {"x": 1.0, "y": -0.07692307692307669, "z": 0.9940828402366865}, {"x": 1.0, "y": -0.02564102564102541, "z": 0.9993425378040762}, {"x": 1.0, "y": 0.02564102564102587, "z": 0.9993425378040762}, {"x": 1.0, "y": 0.07692307692307715, "z": 0.9940828402366864}, {"x": 1.0, "y": 0.12820512820512842, "z": 0.9835634451019066}, {"x": 1.0, "y": 0.17948717948717968, "z": 0.9677843523997369}, {"x": 1.0, "y": 0.23076923076923095, "z": 0.9467455621301775}, {"x": 1.0, "y": 0.2820512820512822, "z": 0.920447074293228}, {"x": 1.0, "y": 0.3333333333333335, "z": 0.8888888888888888}, {"x": 1.0, "y": 0.38461538461538475, "z": 0.8520710059171597}, {"x": 1.0, "y": 0.435897435897436, "z": 0.8099934253780406}, {"x": 1.0, "y": 0.4871794871794873, "z": 0.7626561472715317}, {"x": 1.0, "y": 0.5384615384615385, "z": 0.710059171597633}, {"x": 1.0, "y": 0.5897435897435899, "z": 0.6522024983563444}, {"x": 1.0, "y": 0.6410256410256412, "z": 0.5890861275476658}, {"x": 1.0, "y": 0.6923076923076925, "z": 0.5207100591715974}, {"x": 1.0, "y": 0.7435897435897438, "z": 0.44707429322813896}, {"x": 1.0, "y": 0.7948717948717952, "z": 0.36817882971729077}, {"x": 1.0, "y": 0.8461538461538465, "z": 0.2840236686390527}, {"x": 1.0, "y": 0.8974358974358978, "z": 0.19460880999342467}, {"x": 1.0, "y": 0.9487179487179491, "z": 0.09993425378040688}, {"x": 1.0, "y": 1.0, "z": 0.0}], "faces": [[0, 1, 2, 3], [1, 4, 5, 2], [4, 6, 7, 5], [6, 8, 9, 7], [8, 10, 11, 9], [10, 12, 13, 11], [12, 14, 15, 13], [14, 16, 17, 15], [16, 18, 19, 17], [18, 20, 21, 19], [20, 22, 23, 21], [22, 24, 25, 23], [24, 26, 27, 25], [26, 28, 29, 27], [28, 30, 31, 29], [30, 32, 33, 31], [32, 34, 35, 33], [34, 36, 37, 35], [36, 38, 39, 37], [38, 40, 41, 39], [40, 42, 43, 41], [42, 44, 45, 43], [44, 46, 47, 45], [46, 48, 49, 47], [48, 50, 51, 49], [50, 52, 53, 51], [52, 54, 55, 53], [54, 56, 57, 55], [56, 58, 59, 57], [58, 60, 61, 59], [60, 62, 63, 61], [62, 64, 65, 63], [64, 66, 67, 65], [66, 68, 69, 67], [68, 70, 71, 69], [70, 72, 73, 71], [72, 74, 75, 73], [74, 76, 77, 75], [76, 78, 79, 77], [3, 2, 80, 81], [2, 5, 82, 80], [5, 7, 83, 82], [7, 9, 84, 83], [9, 11, 85, 84], [11, 13, 86, 85], [13, 15, 87, 86], [15, 17, 88, 87], [17, 19, 89, 88], [19, 21, 90, 89], [21, 23, 91, 90], [23, 25, 92, 91], [25, 27, 93, 92], [27, 29, 94, 93], [29, 31, 95, 94], [31, 33, 96, 95], [33, 35, 97, 96], [35, 37, 98, 97], [37, 39, 99, 98], [39, 41, 100, 99], [41, 43, 101, 100], [43, 45, 102, 101], [45, 47, 103, 102], [47, 49, 104, 103], [49, 51, 105, 104], [51, 53, 106, 105], [53, 55, 107, 106], [55, 57, 108, 107], [57, 59, 109, 108], [59, 61, 110, 109], [61, 63, 111, 110], [63, 65, 112, 111], [65, 67, 113, 112], [67, 69, 114, 113], [69, 71, 115, 114], [71, 73, 116, 115], [73, 75, 117, 116], [75, 77, 118, 117], [77, 79, 119, 118], [81, 80, 120, 121], [80, 82, 122, 120], [82, 83, 123, 122], [83, 84, 124, 123], [84, 85, 125, 124], [85, 86, 126, 125], [86, 87, 127, 126], [87, 88, 128, 127], [88, 89, 129, 128], [89, 90, 130, 129], [90, 91, 131, 130], [91, 92, 132, 131], [92, 93, 133, 132], [93, 94, 134, 133], [94, 95, 135, 134], [95, 96, 136, 135], [96, 97, 137, 136], [97, 98, 138, 137], [98, 99, 139, 138], [99, 100, 140, 139], [100, 101, 141, 140], [101, 102, 142, 141], [102, 103, 143, 142], [103, 104, 144, 143], [104, 105, 145, 144], [105, 106, 146, 145], [106, 107, 147, 146], [107, 108, 148, 147], [108, 109, 149, 148], [109, 110, 150, 149], [110, 111, 151, 150], [111, 112, 152, 151], [112, 113, 153, 152], [113, 114, 154, 153], [114, 115, 155, 154], [115, 116, 156, 155], [116, 117, 157, 156], [117, 118, 158, 157], [118, 119, 159, 158], [121, 120, 160, 161], [120, 122, 162, 160], [122, 123, 163, 162], [123, 124, 164, 163], [124, 125, 165, 164], [125, 126, 166, 165], [126, 127, 167, 166], [127, 128, 168, 167], [128, 129, 169, 168], [129, 130, 170, 169], [130, 131, 171, 170], [131, 132, 172, 171], [132, 133, 173, 172], [133, 134, 174, 173], [134, 135, 175, 174], [135, 136, 176, 175], [136, 137, 177, 176], [137, 138, 178, 177], [138, 139, 179, 178], [139, 140, 180, 179], [140, 141, 181, 180], [141, 142, 182, 181], [142, 143, 183, 182], [143, 144, 184, 183], [144, 145, 185, 184], [145, 146, 186, 185], [146, 147, 187, 186], [147, 148, 188, 187], [148, 149, 189, 188], [149, 150, 190, 189], [150, 151, 191, 190], [151, 152, 192, 191], [152, 153, 193, 192], [153, 154, 194, 193], [154, 155, 195, 194], [155, 156, 196, 195], [156, 157, 197, 196], [157, 158, 198, 197], [158, 159, 199, 198], [161, 160, 200, 201], [160, 162, 202, 200], [162, 163, 203, 202], [163, 164, 204, 203], [164, 165, 205, 204], [165, 166, 206, 205], [166, 167, 207, 206], [167, 168, 208, 207], [168, 169, 209, 208], [169, 170, 210, 209], [170, 171, 211, 210], [171, 172, 212, 211], [172, 173, 213, 212], [173, 174, 214, 213], [174, 175, 215, 214], [175, 176, 216, 215], [176, 177, 217, 216], [177, 178, 218, 217], [178, 179, 219, 218], [179, 180, 220, 219], [180, 181, 221, 220], [181, 182, 222, 221], [182, 183, 223, 222], [183, 184, 224, 223], [184, 185, 225, 224], [185, 186, 226, 225], [186, 187, 227, 226], [187, 188, 228, 227], [188, 189, 229, 228], [189, 190, 230, 229], [190, 191, 231, 230], [191, 192, 232, 231], [192, 193, 233, 232], [193, 194, 234, 233], [194, 195, 235, 234], [195, 196, 236, 235], [196, 197, 237, 236], [197, 198, 238, 237], [198, 199, 239, 238], [201, 200, 240, 241], [200, 202, 242, 240], [202, 203, 243, 242], [203, 204, 244, 243], [204, 205, 245, 244], [205, 206, 246, 245], [206, 207, 247, 246], [207, 208, 248, 247], [208, 209, 249, 248], [209, 210, 250, 249], [210, 211, 251, 250], [211, 212, 252, 251], [212, 213, 253, 252], [213, 214, 254, 253], [214, 215, 255, 254], [215, 216, 256, 255], [216, 217, 257, 256], [217, 218, 258, 257], [218, 219, 259, 258], [219, 220, 260, 259], [220, 221, 261, 260], [221, 222, 262, 261], [222, 223, 263, 262], [223, 224, 264, 263], [224, 225, 265, 264], [225, 226, 266, 265], [226, 227, 267, 266], [227, 228, 268, 267], [228, 229, 269, 268], [229, 230, 270, 269], [230, 231, 271, 270], [231, 232, 272, 271], [232, 233, 273, 272], [233, 234, 274, 273], [234, 235, 275, 274], [235, 236, 276, 275], [236, 237, 277, 276], [237, 238, 278, 277], [238, 239, 279, 278], [241, 240, 280, 281], [240, 242, 282, 280], [242, 243, 283, 282], [243, 244, 284, 283], [244, 245, 285, 284], [245, 246, 286, 285], [246, 247, 287, 286], [247, 248, 288, 287], [248, 249, 289, 288], [249, 250, 290, 289], [250, 251, 291, 290], [251, 252, 292, 291], [252, 253, 293, 292], [253, 254, 294, 293], [254, 255, 295, 294], [255, 256, 296, 295], [256, 257, 297, 296], [257, 258, 298, 297], [258, 259, 299, 298], [259, 260, 300, 299], [260, 261, 301, 300], [261, 262, 302, 301], [262, 263, 303, 302], [263, 264, 304, 303], [264, 265, 305, 304], [265, 266, 306, 305], [266, 267, 307, 306], [267, 268, 308, 307], [268, 269, 309, 308], [269, 270, 310, 309], [270, 271, 311, 310], [271, 272, 312, 311], [272, 273, 313, 312], [273, 274, 314, 313], [274, 275, 315, 314], [275, 276, 316, 315], [276, 277, 317, 316], [277, 278, 318, 317], [278, 279, 319, 318], [281, 280, 320, 321], [280, 282, 322, 320], [282, 283, 323, 322], [283, 284, 324, 323], [284, 285, 325, 324], [285, 286, 326, 325], [286, 287, 327, 326], [287, 288, 328, 327], [288, 289, 329, 328], [289, 290, 330, 329], [290, 291, 331, 330], [291, 292, 332, 331], [292, 293, 333, 332], [293, 294, 334, 333], [294, 295, 335, 334], [295, 296, 336, 335], [296, 297, 337, 336], [297, 298, 338, 337], [298, 299, 339, 338], [299, 300, 340, 339], [300, 301, 341, 340], [301, 302, 342, 341], [302, 303, 343, 342], [303, 304, 344, 343], [304, 305, 345, 344], [305, 306, 346, 345], [306, 307, 347, 346], [307, 308, 348, 347], [308, 309, 349, 348], [309, 310, 350, 349], [310, 311, 351, 350], [311, 312, 352, 351], [312, 313, 353, 352], [313, 314, 354, 353], [314, 315, 355, 354], [315, 316, 356, 355], [316, 317, 357, 356], [317, 318, 358, 357], [318, 319, 359, 358], [321, 320, 360, 361], [320, 322, 362, 360], [322, 323, 363, 362], [323, 324, 364, 363], [324, 325, 365, 364], [325, 326, 366, 365], [326, 327, 367, 366], [327, 328, 368, 367], [328, 329, 369, 368], [329, 330, 370, 369], [330, 331, 371, 370], [331, 332, 372, 371], [332, 333, 373, 372], [333, 334, 374, 373], [334, 335, 375, 374], [335, 336, 376, 375], [336, 337, 377, 376], [337, 338, 378, 377], [338, 339, 379, 378], [339, 340, 380, 379], [340, 341, 381, 380], [341, 342, 382, 381], [342, 343, 383, 382], [343, 344, 384, 383], [344, 345, 385, 384], [345, 346, 386, 385], [346, 347, 387, 386], [347, 348, 388, 387], [348, 349, 389, 388], [349, 350, 390, 389], [350, 351, 391, 390], [351, 352, 392, 391], [352, 353, 393, 392], [353, 354, 394, 393], [354, 355, 395, 394], [355, 356, 396, 395], [356, 357, 397, 396], [357, 358, 398, 397], [358, 359, 399, 398], [361, 360, 400, 401], [360, 362, 402, 400], [362, 363, 403, 402], [363, 364, 404, 403], [364, 365, 405, 404], [365, 366, 406, 405], [366, 367, 407, 406], [367, 368, 408, 407], [368, 369, 409, 408], [369, 370, 410, 409], [370, 371, 411, 410], [371, 372, 412, 411], [372, 373, 413, 412], [373, 374, 414, 413], [374, 375, 415, 414], [375, 376, 416, 415], [376, 377, 417, 416], [377, 378, 418, 417], [378, 379, 419, 418], [379, 380, 420, 419], [380, 381, 421, 420], [381, 382, 422, 421], [382, 383, 423, 422], [383, 384, 424, 423], [384, 385, 425, 424], [385, 386, 426, 425], [386, 387, 427, 426], [387, 388, 428, 427], [388, 389, 429, 428], [389, 390, 430, 429], [390, 391, 431, 430], [391, 392, 432, 431], [392, 393, 433, 432], [393, 394, 434, 433], [394, 395, 435, 434], [395, 396, 436, 435], [396, 397, 437, 436], [397, 398, 438, 437], [398, 399, 439, 438], [401, 400, 440, 441], [400, 402, 442, 440], [402, 403, 443, 442], [403, 404, 444, 443], [404, 405, 445, 444], [405, 406, 446, 445], [406, 407, 447, 446], [407, 408, 448, 447], [408, 409, 449, 448], [409, 410, 450, 449], [410, 411, 451, 450], [411, 412, 452, 451], [412, 413, 453, 452], [413, 414, 454, 453], [414, 415, 455, 454], [415, 416, 456, 455], [416, 417, 457, 456], [417, 418, 458, 457], [418, 419, 459, 458], [419, 420, 460, 459], [420, 421, 461, 460], [421, 422, 462, 461], [422, 423, 463, 462], [423, 424, 464, 463], [424, 425, 465, 464], [425, 426, 466, 465], [426, 427, 467, 466], [427, 428, 468, 467], [428, 429, 469, 468], [429, 430, 470, 469], [430, 431, 471, 470], [431, 432, 472, 471], [432, 433, 473, 472], [433, 434, 474, 473], [434, 435, 475, 474], [435, 436, 476, 475], [436, 437, 477, 476], [437, 438, 478, 477], [438, 439, 479, 478], [441, 440, 480, 481], [440, 442, 482, 480], [442, 443, 483, 482], [443, 444, 484, 483], [444, 445, 485, 484], [445, 446, 486, 485], [446, 447, 487, 486], [447, 448, 488, 487], [448, 449, 489, 488], [449, 450, 490, 489], [450, 451, 491, 490], [451, 452, 492, 491], [452, 453, 493, 492], [453, 454, 494, 493], [454, 455, 495, 494], [455, 456, 496, 495], [456, 457, 497, 496], [457, 458, 498, 497], [458, 459, 499, 498], [459, 460, 500, 499], [460, 461, 501, 500], [461, 462, 502, 501], [462, 463, 503, 502], [463, 464, 504, 503], [464, 465, 505, 504], [465, 466, 506, 505], [466, 467, 507, 506], [467, 468, 508, 507], [468, 469, 509, 508], [469, 470, 510, 509], [470, 471, 511, 510], [471, 472, 512, 511], [472, 473, 513, 512], [473, 474, 514, 513], [474, 475, 515, 514], [475, 476, 516, 515], [476, 477, 517, 516], [477, 478, 518, 517], [478, 479, 519, 518], [481, 480, 520, 521], [480, 482, 522, 520], [482, 483, 523, 522], [483, 484, 524, 523], [484, 485, 525, 524], [485, 486, 526, 525], [486, 487, 527, 526], [487, 488, 528, 527], [488, 489, 529, 528], [489, 490, 530, 529], [490, 491, 531, 530], [491, 492, 532, 531], [492, 493, 533, 532], [493, 494, 534, 533], [494, 495, 535, 534], [495, 496, 536, 535], [496, 497, 537, 536], [497, 498, 538, 537], [498, 499, 539, 538], [499, 500, 540, 539], [500, 501, 541, 540], [501, 502, 542, 541], [502, 503, 543, 542], [503, 504, 544, 543], [504, 505, 545, 544], [505, 506, 546, 545], [506, 507, 547, 546], [507, 508, 548, 547], [508, 509, 549, 548], [509, 510, 550, 549], [510, 511, 551, 550], [511, 512, 552, 551], [512, 513, 553, 552], [513, 514, 554, 553], [514, 515, 555, 554], [515, 516, 556, 555], [516, 517, 557, 556], [517, 518, 558, 557], [518, 519, 559, 558], [521, 520, 560, 561], [520, 522, 562, 560], [522, 523, 563, 562], [523, 524, 564, 563], [524, 525, 565, 564], [525, 526, 566, 565], [526, 527, 567, 566], [527, 528, 568, 567], [528, 529, 569, 568], [529, 530, 570, 569], [530, 531, 571, 570], [531, 532, 572, 571], [532, 533, 573, 572], [533, 534, 574, 573], [534, 535, 575, 574], [535, 536, 576, 575], [536, 537, 577, 576], [537, 538, 578, 577], [538, 539, 579, 578], [539, 540, 580, 579], [540, 541, 581, 580], [541, 542, 582, 581], [542, 543, 583, 582], [543, 544, 584, 583], [544, 545, 585, 584], [545, 546, 586, 585], [546, 547, 587, 586], [547, 548, 588, 587], [548, 549, 589, 588], [549, 550, 590, 589], [550, 551, 591, 590], [551, 552, 592, 591], [552, 553, 593, 592], [553, 554, 594, 593], [554, 555, 595, 594], [555, 556, 596, 595], [556, 557, 597, 596], [557, 558, 598, 597], [558, 559, 599, 598], [561, 560, 600, 601], [560, 562, 602, 600], [562, 563, 603, 602], [563, 564, 604, 603], [564, 565, 605, 604], [565, 566, 606, 605], [566, 567, 607, 606], [567, 568, 608, 607], [568, 569, 609, 608], [569, 570, 610, 609], [570, 571, 611, 610], [571, 572, 612, 611], [572, 573, 613, 612], [573, 574, 614, 613], [574, 575, 615, 614], [575, 576, 616, 615], [576, 577, 617, 616], [577, 578, 618, 617], [578, 579, 619, 618], [579, 580, 620, 619], [580, 581, 621, 620], [581, 582, 622, 621], [582, 583, 623, 622], [583, 584, 624, 623], [584, 585, 625, 624], [585, 586, 626, 625], [586, 587, 627, 626], [587, 588, 628, 627], [588, 589, 629, 628], [589, 590, 630, 629], [590, 591, 631, 630], [591, 592, 632, 631], [592, 593, 633, 632], [593, 594, 634, 633], [594, 595, 635, 634], [595, 596, 636, 635], [596, 597, 637, 636], [597, 598, 638, 637], [598, 599, 639, 638], [601, 600, 640, 641], [600, 602, 642, 640], [602, 603, 643, 642], [603, 604, 644, 643], [604, 605, 645, 644], [605, 606, 646, 645], [606, 607, 647, 646], [607, 608, 648, 647], [608, 609, 649, 648], [609, 610, 650, 649], [610, 611, 651, 650], [611, 612, 652, 651], [612, 613, 653, 652], [613, 614, 654, 653], [614, 615, 655, 654], [615, 616, 656, 655], [616, 617, 657, 656], [617, 618, 658, 657], [618, 619, 659, 658], [619, 620, 660, 659], [620, 621, 661, 660], [621, 622, 662, 661], [622, 623, 663, 662], [623, 624, 664, 663], [624, 625, 665, 664], [625, 626, 666, 665], [626, 627, 667, 666], [627, 628, 668, 667], [628, 629, 669, 668], [629, 630, 670, 669], [630, 631, 671, 670], [631, 632, 672, 671], [632, 633, 673, 672], [633, 634, 674, 673], [634, 635, 675, 674], [635, 636, 676, 675], [636, 637, 677, 676], [637, 638, 678, 677], [638, 639, 679, 678], [641, 640, 680, 681], [640, 642, 682, 680], [642, 643, 683, 682], [643, 644, 684, 683], [644, 645, 685, 684], [645, 646, 686, 685], [646, 647, 687, 686], [647, 648, 688, 687], [648, 649, 689, 688], [649, 650, 690, 689], [650, 651, 691, 690], [651, 652, 692, 691], [652, 653, 693, 692], [653, 654, 694, 693], [654, 655, 695, 694], [655, 656, 696, 695], [656, 657, 697, 696], [657, 658, 698, 697], [658, 659, 699, 698], [659, 660, 700, 699], [660, 661, 701, 700], [661, 662, 702, 701], [662, 663, 703, 702], [663, 664, 704, 703], [664, 665, 705, 704], [665, 666, 706, 705], [666, 667, 707, 706], [667, 668, 708, 707], [668, 669, 709, 708], [669, 670, 710, 709], [670, 671, 711, 710], [671, 672, 712, 711], [672, 673, 713, 712], [673, 674, 714, 713], [674, 675, 715, 714], [675, 676, 716, 715], [676, 677, 717, 716], [677, 678, 718, 717], [678, 679, 719, 718], [681, 680, 720, 721], [680, 682, 722, 720], [682, 683, 723, 722], [683, 684, 724, 723], [684, 685, 725, 724], [685, 686, 726, 725], [686, 687, 727, 726], [687, 688, 728, 727], [688, 689, 729, 728], [689, 690, 730, 729], [690, 691, 731, 730], [691, 692, 732, 731], [692, 693, 733, 732], [693, 694, 734, 733], [694, 695, 735, 734], [695, 696, 736, 735], [696, 697, 737, 736], [697, 698, 738, 737], [698, 699, 739, 738], [699, 700, 740, 739], [700, 701, 741, 740], [701, 702, 742, 741], [702, 703, 743, 742], [703, 704, 744, 743], [704, 705, 745, 744], [705, 706, 746, 745], [706, 707, 747, 746], [707, 708, 748, 747], [708, 709, 749, 748], [709, 710, 750, 749], [710, 711, 751, 750], [711, 712, 752, 751], [712, 713, 753, 752], [713, 714, 754, 753], [714, 715, 755, 754], [715, 716, 756, 755], [716, 717, 757, 756], [717, 718, 758, 757], [718, 719, 759, 758], [721, 720, 760, 761], [720, 722, 762, 760], [722, 723, 763, 762], [723, 724, 764, 763], [724, 725, 765, 764], [725, 726, 766, 765], [726, 727, 767, 766], [727, 728, 768, 767], [728, 729, 769, 768], [729, 730, 770, 769], [730, 731, 771, 770], [731, 732, 772, 771], [732, 733, 773, 772], [733, 734, 774, 773], [734, 735, 775, 774], [735, 736, 776, 775], [736, 737, 777, 776], [737, 738, 778, 777], [738, 739, 779, 778], [739, 740, 780, 779], [740, 741, 781, 780], [741, 742, 782, 781], [742, 743, 783, 782], [743, 744, 784, 783], [744, 745, 785, 784], [745, 746, 786, 785], [746, 747, 787, 786], [747, 748, 788, 787], [748, 749, 789, 788], [749, 750, 790, 789], [750, 751, 791, 790], [751, 752, 792, 791], [752, 753, 793, 792], [753, 754, 794, 793], [754, 755, 795, 794], [755, 756, 796, 795], [756, 757, 797, 796], [757, 758, 798, 797], [758, 759, 799, 798], [761, 760, 800, 801], [760, 762, 802, 800], [762, 763, 803, 802], [763, 764, 804, 803], [764, 765, 805, 804], [765, 766, 806, 805], [766, 767, 807, 806], [767, 768, 808, 807], [768, 769, 809, 808], [769, 770, 810, 809], [770, 771, 811, 810], [771, 772, 812, 811], [772, 773, 813, 812], [773, 774, 814, 813], [774, 775, 815, 814], [775, 776, 816, 815], [776, 777, 817, 816], [777, 778, 818, 817], [778, 779, 819, 818], [779, 780, 820, 819], [780, 781, 821, 820], [781, 782, 822, 821], [782, 783, 823, 822], [783, 784, 824, 823], [784, 785, 825, 824], [785, 786, 826, 825], [786, 787, 827, 826], [787, 788, 828, 827], [788, 789, 829, 828], [789, 790, 830, 829], [790, 791, 831, 830], [791, 792, 832, 831], [792, 793, 833, 832], [793, 794, 834, 833], [794, 795, 835, 834], [795, 796, 836, 835], [796, 797, 837, 836], [797, 798, 838, 837], [798, 799, 839, 838], [801, 800, 840, 841], [800, 802, 842, 840], [802, 803, 843, 842], [803, 804, 844, 843], [804, 805, 845, 844], [805, 806, 846, 845], [806, 807, 847, 846], [807, 808, 848, 847], [808, 809, 849, 848], [809, 810, 850, 849], [810, 811, 851, 850], [811, 812, 852, 851], [812, 813, 853, 852], [813, 814, 854, 853], [814, 815, 855, 854], [815, 816, 856, 855], [816, 817, 857, 856], [817, 818, 858, 857], [818, 819, 859, 858], [819, 820, 860, 859], [820, 821, 861, 860], [821, 822, 862, 861], [822, 823, 863, 862], [823, 824, 864, 863], [824, 825, 865, 864], [825, 826, 866, 865], [826, 827, 867, 866], [827, 828, 868, 867], [828, 829, 869, 868], [829, 830, 870, 869], [830, 831, 871, 870], [831, 832, 872, 871], [832, 833, 873, 872], [833, 834, 874, 873], [834, 835, 875, 874], [835, 836, 876, 875], [836, 837, 877, 876], [837, 838, 878, 877], [838, 839, 879, 878], [841, 840, 880, 881], [840, 842, 882, 880], [842, 843, 883, 882], [843, 844, 884, 883], [844, 845, 885, 884], [845, 846, 886, 885], [846, 847, 887, 886], [847, 848, 888, 887], [848, 849, 889, 888], [849, 850, 890, 889], [850, 851, 891, 890], [851, 852, 892, 891], [852, 853, 893, 892], [853, 854, 894, 893], [854, 855, 895, 894], [855, 856, 896, 895], [856, 857, 897, 896], [857, 858, 898, 897], [858, 859, 899, 898], [859, 860, 900, 899], [860, 861, 901, 900], [861, 862, 902, 901], [862, 863, 903, 902], [863, 864, 904, 903], [864, 865, 905, 904], [865, 866, 906, 905], [866, 867, 907, 906], [867, 868, 908, 907], [868, 869, 909, 908], [869, 870, 910, 909], [870, 871, 911, 910], [871, 872, 912, 911], [872, 873, 913, 912], [873, 874, 914, 913], [874, 875, 915, 914], [875, 876, 916, 915], [876, 877, 917, 916], [877, 878, 918, 917], [878, 879, 919, 918], [881, 880, 920, 921], [880, 882, 922, 920], [882, 883, 923, 922], [883, 884, 924, 923], [884, 885, 925, 924], [885, 886, 926, 925], [886, 887, 927, 926], [887, 888, 928, 927], [888, 889, 929, 928], [889, 890, 930, 929], [890, 891, 931, 930], [891, 892, 932, 931], [892, 893, 933, 932], [893, 894, 934, 933], [894, 895, 935, 934], [895, 896, 936, 935], [896, 897, 937, 936], [897, 898, 938, 937], [898, 899, 939, 938], [899, 900, 940, 939], [900, 901, 941, 940], [901, 902, 942, 941], [902, 903, 943, 942], [903, 904, 944, 943], [904, 905, 945, 944], [905, 906, 946, 945], [906, 907, 947, 946], [907, 908, 948, 947], [908, 909, 949, 948], [909, 910, 950, 949], [910, 911, 951, 950], [911, 912, 952, 951], [912, 913, 953, 952], [913, 914, 954, 953], [914, 915, 955, 954], [915, 916, 956, 955], [916, 917, 957, 956], [917, 918, 958, 957], [918, 919, 959, 958], [921, 920, 960, 961], [920, 922, 962, 960], [922, 923, 963, 962], [923, 924, 964, 963], [924, 925, 965, 964], [925, 926, 966, 965], [926, 927, 967, 966], [927, 928, 968, 967], [928, 929, 969, 968], [929, 930, 970, 969], [930, 931, 971, 970], [931, 932, 972, 971], [932, 933, 973, 972], [933, 934, 974, 973], [934, 935, 975, 974], [935, 936, 976, 975], [936, 937, 977, 976], [937, 938, 978, 977], [938, 939, 979, 978], [939, 940, 980, 979], [940, 941, 981, 980], [941, 942, 982, 981], [942, 943, 983, 982], [943, 944, 984, 983], [944, 945, 985, 984], [945, 946, 986, 985], [946, 947, 987, 986], [947, 948, 988, 987], [948, 949, 989, 988], [949, 950, 990, 989], [950, 951, 991, 990], [951, 952, 992, 991], [952, 953, 993, 992], [953, 954, 994, 993], [954, 955, 995, 994], [955, 956, 996, 995], [956, 957, 997, 996], [957, 958, 998, 997], [958, 959, 999, 998], [961, 960, 1000, 1001], [960, 962, 1002, 1000], [962, 963, 1003, 1002], [963, 964, 1004, 1003], [964, 965, 1005, 1004], [965, 966, 1006, 1005], [966, 967, 1007, 1006], [967, 968, 1008, 1007], [968, 969, 1009, 1008], [969, 970, 1010, 1009], [970, 971, 1011, 1010], [971, 972, 1012, 1011], [972, 973, 1013, 1012], [973, 974, 1014, 1013], [974, 975, 1015, 1014], [975, 976, 1016, 1015], [976, 977, 1017, 1016], [977, 978, 1018, 1017], [978, 979, 1019, 1018], [979, 980, 1020, 1019], [980, 981, 1021, 1020], [981, 982, 1022, 1021], [982, 983, 1023, 1022], [983, 984, 1024, 1023], [984, 985, 1025, 1024], [985, 986, 1026, 1025], [986, 987, 1027, 1026], [987, 988, 1028, 1027], [988, 989, 1029, 1028], [989, 990, 1030, 1029], [990, 991, 1031, 1030], [991, 992, 1032, 1031], [992, 993, 1033, 1032], [993, 994, 1034, 1033], [994, 995, 1035, 1034], [995, 996, 1036, 1035], [996, 997, 1037, 1036], [997, 998, 1038, 1037], [998, 999, 1039, 1038], [1001, 1000, 1040, 1041], [1000, 1002, 1042, 1040], [1002, 1003, 1043, 1042], [1003, 1004, 1044, 1043], [1004, 1005, 1045, 1044], [1005, 1006, 1046, 1045], [1006, 1007, 1047, 1046], [1007, 1008, 1048, 1047], [1008, 1009, 1049, 1048], [1009, 1010, 1050, 1049], [1010, 1011, 1051, 1050], [1011, 1012, 1052, 1051], [1012, 1013, 1053, 1052], [1013, 1014, 1054, 1053], [1014, 1015, 1055, 1054], [1015, 1016, 1056, 1055], [1016, 1017, 1057, 1056], [1017, 1018, 1058, 1057], [1018, 1019, 1059, 1058], [1019, 1020, 1060, 1059], [1020, 1021, 1061, 1060], [1021, 1022, 1062, 1061], [1022, 1023, 1063, 1062], [1023, 1024, 1064, 1063], [1024, 1025, 1065, 1064], [1025, 1026, 1066, 1065], [1026, 1027, 1067, 1066], [1027, 1028, 1068, 1067], [1028, 1029, 1069, 1068], [1029, 1030, 1070, 1069], [1030, 1031, 1071, 1070], [1031, 1032, 1072, 1071], [1032, 1033, 1073, 1072], [1033, 1034, 1074, 1073], [1034, 1035, 1075, 1074], [1035, 1036, 1076, 1075], [1036, 1037, 1077, 1076], [1037, 1038, 1078, 1077], [1038, 1039, 1079, 1078], [1041, 1040, 1080, 1081], [1040, 1042, 1082, 1080], [1042, 1043, 1083, 1082], [1043, 1044, 1084, 1083], [1044, 1045, 1085, 1084], [1045, 1046, 1086, 1085], [1046, 1047, 1087, 1086], [1047, 1048, 1088, 1087], [1048, 1049, 1089, 1088], [1049, 1050, 1090, 1089], [1050, 1051, 1091, 1090], [1051, 1052, 1092, 1091], [1052, 1053, 1093, 1092], [1053, 1054, 1094, 1093], [1054, 1055, 1095, 1094], [1055, 1056, 1096, 1095], [1056, 1057, 1097, 1096], [1057, 1058, 1098, 1097], [1058, 1059, 1099, 1098], [1059, 1060, 1100, 1099], [1060, 1061, 1101, 1100], [1061, 1062, 1102, 1101], [1062, 1063, 1103, 1102], [1063, 1064, 1104, 1103], [1064, 1065, 1105, 1104], [1065, 1066, 1106, 1105], [1066, 1067, 1107, 1106], [1067, 1068, 1108, 1107], [1068, 1069, 1109, 1108], [1069, 1070, 1110, 1109], [1070, 1071, 1111, 1110], [1071, 1072, 1112, 1111], [1072, 1073, 1113, 1112], [1073, 1074, 1114, 1113], [1074, 1075, 1115, 1114], [1075, 1076, 1116, 1115], [1076, 1077, 1117, 1116], [1077, 1078, 1118, 1117], [1078, 1079, 1119, 1118], [1081, 1080, 1120, 1121], [1080, 1082, 1122, 1120], [1082, 1083, 1123, 1122], [1083, 1084, 1124, 1123], [1084, 1085, 1125, 1124], [1085, 1086, 1126, 1125], [1086, 1087, 1127, 1126], [1087, 1088, 1128, 1127], [1088, 1089, 1129, 1128], [1089, 1090, 1130, 1129], [1090, 1091, 1131, 1130], [1091, 1092, 1132, 1131], [1092, 1093, 1133, 1132], [1093, 1094, 1134, 1133], [1094, 1095, 1135, 1134], [1095, 1096, 1136, 1135], [1096, 1097, 1137, 1136], [1097, 1098, 1138, 1137], [1098, 1099, 1139, 1138], [1099, 1100, 1140, 1139], [1100, 1101, 1141, 1140], [1101, 1102, 1142, 1141], [1102, 1103, 1143, 1142], [1103, 1104, 1144, 1143], [1104, 1105, 1145, 1144], [1105, 1106, 1146, 1145], [1106, 1107, 1147, 1146], [1107, 1108, 1148, 1147], [1108, 1109, 1149, 1148], [1109, 1110, 1150, 1149], [1110, 1111, 1151, 1150], [1111, 1112, 1152, 1151], [1112, 1113, 1153, 1152], [1113, 1114, 1154, 1153], [1114, 1115, 1155, 1154], [1115, 1116, 1156, 1155], [1116, 1117, 1157, 1156], [1117, 1118, 1158, 1157], [1118, 1119, 1159, 1158], [1121, 1120, 1160, 1161], [1120, 1122, 1162, 1160], [1122, 1123, 1163, 1162], [1123, 1124, 1164, 1163], [1124, 1125, 1165, 1164], [1125, 1126, 1166, 1165], [1126, 1127, 1167, 1166], [1127, 1128, 1168, 1167], [1128, 1129, 1169, 1168], [1129, 1130, 1170, 1169], [1130, 1131, 1171, 1170], [1131, 1132, 1172, 1171], [1132, 1133, 1173, 1172], [1133, 1134, 1174, 1173], [1134, 1135, 1175, 1174], [1135, 1136, 1176, 1175], [1136, 1137, 1177, 1176], [1137, 1138, 1178, 1177], [1138, 1139, 1179, 1178], [1139, 1140, 1180, 1179], [1140, 1141, 1181, 1180], [1141, 1142, 1182, 1181], [1142, 1143, 1183, 1182], [1143, 1144, 1184, 1183], [1144, 1145, 1185, 1184], [1145, 1146, 1186, 1185], [1146, 1147, 1187, 1186], [1147, 1148, 1188, 1187], [1148, 1149, 1189, 1188], [1149, 1150, 1190, 1189], [1150, 1151, 1191, 1190], [1151, 1152, 1192, 1191], [1152, 1153, 1193, 1192], [1153, 1154, 1194, 1193], [1154, 1155, 1195, 1194], [1155, 1156, 1196, 1195], [1156, 1157, 1197, 1196], [1157, 1158, 1198, 1197], [1158, 1159, 1199, 1198], [1161, 1160, 1200, 1201], [1160, 1162, 1202, 1200], [1162, 1163, 1203, 1202], [1163, 1164, 1204, 1203], [1164, 1165, 1205, 1204], [1165, 1166, 1206, 1205], [1166, 1167, 1207, 1206], [1167, 1168, 1208, 1207], [1168, 1169, 1209, 1208], [1169, 1170, 1210, 1209], [1170, 1171, 1211, 1210], [1171, 1172, 1212, 1211], [1172, 1173, 1213, 1212], [1173, 1174, 1214, 1213], [1174, 1175, 1215, 1214], [1175, 1176, 1216, 1215], [1176, 1177, 1217, 1216], [1177, 1178, 1218, 1217], [1178, 1179, 1219, 1218], [1179, 1180, 1220, 1219], [1180, 1181, 1221, 1220], [1181, 1182, 1222, 1221], [1182, 1183, 1223, 1222], [1183, 1184, 1224, 1223], [1184, 1185, 1225, 1224], [1185, 1186, 1226, 1225], [1186, 1187, 1227, 1226], [1187, 1188, 1228, 1227], [1188, 1189, 1229, 1228], [1189, 1190, 1230, 1229], [1190, 1191, 1231, 1230], [1191, 1192, 1232, 1231], [1192, 1193, 1233, 1232], [1193, 1194, 1234, 1233], [1194, 1195, 1235, 1234], [1195, 1196, 1236, 1235], [1196, 1197, 1237, 1236], [1197, 1198, 1238, 1237], [1198, 1199, 1239, 1238], [1201, 1200, 1240, 1241], [1200, 1202, 1242, 1240], [1202, 1203, 1243, 1242], [1203, 1204, 1244, 1243], [1204, 1205, 1245, 1244], [1205, 1206, 1246, 1245], [1206, 1207, 1247, 1246], [1207, 1208, 1248, 1247], [1208, 1209, 1249, 1248], [1209, 1210, 1250, 1249], [1210, 1211, 1251, 1250], [1211, 1212, 1252, 1251], [1212, 1213, 1253, 1252], [1213, 1214, 1254, 1253], [1214, 1215, 1255, 1254], [1215, 1216, 1256, 1255], [1216, 1217, 1257, 1256], [1217, 1218, 1258, 1257], [1218, 1219, 1259, 1258], [1219, 1220, 1260, 1259], [1220, 1221, 1261, 1260], [1221, 1222, 1262, 1261], [1222, 1223, 1263, 1262], [1223, 1224, 1264, 1263], [1224, 1225, 1265, 1264], [1225, 1226, 1266, 1265], [1226, 1227, 1267, 1266], [1227, 1228, 1268, 1267], [1228, 1229, 1269, 1268], [1229, 1230, 1270, 1269], [1230, 1231, 1271, 1270], [1231, 1232, 1272, 1271], [1232, 1233, 1273, 1272], [1233, 1234, 1274, 1273], [1234, 1235, 1275, 1274], [1235, 1236, 1276, 1275], [1236, 1237, 1277, 1276], [1237, 1238, 1278, 1277], [1238, 1239, 1279, 1278], [1241, 1240, 1280, 1281], [1240, 1242, 1282, 1280], [1242, 1243, 1283, 1282], [1243, 1244, 1284, 1283], [1244, 1245, 1285, 1284], [1245, 1246, 1286, 1285], [1246, 1247, 1287, 1286], [1247, 1248, 1288, 1287], [1248, 1249, 1289, 1288], [1249, 1250, 1290, 1289], [1250, 1251, 1291, 1290], [1251, 1252, 1292, 1291], [1252, 1253, 1293, 1292], [1253, 1254, 1294, 1293], [1254, 1255, 1295, 1294], [1255, 1256, 1296, 1295], [1256, 1257, 1297, 1296], [1257, 1258, 1298, 1297], [1258, 1259, 1299, 1298], [1259, 1260, 1300, 1299], [1260, 1261, 1301, 1300], [1261, 1262, 1302, 1301], [1262, 1263, 1303, 1302], [1263, 1264, 1304, 1303], [1264, 1265, 1305, 1304], [1265, 1266, 1306, 1305], [1266, 1267, 1307, 1306], [1267, 1268, 1308, 1307], [1268, 1269, 1309, 1308], [1269, 1270, 1310, 1309], [1270, 1271, 1311, 1310], [1271, 1272, 1312, 1311], [1272, 1273, 1313, 1312], [1273, 1274, 1314, 1313], [1274, 1275, 1315, 1314], [1275, 1276, 1316, 1315], [1276, 1277, 1317, 1316], [1277, 1278, 1318, 1317], [1278, 1279, 1319, 1318], [1281, 1280, 1320, 1321], [1280, 1282, 1322, 1320], [1282, 1283, 1323, 1322], [1283, 1284, 1324, 1323], [1284, 1285, 1325, 1324], [1285, 1286, 1326, 1325], [1286, 1287, 1327, 1326], [1287, 1288, 1328, 1327], [1288, 1289, 1329, 1328], [1289, 1290, 1330, 1329], [1290, 1291, 1331, 1330], [1291, 1292, 1332, 1331], [1292, 1293, 1333, 1332], [1293, 1294, 1334, 1333], [1294, 1295, 1335, 1334], [1295, 1296, 1336, 1335], [1296, 1297, 1337, 1336], [1297, 1298, 1338, 1337], [1298, 1299, 1339, 1338], [1299, 1300, 1340, 1339], [1300, 1301, 1341, 1340], [1301, 1302, 1342, 1341], [1302, 1303, 1343, 1342], [1303, 1304, 1344, 1343], [1304, 1305, 1345, 1344], [1305, 1306, 1346, 1345], [1306, 1307, 1347, 1346], [1307, 1308, 1348, 1347], [1308, 1309, 1349, 1348], [1309, 1310, 1350, 1349], [1310, 1311, 1351, 1350], [1311, 1312, 1352, 1351], [1312, 1313, 1353, 1352], [1313, 1314, 1354, 1353], [1314, 1315, 1355, 1354], [1315, 1316, 1356, 1355], [1316, 1317, 1357, 1356], [1317, 1318, 1358, 1357], [1318, 1319, 1359, 1358], [1321, 1320, 1360, 1361], [1320, 1322, 1362, 1360], [1322, 1323, 1363, 1362], [1323, 1324, 1364, 1363], [1324, 1325, 1365, 1364], [1325, 1326, 1366, 1365], [1326, 1327, 1367, 1366], [1327, 1328, 1368, 1367], [1328, 1329, 1369, 1368], [1329, 1330, 1370, 1369], [1330, 1331, 1371, 1370], [1331, 1332, 1372, 1371], [1332, 1333, 1373, 1372], [1333, 1334, 1374, 1373], [1334, 1335, 1375, 1374], [1335, 1336, 1376, 1375], [1336, 1337, 1377, 1376], [1337, 1338, 1378, 1377], [1338, 1339, 1379, 1378], [1339, 1340, 1380, 1379], [1340, 1341, 1381, 1380], [1341, 1342, 1382, 1381], [1342, 1343, 1383, 1382], [1343, 1344, 1384, 1383], [1344, 1345, 1385, 1384], [1345, 1346, 1386, 1385], [1346, 1347, 1387, 1386], [1347, 1348, 1388, 1387], [1348, 1349, 1389, 1388], [1349, 1350, 1390, 1389], [1350, 1351, 1391, 1390], [1351, 1352, 1392, 1391], [1352, 1353, 1393, 1392], [1353, 1354, 1394, 1393], [1354, 1355, 1395, 1394], [1355, 1356, 1396, 1395], [1356, 1357, 1397, 1396], [1357, 1358, 1398, 1397], [1358, 1359, 1399, 1398], [1361, 1360, 1400, 1401], [1360, 1362, 1402, 1400], [1362, 1363, 1403, 1402], [1363, 1364, 1404, 1403], [1364, 1365, 1405, 1404], [1365, 1366, 1406, 1405], [1366, 1367, 1407, 1406], [1367, 1368, 1408, 1407], [1368, 1369, 1409, 1408], [1369, 1370, 1410, 1409], [1370, 1371, 1411, 1410], [1371, 1372, 1412, 1411], [1372, 1373, 1413, 1412], [1373, 1374, 1414, 1413], [1374, 1375, 1415, 1414], [1375, 1376, 1416, 1415], [1376, 1377, 1417, 1416], [1377, 1378, 1418, 1417], [1378, 1379, 1419, 1418], [1379, 1380, 1420, 1419], [1380, 1381, 1421, 1420], [1381, 1382, 1422, 1421], [1382, 1383, 1423, 1422], [1383, 1384, 1424, 1423], [1384, 1385, 1425, 1424], [1385, 1386, 1426, 1425], [1386, 1387, 1427, 1426], [1387, 1388, 1428, 1427], [1388, 1389, 1429, 1428], [1389, 1390, 1430, 1429], [1390, 1391, 1431, 1430], [1391, 1392, 1432, 1431], [1392, 1393, 1433, 1432], [1393, 1394, 1434, 1433], [1394, 1395, 1435, 1434], [1395, 1396, 1436, 1435], [1396, 1397, 1437, 1436], [1397, 1398, 1438, 1437], [1398, 1399, 1439, 1438], [1401, 1400, 1440, 1441], [1400, 1402, 1442, 1440], [1402, 1403, 1443, 1442], [1403, 1404, 1444, 1443], [1404, 1405, 1445, 1444], [1405, 1406, 1446, 1445], [1406, 1407, 1447, 1446], [1407, 1408, 1448, 1447], [1408, 1409, 1449, 1448], [1409, 1410, 1450, 1449], [1410, 1411, 1451, 1450], [1411, 1412, 1452, 1451], [1412, 1413, 1453, 1452], [1413, 1414, 1454, 1453], [1414, 1415, 1455, 1454], [1415, 1416, 1456, 1455], [1416, 1417, 1457, 1456], [1417, 1418, 1458, 1457], [1418, 1419, 1459, 1458], [1419, 1420, 1460, 1459], [1420, 1421, 1461, 1460], [1421, 1422, 1462, 1461], [1422, 1423, 1463, 1462], [1423, 1424, 1464, 1463], [1424, 1425, 1465, 1464], [1425, 1426, 1466, 1465], [1426, 1427, 1467, 1466], [1427, 1428, 1468, 1467], [1428, 1429, 1469, 1468], [1429, 1430, 1470, 1469], [1430, 1431, 1471, 1470], [1431, 1432, 1472, 1471], [1432, 1433, 1473, 1472], [1433, 1434, 1474, 1473], [1434, 1435, 1475, 1474], [1435, 1436, 1476, 1475], [1436, 1437, 1477, 1476], [1437, 1438, 1478, 1477], [1438, 1439, 1479, 1478], [1441, 1440, 1480, 1481], [1440, 1442, 1482, 1480], [1442, 1443, 1483, 1482], [1443, 1444, 1484, 1483], [1444, 1445, 1485, 1484], [1445, 1446, 1486, 1485], [1446, 1447, 1487, 1486], [1447, 1448, 1488, 1487], [1448, 1449, 1489, 1488], [1449, 1450, 1490, 1489], [1450, 1451, 1491, 1490], [1451, 1452, 1492, 1491], [1452, 1453, 1493, 1492], [1453, 1454, 1494, 1493], [1454, 1455, 1495, 1494], [1455, 1456, 1496, 1495], [1456, 1457, 1497, 1496], [1457, 1458, 1498, 1497], [1458, 1459, 1499, 1498], [1459, 1460, 1500, 1499], [1460, 1461, 1501, 1500], [1461, 1462, 1502, 1501], [1462, 1463, 1503, 1502], [1463, 1464, 1504, 1503], [1464, 1465, 1505, 1504], [1465, 1466, 1506, 1505], [1466, 1467, 1507, 1506], [1467, 1468, 1508, 1507], [1468, 1469, 1509, 1508], [1469, 1470, 1510, 1509], [1470, 1471, 1511, 1510], [1471, 1472, 1512, 1511], [1472, 1473, 1513, 1512], [1473, 1474, 1514, 1513], [1474, 1475, 1515, 1514], [1475, 1476, 1516, 1515], [1476, 1477, 1517, 1516], [1477, 1478, 1518, 1517], [1478, 1479, 1519, 1518], [1481, 1480, 1520, 1521], [1480, 1482, 1522, 1520], [1482, 1483, 1523, 1522], [1483, 1484, 1524, 1523], [1484, 1485, 1525, 1524], [1485, 1486, 1526, 1525], [1486, 1487, 1527, 1526], [1487, 1488, 1528, 1527], [1488, 1489, 1529, 1528], [1489, 1490, 1530, 1529], [1490, 1491, 1531, 1530], [1491, 1492, 1532, 1531], [1492, 1493, 1533, 1532], [1493, 1494, 1534, 1533], [1494, 1495, 1535, 1534], [1495, 1496, 1536, 1535], [1496, 1497, 1537, 1536], [1497, 1498, 1538, 1537], [1498, 1499, 1539, 1538], [1499, 1500, 1540, 1539], [1500, 1501, 1541, 1540], [1501, 1502, 1542, 1541], [1502, 1503, 1543, 1542], [1503, 1504, 1544, 1543], [1504, 1505, 1545, 1544], [1505, 1506, 1546, 1545], [1506, 1507, 1547, 1546], [1507, 1508, 1548, 1547], [1508, 1509, 1549, 1548], [1509, 1510, 1550, 1549], [1510, 1511, 1551, 1550], [1511, 1512, 1552, 1551], [1512, 1513, 1553, 1552], [1513, 1514, 1554, 1553], [1514, 1515, 1555, 1554], [1515, 1516, 1556, 1555], [1516, 1517, 1557, 1556], [1517, 1518, 1558, 1557], [1518, 1519, 1559, 1558], [1521, 1520, 1560, 1561], [1520, 1522, 1562, 1560], [1522, 1523, 1563, 1562], [1523, 1524, 1564, 1563], [1524, 1525, 1565, 1564], [1525, 1526, 1566, 1565], [1526, 1527, 1567, 1566], [1527, 1528, 1568, 1567], [1528, 1529, 1569, 1568], [1529, 1530, 1570, 1569], [1530, 1531, 1571, 1570], [1531, 1532, 1572, 1571], [1532, 1533, 1573, 1572], [1533, 1534, 1574, 1573], [1534, 1535, 1575, 1574], [1535, 1536, 1576, 1575], [1536, 1537, 1577, 1576], [1537, 1538, 1578, 1577], [1538, 1539, 1579, 1578], [1539, 1540, 1580, 1579], [1540, 1541, 1581, 1580], [1541, 1542, 1582, 1581], [1542, 1543, 1583, 1582], [1543, 1544, 1584, 1583], [1544, 1545, 1585, 1584], [1545, 1546, 1586, 1585], [1546, 1547, 1587, 1586], [1547, 1548, 1588, 1587], [1548, 1549, 1589, 1588], [1549, 1550, 1590, 1589], [1550, 1551, 1591, 1590], [1551, 1552, 1592, 1591], [1552, 1553, 1593, 1592], [1553, 1554, 1594, 1593], [1554, 1555, 1595, 1594], [1555, 1556, 1596, 1595], [1556, 1557, 1597, 1596], [1557, 1558, 1598, 1597], [1558, 1559, 1599, 1598]], "color": "#ffa500", "opacity": 1.0, "showMeshGrid": true}]; for ( var i=0 ; i < surfaces.length ; i++ ) addSurface( surfaces[i] ); function addSurface( json ) { var useFaceColors = 'faceColors' in json ? true : false; var geometry = new THREE.Geometry(); for ( var i=0 ; i < json.vertices.length ; i++ ) { var v = json.vertices[i]; geometry.vertices.push( new THREE.Vector3( a[0]*v.x, a[1]*v.y, a[2]*v.z ) ); } for ( var i=0 ; i < json.faces.length ; i++ ) { var f = json.faces[i]; for ( var j=0 ; j < f.length - 2 ; j++ ) { var face = new THREE.Face3( f[0], f[j+1], f[j+2] ); if ( useFaceColors ) face.color.set( json.faceColors[i] ); geometry.faces.push( face ); } } geometry.computeVertexNormals(); var side = json.singleSide ? THREE.FrontSide : THREE.DoubleSide; var transparent = json.opacity < 1 ? true : false; var depthWrite = 'depthWrite' in json ? json.depthWrite : !transparent; var flatShading = json.useFlatShading ? json.useFlatShading : false; var material = new THREE.MeshPhongMaterial( { side: side, color: useFaceColors ? 'white' : json.color, vertexColors: useFaceColors ? THREE.FaceColors : THREE.NoColors, transparent: transparent, opacity: json.opacity, shininess: 20, flatShading: flatShading, depthWrite: depthWrite } ); var c = new THREE.Vector3(); geometry.computeBoundingBox(); geometry.boundingBox.getCenter( c ); geometry.translate( -c.x, -c.y, -c.z ); var mesh = new THREE.Mesh( geometry, material ); mesh.position.set( c.x, c.y, c.z ); if ( transparent && json.renderOrder ) mesh.renderOrder = json.renderOrder; mesh.userData = json; scene.add( mesh ); if ( json.showMeshGrid ) addSurfaceMeshGrid( json ); } function addSurfaceMeshGrid( json ) { var geometry = new THREE.Geometry(); for ( var i=0 ; i < json.faces.length ; i++ ) { var f = json.faces[i]; for ( var j=0 ; j < f.length ; j++ ) { var k = j === f.length-1 ? 0 : j+1; var v1 = json.vertices[f[j]]; var v2 = json.vertices[f[k]]; // vertices in opposite directions on neighboring faces var nudge = f[j] < f[k] ? .0005*zRange : -.0005*zRange; geometry.vertices.push( new THREE.Vector3( a[0]*v1.x, a[1]*v1.y, a[2]*(v1.z+nudge) ) ); geometry.vertices.push( new THREE.Vector3( a[0]*v2.x, a[1]*v2.y, a[2]*(v2.z+nudge) ) ); } } var c = new THREE.Vector3(); geometry.computeBoundingBox(); geometry.boundingBox.getCenter( c ); geometry.translate( -c.x, -c.y, -c.z ); var gridColor = options.theme === 'dark' ? 'white' : 'black'; var linewidth = json.linewidth || 1; var materialOptions = { color: gridColor, linewidth: linewidth }; var mesh; if ( linewidth > 1 && window.createFatLineSegments ) { mesh = createFatLineSegments( geometry, materialOptions ); } else { var material = new THREE.LineBasicMaterial( materialOptions ); mesh = new THREE.LineSegments( geometry, material ); } mesh.position.set( c.x, c.y, c.z ); mesh.userData = json; scene.add( mesh ); } function render() { if ( window.updateAnimation ) animate = updateAnimation(); if ( animate ) requestAnimationFrame( render ); renderer.render( scene, camera ); } render(); controls.update(); if ( !animate ) render(); // menu functions function toggleMenu() { var m = document.getElementById( 'menu-content' ); if ( m.style.display === 'block' ) m.style.display = 'none' else m.style.display = 'block'; } function saveAsPNG() { var a = document.body.appendChild( document.createElement( 'a' ) ); a.href = renderer.domElement.toDataURL( 'image/png' ); a.download = 'screenshot'; a.click(); } function saveAsHTML() { toggleMenu(); // otherwise visible in output event.stopPropagation(); var blob = new Blob( [ '\n' + document.documentElement.outerHTML ] ); var a = document.body.appendChild( document.createElement( 'a' ) ); a.href = window.URL.createObjectURL( blob ); a.download = suggestFilename(); a.click(); function suggestFilename() { if ( !document.title ) { return 'graphic.html'; } else if ( /\.html?$/i.test( document.title ) ) { return document.title; // already ends in .htm or .html } else { return document.title + '.html'; } } } function getViewpoint() { function roundTo( x, n ) { return +x.toFixed(n); } var v = camera.quaternion.inverse(); var r = Math.sqrt( v.x*v.x + v.y*v.y + v.z*v.z ); var axis = [ roundTo( v.x / r, 4 ), roundTo( v.y / r, 4 ), roundTo( v.z / r, 4 ) ]; var angle = roundTo( 2 * Math.atan2( r, v.w ) * 180 / Math.PI, 2 ); var textArea = document.createElement( 'textarea' ); textArea.textContent = JSON.stringify( axis ) + ',' + angle; textArea.style.csstext = 'position: absolute; top: -100%'; document.body.append( textArea ); textArea.select(); document.execCommand( 'copy' ); var m = document.getElementById( 'menu-message' ); m.innerHTML = 'Viewpoint copied to clipboard'; m.style.display = 'block'; setTimeout( function() { m.style.display = 'none'; }, 2000 ); } function getCamera() { function roundTo( x, n ) { return +x.toFixed(n); } var pos = camera.position; var pos_r = [ roundTo( pos.x, 4 ), roundTo( pos.y, 4 ), roundTo( pos.z, 4 ) ]; // var up = camera.up; // up is always (0,0,1) var textArea = document.createElement('textarea'); var cam_position = JSON.stringify(pos_r); textArea.textContent = ',camera_position=' + cam_position; textArea.style.csstext = 'position: absolute; top: -100%'; document.body.append( textArea ); textArea.select(); document.execCommand( 'copy' ); var m = document.getElementById( 'menu-message' ); m.innerHTML = 'Camera position '+ cam_position+' copied to clipboard'; m.style.display = 'block'; setTimeout( function() { m.style.display = 'none'; }, 2000 ); } ================================================ FILE: examples/sample-article/media/code/threejs/splines.js ================================================ // From: https://threejs.org/examples/webgl_geometry_extrude_splines.html // Minimal edits by RAB, 2019-05-15 // The MIT License // // Copyright © 2010-2019 three.js authors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. var container, stats; var camera, scene, renderer, splineCamera, cameraHelper, cameraEye; var binormal = new THREE.Vector3(); var normal = new THREE.Vector3(); var pipeSpline = new THREE.CatmullRomCurve3( [ new THREE.Vector3( 0, 10, - 10 ), new THREE.Vector3( 10, 0, - 10 ), new THREE.Vector3( 20, 0, 0 ), new THREE.Vector3( 30, 0, 10 ), new THREE.Vector3( 30, 0, 20 ), new THREE.Vector3( 20, 0, 30 ), new THREE.Vector3( 10, 0, 30 ), new THREE.Vector3( 0, 0, 30 ), new THREE.Vector3( - 10, 10, 30 ), new THREE.Vector3( - 10, 20, 30 ), new THREE.Vector3( 0, 30, 30 ), new THREE.Vector3( 10, 30, 30 ), new THREE.Vector3( 20, 30, 15 ), new THREE.Vector3( 10, 30, 10 ), new THREE.Vector3( 0, 30, 10 ), new THREE.Vector3( - 10, 20, 10 ), new THREE.Vector3( - 10, 10, 10 ), new THREE.Vector3( 0, 0, 10 ), new THREE.Vector3( 10, - 10, 10 ), new THREE.Vector3( 20, - 15, 10 ), new THREE.Vector3( 30, - 15, 10 ), new THREE.Vector3( 40, - 15, 10 ), new THREE.Vector3( 50, - 15, 10 ), new THREE.Vector3( 60, 0, 10 ), new THREE.Vector3( 70, 0, 0 ), new THREE.Vector3( 80, 0, 0 ), new THREE.Vector3( 90, 0, 0 ), new THREE.Vector3( 100, 0, 0 ) ] ); var sampleClosedSpline = new THREE.CatmullRomCurve3( [ new THREE.Vector3( 0, - 40, - 40 ), new THREE.Vector3( 0, 40, - 40 ), new THREE.Vector3( 0, 140, - 40 ), new THREE.Vector3( 0, 40, 40 ), new THREE.Vector3( 0, - 40, 40 ) ] ); sampleClosedSpline.curveType = 'catmullrom'; sampleClosedSpline.closed = true; // Keep a dictionary of Curve instances var splines = { GrannyKnot: new THREE.Curves.GrannyKnot(), HeartCurve: new THREE.Curves.HeartCurve( 3.5 ), VivianiCurve: new THREE.Curves.VivianiCurve( 70 ), KnotCurve: new THREE.Curves.KnotCurve(), HelixCurve: new THREE.Curves.HelixCurve(), TrefoilKnot: new THREE.Curves.TrefoilKnot(), TorusKnot: new THREE.Curves.TorusKnot( 20 ), CinquefoilKnot: new THREE.Curves.CinquefoilKnot( 20 ), TrefoilPolynomialKnot: new THREE.Curves.TrefoilPolynomialKnot( 14 ), FigureEightPolynomialKnot: new THREE.Curves.FigureEightPolynomialKnot(), DecoratedTorusKnot4a: new THREE.Curves.DecoratedTorusKnot4a(), DecoratedTorusKnot4b: new THREE.Curves.DecoratedTorusKnot4b(), DecoratedTorusKnot5a: new THREE.Curves.DecoratedTorusKnot5a(), DecoratedTorusKnot5c: new THREE.Curves.DecoratedTorusKnot5c(), PipeSpline: pipeSpline, SampleClosedSpline: sampleClosedSpline }; var parent, tubeGeometry, mesh; var params = { spline: 'GrannyKnot', scale: 4, extrusionSegments: 100, radiusSegments: 3, closed: true, animationView: false, lookAhead: false, cameraHelper: false, }; var material = new THREE.MeshLambertMaterial( { color: 0xff00ff } ); var wireframeMaterial = new THREE.MeshBasicMaterial( { color: 0x000000, opacity: 0.3, wireframe: true, transparent: true } ); function addTube() { if ( mesh !== undefined ) { parent.remove( mesh ); mesh.geometry.dispose(); } var extrudePath = splines[ params.spline ]; tubeGeometry = new THREE.TubeBufferGeometry( extrudePath, params.extrusionSegments, 2, params.radiusSegments, params.closed ); addGeometry( tubeGeometry ); setScale(); } function setScale() { mesh.scale.set( params.scale, params.scale, params.scale ); } function addGeometry( geometry ) { // 3D shape mesh = new THREE.Mesh( geometry, material ); var wireframe = new THREE.Mesh( geometry, wireframeMaterial ); mesh.add( wireframe ); parent.add( mesh ); } function animateCamera() { cameraHelper.visible = params.cameraHelper; cameraEye.visible = params.cameraHelper; } init(); animate(); function init() { // RAB, 2019-05-15, renamed "container" id to "three-js-splines" container = document.getElementById( 'threejs-splines' ); // camera camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 0.01, 10000 ); camera.position.set( 0, 50, 500 ); // scene scene = new THREE.Scene(); scene.background = new THREE.Color( 0xf0f0f0 ); // light var light = new THREE.DirectionalLight( 0xffffff ); light.position.set( 0, 0, 1 ); scene.add( light ); // tube parent = new THREE.Object3D(); scene.add( parent ); splineCamera = new THREE.PerspectiveCamera( 84, window.innerWidth / window.innerHeight, 0.01, 1000 ); parent.add( splineCamera ); cameraHelper = new THREE.CameraHelper( splineCamera ); scene.add( cameraHelper ); addTube(); // debug camera cameraEye = new THREE.Mesh( new THREE.SphereBufferGeometry( 5 ), new THREE.MeshBasicMaterial( { color: 0xdddddd } ) ); parent.add( cameraEye ); cameraHelper.visible = params.cameraHelper; cameraEye.visible = params.cameraHelper; // renderer renderer = new THREE.WebGLRenderer( { antialias: true } ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); container.appendChild( renderer.domElement ); // stats // RAB, 2019-05-15, trash stats window // requires https://threejs.org/examples/js/libs/stats.min.js //stats = new Stats(); //container.appendChild( stats.dom ); // dat.GUI var gui = new dat.GUI( { width: 300 } ); var folderGeometry = gui.addFolder( 'Geometry' ); folderGeometry.add( params, 'spline', Object.keys( splines ) ).onChange( function () { addTube(); } ); folderGeometry.add( params, 'scale', 2, 10 ).step( 2 ).onChange( function () { setScale(); } ); folderGeometry.add( params, 'extrusionSegments', 50, 500 ).step( 50 ).onChange( function () { addTube(); } ); folderGeometry.add( params, 'radiusSegments', 2, 12 ).step( 1 ).onChange( function () { addTube(); } ); folderGeometry.add( params, 'closed' ).onChange( function () { addTube(); } ); folderGeometry.open(); var folderCamera = gui.addFolder( 'Camera' ); folderCamera.add( params, 'animationView' ).onChange( function () { animateCamera(); } ); folderCamera.add( params, 'lookAhead' ).onChange( function () { animateCamera(); } ); folderCamera.add( params, 'cameraHelper' ).onChange( function () { animateCamera(); } ); folderCamera.open(); var controls = new THREE.OrbitControls( camera, renderer.domElement ); window.addEventListener( 'resize', onWindowResize, false ); // RAB, 2019-05-15 open without controls on top of everything gui.close() } function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize( window.innerWidth, window.innerHeight ); } // function animate() { requestAnimationFrame( animate ); render(); // DBW, 2019-06-20, stats window was removed, don't update //stats.update(); } function render() { // animate camera along spline var time = Date.now(); var looptime = 20 * 1000; var t = ( time % looptime ) / looptime; var pos = tubeGeometry.parameters.path.getPointAt( t ); pos.multiplyScalar( params.scale ); // interpolation var segments = tubeGeometry.tangents.length; var pickt = t * segments; var pick = Math.floor( pickt ); var pickNext = ( pick + 1 ) % segments; binormal.subVectors( tubeGeometry.binormals[ pickNext ], tubeGeometry.binormals[ pick ] ); binormal.multiplyScalar( pickt - pick ).add( tubeGeometry.binormals[ pick ] ); var dir = tubeGeometry.parameters.path.getTangentAt( t ); var offset = 15; normal.copy( binormal ).cross( dir ); // we move on a offset on its binormal pos.add( normal.clone().multiplyScalar( offset ) ); splineCamera.position.copy( pos ); cameraEye.position.copy( pos ); // using arclength for stablization in look ahead var lookAt = tubeGeometry.parameters.path.getPointAt( ( t + 30 / tubeGeometry.parameters.path.getLength() ) % 1 ).multiplyScalar( params.scale ); // camera orientation 2 - up orientation via normal if ( ! params.lookAhead ) lookAt.copy( pos ).add( dir ); splineCamera.matrix.lookAt( splineCamera.position, lookAt, normal ); splineCamera.rotation.setFromRotationMatrix( splineCamera.matrix, splineCamera.rotation.order ); cameraHelper.update(); renderer.render( scene, params.animationView === true ? splineCamera : camera ); } ================================================ FILE: examples/sample-article/media/favicon/README.md ================================================ This favicon is the test image from [https://realfavicongenerator.net/](RealFaviconGenerator). ================================================ FILE: examples/sample-article/media/iframe/sage-jupyter.html ================================================ ================================================ FILE: examples/sample-article/media/images/complete-graph.tex ================================================ % A complete graph % Author: Quintin Jean-Noël % \documentclass{article} \usepackage{tikz} %%%< \usepackage{verbatim} \usepackage{verbatim} \usepackage[active,tightpage]{preview} \PreviewEnvironment{tikzpicture} \setlength\PreviewBorder{5pt}% %%%> \begin{comment} :Title: A complete graph :Tags: Foreach;Graphs;To paths :Author: Jean-Noël Quintin :Slug: complete-graph \end{comment} \usetikzlibrary[topaths] % A counter, since TikZ is not clever enough (yet) to handle % arbitrary angle systems. \newcount\mycount \begin{document} \begin{tikzpicture}[transform shape] %the multiplication with floats is not possible. Thus I split the loop in two. \foreach \number in {1,...,8}{ % Computer angle: \mycount=\number \advance\mycount by -1 \multiply\mycount by 45 \advance\mycount by 0 \node[draw,circle,inner sep=0.25cm] (N-\number) at (\the\mycount:5.4cm) {}; } \foreach \number in {9,...,16}{ % Computer angle: \mycount=\number \advance\mycount by -1 \multiply\mycount by 45 \advance\mycount by 22.5 \node[draw,circle,inner sep=0.25cm] (N-\number) at (\the\mycount:5.4cm) {}; } \foreach \number in {1,...,15}{ \mycount=\number \advance\mycount by 1 \foreach \numbera in {\the\mycount,...,16}{ \path (N-\number) edge[->,bend right=3] (N-\numbera) edge[<-,bend left=3] (N-\numbera); } } \end{tikzpicture} \end{document} ================================================ FILE: examples/sample-article/media/pytutor/happy.json ================================================ {"code": "# From \"Teaching with Python\" by John Zelle\ndef happy():\n print(\"Happy Birthday to you!\")\n\ndef sing(P):\n happy()\n happy()\n print(\"Happy Birthday dear \" + P + \"!\")\n happy()\n\n# main\nsing(\"Fred\")\n", "trace": [{"ordered_globals": [], "stdout": "", "func_name": "", "stack_to_render": [], "globals": {}, "heap": {}, "line": 2, "event": "step_line"}, {"ordered_globals": ["happy"], "stdout": "", "func_name": "", "stack_to_render": [], "globals": {"happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null]}, "line": 5, "event": "step_line"}, {"ordered_globals": ["happy", "sing"], "stdout": "", "func_name": "", "stack_to_render": [], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 12, "event": "step_line"}, {"ordered_globals": ["happy", "sing"], "stdout": "", "func_name": "sing", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": true, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 5, "event": "call"}, {"ordered_globals": ["happy", "sing"], "stdout": "", "func_name": "sing", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": true, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 6, "event": "step_line"}, {"ordered_globals": ["happy", "sing"], "stdout": "", "func_name": "happy", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": false, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}, {"frame_id": 2, "encoded_locals": {}, "is_highlighted": true, "is_parent": false, "func_name": "happy", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "happy_f2", "ordered_varnames": []}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 2, "event": "call"}, {"ordered_globals": ["happy", "sing"], "stdout": "", "func_name": "happy", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": false, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}, {"frame_id": 2, "encoded_locals": {}, "is_highlighted": true, "is_parent": false, "func_name": "happy", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "happy_f2", "ordered_varnames": []}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 3, "event": "step_line"}, {"ordered_globals": ["happy", "sing"], "stdout": "Happy Birthday to you!\n", "func_name": "happy", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": false, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}, {"frame_id": 2, "encoded_locals": {"__return__": null}, "is_highlighted": true, "is_parent": false, "func_name": "happy", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "happy_f2", "ordered_varnames": ["__return__"]}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 3, "event": "return"}, {"ordered_globals": ["happy", "sing"], "stdout": "Happy Birthday to you!\n", "func_name": "sing", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": true, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 7, "event": "step_line"}, {"ordered_globals": ["happy", "sing"], "stdout": "Happy Birthday to you!\n", "func_name": "happy", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": false, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}, {"frame_id": 3, "encoded_locals": {}, "is_highlighted": true, "is_parent": false, "func_name": "happy", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "happy_f3", "ordered_varnames": []}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 2, "event": "call"}, {"ordered_globals": ["happy", "sing"], "stdout": "Happy Birthday to you!\n", "func_name": "happy", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": false, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}, {"frame_id": 3, "encoded_locals": {}, "is_highlighted": true, "is_parent": false, "func_name": "happy", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "happy_f3", "ordered_varnames": []}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 3, "event": "step_line"}, {"ordered_globals": ["happy", "sing"], "stdout": "Happy Birthday to you!\nHappy Birthday to you!\n", "func_name": "happy", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": false, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}, {"frame_id": 3, "encoded_locals": {"__return__": null}, "is_highlighted": true, "is_parent": false, "func_name": "happy", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "happy_f3", "ordered_varnames": ["__return__"]}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 3, "event": "return"}, {"ordered_globals": ["happy", "sing"], "stdout": "Happy Birthday to you!\nHappy Birthday to you!\n", "func_name": "sing", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": true, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 8, "event": "step_line"}, {"ordered_globals": ["happy", "sing"], "stdout": "Happy Birthday to you!\nHappy Birthday to you!\nHappy Birthday dear Fred!\n", "func_name": "sing", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": true, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 9, "event": "step_line"}, {"ordered_globals": ["happy", "sing"], "stdout": "Happy Birthday to you!\nHappy Birthday to you!\nHappy Birthday dear Fred!\n", "func_name": "happy", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": false, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}, {"frame_id": 4, "encoded_locals": {}, "is_highlighted": true, "is_parent": false, "func_name": "happy", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "happy_f4", "ordered_varnames": []}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 2, "event": "call"}, {"ordered_globals": ["happy", "sing"], "stdout": "Happy Birthday to you!\nHappy Birthday to you!\nHappy Birthday dear Fred!\n", "func_name": "happy", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": false, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}, {"frame_id": 4, "encoded_locals": {}, "is_highlighted": true, "is_parent": false, "func_name": "happy", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "happy_f4", "ordered_varnames": []}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 3, "event": "step_line"}, {"ordered_globals": ["happy", "sing"], "stdout": "Happy Birthday to you!\nHappy Birthday to you!\nHappy Birthday dear Fred!\nHappy Birthday to you!\n", "func_name": "happy", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"P": "Fred"}, "is_highlighted": false, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P"]}, {"frame_id": 4, "encoded_locals": {"__return__": null}, "is_highlighted": true, "is_parent": false, "func_name": "happy", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "happy_f4", "ordered_varnames": ["__return__"]}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 3, "event": "return"}, {"ordered_globals": ["happy", "sing"], "stdout": "Happy Birthday to you!\nHappy Birthday to you!\nHappy Birthday dear Fred!\nHappy Birthday to you!\n", "func_name": "sing", "stack_to_render": [{"frame_id": 1, "encoded_locals": {"__return__": null, "P": "Fred"}, "is_highlighted": true, "is_parent": false, "func_name": "sing", "is_zombie": false, "parent_frame_id_list": [], "unique_hash": "sing_f1", "ordered_varnames": ["P", "__return__"]}], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 9, "event": "return"}, {"ordered_globals": ["happy", "sing"], "stdout": "Happy Birthday to you!\nHappy Birthday to you!\nHappy Birthday dear Fred!\nHappy Birthday to you!\n", "func_name": "", "stack_to_render": [], "globals": {"sing": ["REF", 2], "happy": ["REF", 1]}, "heap": {"1": ["FUNCTION", "happy()", null], "2": ["FUNCTION", "sing(P)", null]}, "line": 12, "event": "return"}]} ================================================ FILE: examples/sample-article/media/stack/01_integration_with_feedback.xml ================================================ Integration Find \[ \int {@p@} d{@v@}\] [[input:ans1]] [[validation:ans1]]

    ]]>
    We can either do this question by inspection (i.e. spot the answer) or in a more formal manner by using the substitution \[ u = ({@v@}-{@a@}).\] Then, since \(\frac{d}{d{@v@}}u=1\) we have \[ \int {@p@} d{@v@} = \int u^{@n@} du = \frac{u^{@n+1@}}{@n+1@}+c = {@ta@}+c.\]

    ]]>
    1 0.1 0 2025030700 n:rand(5)+3; a:rand(5)+3; v:x p:(v-a)^n; ta:(v-a)^(n+1)/(n+1); [[feedback:prt1]]

    ]]>
    \(\int {@p@} d{@v@} = {@ta@}+c\) 1 0 0 . *10 dot 1 i cos-1 lang [ ans1 algebraic ta+c 20 1 0 0 int 1 1 1 1 1 prt1 1.0000000 1 1 0 Int ans1 ta v 0 = 1 -1 1-0-T = 0 -1 1-0-F 1001758021 165520961 1575780430 1893097548 196914510 119069312 2028726687 788370893 400217408 1304537090 1439331987 193373653 1 ans1 ta+c prt1 1.0000000 0.0000000 1-0-T 2 ans1 ta prt1 0.0000000 0.1000000 1-0-F 3 ans1 ev(n*(v-a)^(n-1),simp) prt1 0.0000000 0.1000000 1-0-F 4 ans1 (v-a)^(n+1) prt1 0.0000000 0.1000000 1-0-F 5 ans1 ev(float(ta),simp) prt1 NULL
    ================================================ FILE: examples/sample-article/media/stack/Adding-vectors-in-triangles.xml ================================================ 9.1.5.4 Adding vectors in triangles Exercise

    In triangle \(OAB\) the point \(P\) divides \(AB\) internally in the ratio \(m:n\).

    If \(\overrightarrow{OA} = \underline{a}\) and \(\overrightarrow{OB} = \underline{b}\), then find an expression for \(\overrightarrow{OP}\) in terms of \(\underline{a}\) and \(\underline{b}\).

    You might find it helpful to draw a diagram showing this triangle.

    \(\overrightarrow{OP} = \) [[input:ans1]] [[validation:ans1]] [[feedback:prt1]]

    ]]>
    The figure below shows the triangle with the vector \(\overrightarrow{OP}\) marked with a dotted line within.

    A triangle OAB with vectors a and b marked on the edges OA and OB respectively. The point P is marked partway along the edge AB and a dotted line marks the vector OP through the middle of the triangle.

    From the diagram we can see \(\overrightarrow{OP} = \overrightarrow{OA} + \overrightarrow{AP}\).  We are told \(\overrightarrow{OA} = \underline{a}\) and so we need to find \(\overrightarrow{AP}\).  We know that \(P\) divides \(\overrightarrow{AB}\) in the ratio \(m:n\) so \[\overrightarrow{AP} = \frac{m}{m+n}\left(\overrightarrow{AB}\right),\] as \[\overrightarrow{AB} = \underline{b} - \underline{a}\] we find \[\overrightarrow{AP} = \frac{m}{m+n}\left(\underline{b} - \underline{a}\right)\] and therefore, \[\overrightarrow{OP} = \underline{a} + \frac{m}{m+n}\left(\underline{b} - \underline{a}\right).\]

    Note: You can arrive at an equivalent expression by starting from \(\overrightarrow{OP} = \overrightarrow{OB} + \overrightarrow{BP}\).


    ]]>
    PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgaWQ9InN2ZzgiCiAgIHZlcnNpb249IjEuMSIKICAgdmlld0JveD0iMCAwIDEyMC40NjA1NiA4MC44MzEyMjMiCiAgIGhlaWdodD0iODAuODMxMjIzbW0iCiAgIHdpZHRoPSIxMjAuNDYwNTZtbSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczIiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzEuODI1NjcsLTU1LjI5NDQ3NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgxMCIKICAgICAgIGQ9Ik0gMzguOTMxNTQ4LDEyNS4wMjA4MyBDIDExMC43NDcwMiw2MS41MjA4MzEgMTEwLjc0NzAyLDYxLjUyMDgzMSAxMTAuNzQ3MDIsNjEuNTIwODMxIHYgMCAwIGMgMzYuMjg1NzIsNjMuNDk5OTk5IDM2LjI4NTcyLDYzLjQ5OTk5OSAzNi4yODU3Miw2My40OTk5OTkgdiAwIDAgeiIKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjY0NTgzMzJweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTI3OTE4MTYiCiAgICAgICBkPSJtIDc2LjYyNDk2Nyw5MS41ODE1NTMgLTEuNTg4MjAxLC0wLjY4ODgwNSAwLjAyMDMsLTAuMDYyMDIgMi40NzkyOTgsLTAuNzI1OTM3IGMgMC43NzY1MDksLTAuMzgwMjM4IDEuNTUxMDMxLC0wLjc2MDQ5MiAyLjMyNzU0LC0xLjE0MDczMSAtMC41NTY1ODEsMC42OTY5MjMgLTEuMTEzMTYyLDEuMzkzODQ4IC0xLjY2OTc0MywyLjA5MDc3MSBsIC0xLjM0NjMzNiwyLjM2NTMzNSAtMC4wNTM2NiwwLjAxMjUyIC0wLjE2OTE4OSwtMS44NTEwOSIKICAgICAgIGlkPSJwYXRoMTAxMSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjUyNzkxODE2IgogICAgICAgZD0ibSA5Ny40NTYzMzIsMTI1LjI3MTE1IC0wLjkzNDg0NSwtMS40NTcwMiAwLjA1MTQxLC0wLjA0MDIgMi40NjMxNjIsMC43Nzg5MyBjIDAuODU2NjUzLDAuMTE3MDMgMS43MTE2NjEsMC4yMzI5MyAyLjU2ODMxMSwwLjM0OTk2IC0wLjg1MDUzLDAuMjY4NDggLTEuNzAxMDU1LDAuNTM2OTggLTIuNTUxNTgyLDAuODA1NDYgbCAtMi40MzYwNjUsMS4yMTM2NyAtMC4wNTE1MiwtMC4wMTk1IDAuODkxMTE4LC0xLjYzMTI4IgogICAgICAgaWQ9InBhdGgxMDExLTMiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgzMyIKICAgICAgIGQ9Ik0gMzguOTMxNTQ4LDEyNS4wMjA4MyBDIDEzNC4wMzU2NywxMDIuNTYxNDIgMTM0LjAzNTY3LDEwMi41NjE0MiAxMzQuMDM1NjcsMTAyLjU2MTQyIgogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNjQ5OTk5OTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6Mi4xMTk5OTk5LCAxLjA1OTk5OTk1O3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjUyNzkxODE2IgogICAgICAgZD0ibSA5NS4wODk2NTksMTExLjk0OTI4IC0xLjE5NzY0NCwtMS4yNSAwLjA0MjcyLC0wLjA0OTMgMi41NjY5OTQsMC4yOTA2IGMgMC44NjMxNjMsLTAuMDQ5OSAxLjcyNDUwNCwtMC4xMDA2MyAyLjU4NzY3LC0wLjE1MDU2IC0wLjc4MzAwMywwLjQyNzA4IC0xLjU2NjAwNSwwLjg1NDE1IC0yLjM0OTAwNSwxLjI4MTIzIGwgLTIuMTU3MTI1LDEuNjU5NTkgLTAuMDU0MywtMC4wMSAwLjU2MDY5NywtMS43NzIyMyIKICAgICAgIGlkPSJwYXRoMTAxMS02IiAvPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0ODUzIgogICAgICAgeT0iMTI4LjA4NTY2IgogICAgICAgeD0iMzEuNTM3ODA0IgogICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjguNDY2NjY2MjJweDtsaW5lLWhlaWdodDoxLjI1O2ZvbnQtZmFtaWx5OidUZVggR3lyZSBUZXJtZXMgTWF0aCc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVGVYIEd5cmUgVGVybWVzIE1hdGgsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNjQ1ODMzMiIKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6OC40NjY2NjYyMnB4O2ZvbnQtZmFtaWx5OidUZVggR3lyZSBUZXJtZXMgTWF0aCc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVGVYIEd5cmUgVGVybWVzIE1hdGgsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O3N0cm9rZS13aWR0aDowLjI2NDU4MzMyIgogICAgICAgICB5PSIxMjguMDg1NjYiCiAgICAgICAgIHg9IjMxLjUzNzgwNCIKICAgICAgICAgaWQ9InRzcGFuODUxIj5PPC90c3Bhbj48L3RleHQ+CiAgICA8dGV4dAogICAgICAgaWQ9InRleHQ4NTciCiAgICAgICB5PSI2MS4wMDEwMDciCiAgICAgICB4PSIxMDguMzc3OCIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZToxMC41ODMzMzMwMnB4O2xpbmUtaGVpZ2h0OjEuMjU7Zm9udC1mYW1pbHk6J1RlWCBHeXJlIFRlcm1lcyBNYXRoJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidUZVggR3lyZSBUZXJtZXMgTWF0aCwgTm9ybWFsJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMyIgogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHRzcGFuCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo4LjQ2NjY2NjIycHg7Zm9udC1mYW1pbHk6J1RlWCBHeXJlIFRlcm1lcyBNYXRoJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidUZVggR3lyZSBUZXJtZXMgTWF0aCwgTm9ybWFsJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7c3Ryb2tlLXdpZHRoOjAuMjY0NTgzMzIiCiAgICAgICAgIHk9IjYxLjAwMTAwNyIKICAgICAgICAgeD0iMTA4LjM3NzgiCiAgICAgICAgIGlkPSJ0c3Bhbjg1NSI+QTwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0ODYxIgogICAgICAgeT0iMTI3LjgxODM5IgogICAgICAgeD0iMTQ3LjI2NTUiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6OC40NjY2NjYyMnB4O2xpbmUtaGVpZ2h0OjEuMjU7Zm9udC1mYW1pbHk6J1RlWCBHeXJlIFRlcm1lcyBNYXRoJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidUZVggR3lyZSBUZXJtZXMgTWF0aCwgTm9ybWFsJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMyIgogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHRzcGFuCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo4LjQ2NjY2NjIycHg7Zm9udC1mYW1pbHk6J1RlWCBHeXJlIFRlcm1lcyBNYXRoJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidUZVggR3lyZSBUZXJtZXMgTWF0aCwgTm9ybWFsJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7c3Ryb2tlLXdpZHRoOjAuMjY0NTgzMzIiCiAgICAgICAgIHk9IjEyNy44MTgzOSIKICAgICAgICAgeD0iMTQ3LjI2NTUiCiAgICAgICAgIGlkPSJ0c3Bhbjg1OSI+QjwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0ODY1IgogICAgICAgeT0iMTAyLjgyODY5IgogICAgICAgeD0iMTM1LjM3MjAxIgogICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjguNDY2NjY2MjJweDtsaW5lLWhlaWdodDoxLjI1O2ZvbnQtZmFtaWx5OidUZVggR3lyZSBUZXJtZXMgTWF0aCc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVGVYIEd5cmUgVGVybWVzIE1hdGgsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNjQ1ODMzMiIKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6OC40NjY2NjYyMnB4O2ZvbnQtZmFtaWx5OidUZVggR3lyZSBUZXJtZXMgTWF0aCc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVGVYIEd5cmUgVGVybWVzIE1hdGgsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O3N0cm9rZS13aWR0aDowLjI2NDU4MzMyIgogICAgICAgICB5PSIxMDIuODI4NjkiCiAgICAgICAgIHg9IjEzNS4zNzIwMSIKICAgICAgICAgaWQ9InRzcGFuODYzIj5QPC90c3Bhbj48L3RleHQ+CiAgICA8ZwogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlkPSJnMjYxOSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDMuMjYyNTA4OCwwLDAsMi43OTU4MDQ4LC01MzkuNzc2MywxMy43MDIxMjcpIj4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNjQ1ODMzMywwLDAsMC4yNjQ1ODMzMywxODcuMzE3MjksMjYuMzUzNDAxKSIKICAgICAgICAgaWQ9InVzZTI2MTciPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgaWQ9InBhdGg4NzciCiAgICAgICAgICAgZD0iTSA0LjQ2ODc1LC00LjUzMTI1IEMgNC4yNjU2MjUsLTQuOTg0Mzc1IDMuOTA2MjUsLTUuMjk2ODc1IDMuMzc1LC01LjI5Njg3NSBjIC0xLjQwNjI1LDAgLTIuODkwNjI1LDEuNzUgLTIuODkwNjI1LDMuNTE1NjI1IDAsMS4xMjUgMC42NTYyNSwxLjkwNjI1IDEuNTkzNzUsMS45MDYyNSAwLjIzNDM3NSwwIDAuODQzNzUsLTAuMDQ2ODc1IDEuNTYyNSwtMC44OTA2MjUgMC4wOTM3NSwwLjUgMC41MTU2MjUsMC44OTA2MjUgMS4wOTM3NSwwLjg5MDYyNSAwLjQwNjI1LDAgMC42ODc1LC0wLjI2NTYyNSAwLjg3NSwtMC42NTYyNSAwLjIwMzEyNSwtMC40MjE4NzUgMC4zNTkzNzUsLTEuMTU2MjUgMC4zNTkzNzUsLTEuMTg3NSAwLC0wLjEyNSAtMC4wOTM3NSwtMC4xMjUgLTAuMTQwNjI1LC0wLjEyNSAtMC4xMDkzNzUsMCAtMC4xMjUsMC4wNjI1IC0wLjE3MTg3NSwwLjIxODc1IC0wLjIwMzEyNSwwLjc4MTI1IC0wLjQwNjI1LDEuNSAtMC45MDYyNSwxLjUgLTAuMzI4MTI1LDAgLTAuMzU5Mzc1LC0wLjMxMjUgLTAuMzU5Mzc1LC0wLjU2MjUgMCwtMC4yNjU2MjUgMC4wMzEyNSwtMC4zNTkzNzUgMC4xNTYyNSwtMC44OTA2MjUgMC4xNDA2MjUsLTAuNSAwLjE1NjI1LC0wLjYyNSAwLjI2NTYyNSwtMS4wNzgxMjUgMC4yMDMxMjUsLTAuNzY1NjI1IDAuMjUsLTAuOTg0Mzc1IDAuNDM3NSwtMS42NzE4NzUgMC4wNzgxMjUsLTAuMzQzNzUgMC4wNzgxMjUsLTAuMzU5Mzc1IDAuMDc4MTI1LC0wLjQwNjI1IDAsLTAuMjAzMTI1IC0wLjE0MDYyNSwtMC4zMjgxMjUgLTAuMzQzNzUsLTAuMzI4MTI1IC0wLjI5Njg3NSwwIC0wLjQ2ODc1LDAuMjY1NjI1IC0wLjUxNTYyNSwwLjUzMTI1IHogbSAtMC43NjU2MjUsMy4xMDkzNzUgYyAtMC4wNjI1LDAuMjAzMTI1IC0wLjA2MjUsMC4yMzQzNzUgLTAuMjUsMC40Mzc1IEMgMi45MjE4NzUsLTAuMzI4MTI1IDIuNDM3NSwtMC4xMjUgMi4wOTM3NSwtMC4xMjUgMS41LC0wLjEyNSAxLjMyODEyNSwtMC43OTY4NzUgMS4zMjgxMjUsLTEuMjY1NjI1IGMgMCwtMC41OTM3NSAwLjM5MDYyNSwtMi4wNzgxMjUgMC42NTYyNSwtMi42MjUgMC4zNzUsLTAuNzAzMTI1IDAuOTIxODc1LC0xLjE1NjI1IDEuNDA2MjUsLTEuMTU2MjUgMC43NjU2MjUsMCAwLjkzNzUsMC45ODQzNzUgMC45Mzc1LDEuMDYyNSAwLDAuMDc4MTI1IC0wLjAxNTYyNSwwLjE0MDYyNSAtMC4wMzEyNSwwLjIwMzEyNSB6IG0gMCwwIgogICAgICAgICAgIHN0eWxlPSJzdHJva2U6bm9uZSIgLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuODkzNDgzMDQiCiAgICAgICBkPSJtIDcyLjE4ODkwNyw4OC43MTE5OTcgaCAyLjk4NTMzIHYgLTAuNTU1NTM2IGggLTIuOTg1MzMgeiBtIDAsMCIKICAgICAgIGlkPSJwYXRoMjYyMSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjIwMjI4MjQzIgogICAgICAgZD0ibSA5OC41NDc1ODYsMTM1LjQ1MDYgaCAzLjY0NTczNCB2IDAuNjc1MSBoIC0zLjY0NTczNCB6IG0gMCwwIgogICAgICAgaWQ9InBhdGgxNDg1IiAvPgogICAgPGcKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0iZzE0ODMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgzLjc3OTQ0MzcsMCwwLDIuNjgzMDM3MywtMjc2LjA2MjI2LC0zNS4zNjcyOTIpIj4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNjQ1ODMzMywwLDAsMC4yNjQ1ODMzMyw5OSw2My40MDcyKSIKICAgICAgICAgaWQ9InVzZTE0ODEiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgaWQ9InBhdGg5MDMiCiAgICAgICAgICAgZD0ibSAyLjg3NSwtOC4yMDMxMjUgYyAwLDAgMCwtMC4xMjUgLTAuMTU2MjUsLTAuMTI1IC0wLjI4MTI1LDAgLTEuMTU2MjUsMC4wOTM3NSAtMS40Njg3NSwwLjEyNSAtMC4wOTM3NSwwIC0wLjIzNDM3NSwwLjAxNTYyNSAtMC4yMzQzNzUsMC4yMzQzNzUgMCwwLjE0MDYyNSAwLjEwOTM3NSwwLjE0MDYyNSAwLjI5Njg3NSwwLjE0MDYyNSAwLjU3ODEyNSwwIDAuNTkzNzUsMC4wOTM3NSAwLjU5Mzc1LDAuMjAzMTI1IDAsMC4wOTM3NSAtMC4xMDkzNzUsMC41IC0wLjE3MTg3NSwwLjc1IEwgMC43NSwtMi45Njg3NSBDIDAuNjA5Mzc1LC0yLjM1OTM3NSAwLjU2MjUsLTIuMTcxODc1IDAuNTYyNSwtMS43NSBjIDAsMS4xNDA2MjUgMC42NDA2MjUsMS44NzUgMS41MzEyNSwxLjg3NSAxLjQwNjI1LDAgMi44OTA2MjUsLTEuNzgxMjUgMi44OTA2MjUsLTMuNTE1NjI1IDAsLTEuMDc4MTI1IC0wLjY0MDYyNSwtMS45MDYyNSAtMS41OTM3NSwtMS45MDYyNSAtMC41NjI1LDAgLTEuMDQ2ODc1LDAuMzQzNzUgLTEuNDA2MjUsMC43MTg3NSB6IE0gMS43MzQzNzUsLTMuNjU2MjUgYyAwLjA3ODEyNSwtMC4yNjU2MjUgMC4wNzgxMjUsLTAuMjk2ODc1IDAuMTg3NSwtMC40MjE4NzUgMC41OTM3NSwtMC43ODEyNSAxLjEyNSwtMC45Njg3NSAxLjQzNzUsLTAuOTY4NzUgMC40Mzc1LDAgMC43NSwwLjM1OTM3NSAwLjc1LDEuMTQwNjI1IDAsMC43MDMxMjUgLTAuMzkwNjI1LDIuMDc4MTI1IC0wLjYwOTM3NSwyLjUzMTI1IC0wLjM5MDYyNSwwLjgxMjUgLTAuOTM3NSwxLjI1IC0xLjQwNjI1LDEuMjUgLTAuNDA2MjUsMCAtMC44MTI1LC0wLjMyODEyNSAtMC44MTI1LC0xLjIxODc1IDAsLTAuMjM0Mzc1IDAsLTAuNDUzMTI1IDAuMTg3NSwtMS4yMTg3NSB6IG0gMCwwIgogICAgICAgICAgIHN0eWxlPSJzdHJva2U6bm9uZSIgLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==
    1 0.1 0 2021072200 oa:a; ob:b; ab: ob-oa; ap: ab*(m/(m+n)); op: oa+ap; ta: op; PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgaWQ9InN2ZzgiCiAgIHZlcnNpb249IjEuMSIKICAgdmlld0JveD0iMCAwIDEyMC40NjA1NiA4MC44MzEyMjMiCiAgIGhlaWdodD0iODAuODMxMjIzbW0iCiAgIHdpZHRoPSIxMjAuNDYwNTZtbSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczIiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzEuODI1NjcsLTU1LjI5NDQ3NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgxMCIKICAgICAgIGQ9Ik0gMzguOTMxNTQ4LDEyNS4wMjA4MyBDIDExMC43NDcwMiw2MS41MjA4MzEgMTEwLjc0NzAyLDYxLjUyMDgzMSAxMTAuNzQ3MDIsNjEuNTIwODMxIHYgMCAwIGMgMzYuMjg1NzIsNjMuNDk5OTk5IDM2LjI4NTcyLDYzLjQ5OTk5OSAzNi4yODU3Miw2My40OTk5OTkgdiAwIDAgeiIKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjY0NTgzMzJweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTI3OTE4MTYiCiAgICAgICBkPSJtIDc2LjYyNDk2Nyw5MS41ODE1NTMgLTEuNTg4MjAxLC0wLjY4ODgwNSAwLjAyMDMsLTAuMDYyMDIgMi40NzkyOTgsLTAuNzI1OTM3IGMgMC43NzY1MDksLTAuMzgwMjM4IDEuNTUxMDMxLC0wLjc2MDQ5MiAyLjMyNzU0LC0xLjE0MDczMSAtMC41NTY1ODEsMC42OTY5MjMgLTEuMTEzMTYyLDEuMzkzODQ4IC0xLjY2OTc0MywyLjA5MDc3MSBsIC0xLjM0NjMzNiwyLjM2NTMzNSAtMC4wNTM2NiwwLjAxMjUyIC0wLjE2OTE4OSwtMS44NTEwOSIKICAgICAgIGlkPSJwYXRoMTAxMSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjUyNzkxODE2IgogICAgICAgZD0ibSA5Ny40NTYzMzIsMTI1LjI3MTE1IC0wLjkzNDg0NSwtMS40NTcwMiAwLjA1MTQxLC0wLjA0MDIgMi40NjMxNjIsMC43Nzg5MyBjIDAuODU2NjUzLDAuMTE3MDMgMS43MTE2NjEsMC4yMzI5MyAyLjU2ODMxMSwwLjM0OTk2IC0wLjg1MDUzLDAuMjY4NDggLTEuNzAxMDU1LDAuNTM2OTggLTIuNTUxNTgyLDAuODA1NDYgbCAtMi40MzYwNjUsMS4yMTM2NyAtMC4wNTE1MiwtMC4wMTk1IDAuODkxMTE4LC0xLjYzMTI4IgogICAgICAgaWQ9InBhdGgxMDExLTMiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgzMyIKICAgICAgIGQ9Ik0gMzguOTMxNTQ4LDEyNS4wMjA4MyBDIDEzNC4wMzU2NywxMDIuNTYxNDIgMTM0LjAzNTY3LDEwMi41NjE0MiAxMzQuMDM1NjcsMTAyLjU2MTQyIgogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNjQ5OTk5OTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6Mi4xMTk5OTk5LCAxLjA1OTk5OTk1O3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjUyNzkxODE2IgogICAgICAgZD0ibSA5NS4wODk2NTksMTExLjk0OTI4IC0xLjE5NzY0NCwtMS4yNSAwLjA0MjcyLC0wLjA0OTMgMi41NjY5OTQsMC4yOTA2IGMgMC44NjMxNjMsLTAuMDQ5OSAxLjcyNDUwNCwtMC4xMDA2MyAyLjU4NzY3LC0wLjE1MDU2IC0wLjc4MzAwMywwLjQyNzA4IC0xLjU2NjAwNSwwLjg1NDE1IC0yLjM0OTAwNSwxLjI4MTIzIGwgLTIuMTU3MTI1LDEuNjU5NTkgLTAuMDU0MywtMC4wMSAwLjU2MDY5NywtMS43NzIyMyIKICAgICAgIGlkPSJwYXRoMTAxMS02IiAvPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0ODUzIgogICAgICAgeT0iMTI4LjA4NTY2IgogICAgICAgeD0iMzEuNTM3ODA0IgogICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjguNDY2NjY2MjJweDtsaW5lLWhlaWdodDoxLjI1O2ZvbnQtZmFtaWx5OidUZVggR3lyZSBUZXJtZXMgTWF0aCc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVGVYIEd5cmUgVGVybWVzIE1hdGgsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNjQ1ODMzMiIKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6OC40NjY2NjYyMnB4O2ZvbnQtZmFtaWx5OidUZVggR3lyZSBUZXJtZXMgTWF0aCc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVGVYIEd5cmUgVGVybWVzIE1hdGgsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O3N0cm9rZS13aWR0aDowLjI2NDU4MzMyIgogICAgICAgICB5PSIxMjguMDg1NjYiCiAgICAgICAgIHg9IjMxLjUzNzgwNCIKICAgICAgICAgaWQ9InRzcGFuODUxIj5PPC90c3Bhbj48L3RleHQ+CiAgICA8dGV4dAogICAgICAgaWQ9InRleHQ4NTciCiAgICAgICB5PSI2MS4wMDEwMDciCiAgICAgICB4PSIxMDguMzc3OCIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZToxMC41ODMzMzMwMnB4O2xpbmUtaGVpZ2h0OjEuMjU7Zm9udC1mYW1pbHk6J1RlWCBHeXJlIFRlcm1lcyBNYXRoJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidUZVggR3lyZSBUZXJtZXMgTWF0aCwgTm9ybWFsJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMyIgogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHRzcGFuCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo4LjQ2NjY2NjIycHg7Zm9udC1mYW1pbHk6J1RlWCBHeXJlIFRlcm1lcyBNYXRoJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidUZVggR3lyZSBUZXJtZXMgTWF0aCwgTm9ybWFsJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7c3Ryb2tlLXdpZHRoOjAuMjY0NTgzMzIiCiAgICAgICAgIHk9IjYxLjAwMTAwNyIKICAgICAgICAgeD0iMTA4LjM3NzgiCiAgICAgICAgIGlkPSJ0c3Bhbjg1NSI+QTwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0ODYxIgogICAgICAgeT0iMTI3LjgxODM5IgogICAgICAgeD0iMTQ3LjI2NTUiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6OC40NjY2NjYyMnB4O2xpbmUtaGVpZ2h0OjEuMjU7Zm9udC1mYW1pbHk6J1RlWCBHeXJlIFRlcm1lcyBNYXRoJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidUZVggR3lyZSBUZXJtZXMgTWF0aCwgTm9ybWFsJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMyIgogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHRzcGFuCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo4LjQ2NjY2NjIycHg7Zm9udC1mYW1pbHk6J1RlWCBHeXJlIFRlcm1lcyBNYXRoJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidUZVggR3lyZSBUZXJtZXMgTWF0aCwgTm9ybWFsJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7c3Ryb2tlLXdpZHRoOjAuMjY0NTgzMzIiCiAgICAgICAgIHk9IjEyNy44MTgzOSIKICAgICAgICAgeD0iMTQ3LjI2NTUiCiAgICAgICAgIGlkPSJ0c3Bhbjg1OSI+QjwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0ODY1IgogICAgICAgeT0iMTAyLjgyODY5IgogICAgICAgeD0iMTM1LjM3MjAxIgogICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjguNDY2NjY2MjJweDtsaW5lLWhlaWdodDoxLjI1O2ZvbnQtZmFtaWx5OidUZVggR3lyZSBUZXJtZXMgTWF0aCc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVGVYIEd5cmUgVGVybWVzIE1hdGgsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNjQ1ODMzMiIKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6OC40NjY2NjYyMnB4O2ZvbnQtZmFtaWx5OidUZVggR3lyZSBUZXJtZXMgTWF0aCc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVGVYIEd5cmUgVGVybWVzIE1hdGgsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O3N0cm9rZS13aWR0aDowLjI2NDU4MzMyIgogICAgICAgICB5PSIxMDIuODI4NjkiCiAgICAgICAgIHg9IjEzNS4zNzIwMSIKICAgICAgICAgaWQ9InRzcGFuODYzIj5QPC90c3Bhbj48L3RleHQ+CiAgICA8ZwogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlkPSJnMjYxOSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDMuMjYyNTA4OCwwLDAsMi43OTU4MDQ4LC01MzkuNzc2MywxMy43MDIxMjcpIj4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNjQ1ODMzMywwLDAsMC4yNjQ1ODMzMywxODcuMzE3MjksMjYuMzUzNDAxKSIKICAgICAgICAgaWQ9InVzZTI2MTciPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgaWQ9InBhdGg4NzciCiAgICAgICAgICAgZD0iTSA0LjQ2ODc1LC00LjUzMTI1IEMgNC4yNjU2MjUsLTQuOTg0Mzc1IDMuOTA2MjUsLTUuMjk2ODc1IDMuMzc1LC01LjI5Njg3NSBjIC0xLjQwNjI1LDAgLTIuODkwNjI1LDEuNzUgLTIuODkwNjI1LDMuNTE1NjI1IDAsMS4xMjUgMC42NTYyNSwxLjkwNjI1IDEuNTkzNzUsMS45MDYyNSAwLjIzNDM3NSwwIDAuODQzNzUsLTAuMDQ2ODc1IDEuNTYyNSwtMC44OTA2MjUgMC4wOTM3NSwwLjUgMC41MTU2MjUsMC44OTA2MjUgMS4wOTM3NSwwLjg5MDYyNSAwLjQwNjI1LDAgMC42ODc1LC0wLjI2NTYyNSAwLjg3NSwtMC42NTYyNSAwLjIwMzEyNSwtMC40MjE4NzUgMC4zNTkzNzUsLTEuMTU2MjUgMC4zNTkzNzUsLTEuMTg3NSAwLC0wLjEyNSAtMC4wOTM3NSwtMC4xMjUgLTAuMTQwNjI1LC0wLjEyNSAtMC4xMDkzNzUsMCAtMC4xMjUsMC4wNjI1IC0wLjE3MTg3NSwwLjIxODc1IC0wLjIwMzEyNSwwLjc4MTI1IC0wLjQwNjI1LDEuNSAtMC45MDYyNSwxLjUgLTAuMzI4MTI1LDAgLTAuMzU5Mzc1LC0wLjMxMjUgLTAuMzU5Mzc1LC0wLjU2MjUgMCwtMC4yNjU2MjUgMC4wMzEyNSwtMC4zNTkzNzUgMC4xNTYyNSwtMC44OTA2MjUgMC4xNDA2MjUsLTAuNSAwLjE1NjI1LC0wLjYyNSAwLjI2NTYyNSwtMS4wNzgxMjUgMC4yMDMxMjUsLTAuNzY1NjI1IDAuMjUsLTAuOTg0Mzc1IDAuNDM3NSwtMS42NzE4NzUgMC4wNzgxMjUsLTAuMzQzNzUgMC4wNzgxMjUsLTAuMzU5Mzc1IDAuMDc4MTI1LC0wLjQwNjI1IDAsLTAuMjAzMTI1IC0wLjE0MDYyNSwtMC4zMjgxMjUgLTAuMzQzNzUsLTAuMzI4MTI1IC0wLjI5Njg3NSwwIC0wLjQ2ODc1LDAuMjY1NjI1IC0wLjUxNTYyNSwwLjUzMTI1IHogbSAtMC43NjU2MjUsMy4xMDkzNzUgYyAtMC4wNjI1LDAuMjAzMTI1IC0wLjA2MjUsMC4yMzQzNzUgLTAuMjUsMC40Mzc1IEMgMi45MjE4NzUsLTAuMzI4MTI1IDIuNDM3NSwtMC4xMjUgMi4wOTM3NSwtMC4xMjUgMS41LC0wLjEyNSAxLjMyODEyNSwtMC43OTY4NzUgMS4zMjgxMjUsLTEuMjY1NjI1IGMgMCwtMC41OTM3NSAwLjM5MDYyNSwtMi4wNzgxMjUgMC42NTYyNSwtMi42MjUgMC4zNzUsLTAuNzAzMTI1IDAuOTIxODc1LC0xLjE1NjI1IDEuNDA2MjUsLTEuMTU2MjUgMC43NjU2MjUsMCAwLjkzNzUsMC45ODQzNzUgMC45Mzc1LDEuMDYyNSAwLDAuMDc4MTI1IC0wLjAxNTYyNSwwLjE0MDYyNSAtMC4wMzEyNSwwLjIwMzEyNSB6IG0gMCwwIgogICAgICAgICAgIHN0eWxlPSJzdHJva2U6bm9uZSIgLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuODkzNDgzMDQiCiAgICAgICBkPSJtIDcyLjE4ODkwNyw4OC43MTE5OTcgaCAyLjk4NTMzIHYgLTAuNTU1NTM2IGggLTIuOTg1MzMgeiBtIDAsMCIKICAgICAgIGlkPSJwYXRoMjYyMSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjIwMjI4MjQzIgogICAgICAgZD0ibSA5OC41NDc1ODYsMTM1LjQ1MDYgaCAzLjY0NTczNCB2IDAuNjc1MSBoIC0zLjY0NTczNCB6IG0gMCwwIgogICAgICAgaWQ9InBhdGgxNDg1IiAvPgogICAgPGcKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0iZzE0ODMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgzLjc3OTQ0MzcsMCwwLDIuNjgzMDM3MywtMjc2LjA2MjI2LC0zNS4zNjcyOTIpIj4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNjQ1ODMzMywwLDAsMC4yNjQ1ODMzMyw5OSw2My40MDcyKSIKICAgICAgICAgaWQ9InVzZTE0ODEiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgaWQ9InBhdGg5MDMiCiAgICAgICAgICAgZD0ibSAyLjg3NSwtOC4yMDMxMjUgYyAwLDAgMCwtMC4xMjUgLTAuMTU2MjUsLTAuMTI1IC0wLjI4MTI1LDAgLTEuMTU2MjUsMC4wOTM3NSAtMS40Njg3NSwwLjEyNSAtMC4wOTM3NSwwIC0wLjIzNDM3NSwwLjAxNTYyNSAtMC4yMzQzNzUsMC4yMzQzNzUgMCwwLjE0MDYyNSAwLjEwOTM3NSwwLjE0MDYyNSAwLjI5Njg3NSwwLjE0MDYyNSAwLjU3ODEyNSwwIDAuNTkzNzUsMC4wOTM3NSAwLjU5Mzc1LDAuMjAzMTI1IDAsMC4wOTM3NSAtMC4xMDkzNzUsMC41IC0wLjE3MTg3NSwwLjc1IEwgMC43NSwtMi45Njg3NSBDIDAuNjA5Mzc1LC0yLjM1OTM3NSAwLjU2MjUsLTIuMTcxODc1IDAuNTYyNSwtMS43NSBjIDAsMS4xNDA2MjUgMC42NDA2MjUsMS44NzUgMS41MzEyNSwxLjg3NSAxLjQwNjI1LDAgMi44OTA2MjUsLTEuNzgxMjUgMi44OTA2MjUsLTMuNTE1NjI1IDAsLTEuMDc4MTI1IC0wLjY0MDYyNSwtMS45MDYyNSAtMS41OTM3NSwtMS45MDYyNSAtMC41NjI1LDAgLTEuMDQ2ODc1LDAuMzQzNzUgLTEuNDA2MjUsMC43MTg3NSB6IE0gMS43MzQzNzUsLTMuNjU2MjUgYyAwLjA3ODEyNSwtMC4yNjU2MjUgMC4wNzgxMjUsLTAuMjk2ODc1IDAuMTg3NSwtMC40MjE4NzUgMC41OTM3NSwtMC43ODEyNSAxLjEyNSwtMC45Njg3NSAxLjQzNzUsLTAuOTY4NzUgMC40Mzc1LDAgMC43NSwwLjM1OTM3NSAwLjc1LDEuMTQwNjI1IDAsMC43MDMxMjUgLTAuMzkwNjI1LDIuMDc4MTI1IC0wLjYwOTM3NSwyLjUzMTI1IC0wLjM5MDYyNSwwLjgxMjUgLTAuOTM3NSwxLjI1IC0xLjQwNjI1LDEuMjUgLTAuNDA2MjUsMCAtMC44MTI1LC0wLjMyODEyNSAtMC44MTI1LC0xLjIxODc1IDAsLTAuMjM0Mzc1IDAsLTAuNDUzMTI1IDAuMTg3NSwtMS4yMTg3NSB6IG0gMCwwIgogICAgICAgICAgIHN0eWxlPSJzdHJva2U6bm9uZSIgLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg== 1 0 0 Correct answer, well done.]]> Your answer is partially correct.]]> Incorrect answer.]]> . *10 none 1 i cos-1 lang [ 0 ans1 algebraic ta 15 1 0 0 1 0 0 1 3 prt1 1.0000000 1 1 0 AlgEquiv ans1 ta 0 = 1.0000000 -1 prt1-1-T


    ]]>
    PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgaWQ9InN2ZzgiCiAgIHZlcnNpb249IjEuMSIKICAgdmlld0JveD0iMCAwIDEyMC40NjA1NiA4MC44MzEyMjMiCiAgIGhlaWdodD0iODAuODMxMjIzbW0iCiAgIHdpZHRoPSIxMjAuNDYwNTZtbSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczIiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzEuODI1NjcsLTU1LjI5NDQ3NCkiCiAgICAgaWQ9ImxheWVyMSI+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgxMCIKICAgICAgIGQ9Ik0gMzguOTMxNTQ4LDEyNS4wMjA4MyBDIDExMC43NDcwMiw2MS41MjA4MzEgMTEwLjc0NzAyLDYxLjUyMDgzMSAxMTAuNzQ3MDIsNjEuNTIwODMxIHYgMCAwIGMgMzYuMjg1NzIsNjMuNDk5OTk5IDM2LjI4NTcyLDYzLjQ5OTk5OSAzNi4yODU3Miw2My40OTk5OTkgdiAwIDAgeiIKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuMjY0NTgzMzJweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTI3OTE4MTYiCiAgICAgICBkPSJtIDc2LjYyNDk2Nyw5MS41ODE1NTMgLTEuNTg4MjAxLC0wLjY4ODgwNSAwLjAyMDMsLTAuMDYyMDIgMi40NzkyOTgsLTAuNzI1OTM3IGMgMC43NzY1MDksLTAuMzgwMjM4IDEuNTUxMDMxLC0wLjc2MDQ5MiAyLjMyNzU0LC0xLjE0MDczMSAtMC41NTY1ODEsMC42OTY5MjMgLTEuMTEzMTYyLDEuMzkzODQ4IC0xLjY2OTc0MywyLjA5MDc3MSBsIC0xLjM0NjMzNiwyLjM2NTMzNSAtMC4wNTM2NiwwLjAxMjUyIC0wLjE2OTE4OSwtMS44NTEwOSIKICAgICAgIGlkPSJwYXRoMTAxMSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjUyNzkxODE2IgogICAgICAgZD0ibSA5Ny40NTYzMzIsMTI1LjI3MTE1IC0wLjkzNDg0NSwtMS40NTcwMiAwLjA1MTQxLC0wLjA0MDIgMi40NjMxNjIsMC43Nzg5MyBjIDAuODU2NjUzLDAuMTE3MDMgMS43MTE2NjEsMC4yMzI5MyAyLjU2ODMxMSwwLjM0OTk2IC0wLjg1MDUzLDAuMjY4NDggLTEuNzAxMDU1LDAuNTM2OTggLTIuNTUxNTgyLDAuODA1NDYgbCAtMi40MzYwNjUsMS4yMTM2NyAtMC4wNTE1MiwtMC4wMTk1IDAuODkxMTE4LC0xLjYzMTI4IgogICAgICAgaWQ9InBhdGgxMDExLTMiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgzMyIKICAgICAgIGQ9Ik0gMzguOTMxNTQ4LDEyNS4wMjA4MyBDIDEzNC4wMzU2NywxMDIuNTYxNDIgMTM0LjAzNTY3LDEwMi41NjE0MiAxMzQuMDM1NjcsMTAyLjU2MTQyIgogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNjQ5OTk5OTtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6Mi4xMTk5OTk5LCAxLjA1OTk5OTk1O3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjUyNzkxODE2IgogICAgICAgZD0ibSA5NS4wODk2NTksMTExLjk0OTI4IC0xLjE5NzY0NCwtMS4yNSAwLjA0MjcyLC0wLjA0OTMgMi41NjY5OTQsMC4yOTA2IGMgMC44NjMxNjMsLTAuMDQ5OSAxLjcyNDUwNCwtMC4xMDA2MyAyLjU4NzY3LC0wLjE1MDU2IC0wLjc4MzAwMywwLjQyNzA4IC0xLjU2NjAwNSwwLjg1NDE1IC0yLjM0OTAwNSwxLjI4MTIzIGwgLTIuMTU3MTI1LDEuNjU5NTkgLTAuMDU0MywtMC4wMSAwLjU2MDY5NywtMS43NzIyMyIKICAgICAgIGlkPSJwYXRoMTAxMS02IiAvPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0ODUzIgogICAgICAgeT0iMTI4LjA4NTY2IgogICAgICAgeD0iMzEuNTM3ODA0IgogICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjguNDY2NjY2MjJweDtsaW5lLWhlaWdodDoxLjI1O2ZvbnQtZmFtaWx5OidUZVggR3lyZSBUZXJtZXMgTWF0aCc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVGVYIEd5cmUgVGVybWVzIE1hdGgsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNjQ1ODMzMiIKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6OC40NjY2NjYyMnB4O2ZvbnQtZmFtaWx5OidUZVggR3lyZSBUZXJtZXMgTWF0aCc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVGVYIEd5cmUgVGVybWVzIE1hdGgsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O3N0cm9rZS13aWR0aDowLjI2NDU4MzMyIgogICAgICAgICB5PSIxMjguMDg1NjYiCiAgICAgICAgIHg9IjMxLjUzNzgwNCIKICAgICAgICAgaWQ9InRzcGFuODUxIj5PPC90c3Bhbj48L3RleHQ+CiAgICA8dGV4dAogICAgICAgaWQ9InRleHQ4NTciCiAgICAgICB5PSI2MS4wMDEwMDciCiAgICAgICB4PSIxMDguMzc3OCIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZToxMC41ODMzMzMwMnB4O2xpbmUtaGVpZ2h0OjEuMjU7Zm9udC1mYW1pbHk6J1RlWCBHeXJlIFRlcm1lcyBNYXRoJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidUZVggR3lyZSBUZXJtZXMgTWF0aCwgTm9ybWFsJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMyIgogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHRzcGFuCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo4LjQ2NjY2NjIycHg7Zm9udC1mYW1pbHk6J1RlWCBHeXJlIFRlcm1lcyBNYXRoJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidUZVggR3lyZSBUZXJtZXMgTWF0aCwgTm9ybWFsJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7c3Ryb2tlLXdpZHRoOjAuMjY0NTgzMzIiCiAgICAgICAgIHk9IjYxLjAwMTAwNyIKICAgICAgICAgeD0iMTA4LjM3NzgiCiAgICAgICAgIGlkPSJ0c3Bhbjg1NSI+QTwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0ODYxIgogICAgICAgeT0iMTI3LjgxODM5IgogICAgICAgeD0iMTQ3LjI2NTUiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6OC40NjY2NjYyMnB4O2xpbmUtaGVpZ2h0OjEuMjU7Zm9udC1mYW1pbHk6J1RlWCBHeXJlIFRlcm1lcyBNYXRoJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidUZVggR3lyZSBUZXJtZXMgTWF0aCwgTm9ybWFsJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMyIgogICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHRzcGFuCiAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo4LjQ2NjY2NjIycHg7Zm9udC1mYW1pbHk6J1RlWCBHeXJlIFRlcm1lcyBNYXRoJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidUZVggR3lyZSBUZXJtZXMgTWF0aCwgTm9ybWFsJztmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtZmVhdHVyZS1zZXR0aW5nczpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7c3Ryb2tlLXdpZHRoOjAuMjY0NTgzMzIiCiAgICAgICAgIHk9IjEyNy44MTgzOSIKICAgICAgICAgeD0iMTQ3LjI2NTUiCiAgICAgICAgIGlkPSJ0c3Bhbjg1OSI+QjwvdHNwYW4+PC90ZXh0PgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0ODY1IgogICAgICAgeT0iMTAyLjgyODY5IgogICAgICAgeD0iMTM1LjM3MjAxIgogICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjguNDY2NjY2MjJweDtsaW5lLWhlaWdodDoxLjI1O2ZvbnQtZmFtaWx5OidUZVggR3lyZSBUZXJtZXMgTWF0aCc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVGVYIEd5cmUgVGVybWVzIE1hdGgsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNjQ1ODMzMiIKICAgICAgIHhtbDpzcGFjZT0icHJlc2VydmUiPjx0c3BhbgogICAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6OC40NjY2NjYyMnB4O2ZvbnQtZmFtaWx5OidUZVggR3lyZSBUZXJtZXMgTWF0aCc7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonVGVYIEd5cmUgVGVybWVzIE1hdGgsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O3N0cm9rZS13aWR0aDowLjI2NDU4MzMyIgogICAgICAgICB5PSIxMDIuODI4NjkiCiAgICAgICAgIHg9IjEzNS4zNzIwMSIKICAgICAgICAgaWQ9InRzcGFuODYzIj5QPC90c3Bhbj48L3RleHQ+CiAgICA8ZwogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlkPSJnMjYxOSIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDMuMjYyNTA4OCwwLDAsMi43OTU4MDQ4LC01MzkuNzc2MywxMy43MDIxMjcpIj4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNjQ1ODMzMywwLDAsMC4yNjQ1ODMzMywxODcuMzE3MjksMjYuMzUzNDAxKSIKICAgICAgICAgaWQ9InVzZTI2MTciPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgaWQ9InBhdGg4NzciCiAgICAgICAgICAgZD0iTSA0LjQ2ODc1LC00LjUzMTI1IEMgNC4yNjU2MjUsLTQuOTg0Mzc1IDMuOTA2MjUsLTUuMjk2ODc1IDMuMzc1LC01LjI5Njg3NSBjIC0xLjQwNjI1LDAgLTIuODkwNjI1LDEuNzUgLTIuODkwNjI1LDMuNTE1NjI1IDAsMS4xMjUgMC42NTYyNSwxLjkwNjI1IDEuNTkzNzUsMS45MDYyNSAwLjIzNDM3NSwwIDAuODQzNzUsLTAuMDQ2ODc1IDEuNTYyNSwtMC44OTA2MjUgMC4wOTM3NSwwLjUgMC41MTU2MjUsMC44OTA2MjUgMS4wOTM3NSwwLjg5MDYyNSAwLjQwNjI1LDAgMC42ODc1LC0wLjI2NTYyNSAwLjg3NSwtMC42NTYyNSAwLjIwMzEyNSwtMC40MjE4NzUgMC4zNTkzNzUsLTEuMTU2MjUgMC4zNTkzNzUsLTEuMTg3NSAwLC0wLjEyNSAtMC4wOTM3NSwtMC4xMjUgLTAuMTQwNjI1LC0wLjEyNSAtMC4xMDkzNzUsMCAtMC4xMjUsMC4wNjI1IC0wLjE3MTg3NSwwLjIxODc1IC0wLjIwMzEyNSwwLjc4MTI1IC0wLjQwNjI1LDEuNSAtMC45MDYyNSwxLjUgLTAuMzI4MTI1LDAgLTAuMzU5Mzc1LC0wLjMxMjUgLTAuMzU5Mzc1LC0wLjU2MjUgMCwtMC4yNjU2MjUgMC4wMzEyNSwtMC4zNTkzNzUgMC4xNTYyNSwtMC44OTA2MjUgMC4xNDA2MjUsLTAuNSAwLjE1NjI1LC0wLjYyNSAwLjI2NTYyNSwtMS4wNzgxMjUgMC4yMDMxMjUsLTAuNzY1NjI1IDAuMjUsLTAuOTg0Mzc1IDAuNDM3NSwtMS42NzE4NzUgMC4wNzgxMjUsLTAuMzQzNzUgMC4wNzgxMjUsLTAuMzU5Mzc1IDAuMDc4MTI1LC0wLjQwNjI1IDAsLTAuMjAzMTI1IC0wLjE0MDYyNSwtMC4zMjgxMjUgLTAuMzQzNzUsLTAuMzI4MTI1IC0wLjI5Njg3NSwwIC0wLjQ2ODc1LDAuMjY1NjI1IC0wLjUxNTYyNSwwLjUzMTI1IHogbSAtMC43NjU2MjUsMy4xMDkzNzUgYyAtMC4wNjI1LDAuMjAzMTI1IC0wLjA2MjUsMC4yMzQzNzUgLTAuMjUsMC40Mzc1IEMgMi45MjE4NzUsLTAuMzI4MTI1IDIuNDM3NSwtMC4xMjUgMi4wOTM3NSwtMC4xMjUgMS41LC0wLjEyNSAxLjMyODEyNSwtMC43OTY4NzUgMS4zMjgxMjUsLTEuMjY1NjI1IGMgMCwtMC41OTM3NSAwLjM5MDYyNSwtMi4wNzgxMjUgMC42NTYyNSwtMi42MjUgMC4zNzUsLTAuNzAzMTI1IDAuOTIxODc1LC0xLjE1NjI1IDEuNDA2MjUsLTEuMTU2MjUgMC43NjU2MjUsMCAwLjkzNzUsMC45ODQzNzUgMC45Mzc1LDEuMDYyNSAwLDAuMDc4MTI1IC0wLjAxNTYyNSwwLjE0MDYyNSAtMC4wMzEyNSwwLjIwMzEyNSB6IG0gMCwwIgogICAgICAgICAgIHN0eWxlPSJzdHJva2U6bm9uZSIgLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuODkzNDgzMDQiCiAgICAgICBkPSJtIDcyLjE4ODkwNyw4OC43MTE5OTcgaCAyLjk4NTMzIHYgLTAuNTU1NTM2IGggLTIuOTg1MzMgeiBtIDAsMCIKICAgICAgIGlkPSJwYXRoMjYyMSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjIwMjI4MjQzIgogICAgICAgZD0ibSA5OC41NDc1ODYsMTM1LjQ1MDYgaCAzLjY0NTczNCB2IDAuNjc1MSBoIC0zLjY0NTczNCB6IG0gMCwwIgogICAgICAgaWQ9InBhdGgxNDg1IiAvPgogICAgPGcKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0iZzE0ODMiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgzLjc3OTQ0MzcsMCwwLDIuNjgzMDM3MywtMjc2LjA2MjI2LC0zNS4zNjcyOTIpIj4KICAgICAgPGcKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC4yNjQ1ODMzMywwLDAsMC4yNjQ1ODMzMyw5OSw2My40MDcyKSIKICAgICAgICAgaWQ9InVzZTE0ODEiPgogICAgICAgIDxwYXRoCiAgICAgICAgICAgaWQ9InBhdGg5MDMiCiAgICAgICAgICAgZD0ibSAyLjg3NSwtOC4yMDMxMjUgYyAwLDAgMCwtMC4xMjUgLTAuMTU2MjUsLTAuMTI1IC0wLjI4MTI1LDAgLTEuMTU2MjUsMC4wOTM3NSAtMS40Njg3NSwwLjEyNSAtMC4wOTM3NSwwIC0wLjIzNDM3NSwwLjAxNTYyNSAtMC4yMzQzNzUsMC4yMzQzNzUgMCwwLjE0MDYyNSAwLjEwOTM3NSwwLjE0MDYyNSAwLjI5Njg3NSwwLjE0MDYyNSAwLjU3ODEyNSwwIDAuNTkzNzUsMC4wOTM3NSAwLjU5Mzc1LDAuMjAzMTI1IDAsMC4wOTM3NSAtMC4xMDkzNzUsMC41IC0wLjE3MTg3NSwwLjc1IEwgMC43NSwtMi45Njg3NSBDIDAuNjA5Mzc1LC0yLjM1OTM3NSAwLjU2MjUsLTIuMTcxODc1IDAuNTYyNSwtMS43NSBjIDAsMS4xNDA2MjUgMC42NDA2MjUsMS44NzUgMS41MzEyNSwxLjg3NSAxLjQwNjI1LDAgMi44OTA2MjUsLTEuNzgxMjUgMi44OTA2MjUsLTMuNTE1NjI1IDAsLTEuMDc4MTI1IC0wLjY0MDYyNSwtMS45MDYyNSAtMS41OTM3NSwtMS45MDYyNSAtMC41NjI1LDAgLTEuMDQ2ODc1LDAuMzQzNzUgLTEuNDA2MjUsMC43MTg3NSB6IE0gMS43MzQzNzUsLTMuNjU2MjUgYyAwLjA3ODEyNSwtMC4yNjU2MjUgMC4wNzgxMjUsLTAuMjk2ODc1IDAuMTg3NSwtMC40MjE4NzUgMC41OTM3NSwtMC43ODEyNSAxLjEyNSwtMC45Njg3NSAxLjQzNzUsLTAuOTY4NzUgMC40Mzc1LDAgMC43NSwwLjM1OTM3NSAwLjc1LDEuMTQwNjI1IDAsMC43MDMxMjUgLTAuMzkwNjI1LDIuMDc4MTI1IC0wLjYwOTM3NSwyLjUzMTI1IC0wLjM5MDYyNSwwLjgxMjUgLTAuOTM3NSwxLjI1IC0xLjQwNjI1LDEuMjUgLTAuNDA2MjUsMCAtMC44MTI1LC0wLjMyODEyNSAtMC44MTI1LC0xLjIxODc1IDAsLTAuMjM0Mzc1IDAsLTAuNDUzMTI1IDAuMTg3NSwtMS4yMTg3NSB6IG0gMCwwIgogICAgICAgICAgIHN0eWxlPSJzdHJva2U6bm9uZSIgLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==
    = 0.0000000 1 prt1-1-F
    1 AlgEquiv ans1 -1*ta 0 + 0.0000000 -1 prt1-2-T Almost correct, the question asks for \(\overrightarrow{OP}\) which is the vector pointing from \(O\) to \(P\).  Check that your answer points in this direction.

    ]]>
    - 0.0000000 2 prt1-2-F
    2 AlgEquiv ans1 a+m/(n+m)*(a-b) 0 + 0.0000000 -1 prt1-3-T Almost correct, check the direction of the vector \(\overrightarrow{AB}\), it looks like you may have used \(\overrightarrow{BA}\) instead.

    ]]>
    - 0.0000000 3 prt1-3-F
    3 AlgEquiv ans1 b+n/(n+m)*(b-a) 0 + 0.0000000 -1 prt1-4-T Almost correct, check the direction of the vector \(\overrightarrow{BA}\), it looks like you may have used \(\overrightarrow{AB}\).

    ]]>
    - 0.0000000 -1 prt1-4-F
    1 ans1 ta prt1 1.0000000 0.0000000 prt1-1-T 2 ans1 -ta prt1 0.0000000 0.1000000 prt1-2-T 3 ans1 a+m/(n+m)*(a-b) prt1 0.0000000 0.1000000 prt1-3-T 4 ans1 b+n/(n+m)*(b-a) prt1 0.0000000 0.1000000 prt1-4-T 5 ans1 ta+1 prt1 0.0000000 0.1000000 prt1-4-F
    ================================================ FILE: examples/sample-article/media/stack/Checkbox.xml ================================================ Checkbox Differentiate {@p@} with respect to \(x\).

    [[input:ans1]]

    [[validation:ans1]]
    ]]>
    1 0.1 0 2018080600 [[feedback:prt1]] 1 0 0 Correct answer, well done.]]> Your answer is partially correct.]]> Incorrect answer.]]> . *10 dot 1 i cos-1 lang [ 0 ans1 checkbox ta 15 1 0 0 1 0 0 1 2 prt1 1.0000000 1 1 0 AlgEquiv ansmod true 0 = 1.0000000 -1 prt1-1-T = 0.0000000 -1 prt1-1-F 1 ans1 [2*cos(2*x)] prt1 1.0000000 0.0000000 prt1-1-T 2 ans1 [first(ta[1]),first(ta[3])] prt1 0.0000000 0.1000000 prt1-1-F
    ================================================ FILE: examples/sample-article/media/stack/Matrix.xml ================================================ Matrix Type in {@M@}

    [[input:ans1]]

    [[validation:ans1]]
    ]]>
    1 0.1 0 2018080600 M:matrix([1,2],[3,4]) [[feedback:prt1]] 1 0 0 Correct answer, well done.]]> Your answer is partially correct.]]> Incorrect answer.]]> . *10 dot 1 i cos-1 lang [ 0 ans1 matrix M 15 1 0 0 1 0 1 1 1 prt1 1.0000000 1 1 0 AlgEquiv ans1 M 0 = 1.0000000 -1 prt1-1-T = 0.0000000 -1 prt1-1-F 1 ans1 M prt1 1.0000000 0.0000000 prt1-1-T 2 ans1 ev(2*M,simp) prt1 0.0000000 0.1000000 prt1-1-F
    ================================================ FILE: examples/sample-article/media/stack/basic-plot.xml ================================================ Identify quadratic What is the function plotted here:

    {@plot1@}

    [[input:ans1]] [[validation:ans1]]

    ]]>
    1 0.1 0 2025012100 [[feedback:prt1]] 1 0 0 Correct answer, well done.]]> Your answer is partially correct.]]> Incorrect answer.]]> . *10 dot 1 i cos-1 lang [ 0 ans1 algebraic ta1 15 1 0 0 1 0 0 1 1 prt1 1.0000000 1 1 0 AlgEquiv ans1 ta1 0 = 1 -1 prt1-1-T = 0 -1 prt1-1-F 1564818949 1017944393 1004281449 1163477571 1441642357
    ================================================ FILE: examples/sample-article/media/video/BigBuckBunnyAcapella.vtt ================================================ WEBVTT Kind: captions Language: en NOTE Adapted from a SubRip file from NOTE https://sites.google.com/site/chrisfoo/subtitles NOTE Specifically NOTE https://sites.google.com/site/chrisfoo/subtitles/BigBuckBunnyAcapella.srt 00:00:02.681 --> 00:00:11.178 Bun, bun, bun ♪ 00:00:17.162 --> 00:00:20.830 Ahh! I’m a bird. I like to fly and spread out my wings. 00:00:20.830 --> 00:00:21.939 Ow! 00:00:23.112 --> 00:00:23.965 [Chuckles] 00:00:24.215 --> 00:00:29.220 [Snoring] 00:00:29.470 --> 00:00:38.371 Big bah bunny, big bah bunny ♪ 00:00:39.423 --> 00:00:42.663 What? What’s that? Ooh, it’s morning. 00:00:45.947 --> 00:00:48.526 Oh boy. Yay! I’m awake! 00:00:48.776 --> 00:00:53.365 Oh boy. Hey, ahh... 00:00:56.725 --> 00:01:00.144 I like mornings. Oh man, I really have an itch on my butt. ================================================ FILE: examples/sample-article/privatesolutions.xml ================================================

    A private answer.

    A private solution.

    A private hint.

    First of two private solutions.

    Second of two private solutions.

    A private answer to a nested task.

    A private solution to a nested task.

    ================================================ FILE: examples/sample-article/project.ptx ================================================ html sample-article.xml publication.xml output/html html sample-article.xml publication-oscarlevin.xml output/oscar latex sample-article.xml publication.xml output/latex pdf sample-article.xml publication.xml output/pdf pdf sample-article.xml publication-solution-manual.xml output/solutions latex pdflatex xelatex asy sage convert pdftops pdf-crop-margins pageres node file2brl ================================================ FILE: examples/sample-article/publication-crc.xml ================================================ ================================================ FILE: examples/sample-article/publication-oscarlevin.xml ================================================ ================================================ FILE: examples/sample-article/publication-print.xml ================================================ ================================================ FILE: examples/sample-article/publication-solution-manual.xml ================================================ ================================================ FILE: examples/sample-article/publication.xml ================================================ ================================================ FILE: examples/sample-article/sample-article.xml ================================================ \newcommand{\definiteintegral}[4]{\int_{#1}^{#2}\,#3\,d#4} % this comment will be stripped \newcommand{\myequation}[2]{#1\amp =#2} % testing alignment override % comments anywhere get stripped, with or without faux % comment \% characters \newcommand{\indefiniteintegral}[2]{\int#1\,d#2} \newcommand{\testingescapedpercent}{ \% } % just testing % employed in a PreFigure linear algebra diagram \newcommand{\bvec}{{\mathbf b}} \newcommand{\vvec}{{\mathbf v}} % employed in Valerio Monti sbsgroup operation tables \newcommand{\class}[2][\sim]{\lbrack #2\rbrack_{#1}}% Classe di equivalenza \usepackage{pgfplots} % loads tikz package \usepackage{smartdiagram} % for a circular diagram \pgfplotsset{axis x line = middle, axis y line = middle} \usetikzlibrary{backgrounds} \usetikzlibrary{arrows,matrix} \usetikzlibrary{positioning} % for Dave R's worksheet \usepackage{circuitikz} % for Virgil P's worksheet \usepackage{nicematrix} % for multi-run latex-image (label="latex-three-pass") \usepackage{siunitx} % swim speeds in shark attack image SA pretext-SA Conundrum
    Derivatives and Integrals An Annotated Discourse Robert Beezer Department of Mathematics and Computer Science University of Puget Sound Tacoma, Washington, USA beezer@pugetsound.edu Statement about support received by the first author. A. Second Author Department of Mathematics University of Somewhere Anytown, USA asauthor@example.edu Statement about support received by the second author. samplesPreTeXttesting document 00-01 00-02 00A99

    This is an example of a statement describing funding support for the current document.

    This is a sample of many of the things you can do with . Sometimes the math makes sense, sometimes it seems to be written in the first person, sort of like this Abstract.

    Introduction

    We consider definite integrals of functions f(x). For example, \definiteintegral{0}{2}{\sin^2(x)}{x}. This is also a demonstration of the capabilities of . \int_a^b\,f(x)\,dx definite integral of f(x)

    Generated: ,

    The Fundamental Theorem

    There is a remarkable theorem:And fortunately we do not need to try to write it in the margin!

    The Fundamental Theorem of Calculus Fundamental Theorem of Calculus

    If f(x) is continuous, and the derivative of F(x) is f(x), then \definiteintegral{a}{b}{f(x)}{x}=F(b)-F(a)test: buried in theorem/statement/p

    Left to the reader.This is a footnote in a proof that is inside a theorem.

    You will find almost nothing about all this in the article , nor in the book , since they belong in some other article, but we can cite them out-of-order for practice anyway.

    When we are writing we do not always know what we want to cite, or just where subsequent material will end up. For example, we might want a citation to or we might want to reference a later.

    We can also embed todos in the source by making an XML comment that begins with the four characters todo, and selectively display them, so you may not see the one here in the output you are looking at now. Or maybe you do see it?

    Because a definite integral can be computed using an antiderivative, we have the following definition.

    indefinite integralintegralindefinite integral \int\,f(x)\,dx indefinite integral of f(x)

    Suppose that \frac{d}{dx}F(x)=f(x). Then the indefinite integral of f(x) is F(x) and is written as \int\,f(x)\,dx=F(x).

    Computing Integrals with Sage (<m>\int</m>) Computing Integrals with Sage Sageintegration Sageintegrationcell Sageintegrationnumerical numericalSage integration numericalSage numerics numericsSage numerical integrationSagecellSage AF AG AH AB ABC ABCD ABCA X XF XG XH XY XYZD XYZA mixed-content emphasized structured-content emphasized sorted as if Cat sorted as if Quorum unitsZ (sort as A) unitsA (sort as Z) verbatim text, use sortby \rhofibers Cayley graphcayley graphCAYLEY GRAPH x as a variable

    Sage can compute definite integrals. The output contains the approximate numerical value of the definite integral, followed by an upper bound of the error in the approximation.

    numerical_integral(sin(x)^2, (0, 2)) (1.189200623826982, 1.320277913471315e-14)

    Given the Fundamental Theorem, we would find the antiderivative useful.Cayley graphx as a variable

    integral(sin(x)^2, x) 1/2*x - 1/4*sin(2*x)

    The same command can be used to employ the antiderivative in the application of the Fundamental Theorem. Notice that the answer is exact and any further manipulation is likely to be simply producing a numerical approximation.cayley graph

    integral(sin(x)^2, (x, 0, 2)) -1/4*sin(4) + 1

    There are integrals you really do not want to evaluate, or you do not want your reader to evaluate. A Sage cell can be configured for display purposes onlyyou can look but you cannot touch.CAYLEY GRAPH

    integral(e^(x^2), x) -1/2*I*sqrt(pi)*erf(I*x)

    You can give a Sage element a doctestdoctestattributesdoctest attribute, whose value mirrors the optional hash tags used in Sage doctests. Possible values are random, long time, not implemented, not tested, known bug, absolute, relative, and optional. The values absolute and relative refer to floating-point tolerances for equality and require a second attribute tolerance to specify a floating point value. The value optional refers to the test requiring that an optional Sage package be present. The name of that package should be provided in the package attribute.

    The next cell is marked in the source as doctest="random", and so is specified as unpredictable and not tested. But there is some sample output which will appear in the version (and always be the same). c A bug test, sorted as cbc one A bug test, sorted as cxc two A bug test, sorted as cbc three

    random() 0.11736021338650582

    While the next cell is random, the returned value will never be more than 0.01 away from 12, since the random() function stays between 0 and 1. So we provide 12.005 as the expected answer, but test with an absolute tolerance of \epsilon=0.006.

    12 + 0.01*random() 12.005

    Sage has some functions which affect output, generally making mathematics look more like mathematics via syntax. This is a simple test, and you should see the variable and superscript in italics, properly formatted as output when viewed within HTML output. We have provided expected output for doctesting, but it is sort of silly to have this as part of output, even if it is instructive.

    pretty_print(html("$a^2$")) <script type="math/tex">a^2</script>

    Sage, and by extension, the Sage Cell Server, can interpret several languages. The next example has code in the R language,R a popular open source language for statistics. As an author, you add the attribute language="r" to your sage element. (The default language is Sage, so you do not need to indicate that repeatedly.) Note that a language like R likes to use a less than character, <, special character in XML. You need to escape it by writing &lt; as we have done in the source for this example. (See the discussion in .)

    As a reader you learn that the Evaluate button for a pre-loaded Sage cell will indicate the language in use.

    ruth <- c(22, 25, 34, 35, 41, 41, 46, 46, 46, 47, 49, 54, 54, 59, 60) bonds <- c(16, 25, 24, 19, 33, 25, 34, 46, 37, 33, 42, 40, 37, 34, 49, 73, 46, 45, 45, 5, 26, 28) dimaggio <- c(12, 14, 20, 21, 25, 29, 30, 30, 31, 32, 32, 39, 46) summary(ruth) summary(bonds) summary(dimaggio) boxplot(ruth, bonds, dimaggio)

    The Sage Cell Server supports the following languages: sage, gap, gp, html, maxima, octave, python, r, and singular.

    Here is another R cell. Unfortunately, it seems Sage's doctest facility cannot be used easily with code from other languages. In the source for this example, we have employed the XML escape sequence, &lt; several times (see ).

    age <- c(25, 30, 56) gender <- c("male", "female", "male") weight <- c(160, 110, 220) mydata <- data.frame(age,gender,weight) summary(mydata) cor(mydata$age,mydata$weight) mean(mydata$age) sd(mydata$age) plot(mydata$age,mydata$weight)

    The Sage Cell server imports a few important R packages. As of 2022-06-04 these are deSolve, ggplot2, pracma, survey, swirl, and tidyverse. This next example uses the ggplot library for both a data set and the plotting capabilities. Note the initial use of the library() function. This is a modified version of the Bubble plot example at Top 50 ggplot2 Visualizations The Master List.

    # load package and data library(ggplot2) data(mpg, package="ggplot2") mpg_select <- mpg[mpg$manufacturer %in% c("audi", "ford", "honda", "hyundai"), ] # Scatterplot g <- ggplot(mpg_select, aes(displ, cty)) + labs(subtitle="mpg: Displacement vs City Mileage", title="Bubble chart") g + geom_jitter(aes(col=manufacturer, size=hwy)) + geom_smooth(aes(col=manufacturer), method="lm", se=F)

    Here is a blank Sage cell that you may use for practice and experimentation with the commands above. Note that this cell allows a choice of languages, and is not linked with any of the previous cells, so a reader would need to start fresh, or cut/paste definitions from other cells.

    On the other hand a sage element with no content will also create an empty Sage cell for the reader's use, but now it will be specific to a particular language and linked to others of the same language. Run the R cell above that defines the variable ruth and then try typing summary(ruth) in the cell below.

    You can make Sage blocks which are of type="invisible", which will never be shown to a reader, but which get doctested. Why do this? If some code produces an error, and you hope it is fixed someday, use an invisible block to raise the error. Once fixed, the doctest will fail, and you can adjust your commentary to suit. There is such a block right now, but you will need to go to the source to see it.

    graphs(augment='vertices').next() Traceback (most recent call last): ... NotImplementedError

    Our maximum width for text, designed for readability, suggests you should format your Sage code with a maximum of about 54 characters. On a mobile device, the number of displayed characters might be as low as 28 in portrait orientation, and again around 50 in landscape. You can use a variety of techniques to shorten long lines, such as using intermediate variables. Since Sage is just a huge Python library, you can use any of Python's facilities for handling long lines. These include a continuation character (which I try to avoid using) or natural places where you can break long lines, such as between entries of a list. Also, if writing loops or functions, you may wish to have your indentation be only two characters wide (rather than, say, four).

    Sage output can sometimes be quite long, though this has improved with some changes in Sage's output routines. Output code should be included primarily for doctesting purposes, and in this use, you may break at almost whitespace character and the doctesting framework will adjust accordingly. You may wish to show sample output in a static format, like a PDF, so you can consider formatting your output to fit the width constraints of that medium. Or you may even adjust exactly what is output, to keep it from being too verbose. Sage doctesting also allows for a wild-card style syntax which allows you to skip over huge chunks of meaningless or unpredictable output, such as tracebacks on error messages.

    This paragraph is just a placeholder. It has handful of index entries, all starting with the letters gas, taken from Indexing for Editors and Authors: A Practical Guide to Understanding Indexes by Leise, Mertes, and Badgett. The intent is to test letter-by-letter versus word-by-word sorting of index entries. We use a word-by-word order, resulting in:

    1. gas
    2. gas masks
    3. gas production
    4. gas works
    5. gasoline
    6. gastritis
    gasoline gas works gas gas masks gas production gastritis

    Titled Sage Cells Sage cellwith a title integral(sin(x)^2, x) 1/2*x - 1/4*sin(2*x)

    You can place Sage cells inside of a paragraphs if you want to give them a title, but no numbers, .

    An Interesting Corollary Fundamental Structures

    This is an objectives element you are reading, and this is its introduction. This early section has really grown and tries to accomplish many things. Not all of them are listed here.

    1. Display various blocks, fundamental units of the flow.
    2. More.
    3. Evermore.

    This concludes the (incomplete) objectives for this section, so now we can carry-on as before.

    This is a cross-reference to one of the objectives above, forced to use the phrase-global form of the text. It should describe the objective as belonging to the section (rather than the objectives), since objectives are one-per-subdivision and are numbered based upon the containing division: . For comparison this is the (forced) type-global cross-reference: .

    The Fundamental Theorem comes in two flavors, where usually one is a corollary of the other.

    Second Version of <acro>FTC</acro> Leibniz, Newton Fundamental Theorem of CalculusCorollary

    Suppose f(x) is a continuous function. Then \frac{d}{dx}\definiteintegral{a}{x}{f(t)}{t}=f(x).

    We simply take the indicated derivative, applying Theorem at \frac{d}{dx}\definiteintegral{a}{x}{f(t)}{t}&=\frac{d}{dx}\left(F(x)-F(a)\right) &=\frac{d}{dx}F(x)-\frac{d}{dx}F(a) &=f(x)-0 = f(x) .

    A justification, which is one of the variants of a proof.

    Alternate Proof

    You can have multiple proofs, and they can have titles which replace the word Proof as a heading. Here we just exercise displayed math with no automatic numbering, and an elective number on the middle equation. \frac{d}{dx}\definiteintegral{a}{x}{f(t)}{t}&=\frac{d}{dx}\left(F(x)-F(a)\right) &=\frac{d}{dx}F(x)-\frac{d}{dx}F(a) &=f(x)-0 = f(x)

    The alternative version of the Fundamental Theorem (FTC) in is a compact way to express the result.

    For testing purposes, there is a simple bare Sage Cell here.

    c = 832 c A Mysterious Derivative!

    So if we define a function with its variable employed as a limit of integration, like so K(z)=\definiteintegral{345}{z}{x^4\sin(x^2)}{x} then we get the derivative of that function so easily it seems like a mystery, \frac{d}{dz}K(z)=z^4\sin(z^2). That's it.

    For testing purposes, there is a simple Sage Cell here, buried inside an example that should be a knowl (embedded in the page).

    2+2

    We test a Sage cell inside a knowl, which should set the value of a variable that will be available to subsequent cells within the knowl.

    a = 6 a b = a + 10 b

    Even if you ran the cell at the top of this page, within this knowl the value of the variable c is not known, so the next cell will cause an error.

    c + 400

    The Sage cells on a page will remember results computed elsewhere on the page. If you rely on this feature, remind your readers to evaluate all the necessary cells and that they perhaps need to be evaluated in a certain order.

    c/2

    There are some Sage cells in the previous (knowled) example. The results there are restricted to the knowl. In other words, the scope of those cells is the knowl. So if you opened the example and executed the Sage cells there, or if you skipped the example entirely, the next cell should not know the values of those variables and will raise an error.

    a + b

    We cross-reference the example just prior, , to test the simple Sage cells that will now be part of a cross-reference knowl (an external file).

    An Equivalent Claim

    This claim is an equivalence: it is true if and only if it is correct.

    Our purpose here is to show how you can structure a proof with cases, such as an equivalence structured with the arrows typically used to demonstrate the two directions involved in the proof, by using the direction attribute on a case element.

    Nulla non lectus suscipit, bibendum leo quis, dignissim justo. In urna turpis, tincidunt id elementum id, faucibus ac tellus.

    Quisque auctor ligula turpis, ut aliquam urna consectetur hendrerit. Aenean porta dolor et justo facilisis feugiat in sed sapien. Nullam porta ex et commodo semper.

    Case 3b: The inductive step

    A case may also have a title, whose formatting and structure is entirely up to the author. This then becomes the text of a cross-reference, as well.

    Why Not Try This?

    A case (or any other element with a default title) did not always handle title-ending punctuation correctly. So we try an example title with a question mark.

    Necessity

    If you like, you can have both indications.

    No direction, no title, then just a generic title.

    Exciting Proof!

    We test here that punctuation at the end of the title of a proof is handled correctly.

    Exact Proof

    This proof should fill exactly three lines (as of defaults in place 2018-12-31) and so the tombstone/Halmos should be on a fourth line, and then flush right. xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx.

    A List of Equivalent Statements

    The following are equivalent.

    1. This statement is equivalent to all those below.
    2. This statement is equivalent to the statement above and to all those below.
    3. This statement is equivalent to the two statements above and to the statement below.
    4. This statement is equivalent to all those above.

    Our purpose here is to show how you can structure a proof with cases to address the circular logic required to prove the equivalence of a list of statements, by using the direction attribute on a case element. You should order the list of statements in the order that you would like to prove ``this statement implies the next.''

    Here we would prove that the first statement implies the second.

    Here we would prove that the second statement implies the third.

    The trickiest case

    This time we include a title to describe the nature of this case. But we would still need to prove that the third statement implies the last.

    Wrap-around

    Finally, we would complete the cycle of logic by proving that the last statement implies the first.

    We can also use direction set to cycle in a stand-alone proof of our TFAE claim. If we include a ref on the proof that points to the original claim, then the formatting of the markers on the statement list will be honored in our cases.

    Once again we will prove that the four statements in are equivalent.

    Another argument that the first statement implies the second.

    And another argument that the second statement implies the third.

    Not so tricky this time

    Why did we find it so difficult before to prove that the third statement implies the last?

    Wrap-around

    And once more we complete the cycle of logic.

    A couple more times to check that the default list markers get applied to the directional cases properly.

    Another List of Equivalent Statements

    The ol that creates the list below does not have marker.

    1. This statement is equivalent to the two below.
    2. This statement is equivalent to both the statement above and to the statement below.
    3. This statement is equivalent to the two above.

    You know the drill by now.

    Does the first statement imply the second?

    The <q>middle</q> case

    Does the second statement imply the third?

    And finally, does the third imply the first?

    This proof includes a ref to the preceding claim.

    Does the first statement imply the second?

    The <q>middle</q> case

    Does the second statement imply the third?

    And finally, does the third imply the first?

    This proof does not include a ref, and so the direction indicators get default markers.

    Does the first statement imply the second?

    And finally, does the second imply the first?

    A Pedagogical Note about <xref ref="subsection-second-FTC" text="type-global"/> Symbolic and Numerical Integrals

    The Fundamental Theorem explains why we use the same notation for a definite integral, which is a numerical calculation,Which I think sometimes students lose sight of. and an antiderivative, which is a symbolic expression.

    Essay Question: Compare and Contrast

    Write a short paragraph which compares, and contrasts, the definite and indefinite integral. This is an exercise which sits in the midst of the narrative, so is formatted more like an example or a remark. It can have a hint and a solution, but this one does not. It can have a title, which this one does.

    Start writing!

    Advice

    Using an integral sign for an antiderivative (aka indefinite integral) would seem to make the Fundamental Theorem a fait accompli. So I would suggest not conflating the notation for two very different things until the Fundamental Theorem exposes them as being highly related.

    An Example of Structure

    This is an example of an example with a bit more structure. Specifically, the example has a title, as usual, but then has a statement, which is separate from the solution. Why did we implement an example in two ways?

    Authors asked for it and it seemed a very natural thing to do, even if we only had an unstructured version for a long time.

    An Example of a Question

    Any kind of question can be marked as such with question. Or similarly, as a problem. They behave identically to examples, such as the one preceding and are numbered along with theorems, examples. etc.

    You can have a solution. Or several, even if you don't ask a question.

    See?

    An Inline Exercise

    There are lots of exercises in this sample article, but mostly they are in special exercise sections. Sometimes you just want to sprinkle some exercises through the narrative. We call these inline exercises, in contrast to divisional exercises. The inline exercises look a bit more like a theorem or definition, with titles and fully-qualified numbers.

    These may also have hints, answers and solutions.

    A good hint.

    42.

    If your exercise feels like proving a theorem, then you might want to make some comments, but also clearly delineate which part of the solution is a the complete proof.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin lorem diam, convallis in nulla sed, accumsan fermentum urna. Pellentesque aliquet leo elit, ut consequat nunc dapibus ac. Sed lobortis leo tincidunt, vulputate nunc at, ultricies leo. Vivamus purus diam, tristique laoreet purus eget, mollis gravida sapien. Nunc vulputate nisl ac mauris hendrerit cursus. Sed vel molestie velit. Suspendisse sem sem, elementum at vehicula id, volutpat ac mi. Nullam ullamcorper fringilla purus in accumsan. Mauris at nunc accumsan orci dictum vulputate id id augue. Suspendisse at dignissim elit, non euismod nunc. Aliquam faucibus magna ac molestie semper. Aliquam hendrerit sem sit amet metus congue tempor. Donec laoreet laoreet metus, id interdum purus mattis vulputate. Proin condimentum vitae erat varius mollis. Donec venenatis libero sed turpis pretium tempor.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra. Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    An Example of with <m>\frac12</m> math formula <m>\displaystyle{\int e^x \, dx}</m> in the title

    Just for testing math in knowls, and also extra whitespace in a p.

    There are many different blocks you can employ, and they mostly behave the same way. A projectproject is very similar to a questionquestion or problemproblem

    Start Exploring <pretext/>

    You could grab the minimal.xml file from the examples/minimal directory and experiment with that.

    Projects get their own independent numbering scheme, since they may be central to your textbook, workbook, or lab manual. If you process this sample article with level for project numbering set to 0 then you will get consecutive numbers from the beginning of your book, starting with 1.

    Exploring Explorations

    This is an exploration.exploration Other similar possibilities are projectproject, activityactivity, tasktask, and investigationinvestigation.

    Note that projects, activities, explorations, tasks and investigations share the independent numbering scheme, so it is really only intended you use one of these. If you want a variant of the name ( Directed Activity) you can use the renamerename an environment facility ().

    This is a solution to the exploration. In practice, you might choose to not make this visible for students, but instead include it as part of some guidance you might provide to instructors ( an Instructor's Manual).

    Hints, Answers, Solutions

    This is quite the activity upcoming. This is a prelude authored within the activity element, but visually just prior.

    Another variant of these project-like items is to possibly include a hint and an answer before the solution.

    Just a little help.

    The result, but no help in getting there.

    Everything to get it all done, in detail.

    This was quite the activity just now. This is a postlude authored within the activity element, but visually just after.

    A Note on Remarks

    remark, convention, note, observation and warning are designed to hold very simple contents, with no additional structure (no proofs, no solutions, ).

    But they do carry a title and a number, can be the target of a cross-reference, and may be optionally knowlized in HTML with the html.knowl.remark processing switch.

    And distinctly different from a note in a biblioA gratuitous footnote to test prior bug confusing this with a note in a biblio..

    An exercise can be structured with task.

    A very structured exercise

    This is an over-arching introduction to the whole exercise. We follow with some tasks. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A super-simple task

    This first task is very simple, just a paragraph. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Now three paragraphs. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A title of a task that has a subtask with an <tag>answer</tag> for the Solutions

    This second task is further divided by more tasks. This is its introduction. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A task with a title and an <tag>answer</tag> for the Solutions

    A really simple subtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A short paragraph, before an answer.

    With a proof.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    And a bit more to say.

    A subtask with an answer. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Right! In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Three simple sub-sub-tasks. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    First subsubtask. Short paragraph.

    A second three-deep subsubtask!

    Second subsubtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Third subsubtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    The conclusion of the structured subtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A simple task as the last subtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This concludes our structured second task. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This third top-level task is intermediate in complexity, you are reading the statement, which is followed by more items. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    One hint. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    First answer. In interdum suscipit ullamcorper.

    Second answer. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    At last, the solution. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This is a conclusion where you could summarize the exercise. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    The following project is nearly identical to the preceding exercise.

    A very structured project

    The next block is a project, demonstrating the use of the task element to structure its parts. You are reading the prelude now. The project has lots of nonsense words, so we can test spacing the nested items. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This is an over-arching introduction to the whole project. We follow with some tasks. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This first task is very simple, just a paragraph. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Now three paragraphs. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This second task is further divided by more tasks. This is its introduction. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A really simple subtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A short paragraph, before an answer.

    With a proof.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    And a bit more to say.

    A subtask with an answer. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Right! In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Two simple sub-sub-tasks. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    First subsubtask. Short paragraph.

    Second subsubtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Third subsubtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    The conclusion of the structured subtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A simple task as the last subtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This concludes our structured second task. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This third top-level task is intermediate in complexity, you are reading the statement, which is followed by more items. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    One hint. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    First answer. In interdum suscipit ullamcorper.

    Second answer. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    At last, the solution. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This is a conclusion where you could summarize the project. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This postlude appears visually outside the project, but is authored within, to make clear its attachment to the project. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Notation mathématique 2

    The following example, from Elise Desgreniers, is structured with task.

    Écrivez chacun des exemples suivants avec les conditions pertinentes.

    Soit l'ensemble A=\lbrace 1,2,3,4,5\rbrace.

    On constate que cet ensemble contient uniquement des entiers positifs allant de 1 à 5.

    Donc, on peut écrire A=\lbrace x\mid x\in\mathbb{N}\text{ et } 1\leq x\leq 5\rbrace.

    \{3,6,9,12,15,\ldots,27,30\}

    Ce sont des multiples de 3.

    \{x\mid x=3y \text{ et } 1\leq y\leq 10 \text{ et } y\in\mathbb{N}\}

    \{1,3,5,7,9,11,\ldots\}

    Ce sont des nombres impairs.

    \{x\mid x\mod 2=1 \text{ et } x\in\mathbb{N}\}

    \{2,3,5,7,11,13,17,19,23,\ldots\}

    Ce sont des nombres premiers.

    \{x\mid x\text{ est un nombre premier positif}\}

    \{1,4,9,16,25,36,\ldots,961\}

    Ce sont des carrés parfaits.

    \{x\mid x=y^2 \text{ et } 1\leq y\leq 31\text{ et } y\in\mathbb{N}\}

    \{1,8,27,64,125,\ldots\}

    Ce sont des cubes parfaits.

    \{x\mid x=y^3 \text{ et } y\in\mathbb{N^*}\}

    Notes or examples related to computation or technology can go in blocks of the same name.

    Sample Use of Sage

    This would be a good place to talk about Sage, including a cell or two.

    diff(x^4, x) 4*x^3

    But you might want to describe how to use some other calculator, or maybe some numerical method.

    A <tag>paragraphs</tag> with a <tag>project</tag> with an <tag>answer</tag>

    The solutions to a project (and similar) once did not migrate to the automatically-generated solutions.

    A simple project, no tasks, just an answer.

    Here's the answer we are looking for.

    This is an exercise in an Exercises subdivision at the level of a subsubsection. There is no question other than if the numbering is appropriate. Here is a self-referential link: Exercise.

    The subsubsection has no title in the source, so one is provided automatically, and will adjust according to the language of the document.

    This solution will migrate to a list of solutions in the backmatter. We include a sidebyside as a test.

    This is a skinny paragraph which should be just 30% of the width.

    And another skinny paragraph which should also be just 30% of the width.

    An exercise can be structured with parts, called task. This is the introduction.

    Do this.

    And the other thing.

    reading questions

    A set of reading questions may have an introduction, perhaps for preparatory explanation.

    If a student has logged in to the HTML version, then they can answer the reading questions directly in the book. Inline math LaTeX can be entered using $...$ or \(...\) delimiters, and inline AsciiMath using backticks `...` as delimiters. Here are some `gratuitous backticks` to check that AsciiMath is only active in the answers to reading questions.

    This is a reading question that you might have a student answer prior to a class session, based on reading part of the book. A quick glance before class can help you tailor class time to the specific needs of your students. The perfect reading question will reveal whether the student has read and understood the material, and will be difficult to answer if they have not. What do you think of that?

    And a second one, with a cross-reference to the first, as a check on numbering: . Reading questions are allowed to have answers, but providing answers misses the point of a reading question, and the answer knowl interacts poorly with the mechanism used to allow students to answer directly in the book. Do you think the schema should ban answers to reading questions?

    And for symmetry, a conclusion.

    glossary

    A glossary may have a headnote, perhaps with some explanation. This glossary is a specialized division within a section. Placement in the back matter is another option, see the .

    bar

    A part of foobar. See .

    foobar

    A synonym for the acronym FUBAR.

    Solutions for This Subsection solutionsfor a division

    This is an introduction, where you might explain that this division of this subsection contains various hints, answers, solutions of inline exercises, divisional exercises, and/or project-like blocks. See the source to see just how this solutions division was built.

    And a conclusion to this solutions division, which may not be readily apparent as distinct from the final division's worth of solutions, but since it is not prefixed with a number, it may be different enough.

    Theorem-Like Environments

    There are a variety of pre-defined environments in . All take a title, and must have a statement. Some have proofs (theorems, corollaries, ), while some do not have proofs (conjectures, axioms, principles).

    The Title Principle

    It is a fundamental principle that many elements can have a title. Try it and see. If you get better formatting, then it is being recognized. If it looks very plain, check the documentation and perhaps make a feature request.

    More precisely, theorem, corollary, lemma, algorithm, proposition, claim, fact, and identity, all behave exactly the same, requiring a statement (as a sequence of paragraphs) followed by an optional proof, and may have an optional title. The elements axiom, conjecture, principle, heuristic, hypothesis, and assumption are functionally the same, barring a proof (since they would never have one!). Definitions are an exception, as it is natural to place notation withinsee the source for Definition for an example.

    Linking Sage Cells Sage cellslinking

    Sage cells share their results on a per-webpage basis, or a per-knowl basis, so if you move to a new chapter, section, or subsection that happens to be on another webpage, your Sage computations are gone and you start fresh. But maybe you need some results from elsewhere. As an author, you can make an exact copy of a cell in another location by placing the code in an external file, which is pure text, freed from any need to format for XML processing. So, in particular, there is no need to escape ampersands and angle brackets, nor is there employment of the CDATA mechanism. But the real value is that there is just one version to edit, and any changes will be reflected in both copies. We demonstrate this in the sample book, since it has the xinclude mechanism in place. In the chapter on groups, find the section on Sage and then find the discussion of subgroups, and you will find an example of two identical Sage cells produced from one source file.

    You can also specify certain cells to be auto-evaluated, by setting the auto-evaluate attribute to yes. The resulting cell will not have a button for evaluation (so editing it would be pointless). See the source of this sample article for the two examples below.

    2023-08-17: support just now is for the use case of a small portion of code, not a huge library of helper routines.

    Two cells with the default language sage.

    k = 404 2*k

    Two cells with language python.

    k = 4112 print("Assigned an initial value to the variable k") k = 2*k print(k)
    Hierarchy Structure

    This section of this article has subsections and subsubsections. In a book you can have chapters enclosing multiple sections. There is one finer subdivision, it is achieved with the paragraphs element.

    It is basically a sequence of paragraphs, where the first one gets an inline title. You are reading the second, and final, paragraph of one right now. It is useful for organizing very short documents, where numbered subdivisions might be overkill.

    A Second Paragraphs

    This is a second consecutive paragraphs element, so should seem related to its title, but distinct from the two paragraphs in the grouping with the title Structure immediately prior.

    Assemblages: Collections and Summaries

    An assemblage is a collection, or summary, that does not have much structure to it. So you are limited to paragraphs and friends (p, blockquote, pre) and side-by-sides that do not contain captioned items (sidebyside, sbsgroup). The intent is that contents are not numbered, so cannot be cross-referenced individually, and so also do not become knowls. You may place image, tabular, and program inside a sidebyside, in addition to other objects that do not have captions. Note that p may by extension contain lists (ol, ul, dl). Despite limited structure, the presentation should draw attention to it, because the contents should be seen as more important in some way. It should be highlighted in some manner. If you need to connect the entire assemblage with material elsewhere, you can do that with the usual xref/xml:id mechanism.assemblage

    What have we seen so far in this (disorganized) sample?

    • Theorems, definitions and corollaries. ()

    • Sage cells, including with R. ()

    • Lots of document structure, like introductions and conclusions (next). ()

    A sample table, as a tabular inside a sidebyside with no caption, follows.

    ABC UnoDosTres

    This is a small assemblage with no title, simply to make sure the surrounding box behaves properly, especially for output.

    Assemblages containing <m>\mu \forall \tau \mathbb{H} = \emptyset \kappa</m>

    It is acceptable for an assemblage to contain mathematical content, even in its title.

    Introductions and Conclusions An Introductory Introduction

    Any subdivision may have a sequence of paragraphs within an introduction that precedes subsequent further subdivisions. You are reading one now. They are always leaves of the document structure, so are rendered on some pages that reference the following subdivisions.

    An introduction or conclusion is an extremely restrictive container with simple presentation. A title is optional (and probably not advisable). Content is meant to be short and unstructured, in particular, nothing that can be numbered is allowed. If this feels too restrictive, then place your content in an initial numbered subdivision and perhaps title it Introduction. Or make your entire subdivion unstructured and place whatever you want into it.

    This ends this introduction to introductions.

    Test One

    An intervening subsubsection just after an introduction.

    Test Two

    An intervening subsection section which contains an exercises division which must be at the level of a Subsubsubsection.

    An inline exercise to examine any clash with divisional exercises below.

    An answer so there is something to appear in a solutions.

    What Did You Learn?

    A mock exercise to appease validation.

    An answer so there is something to appear in a solutions.

    And a second to help with formatting the division heading.

    A mock exercise to appease validation.

    An answer so there is something to appear in a solutions.

    And a second to help with formatting the division heading.

    Test Three

    An intervening subsubsection just before a conclusion.

    Entirely analogous to introductions are conclusions. Any subdivision may have a sequence of paragraphs within a conclusion that follows previous further subdivisions. You are reading one now. They are always leaves of the document structure, so are rendered on some pages that reference the preceding subdivisions.

    This concludes this conclusion (and this subsection and this section).

    Some Paragraph-Level Markup

    Text within a paragraph may be emphasizedememphasisstyling wordsemstyling wordsemphasis with em or if you want to take it to the next level you can identify the text as an alertalertstyling wordsalert with alert.

    Similarly, within a paragraph, you can identify edits between versions as inserted text that has been addedstyling wordsinsert with insert or as deleted text that has been removedstyling wordsdelete with delete. Note that these identified edits are slightly different than stale text that you want to retain, but which is no longer relevantstyling wordsstale, which is accomplished with stale. The original request for stale text came from an instructor with an online list of student topics for presentations, and as students claimed topics they were marked as no longer available for other students.

    If you need a fill-in blank, like this , it can be obtained with an empty fillin element that defaults to roughly a 10-character width. You can use the characters attribute to make the rule longer or shorter, such as a 40-character blank: . The character count is approximate, based on typical character widths within a proportional font carrying English language text. Adjust to suit, or request a language-specific adjustment if it is critical.

    This paragraph is intended to make a fillin appear right at the start of the second line in print and then the next paragraph has nothing but a fillin. Both are for testing purposes.

    The following are fillin with rows and/or cols attributes (at least one of which is greater than 1): , , .

    Long after we started this mess, we added tags to mark up tags and attributes. The elements are: tag, tage, attr. Examples of how these render are (respectively): section, hash, width. Perhaps this document will make greater use of these tags.

    We supply two provisional cross-references for testing purposes only: , .

    A conclusion here, which we fill with some numbering tests.

    This is a cross-reference to one of the outcomes, forced to use the type-global form of the text. It should describe the outcome as belonging to the section (rather than the outcomes), since outcomes are one-per-subdivision and are numbered based upon the containing division: . For comparison this is the (forced) type-global cross-reference: .

    Fundamental Structures, Revisited

    This is a outcomes element you are reading, and this is its introduction. This early section has really grown and we have tried to accomplish many things. Not all of them are listed here.

    1. Display various blocks, fundamental units of the flow.
    2. More, and this is what the cross-references above are pointing to.
    3. Evermore.

    This concludes the (incomplete) outcomes for this section, so now we can carry-on to the next section.

    Some Facts and Figures footnotes

    Because of the Fundamental TheoremFirst test footnote, for every derivative we know, there is an antiderivative we might find useful. Because of the Fundamental Theorem of CalculusSecond test footnote, we recycle the \int symbol as notation for an antiderivative.

    • Derivatives

      1. \frac{d}{dx}x^n = nx^{n-1}
      2. \frac{d}{dx}e^x = e^x
      3. \frac{d}{dx}\cos(x) = -\sin(x)

    • Antiderivatives

      1. \indefiniteintegral{x^n}{x} = \displaystyle\frac{x^{n-1}}{n+1}\text{ if }n\neq -1
      2. \indefiniteintegral{e^x}{x} = e^x
      3. \indefiniteintegral{\sin(x)}{x} = -\cos(x)

    You canThird test footnote gain a greater understanding of derivatives by studying the graphs of functions with their derivatives. CanFourth test footnote you discern the derivativeantiderivativeFifth test footnote relationship in Figure?

    A function and its derivative a third degree polynomial with a local max and a local min; its derivative is plotted on the same axes

    ListsSixth test footnote can have multiple columns. With HTML items displayed in row-major order (horizontally first) andSeventh test footnote with items are displayed in column-major order (vertically first). When one order, or the other, becomes workable in both variants, maybe we will be consistent in presentation. (Note that with just one row, it makes no difference.) We used it above for the two itemsderivatives and integralswhere each item was a list of its own. Here are two more examples, one with short snippets and lots of columns, the other with lots of text in paragraphs.listmulticolumn

    1. Red

    2. Blue

    3. Green

    4. Purple

    5. Yellow

    6. Black

    7. Orange

    8. Pink

    9. Salmonstrange colors

    10. Aqua

    11. Cyan

    12. Pucestrange colors

    • Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin lorem diam, convallis in nulla sed, accumsan fermentum urna. Pellentesque aliquet leo elit, ut consequat nunc dapibus ac. Sed lobortis leo tincidunt, vulputate nunc at, ultricies leo. Vivamus purus diam, tristique laoreet purus eget, mollis gravida sapien. Nunc vulputate nisl ac mauris hendrerit cursus. Sed vel molestie velit. Suspendisse sem sem, elementum at vehicula id, volutpat ac mi. Nullam ullamcorper fringilla purus in accumsan. Mauris at nunc accumsan orci dictum vulputate id id augue. Suspendisse at dignissim elit, non euismod nunc. Aliquam faucibus magna ac molestie semper. Aliquam hendrerit sem sit amet metus congue tempor. Donec laoreet laoreet metus, id interdum purus mattis vulputate. Proin condimentum vitae erat varius mollis. Donec venenatis libero sed turpis pretium tempor.

      Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra. Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    • Donec vestibulum auctor nisl. Nullam placerat interdum dui. Quisque lobortis scelerisque augue imperdiet placerat. Maecenas ultricies massa tempor, laoreet urna a, eleifend enim. Integer sed suscipit odio. Pellentesque non dapibus diam, eget tempus dui. Maecenas sollicitudin magna viverra, egestas velit nec, tristique sem. Cras iaculis mattis dui ac cursus. Integer volutpat, urna vel tempus convallis, erat nisi consectetur turpis, id varius dolor lorem vitae mauris. Phasellus erat orci, laoreet commodo gravida quis, congue in lacus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent at bibendum turpis. Pellentesque est nisl, dapibus at sagittis non, ultricies in nunc. Etiam ipsum arcu, porta sed feugiat eget, facilisis nec libero. Mauris tempor convallis felis.

      Cras iaculis sapien elit, at convallis ligula convallis nec. Duis ante tortor, euismod a libero vitae, ornare viverra purus. Pellentesque facilisis urna a velit volutpat, in malesuada tortor porttitor. Sed vehicula mauris id lectus dignissim, eget consectetur dui pellentesque. Sed vel quam molestie, euismod ligula ac, venenatis arcu. Fusce sit amet sapien non urna dignissim tempus in vitae metus. Aliquam arcu turpis, mattis non libero eu, lacinia feugiat turpis. Phasellus rhoncus lacinia lacus facilisis ullamcorper. Praesent hendrerit accumsan neque, eu dignissim est consequat sed. Nulla facilisi. Proin at mi scelerisque, scelerisque felis ut, tristique diam. Proin in leo in lorem porttitor varius. Praesent condimentum in dui sit amet blandit. In imperdiet blandit congue.

    • Ut nec sem vitae ipsum interdum vestibulum sit amet sed velit. Aliquam tempor nibh vitae augue pulvinar, at ultricies urna commodo. Donec in porta lectus, ac sagittis felis. Vestibulum tincidunt quis metus facilisis luctus. In lobortis lacus vel ornare vehicula. Duis aliquet, ligula semper sodales adipiscing, augue nibh ornare ante, quis pulvinar justo mi eget mi. Mauris varius imperdiet vehicula. Duis dignissim magna quis velit mattis, in cursus lectus vehicula. Morbi quis tempus felis, ut gravida nisi.

      Vivamus eu commodo est, pretium fringilla dolor. Curabitur vel sollicitudin libero. Integer sit amet auctor felis. Maecenas sagittis erat at ante feugiat, in tincidunt ligula pretium. Integer eget auctor ipsum, quis volutpat felis. Morbi id dignissim eros. Suspendisse aliquet pulvinar lorem gravida egestas. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent nec massa dui. Suspendisse convallis lacus sit amet adipiscing varius. Suspendisse tempus diam vitae justo ornare, in condimentum metus pharetra. Curabitur sem dolor, auctor vitae sagittis vestibulum, posuere imperdiet metus. Etiam pretium lacus urna, vel auctor diam tincidunt non. Etiam viverra sodales iaculis.

    • Sed varius leo urna. Phasellus tempus mollis ultricies. Curabitur non neque aliquet, facilisis tortor in, sodales dui. Donec hendrerit ultricies nulla mollis rhoncus. In vel lobortis est. Vestibulum consectetur lacus vel sem dignissim vestibulum. Etiam sed elementum ligula, vel congue turpis. Morbi nec diam mattis, venenatis eros et, elementum tellus. Integer sed orci ornare, elementum elit id, lacinia augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In et libero id turpis pharetra faucibus. Integer consequat dignissim semper. Donec pretium magna at ullamcorper ultricies. Nam quis suscipit elit. Donec cursus tellus et venenatis feugiat. Mauris dictum molestie leo, vitae aliquet metus luctus vitae.

      Ut id iaculis leo. Sed nec vestibulum mi. Mauris est mauris, porta in nulla eget, bibendum luctus nisl. Praesent et posuere felis, molestie vehicula velit. Nulla a nunc venenatis, aliquam orci nec, congue felis. Vestibulum a dolor nisi. Morbi sed nisi nulla. Nam iaculis felis a enim blandit, at venenatis diam congue. Nulla augue diam, egestas eget fermentum nec, posuere eget risus. Praesent egestas nulla eros, eget accumsan augue euismod vel. Pellentesque pellentesque non erat vitae posuere. Curabitur lacus arcu, varius sed risus ut, ullamcorper tincidunt lorem. Sed et lacus dignissim, tincidunt nisl ac, porttitor sapien.

    Some Advanced Ideas

    The multi-row displayed mathematics in the proof of the Fundamental Theorem had equations aligned on the equals signs via the & character. Sometimes you don't want that. Here is an example with some differential equations, with each equation centered and unnumbered, {\mathcal L}(y')(s) = s {\mathcal L}(y)(s) - y(0) = s Y(s) - y(0) {\mathcal L}(y'')(s) = s^2 {\mathcal L}(y)(s) - sy(0) - y'(0)= s^2 Y(s) - sy(0) - y'(0) . \rho this symbol could be used for lots of things, but we are just trying to make a super-long description to get it to wrap within the column where it belongs, which is sometimes set to a fixed width to accomodate really complicated explanations rho, a test Just prior to this sentence, in the middle of this paragraph, is an idx and a notation, adjacent, but separated by some whitespace in the authored source. That insignificant whitespace will be removed akways, which will be a (slightly) noticeable improvement in the output. We test referencing notation here, placed before the sentence-ending period and right after some inline mathematicsfor \mathbb{Z}_n\mathbb{Z}_n(ring of) integers modulo n.

    has a device where you can interrupt a sequence of equations with a small amout of text and preserve the equation alignment on either side. Here are two tests of that device, with aligned equations and non-aligned equations. Study the source to see use and differences. (The math does not make sense.)

    Aligned and numbered first. {\mathcal L}(y')(s) &= s {\mathcal L}(y)(s) - y(0) = s Y(s) - y(0) {\mathcal L}(y'')(s) &= s^2 {\mathcal L}(y)(s) - sy(0) - y'(0)= s^2 Y(s) - sy(0) - y'(0). And so it follows that, {\mathcal L}(y')(s)^{++} &= s {\mathcal L}(y)(s) - y(0) = s Y(s) - y(0) {\mathcal L}(y'')(s)^{5} &= s^2 {\mathcal L}(y)(s) - sy(0) - y'(0)= s^2 Y(s) - sy(0) - y'(0).

    Now with no numbers and no alignment. We include two cross-references in the intertext portion for testing. {\mathcal L}(y')(s) = s {\mathcal L}(y)(s) - y(0) = s Y(s) - y(0) {\mathcal L}(y'')(s) = s^2 {\mathcal L}(y)(s) - sy(0) - y'(0)= s^2 Y(s) - sy(0) - y'(0). First an external reference to and internal cross-reference to . And so it follows that, {\mathcal L}(y')(s)^{++} = s {\mathcal L}(y)(s) - y(0) = s Y(s) - y(0) {\mathcal L}(y'')(s)^{5} = s^2 {\mathcal L}(y)(s) - sy(0) - y'(0)= s^2 Y(s) - sy(0) - y'(0) .

    Tables can get quite complex. Simple ones are simpler, such as this example of numerical computations for Euler's method in just a bit.

    But first we make a figure with two very simple tables next to each other. This causes the very first instance of table to actually be a subtable, which exposes a bug provoked by Emiliano Vega and fixed around 2020-08-06. (So we have to place this early to create the same behavior that exposed the bug.)

    Buggy sub-tables First One
    Second Two
    Euler's approximation for Duffing's Equation with <m>h = 0.2</m> i t_i x_i y_i 00.000.00000.5000 10.200.10000.4800 20.400.19600.4560 30.600.28720.4295 40.800.37310.4027 51.000.45360.3783 61.200.52930.3591 71.400.60110.3480 81.600.67070.3474 91.800.74020.3603 102.000.81230.3900
    Mathematics

    To be able to create both and HTML output (plus variations), we rely on MathJax, which in turn supports an extensive subset of the mathematical symbols normally available. The AMSMath symbol set is a good approximation. The Guide has a link to the complete list of macros supported by MathJax. We load the AMSsymbols library.

    Basic Mathematics

    The following is from the MathJax demonstration page, an identity due to Ramanujan:\frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} {1+\frac{e^{-8\pi}} {1+\ldots} } } }

    And again, from the MathJax demonstration page, Maxwell's equations:Maxwell's equations \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \nabla \cdot \vec{\mathbf{B}} & = 0 \nablagradient operator

    Look back at the top of the source file of this document to see how to include your macros just once. For best results keep your macros simple and semantic.

    once provided modest built-in support for slanted, or beveled, or nice fractions. To wit, we mean fractions such as: \sfrac{3}{8}. Use the pre-defined \sfrac{}{} macro in your mathematics to achieve this presentation. The presentation in HTML is subpar, but could improve as MathJax provides support. It is now an author's responsibility to add support for superior typesetting for PDF output by loading the xfrac package with the following in docinfo: <math-package latex-name="xfrac" mathjax-name=""/> which is what we have done here as a test. See the Guide for more details.

    We consider a system of equations. We number the first and last equation (there are just two) and include an xml:id attribute on each. We reference the whole system later as the range of equations from the first to the last. \frac{dx}{dt} \amp = x^2 - 4x - y + 4 \frac{dy}{dt} \amp = x^3 - y.

    Displayed Mathematics

    Display mathematics is achieved with the md tag (math display), always used within a paragraph (p). As a good example of how XML syntax is superior, you author n lines of equations by enclosing each line inside of a mrow tag, rather than using n-1 separators (such as \\).

    If you use no ampersands to express alignment (read ahead), then each equation is centered independently on the width of the text. This is implemented according to the AMSmath package's gather environment. Example: \frac{dx}{dt} = x^2 - 4x - y + 4 \frac{dy}{dt} = x^3 - y.

    An ampersand is used, in two ways, to describe positioning several equations per line, organized in columns. We have created the pre-defined macro \amp as one way specify these, but the escape sequence &amp; may be used also. The second, fourth, sixth, ampersands separate columns, and the spacing between columns will be provided automatically. The first, third, fifth, ampersands are alignment points for the equations in each column. Typically this is placed just prior to a binary operator, such as an equal sign (\amp = ), or for a column of explanations or commentary, just prior to the \text{} macro. Note that this scenario suggests always having an odd number of ampersands in each mrow. In the example below, alignment is on the equals sign in the first two columns, and provides left-justification to the explanations in the third column. N.B.: the use below of the \text{} macro does not include mathematics within its argument. Doing so may yield unpredictable results depending on your choice of delimiters for the mathematics (and using an m tag will be ineffective). \frac{dx}{dt} \amp = x^2 - 4x - y + 4 \amp \frac{dy}{dt} \amp = x^3 - y \amp\amp x, y\text{ version} \frac{dw}{dt} \amp = z^3 - w \amp \frac{dz}{dt} \amp = z^2 - 4z - w + 4 \amp\amp z, w\text{ version}

    will automatically detect the presence or absence of ampersands, but by defining macros for entire aligned equations, you can effectively hide the ampersands. So the alignment attribute can override automatic detection. We use a simple macro to demonstrate setting alignment='align' to override the use of a gather environment and use a align environment instead. Example: \myequation{\frac{dx}{dt}}{x^2 - 4x - y + 4} \myequation{\frac{dy}{dt}}{x^3 - y}.

    The AMSmath package's alignat environment is a third variant of alignment. It never happens automatically, you need to ask for it with alignment="alignat". It is very similar to align but adds no space between the equation columns. So you can leave it that way, or you can add your own extra space to suit. Here is a previous example with no inter-column space: \frac{dx}{dt} \amp = x^2 - 4x - y + 4 \amp \frac{dy}{dt} \amp = x^3 - y \amp\amp x, y\text{ version} \frac{dw}{dt} \amp = z^3 - w \amp \frac{dz}{dt} \amp = z^2 - 4z - w + 4 \amp\amp z, w\text{ version} . This modified example has a middle row with three columns, while the other rows have just one column, as a test of our routines for determining the mrow with the greatest number of ampersands (and how many there are), \frac{dw}{dt} &= z^3 - w \frac{dx}{dt} &= x^2 - 4x - y + 4 & \frac{dy}{dt} &= x^3 - y&& x, y\text{ third column} \frac{dw}{dt} & = z^3 - w . Final example demonstrates that ampersands in other objects (matrices here) can wreak havoc with computing the number of columns. So we provide yet another attribute to override automatic detection, alignat-columns. This is the number of columns not the number of ampersands. Generally, for c columns, there will be 2c-1 ampersands. A &= \begin{bmatrix}1 & 2 \\ 3 & 4\end{bmatrix} & I &= \begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix} . One caveat: if your number of ampersands is even (see advice above about using an odd number) behavior should still be correct, as in next example.

    If you want super-precise control over alignment of the terms of a system of equations (linear or not) you can use the alignat option to advantage by not including any extra space. This example is modified slightly from a post by Alex Jordan: 2x \amp {}+{} \amp y \amp {}+{} \amp 3z \amp {}={} \amp 10 x \amp \amp \amp {}+{} \amp z \amp {}={} \amp 6 x \amp {}+{} \amp 3y \amp {}+{} \amp 2z \amp {}={} \amp 13. Beautiful.

    A long equation, to check layout on various screen sizes. This is Weil's explicit formula for the Riemann \zeta-function: \sum_\gamma S_-(\gamma) = \frac{\log Q}{\pi} \hat S_-(0) + \frac{1}{2\pi} \sum_{j=1}^d \Re\left\{ \int_{-\infty}^\infty \frac{\Gamma'}{\Gamma}\left(\frac{1}{4} + \frac{it}{2} + \mu_j\right)S_-(t) dt\right\} - \frac{d}{2\pi}\hat S_-(0)\log \pi .

    Excessive Display Mathematics

    In print versions, a long run of displayed equations often needs to be broken across pages. If you are reading some other version of this, then there is nothing to see here. But for output it could be interesting. First, with no extra effort, this page-long display should break naturally, no matter how the preceding material changes. x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 .

    In this version we have turned off page breaking for the entire display, but then allowed a break at every fourth equation, so you should see a reasonably attractive page break right after one of the m^2+n^2=p^2 equations. x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 x^2+y^2=z^2 a^2+b^2=c^2 \alpha^2+\beta^2=\gamma^2 m^2+n^2=p^2 .

    So. Do not take any extra steps and let figure out the breaks. If you do not like a break, modify the md to go back to the AMSmath default behavior and not break at all. Ever. Or rather, go further and modify an individual mrow to suggest that it is a good place for a break.

    Displayed mathematics in has a device called intertext, allowing for short snippets of text in-between displayed equations, but alignment continues across these short breaks. For any other output format besides PDF/ there really is not the technical means to make this continued alignment happen. So we mostly do the best we can. The following is a test example. Since almost all the equations are very similar in shape, it appears that there is alignment throughout. However, for almost all output formats, the very last equation changes the horizontal positioning of the block with the final three equations, and they are not aligned with the previous equations. The exception is a PDF where we are able to take advantage of 's support and the equations should all be aligned on the equals signs. A &= Z + 1 B &= Y + 2 One intertext. C &= X + 3 D &= W + 4 E &= V + 5 Two intertext. F &= U + 6 Three intertext. G &= T + 7 H &= S + 8 I + J + K &= P + Q + R + 9 + 10 + 11

    Now for some more testing of the intertext feature. Numbering some equations, and not others, requires some care in the conversion to .

    First, a numbered equation in the first group of equations. A & = B + C Intertext: between first and second equations. P & = Q + R Intertext: between second and third equations. X & = Y + Z Second, a numbered equation in the intermediate group of equations. A & = B + C Intertext: between first and second equations. P & = Q + R Intertext: between second and third equations. X & = Y + Z Third, a numbered equation in the final group of equations. A & = B + C Intertext: between first and second equations. P & = Q + R Intertext: between second and third equations. X & = Y + Z Fourth, no numbered equations at all. A & = B + C Intertext: between first and second equations. P & = Q + R Intertext: between second and third equations. X & = Y + Z

    This is a poorly-authored paragaph to test the conversion to HTML. There are two displayed equations, separated by a period ending the first one's sentence, which should migrate into the display, and not leave behind an empty paragraph: z+y = z. a + b = c. This final sentence should remain, inside another HTML paragraph, without the second equation's period.

    <latex/> Packages and MathJax Extensions

    If you would like to enhance your mathematics by using a macro from a package and there is a MathJax extension which implements the same macro, then you may use this with your mathematics as we demonstrate here.

    This example is from Jason Underdown.Underdown, Jason The package is named cancel and is included in the TeXLive distribution, so is fairly standard. The particular macro being demonstrated is \cancelto{}{}. \lim_{b \rightarrow \infty}\left[\cancelto{0}{-\frac{1}{s}e^{-sb}} + \frac{1}{s}\right]. Look at the source of this article to see the package name being supplied in a math-package element within the docinfo section. That is the only setup required to make the macro usable in and HTML output.canceling a termcancelto macro

    See the Guide subsection about MathJax Extensions for more detail.

    Advanced Mathematics

    MathJax is extremely capable in rendering a subset of in web browsers, and improving all the time. You can get fairly fancy with some of its supported commands. In particular, if you need to mix in a few words with your mathematics, the \text{} macro is supported. For example, you might use an if or an otherwise in the definition of a piecewise function.

    Consider that the first line below is text sandwiched in-between two Greek letters, wrapped in a \text{} macro. In HTML output we have taken care that the font for text material within display mathematics should match the font of the surrounding paragraph, as also happens with output. The second line is nearly identical in the source, but is just naked text being rendered like a slew of variables. \alpha\text{ is not equal to }\beta \alpha is not equal to \beta \alpha\neq\beta . We are not suggesting here that using words in place of symbols, as in the first line, is a good practice. (It is not.)

    The following example is a good stress-test of using the \text{} macro to achieve certain effects. Note the Unicode left and right smart quotes. This a contribution from Alex Jordan as part of his work on APEX Calculus. y \rightarrow \frac{\sin(0) }{0} \rightarrow {{\text{“}}\atop{}}\frac{0}{0}{{\text{”}}\atop{}}\text{.} And another one from Alex. Note the use of the \mathord{} and \mathrel{} macros to control spacing around the mathematical symbols. Examine the source to see how the quotation marks have been authored with XML syntax for Unicode characters, since we do not allow most markup inside mathematics. \zeta(1)=\sum_{n=1}^{\infty}\frac{1}{n}\mathrel{\text{ “}\mathord{=}{\text{” }}}\prod_{p}\left(\frac{1}{1-1/p}\right)=\prod_{p}\left(\frac{1}{1-p^{-1}}\right)

    Generally, you cannot use any XML elements inside of the mathematics elements. An exception is the xref element which you might want to use to provide justifications for the steps of a derivation. Here is a visual example that is mathematically meaningless, A&=B+C&& &=D+E&& &=F+G&&A nice result .

    Scott Beaver likes to write short chains of equalities all in one line, with the cross-references sitting on each equals sign. Here we test the \overset and \underset macros wrapping a xref, with and without content, inside an md element. Note that \stackrel is obsolete, and \overunderset is not yet supported by MathJax (but see GitHub #2704). The mathematics is Scott's, the reasons are totally unrelated to the math. AC-AD \overset{}{=} A(C-D) \underset{}{=} A0_{n\times p} \overset{Thm.}{=} 0_{m\times p} We suggest using cross-references that only display numbers (xref with text set to global) since if you stick to elements like theorem, lemma, definition, or axiom, then the numbers will be unambiguous and the target of the cross-reference will contain full information. But note that if you mix in divisions, or perhaps figures, as reasons then there is a possibility that numbers will need to be qualified by their type. We have provided an abbreviation for one cross-reference to (which will not benefit from automatic translation to other languages).

    Numbered Equations

    There is flexible control for numbering displayed equations, largely provided by the number attribute on the md and mrow elements, taking values of yes or no. First, a single displayed equation, with a number: x^{2} + y^2 = z^2. Now several displayed equations, all numbered. x^{3} + y^{3} = z^{3} x^{4} + y^{4} = z^{4} x^{5} + y^{5} = z^{5} . Similar, but now the first equation's numbering is controlled by the global default value, the second is explicitly not numbered, and the third is explicitly numbered. x^{6} + y^{6} = z^{6} x^{7} + y^{7} = z^{7} x^{8} + y^{8} = z^{8} . The global default numbering choice is set in docinfo.

    Local Tags on Equations

    If you are not writing a research monograph, maybe (a) you will not use many numbered equations, or do not like the looks of them, or feel they scare your readers, and (b) maybe your cross-references are always local-ish, like strictly within an example or a proof. For this situation you can create, and employ, a local tag on a displayed equation. Nothing enforces the idea of what constitutes local, and there is nothing to stop you from using the same symbols more than once. With freedom comes responsibility.

    Use the tag attribute on an mrow, or directly on a single-line md (one with no mrow children). The value of the tag attribute is a symbol name. The prefix d means double, and the prefix t means triple. So allowed values are star, dstar, tstar dagger, ddagger, tdagger daggerdbl, ddaggerdbl, tdaggerdbl hash, dhash, thash maltese, dmaltese, tmaltese Cross-references to these tagged equations happens in the usual way and should behave as expected. We test the double versions to make sure the symbols render properly in various output formats. c^2 \amp = a^2+b^2 c^2 \amp = a^2+b^2 c^2 \amp = a^2+b^2 c^2 \amp = a^2+b^2 c^2 \amp = a^2+b^2 z^2 \amp = x^2+y^2 Here are the local cross-references: , , , , . We test another farther away in , contrary to our advice above.

    When there is nothing to align, the tag attribute may live directly on a single-line md: c^2 = a^2 + b^2. This is equivalent to placing the content in a single mrow child carrying the tag. A cross-reference to this equation looks like . Note that tag and number are mutually exclusive on a single-line md.

    Commutative Diagrams

    This diagram is authored by Tom Judson using the syntax of the AMS CD package. Inside of a md element start with \begin{CD}. Remember to escape the less-than character. \begin{CD} E[x]/\langle p(x) \rangle @>\psi>> F[x]/\langle q(x) \rangle\\ @VV{\sigma}V @VV{\tau}V\\ E(\alpha) @>\overline{\phi}>> F(\beta)\\ @VVV @VVV\\ E @>\phi>> F \end{CD} While this package is not as flexible as some generic drawing packages, it has the advantage of full support by MathJax, and thus the HTML version will be more accessible.

    Line-Breaking after Mathematics

    As of 2021-05-14, in HTML output the next sentence should just fill a full line across the page. We take active measures to bind the concluding period to the final bit of mathematics, the variable x. The prevents a bad line break which could see the period begin a new line, all by itself. In the event that the line-breaking siutation improves, we could relax these measures. This testing is only relevant to HTML output, not output.

    xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx x.

    Fonts and Mathematics

    This section is about testing types and sizes of fonts, not so much about using different typefaces. First, one long displayed equation, which is designed to be full-width for output when using defaults as of 2020-01-29 (commit defd4bffd462e7ea).

    Start paragraph.a^2 + b^2 + a^2 + b^2 + a^2 + b^2 + a^2 + b^2 + a^2 + b^2 + a^2 + b^2 + a^2 + b^2 + a^2 + b^2 + a^2 + b^2 + a^2 + b^2End paragraph.

    The next paragraph has five ways to write the sine of x, bracketed by plain text versions. This tests font size and the fonts employed. The raw source of this paragraph is (spread over two lines) sin x | <m>\sin x</m> | <m>\text{sin}\ x</m> | <m>\mathrm{sin}\ x</m> | <m>\text{sin}x</m> | <m>sin x</m> | sin x The five ways, from good to bad,

    1. The best way, using \sin. Note the distance to the x.
    2. With a \text{} macro.
    3. With a \mathrm{} macro. Not recommended for .
    4. Without a space. Note that the previous two require explicit spacing.
    5. No extra effort, so renders as a product of four variables.

    sin x | \sin x | \text{sin}\ x | \mathrm{sin}\ x | \text{sin}x | sin x | sin x

    Finally a simple paragraph that places a text x next to a variable x.

    wordxxx+xxxword

    Special Characters in Text Mode

    designates ten characters as special because they carry syntactic meaning. When these characters appear inside text-mode macros (such as \text{}) within mathematics, they must be escaped to produce their literal glyph. Seven of the ten have simple single-character escapes and are demonstrated in the following table. The remaining three (~, ^, \) require macros from 's textcomp package (\textasciitilde, \textasciicircum, \textbackslash) which are not available in MathJax's text mode as of 2026-04-03.

    Character Escaped form Rendered Hash # \# \text{5\#} Ampersand & \& \text{P \& Q} Percent % \% \text{5\%} Dollar $ \$ \text{\$3} Underscore _ \_ \text{x\_1} Left brace { \{ \text{\{a, b\}} Right brace } \} \text{\{a, b\}}

    The hash character also requires escaping within the \tag{} macro. See for an example where the tag="dhash" attribute produces a double hash as an equation tag.

    Miscellaneous

    In HTML output, a MathJax workaround for a Safari rendering bug was inserting extra spaces after textual subscripts and superscripts (MathJax thread). CSS now applies a correction. The following tests if the CSS fix is sufficient, and could be used to test the necessity of our fix in the future. Following is the original report, though NOT has been moved to a superscript: T_\text{clk}-t_\text{su} \gt t_\text{clk-Q} + \max\left( t_\text{XOR}, t^\text{NOT} \right) . There should not be anything to see in /PDF output. (2021-10-21)

    Grouping Samples

    While building or testing a rendering of PreTeXt, especially in HTML, it can be useful to see all the various elements that potentially create visual blocks in one place. So they are collected here.

    We will omit content specific blocks like figures, images, tables, as those elements have significant stress testing of their own elsewhere.

    Please add any similar elements that are created or that you discover are missing from this page.

    Our goals

    A minimal objective.

    • Stress test HTML themes
    • Locally, test objectives
    Remark-like Blocks A title

    A minimal remark.

    A title

    A minimal convention.

    A title

    A minimal note.

    A title

    A minimal observation.

    A title

    A minimal warning.

    A title

    A minimal insight.

    Example-like Blocks A title

    A minimal example.

    A title

    A structured example.

    A structured example.

    A hint

    An answer

    A solution

    The conclusion.

    A title

    A minimal question.

    A title

    A minimal problem.

    A title

    A minimal observation.

    A title

    A minimal warning.

    A title

    A minimal insight.

    Theorem-like Blocks A title

    A minimal theorem.

    A title

    A theorem with a proof.

    The proof of the theorem.

    A title

    A minimal corollary.

    A title

    A minimal lemma.

    A title

    A minimal algorithm.

    A title

    A minimal proposition.

    A title

    A minimal claim.

    A title

    A minimal fact.

    A title

    A minimal identity.

    A title

    A stand-alone proof.

    Axiom-like Blocks A title

    A minimal axiom.

    A title

    A minimal conjecture.

    A title

    A minimal principle.

    A title

    A minimal heuristic.

    A title

    A minimal hypothesis.

    A title

    A minimal assumption.

    Definition-like Blocks A title

    A minimal definition.

    Aside-like Blocks

    Three asides are below.

    A title

    A minimal biographical.

    A title

    A minimal biographical.

    A title

    A minimal historical.

    Computation-like Blocks A title

    A minimal computation.

    A title

    A minimal technology.

    A title

    A minimal data.

    Project-like Blocks A title

    A minimal project.

    A title

    A minimal activity.

    A title

    A minimal exploration.

    A title

    A minimal investigation.

    Miscellaneous Blocks

    A minimal assemblage.

    Our results

    A minimal outcome.

    • Stress test HTML themes
    • Locally, test outcomes
    Wrap-up

    A minimal conclusion.

    Entering Text in Paragraphs, Titles, Captions Text in Paragraphs Entering Text in Paragraphs

    XML, and therefore , is a markup language. But by and large, what you type into your source will be what you see in your output. So there is not much to say. Except that eventually will be essential. However we do test various tricky situations here (which have technical explanations we avoid). See the Author's Guide for a superior treatment of the topics addressed here.

    Special <init>XML</init> characters

    One of the goals of is to relieve an author of managing the numerous conflicts when mixing languages that use different characters for special purposes. But, of course, XML has its own special characters.

    If you type a less-than symbol in your source, the XML processor thinks you are starting an opening, or closing, tag. So how do you get a less-than sign into your source so that it survives into your output, like this: <? You use an escaped version. Type literally, the four characters &lt; in your source. Then the XML processor will know you want the character and will not mistake it for a tag. But now we want to get an ampersand into our source like: &. How? Another escaped version of a character, literally the five characters &amp;.

    Otherwise, keys on your keyboard, even international versions, should be fine in your source and behave as expected. WYTIWYG = What You Type Is What You Get. So the principal concession to using XML markup is the following very simple rule.

    Rather than pressing the < and & keys on your keyboard, instead always enter the escape sequences &lt; and &amp; as replacements.

    Simple. And it will work in running text, verbatim text (like when authoring the content of c or pre elements), and mixed into syntax to desribe mathematical expressions. XML has three other escape sequences &gt;, &apos;, and &quot;, for the characters >, ', and " (respectively). But they seem largely unnecessary for authoring in PreTeXt, as we now demonstrate by typing them directly from our keyboard into our source: >, ', and ".

    How was &amp; authored? Work it out, and then check the source here for the answer.

    The next subsection should start on a new page in PDF output if the standard publisher file is used.

    Quotations

    The qquotations tag will provide beginning and ending double quotations, while the sq tag will behave similarly but provide single quotes. Given the complexity of quotations, the different symbols used in different languages, and the over-simplified versions provided on keyboards, it is necessary to use markup.

    The roots of education are bitter, but the fruit is sweet. (Aristotle)

    It is always wise to look ahead, but difficult to look further than you can see. (Winston Churchill)

    A large quote can be accomodated with the blockquote tag, which can carry within itself an attribution element.

    The problem with writing a book in verse is, to be successful, it has to sound like you knocked it off on a rainy Friday afternoon. It has to sound easy. When you can do it, it helps tremendously because it's a thing that forces kids to read on. You have this unconsummated feeling if you stop.

    Dr. Seuss

    We say that again, to test a multiline attribution of a block quotation. Notice how the dash appears automatically, and that it is a quotation dash in HTML, distinct from other sorts of dashes.

    The problem with writing a book in verse is, to be successful, it has to sound like you knocked it off on a rainy Friday afternoon. It has to sound easy. When you can do it, it helps tremendously because it's a thing that forces kids to read on. You have this unconsummated feeling if you stop.

    Dr. Seuss Children's Author

    Sometimes a quote may extend across several paragraphs. Or a balanced pair of quotations marks crosses an XML boundary, so we need left, right, single and double versions. (For example, see Section on poetry.) Here are all four in a haphazard order: , , , . These should be a last resort, and not a replacement for the q and sq tags. The left/right versions are used for the following quote from Abraham Lincoln, which we have edited into two paragraphs.

    I am not bound to win, but I am bound to be true. I am not bound to succeed, but I am bound to live by the light that I have.

    I must stand with anybody that stands right, and stand with him while he is right, and part with him when he goes wrong.

    And as a tests, we try some crazy combinations of quotes, which would normally give some trouble where the quotation marks are adjacent. View these examples in PDF output, with lots of magnification and note the spacing between the quotation marks.

    • we use single quotes inside of double quotes

    • double quotes inside of single quotes with more

    • single quotes tight inside of double quotes

    • double quotes tight inside of single quotes

    • An absurd test of two adjacent single quotes inside a pair of double quotes

    • you would never do this, but a pair of single quotes

    Quotation marks are different in different languages. The following paragraphs contain short examples.

    English (United States)

    Primary only: Government of the people, by the people, for the people, shall not perish from the earth. Primary and secondary: I have a dream that one day this nation will rise up and live out the true meaning of its creed: We hold these truths to be self-evident, that all men are created equal. (Abraham Lincoln, Gettysburg Address; Martin Luther King Jr., I Have a Dream)

    French (France)

    Primary only: La liberté commence où l’ignorance finit. Primary and secondary: Elle se répétait : J’ai un amant ! un amant ! se délectant à cette idée comme à celle d’une autre puberté qui lui serait survenue. (Victor Hugo, Les Misérables; Gustave Flaubert, Madame Bovary)

    French (Canada)

    Primary only: La liberté commence où l’ignorance finit. Primary and secondary: Elle se répétait : J’ai un amant ! un amant ! se délectant à cette idée comme à celle d’une autre puberté qui lui serait survenue. (Victor Hugo, Les Misérables; Gustave Flaubert, Madame Bovary)

    German (Germany)

    Primary only: Grau, teurer Freund, ist alle Theorie, und grün des Lebens goldner Baum. Primary and secondary: Meine Luise, sagte er mir, hat mich zu Boden geworfen. Meine Luise wird mich auch aufrichten. (Johann Wolfgang von Goethe, Faust I; Friedrich Schiller, Kabale und Liebe)

    Groupings

    It is possible to make some other groupings like quotations, such as {some emphasized text grouped within braces}, or [a Book Title inside brackets], an Article Title, some foreign words inside angle brackets, or just a bit of text within double brackets. Some of these are used extensively by scholars who study texts to note various restorations or deletions. Note that the foreign element may have a xml:lang attribute.

    Note that the angle brackets, and , are not the keyboard characters, < and >. Your best bet is to use the provided angles element when constructing a balanced pair. Similarly, dblbrackets is provided to make the double-bracket characters easily available, since they are likely not on your keyboard.

    Characters, Symbols, and Constructions

    Verbatim, inline text, is accomplished with the c element. One special consideration: if your editor splits a line in the middle, we will fix it. This sentence has two words that we purposely split with a newline character in the middle. In output you should see a space between the words.

    Some keyboard characters are ambiguous. Is the character ' an apostrophe or a right single quote? We presume the former, ', and provide markup as an alternative for the latter (described above). Is / used to separate words, or to form a fraction? We presume the former, /, and provide solidus, , for the latter. We test some other characters straight from our US keyboard (with two being escape sequences).

    ~ ` ! @ # $ % ^ & * ( ) _ - + = [ ] { } | \ ; : ' " , < . > ? /

    And again as verbatim text.

    ~ ` ! @ # $ % ^ & * ( ) _ - + = [ ] { } | \ ; : ' " , < . > ? /

    Note that for a long time had empty elements for many of these characters, as a consequence of naïveté. So you might see dollar, ampersand, or others in old source. They will be deprecated and will raise warnings.

    Now, when a character is nowhere to be found on your keyboard, we provide conveniences as markup. Or a keyboard character may have a different variant which we implement as an empty element. Here we test many of these. Read the Author's Guide for tags and more detail.

    There are a few common abbreviations of Latin phrases that can be achieved in HTML one way, and in with a slightly different mechanism. These are due to 's treatment of a period (full stop), depending on its surroundings. So not reserved characters, but just divergent treatment. Using these will lead to the best quality in all your outputs. See Will Robertson's informative and arcane blog post on the topic if you want the full story for the treatment of a full stop in .

    TagRealizationMeaning ad anno Domini, in the year of the Lord am ante meridiem, before midday bc English, before Christ ca circa, about eg exempli gratia, for example etal et alia, and others etc et caetera, and the rest ie id est, in other words nb nota bene, note well pm post meridiem, after midday ps post scriptum, after what has been written vs versus, against viz videlicet, namely

    We also distinguish between abbreviations (vs.), acronyms (SCUBA) and initialisms (XML). This is a test of the text version of a multiplication symbol: 24.

    Simple coordinates with degrees, minutes, seconds, or temperature, or distance in feet and inches. We parked the car at 36160.83N, 1223547.27W, and since it was 93F, we walked 5053.6 so we could swim in the bay.

    An em dash is the long dash used much like parentheses (not an en dash used to denote a range, such as a range of page numbers). It should not have spaces around it, but some style guides allow for a thin space, whichwe test right now. A publication file entry can be set to none or thin to control this.

    Currency

    For best results, be certain the right Unicode characters are in your source. If you only need a certain symbol rarely, you can enter it in your source via its Unicode number. For example, to obtain a peso, type &#x20B1;. This table has been tested with our default fonts, and should be fine for HTML output. Please report any difficulties with different fonts, as there are extra measures we can take to make these more robust. (We've already done this for the Paraguayan guaraní.)

    Supported Currency Sign Unicode Name $ U+0024 dollar ¢ U+00A2 cent £ U+00A3 sterling ¤ U+00A4 currency ¥ U+00A5 yen ƒ U+0192 florin ฿ U+0E3F baht U+20A1 colon U+20A4 lira U+20A6 naira U+20A9 won U+20AB dong U+20AC euro U+20B1 peso U+20B2 guarani
    Icons in Text

    A limited supply of icons can be used when explaining how to use some computer application. The empty element is icon and the attribute is name.

    We sprinkle a few into a few sentences to check baselines and font sizing. We sprinkle a few into a few sentences to check baselines and font sizing. We sprinkle a few into a few sentences to check baselines and font sizing. We sprinkle a few into a few sentences to check baselines and font sizing.

    User-Interface Icons NameIcon NameIcon NameIcon arrow-down arrow-left arrow-right arrow-up file-save gear menu wrench
    Creative Commons License Icons NameIcon NameIcon NameIcon cc cc-by cc-sa cc-nc cc-pd cc-zero

    Nominations of new icons must

    • Have a Unicode character representation.
    • Be in the HTML/CSS/JS Font Awesome 5 catalog.
    • Be in the fontawesome5 package.
    • Have a reasonably semantic name.
    Please supply all this information, including the official Unicode name, with your request. Better yet, form a pull request.

    Icons, <c>xelatex</c>, and Fonts

    When processing a file with xelatex the Font Awesome 5 icons are expected to be in a system font whose name is Font Awesome 5 Free. This is not a filename, and installing the fontawesome5 package into your installation does not always guarantee that this font will automatically be available as a system font.

    The Publisher's Guide contains some discussion about installing fonts into a system, as part of the documentation of creating a style, and has particular warnings about only using the fontawesome5 package as a vehicle for installing and accessing these fonts.

    Keyboard Keys keyboard keys

    Your text can include specialized text meant to look like a key on the keyboard of a calculator or other device. So you can go b Enter < or F1. Or maybe a sequence as: Tab > Ctrl > T. Use the kbd element, with the label of the key as content.

    There is a growing supply of keys which are labeled with graphics rather than text, such as a left arrow , right arrow , up arrow , down arrow , and Enter . See The Guide for the definitive list. In the literal column means the symbol/character is the content of a kbd element, while the named column means the symbol/character has been chosen via the value of the name attribute of an empty kbd element.

    Named keys Literal Named Ampersand & Less than < Greater than > Dollar $ Per cent % Open brace { Close brace } Hash # Backslash \ Tilde ~ Circumflex ^ Underscore _
    Upper Case ~ ! @ # $ % ^ & * ( ) _ + Tab Q W E R T Y U I O P { } | CapsLock A S D F G H J K L : ' Enter Shift Z X C V B N M < > ? Shift
    Lower Case ` 1 2 3 4 5 6 7 8 9 0 - = Tab q w e r t y u i o p [ ] \ CapsLock a s d f g h j k l ; ' Enter Shift z x c v b n m , . / Shift
    URLs, such as <url href="http://example.com"/> linkexternal, url referenceexternal, url

    The url element can be used to create an external reference. The mandatory href attribute is the actual URL complete with the protocol (e.g. https://). Content for the element is optional, and if provided will be the clickable text. In this case, a visual attribute can be provided. In producing the print version of a PDF, this will become a parenthetical with a more friendly version of the URL. When no content is provided, the clickable will be the URL with a preference for an optional visual. This subsection has some (extreme) tests and we leave complete documentation and full details for the Guide.

    A long URL for testing: . Notice in the source that you do not put any tags inside the href or visual attributes, but you may need to provide XML escape sequences (see ).

    A url element in the print version of a PDF will get a trailing parenthetical containing the (simplified) URL in the highly-recommended visual attribute. If you do not provide the visual attribute in this case, then you will get the href value repeated, possibly with some editing. If you insist, you can make the visual attribute identical to the href attribute. Some tests:

    • With a useful visual attribute
    • With a duplicate visual attribute
    • With no visual attribute, so an edited one is formulated (no protocol)

    Here is a totally bogus URL, which contains every possible legal character, so if this fails to convert there is some problematic character. In order to test the use of a percent sign (%) in a URL, we follow it by two hex digits, specifically, 58, which is a way to represent the character X in a URL. Normal text, monospace text, url with just href, url with href and visual, url with href, visual and content. Notice how the various versions do, or do not, line-break in /PDF output, including the (potentially confusing) use of a use of a hyphen in the normal text version. Note that # starts a fragment identifier, so it is the penultimate character. A ? would normally start a query string, but as the fragment identifier, it is not special. Finally, square brackets ([ and ]) are only legal in limited situations (authority component for IPv6 host literals), so they are present as percent-encoded literals, which really does not demonstrate anything. All these efforts to make a comprehensive, but legal, URL are meant to appease the EPUB validator which will otherwise flag them as errors.

    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%-._~:/%5B%5D@!$&'()*+,;=#?

    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%-._~:/%5B%5D@!$&'()*+,;=#?

    Characters to a footnote

    Line-breaking in /PDF output is specialized, using path separators (slashes) as candidates for splitting across lines:

    We are not fans of footnotes, they are totally unstructured.Carleson's Theorem A URL in a footnote migrates around, and so care must be taken. This paragraph has two footnotes, one with a real URL from Jesse Oldroyd, another with a fake URL from the above suite. For good measure, we repeat the URL found in the first footnoteAnd if you do provide a link like Carleson's Theorem in a footnote you should see an easy-to-read parenthetical version in some output formats, such as en.wikipedia.org/wiki/Carleson%27s_theorem.: Carleson's Theorem. And we include a no-content version of the same link, with a visual version provided and employed: .

    Biological Names biological names biological namestaxon scientific namesbiological names

    The taxontaxonbiological namestaxon element can be used all by itself to get an italicized scientific name, as in Escherichia coli. It can also be structured with the elements genusgenusbiological namesgenus and species,speciesbiological namesspecies as in using both together in Cyclopskolensis. Or the subelements can be used individually. Rules for capitalization are presently your responsibility as an author. Possible improvements include new subelements, attributes for database identifiers, and checks on capitalization. Also, we might automatically abbreviate the genus after first use.

    There is an attribute, @ncbincbi attributeattributesncbi attributebiological namesncbi attribute that you can use on the taxon element to precisely identify the organism you are discussing using an identification number from the National Center for Biotechnology Information. Their taxonomy is at www.ncbi.nlm.nih.gov/taxonomy. Right now, we do not do anything with this attribute, but things like links are certainly possible. See the source of this document to see it in use with Drosophilamiranda which could be used to construct a link to further information via id number or even further information via just the name.

    Verbatim in titles, <c>\a&b#c%d~e{f}g$h_i^j</c>, OK

    You can test the migration of the special characters in this section title by requesting a 2-deep Table of Contents via the publication file.

    Special Situations

    Sage defines a nice syntax for generators of algebraic structures, but we must remember to use an escape sequence for the < symbol (see ).

    P.<t> = ZZ[] P Univariate Polynomial Ring in t over Integer Ring

    There is an alternate Sage syntax, which avoids the less-than and greater symbols.

    R = ZZ['u'] u = R.gen(0) (u, R) (u, Univariate Polynomial Ring in u over Integer Ring)

    Ampersands, less-than, and greater symbols are likely to be necessary in source code, such as Sage code (think generators of field extensions) or TikZ code (think arrowheads), and in matrices (think separating entries). If you have a big matrix, or a huge chunk of TikZ code, you can protect it all at once from the XML processor by wrapping it in <![CDATA[]]>. It should be possible to write without ever using the CDATA mechanism, but it might get tedious in places to use the supplied macros or XML escape sequences. This construction is often mis-understood as a solution better remedied by reading again.

    We test the three pre-defined macros for &, <, and > with a pair of aligned equations: a^2 + b^2\amp\lt c^2 c^2\amp\gt a^2 + b^2

    Jupyter Notebook, Markdown, MathJax, Delimiters

    A Jupyter notebook allows a mix of HTML (our logistical preference for a conversion) and Markown (another set of special characters and their escaped versions). Certain pairs of delimiters, when appearing in consecutive HTML code elements require extraordinary care. But the one nut we cannot crack is pairs of dollar signs. So the next paragraph is known to render badly in a Jupyter notebook, but should otherwise be a bit boring.

    $ and $

    <latex/> Characters, Ligatures, and More

    This section is just for testing, and the more you know about , the more we would encourage you to not to read this. Look to the Author's Guide for the right way to author your source.

    The ten reserved characters, directly in the source: # $ % ^ & _ { } ~ \. And again: X#X$X%X^X&X_X{X}X~X\X, but smashed up tight to intermediate characters.

    In a verbatim presentation: # $ % ^ & _ { } ~ \.

    And X#X$X%X^X&X_X{X}X~X\X. (These verbatim versions are authored in different paragraphs to work around the Jupyter notebook bug described above.)

    We also disrupt certain constructions from . Attempting to sneak-in any traditional macro for the purposes of -only output, such as, say a \newpage, will fail since the leading backslash will be caught and converted to \textbackslash. (See? It just happened twice.) For technical reasons we want to particularly test \textbackslash, \textbraceleft, and \textbraceright.

    Four ligatures, --, ---, ``, and '', authored in running text, --, ---, ``, ''. It may be hard to tell that the two consecutive apostrophes have not coalesced into a curly left smart quote, but see below, the spacing is subtly different.

    We want the double quote mark from your keyboard, ", to not morph into some other character: ".

    More testing: runs of hyphens. Such as: - (one), -- (two), --- (three), ---- (four), ----- (five), ------ (six), ------- (seven). Use the empty elements ndash and mdash for the longer dashes/hyphens.

    Runs of apostrophes should not become smart right double quotes: ' (one), '' (two), ''' (three), '''' (four), ''''' (five), '''''' (six), ''''''' (seven). You might want to cut-and-paste these into a text file to convince yourself there are the right number of characters. Here are two smart right double quotes, separated by a non-breaking space, for visual comparison: . Or 30 apostrophes on a line of their own (longer) followed by 15 smart right double quotes (shorter).

    ''''''''''''''''''''''''''''''.

    .

    Runs of backticks (accent grave) should not become smart left double quotes when the output is processed by : ` (one), `` (two), ``` (three), ```` (four), ````` (five), `````` (six), ``````` (seven). Furthermore, in a context where Markdown syntax is recognized as well ( a Jupyter notebook), paired backticks should not produce `inline verbatim text`.

    The next paragraph has a long run of words separated/joined by the keyboard forward-slash character. With this input, will not line-break at the slash, nor will it hypenate anywhere. automatically provides an improved slash, which will line-break, as you should see below in output. There is a bad right margin, but that is due to the absurdity of this test. This sort of problem should be no better or worse for the use of this character. Further refinements (zero-width space) and packages can be used to get hyphenation. HTML will line-break rationally with no extra help. Remember the solidus character for super-simple text fractions like 732 (which will not line-break), and math elements or SI unit markup for technical work.

    A/test/of/some/short/words/that/go/off/the/end/of/a/line/A/test/of/some/short/words/that/go/off/the/end/of/a/line/A/test/of/some/short/words/that/go/off/the/end/of/a/line/A/test/of/some/short/words/that/go/off/the/end/of/a/line/A/test/of/some/short/words/that/go/off/the/end/of/a/line.

    <init>HTML</init> and accidental mathematics

    We render mathematics in web pages with the fantastic MathJax Javascript library. Simplifying just a bit, it recognizes syntax within a page, takes control of that text, and replaces it wth nice fonts and formatting. Now, if you write about you might well have some mathematics in your examples. Best practice would be to use verbatim text for that, and we mark off such text as being off-limits to MathJax.

    But if you are writing running text, then you can (accidentally) author some text which MathJax recognizes and converts to something (unintended). And if you are doing this intentionally, then you have ignored markup for mathematics, and are missing out on some features.

    A few tests that we can prevent any accidents.

    Inline mathematics: \(x^2\).

    Display mathematics: \begin{align}x^2+y^2=z^2\end{align}

    Double backticks is a common construction, which in /PDF output should not become an opening quote-mark. Also, a single backtick in HTML is a signal for MathJax to interpret ASCIIMath, and then a double backtick causes random pieces of mathematics on a page to not render at all. So we have a quotation authored -style: ``We have nothing to fear, but fear itself.''

    Graphics

    In addition to including images created externally (e.g. photographs), supports several languages for describing diagrams and pictures with human-readable source code ( plain text), rather than using a paint program. This section describes the various methods for incorporationg, or generating, graphis, images or diagrams.

    Images from External Sources

    If you have raster images (photographs, etc.) then they are specified with complete filenames, as above in Figure or just below.

    New Zealand Landscape, commons.wikimedia.org, CC-BY-SA-2.0

    If you have existing images that are vector graphics, then PDF format works best for output and SVG format works best for HTML. The utility pdf2svg works well for converting PDF to SVG. In this case, specify your source as a filename, but leave off the file extension, and the appropriate version will be used for the current output format.

    The image below is provided from a PDF file in output, and was converted to an SVG for use with the HTML output. It has been explicitly scaled to a width of 65% of the text width. It has a description, but no shortdescription, so is testing that scenario.

    Complete graph on 16 vertices, from www.texample.net

    A circular arrangment of 16 dots (vertices) with 120 straight lines (edges), joining every pair of dots.

    Footnote Buried

    Nested tcolorbox (in conversion) need special care when footnotes are interior.

    A paragraph interior to a sidebyside with a footnoteInterior footnote. buried inside the paragraph.

    A second paragraph, just to avoid a one-panel warning.

    The final paragraph of this remark, randomly placed, to test footnotes in conversions.

    <prefigure/> image image image

    is a standalone project for authoring mathematical diagrams (see ). Its philosophy and approach are much like that of , and is tightly integrated into . One key feature is excellent support for the creation of accessible output formats.

    As of 2024-11-06 development continues for itself, and fine-tuning of its integration within . But it is usable now for projects that want to use it.

    • You can author diagrams, and then generate SVG, PDF, and PNG output versions with the pretext/pretext script (see the Guide), and expect them to render in HTML, PDF, and EPUB output formats.
    • Look for automatic generation to come to the -CLI sometime very soon.
    • has excellent support for annotations within an SVG diagram, supporting their use by screenreaders, for example. See an example below.
    • Production of tactile versions is now possible, though they are not incorporated explicitly into any of the output formats. Perhaps they will become available via archive links or as a zip archive.

    This is a basic diagram, in the sense that it does not use all the features of or .

    Solution to a differential equation f(t,y) = (y[1], -pi*y[0]-0.3*y[1]) x(t) x'(t)

    This next diagram employs some macros that are defined in the usual way in docinfo and are employed to produce the names of some vectors in the labels. The blue line is colored blue by a global declaration, also in docinfo.

    v=(2,1) b=(2,4) bhat=dot(v,b)/dot(v,v) * v bperp = b - bhat

    The next diagram is authored with annotations, arranged in a hierarchy of increasing refinement and detail. Each identified graphical component will read its annotation and show it on the screen below the diagram. When a reader clicks on the image, a high-level summary will be read using the author-provided annotation. The down and up arrow keys enable a reader to explore the diagram in more or less detail while the right and left arrow keys reveal features at the same level of detail. When the focus is on the graph, pressing "O" will produce a sonification of the graph.

    a=1 f(x) = exp(x/3)*cos(x) (a,f(a))

    Including annotations enables a new type of interactive diagram within a document offering potential benefits for all readers. In particular, annotations allow an author to call the reader's attention to specific details in a diagram and how they are related to one another so that the diagram and surrounding text are more tightly integrated. The annotated diagram below introduces Fibonacci tilings, which are one-dimensional analogs of Penrose tilings, and offers an explanation of their aperiodicity. Of course, surrounding text would usually provide a richer context for a diagram like this.

    Fibonacci tilings are one-dimensional analogs of Penrose tilings. The diagram on the left introduces the process of deflation that is used to produce tilings while the diagram on the right explains why they are aperiodic. phi=(sqrt(5)+1)/2 height=0.25 top=1 bottom=0 left=0 right=2 colors={0:'blue', 1:'red'} widths={0:phi, 1:1} phi=(sqrt(5)+1)/2 height=0.25 width=5+8*phi colors={0:'blue', 1:'red'} widths={0:phi, 1:1} tiling2=[0,1,0,0,1] tiling1=[0,1,0,0,1,0,1,0] tiling0=[0,1,0,0,1,0,1,0,0,1,0,0,1] tilings=[tiling0, tiling1, tiling2]

    For sighted readers, here is an example of a tactile version of one of the above diagrams. It is generated automatically from the same source as the other version. Imagine this being printed with an embosser so that the parts of the diagram, and the braille labels, are raised up from the paper and can be explored with one's fingertips. This image is a PNG produced specifically for this document. Typically, a tactile diagram produced by will be a PDF ready to be sent to an appropriate embosser. Notice that adds a caption indicating the diagram's location in the document along the top of the diagram.

    <latex/> images image image image

    There are several graphics engine packages that a document can employ. Code from these packages renders diagrams automatically as part of normal processing of files. For HTML output the pretext script produces SVG versions of the pictures. The script can also produce standalone source files, PDFs, PNGs, and EPSs. The packages should be loaded in docinfo/latex-image-preamble, which is also where global package settings should be made. If any ampersands occur in your code you should use the \amp macro pre-defined by . These first examples are from the TeXample.net site. Note that any macros used in the rest of your document may be employed in the -standalone or Asymptote diagrams (with this feature coming to Sage graphics next?).

    TikZ Electronics Diagram a pile of electronic components wired together =triangle 45] \draw % Drawing the blocks of first filter : node at (0,0)[right=-3mm]{\Large \textbullet} node [input, name=input1] {} node [sum, right of=input1] (suma1) {\suma} node [block, right of=suma1] (inte1) {\inte} node at (6.8,0)[block] (Q1) {\Large $Q_1$} node [block, below of=inte1] (ret1) {\Large$T_1$}; % Joining blocks. % Commands \draw with options like [->] must be written individually \draw[->](input1) -- node {$X(Z)$}(suma1); \draw[->](suma1) -- node {} (inte1); \draw[->](inte1) -- node {} (Q1); \draw[->](ret1) -| node[near end]{} (suma1); % Adder \draw node at (5.4,-4) [sum, name=suma2] {\suma} % Second stage of filter node at (1,-6) [sum, name=suma3] {\suma} node [block, right of=suma3] (inte2) {\inte} node [sum, right of=inte2] (suma4) {\suma} node [block, right of=suma4] (inte3) {\inte} node [block, right of=inte3] (Q2) {\Large$Q_2$} node at (9,-8) [block, name=ret2] {\Large$T_2$} ; % Joining the blocks of second filter \draw[->] (suma3) -- node {} (inte2); \draw[->] (inte2) -- node {} (suma4); \draw[->] (suma4) -- node {} (inte3); \draw[->] (inte3) -- node {} (Q2); \draw[->] (ret2) -| (suma3); \draw[->] (ret2) -| (suma4); % Third stage of filter: % Defining nodes: \draw node at (11.5, 0) [sum, name=suma5]{\suma} node [output, right of=suma5]{} node [block, below of=suma5] (deriv1){\derv} node [output, right of=suma5] (sal2){} ; % Joining the blocks: \draw[->] (suma2) -| node {}(suma3); \draw[->] (Q1) -- (8,0) |- node {}(ret1); \draw[->] (8,0) |- (suma2); \draw[->] (5.4,0) -- (suma2); \draw[->] (Q1) -- node {}(suma5); \draw[->] (deriv1) -- node {}(suma5); \draw[->] (Q2) -| node {}(deriv1); \draw[<->] (ret2) -| node {}(deriv1); \draw[->] (suma5) -- node {$Y(Z)$}(sal2); % Drawing nodes with \textbullet \draw node at (8,0) {\textbullet} node at (8,-2){\textbullet} node at (5.4,0){\textbullet} node at (5,-8){\textbullet} node at (11.5,-6){\textbullet} ; % Boxing and labelling noise shapers \draw [color=gray,thick](-0.5,-3) rectangle (9,1); \node at (-0.5,1) [above=5mm, right=0mm] {\textsc{first-order noise shaper}}; \draw [color=gray,thick](-0.5,-9) rectangle (12.5,-5); \node at (-0.5,-9) [below=5mm, right=0mm] {\textsc{second-order noise shaper}}; \end{tikzpicture}]]>

    The next example began life in Sketch, which will output TikZ code (though the code has been edited by hand for readability).

    TikZ Cone Drawing ](1.643,1.853)--(1.643,.12); \filldraw[conefill](.913,1.8)--(1.369,.1)--(1.162,-.283) --(.775,1.545)--cycle; \draw[arrows=->,line width=.4pt](.274,-.5)--(0,0)--(0,2.86); \draw[arrows=-,line width=.4pt](0,0)--(-1.369,-.1); \draw[arrows=->,line width=.4pt](-1.369,-.1)--(-2.1,-.153); \filldraw[conefill](-.516,1.45)--(-.775,-.424)--(-1.369,-.1) --(-.913,1.667)--cycle; \draw(-1.369,.073)--(-1.369,2.76); \draw(1.004,1.807)--(1.734,1.86); \filldraw[conefill](.775,1.545)--(1.162,-.283)--(.274,-.5) --(.183,1.4)--cycle; \draw[arrows=<->](0,2.34)--(-.913,2.273); \draw(-.913,1.84)--(-.913,2.447); \draw[arrows=<->](0,2.687)--(-1.369,2.587); \filldraw[conefill](.183,1.4)--(.274,-.5)--(-.775,-.424) --(-.516,1.45)--cycle; \draw[arrows=<-,line width=.4pt](.42,-.767)--(.274,-.5); \node[ann] at (-.456,2.307) {$r_0$}; \node[ann] at (-.685,2.637) {$r_1$}; \node[ann] at (1.643,.987) {$h$}; \path (.42,-.767) node[below] {$x$} (0,2.86) node[above] {$y$} (-2.1,-.153) node[left] {$z$}; % Second version of the cone \begin{scope}[xshift=3.5cm] \filldraw[ghostdraw,ghostfill](-.775,1.922)--(-1.162,.283)--(-.274,.5) --(-.183,2.067)--cycle; \filldraw[ghostdraw,ghostfill](-.183,2.067)--(-.274,.5)--(.775,.424) --(.516,2.016)--cycle; \filldraw[ghostdraw,ghostfill](.516,2.016)--(.775,.424)--(1.369,.1) --(.913,1.8)--cycle; \filldraw[ghostdraw,ghostfill](-.913,1.667)--(-1.369,-.1)--(-1.162,.283) --(-.775,1.922)--cycle; \filldraw[ghostdraw,ghostfill](.913,1.8)--(1.369,.1)--(1.162,-.283) --(.775,1.545)--cycle; \filldraw[ghostdraw,ghostfill](-.516,1.45)--(-.775,-.424)--(-1.369,-.1) --(-.913,1.667)--cycle; \filldraw[ghostdraw,ghostfill](.775,1.545)--(1.162,-.283)--(.274,-.5) --(.183,1.4)--cycle; \filldraw[fill=red,fill opacity=0.5](-.516,1.45)--(-.775,-.424)--(.274,-.5) --(.183,1.4)--cycle; \fill(-.775,-.424) circle (2pt); \fill(.274,-.5) circle (2pt); \fill(-.516,1.45) circle (2pt); \fill(.183,1.4) circle (2pt); \path[font=\footnotesize] (.913,1.8) node[right] {$i\hbox{$=$}0$} (1.369,.1) node[right] {$i\hbox{$=$}1$}; \path[font=\footnotesize] (-.645,.513) node[left] {$j$} (.228,.45) node[right] {$j\hbox{$+$}1$}; \draw (-.209,.482)+(-60:.25) [yscale=1.3,->] arc(-60:240:.25); \fill[black,font=\footnotesize] (-.516,1.45) node [above] {$P_{00}$} (-.775,-.424) node [below] {$P_{10}$} (.183,1.4) node [above] {$P_{01}$} (.274,-.5) node [below] {$P_{11}$}; \end{scope} \end{tikzpicture}]]>

    The pgfplots package was included in docinfo/latex-image-preamble. Here, it is used. Also, here we demonstrate using \amp where you would normally use an ampersand in . There are known issues with xelatex processing any gradient shading in tikz. To (successfully) create the gradient shading in the 3D image here, you may need to use pdflatex until developers resolve this issue.

    Sample pgfplots plot a Cartesian plane with a function graph, a parametric curve, and some points , smooth, thin, color = blue, ]{4*ln(x)/ln(10)}; \addplot[ only marks, ]coordinates{ (0,2) (4,3) (2,4) (3,4)}; \addplot[ variable = \t, domain = 0:360, samples = 200, color = orange, ]({3*sin(2*t)}, {2*cos(5*t)}); \end{axis} \amp \begin{axis}[axis lines = box, width = 0.5\linewidth] \addplot3[ surf, faceted color = blue, samples = 15, domain = 0:1, y domain = -1:1 ]{x^2 - y^2}; \end{axis}\\ }; \end{tikzpicture}]]>

    A plot might use a graphics language to draw the axes and grid, but the data might be from an experiment and live in an external file that you do not wish to place in your source. Place such a file in a subdirectory directly below the directory where your master source file resides. Then indicate this directory in a docinfo/directories/@data attribute of your source. But you must prefix the path with data/ as in the source below.

    External data in a pgfplots plot a Cartesian plot of electric potential over time;

    The TikZ image in the next figure is made up from two PNG images (the shark and the swimmer), in addition to various TikZ commands. The images reside in a source directory, numerical/attack, so the image files (shark.png, swimmer.png) are prefixed in the TikZ code with data/attack so the creation of the image will be successful. This example is courtesy of Stephen Brown.

    An illustration of the shark trying to catch you as you swim to shore. \begin{tikzpicture} \tikzset{ ragged border/.style={ decoration={random steps, segment length=1mm, amplitude=0.5mm}, decorate, } } \fill[cyan!30] decorate[ragged border]{ (0,2) -- (8,2) } -- (8,0) -- (0,0) -- cycle; \fill[yellow!30] decorate[ragged border]{ (8,2) -- (8,0) } -- (9,0) -- (9,2) -- cycle; \draw (1.5,1) node {\scalebox{-0.2}[0.2]{\includegraphics{data/attack/shark.png}}}; \draw (5,1) node {\includegraphics[scale=0.05]{data/attack/swimmer.png}}; \draw[|-|] (1.5,3) node [above] {\(\SI{0}{m}\)} -- (5,3) node [above] {\(\SI{50}{m}\)}; \draw[|-|] (5,3) -- (8,3) node [above] {\(\SI{70}{m}\)}; \end{tikzpicture}

    A Cartesian plot might benefit from having a description with a tabular that lays bare the data used to to plot points.

    Full description with tabular a plot of some data points

    A Cartesian graph plotting the following data.

    x 1 2 3 4 5 6 7 8 9 y 5 3 8 9 5 5 8 2 3
    \begin{tikzpicture} \begin{axis}[ xmin=0, xmax=10, ymin=-0,ymax=10, xlabel={\(x\)}, ylabel={\(y\)}, ] \addplot[only marks] coordinates {(1,5) (2,3) (3,8) (4,9) (5,5) (6,5) (7,8) (8,2) (9,3)}; \end{axis} \end{tikzpicture}

    The next image requires three passes with to get everything in place. It is placed here to test that the code in the Pythion script correctly recognizes this requirement.

    A matrix with colored entries \begin{tikzpicture} \node{ $\begin{bNiceArray}{ccc|cc}[ code-before={\cellcolor{green!72}{1-1,2-2,3-3}\cellcolor{teal!72}{1-2,2-3,3-4}\cellcolor{yellow!72}{1-3,2-4,3-5}} ] 3 \amp 4 \amp 0 \amp 1 \amp 4 \\ -2 \amp 3 \amp 1 \amp -2 \amp 3 \\ 0 \amp 2 \amp 1 \amp 0 \amp 2 \end{bNiceArray}$ }; \end{tikzpicture}

    PSTricks is a package for drawing diagrams and pictures, dating back to the days before PDF, when PostScript (PS) was king. Given its history, it does not seem to work easily with the pdflatex engine. But it will work easily with the xelatex engine. We try to keep this present sample document workable with both engines, so we have presented an example of the use of PSTricks in the xelatex-exclusive sample document where we test obscure fonts and characters. So your best bet is to look there.PSTricks

    There are suggestions online that \usepackage[pdf]{pstricks}along with pdflatex --shell-escape *.tex is workable. We could not make it happen, and a shell escape can be a dangerous security hole. That said, updates to this approach are welcome.

    Asymptote, 2D

    The Asymptoteasymptote graphics language graphics language may be placed in your source to draw graphs, diagrams or pictures. Rules for formatting code are identical to those for Sage code. For more on Asymptote see .

    This is a simple physics diagram about levers, taken from the Asymptote documentation. In the HTML version of this article, the images are SVG's and so should scale nicely when you zoom in on the page.

    Asymptote Lever Demonstration moments on a lever

    This diagram has two masses at either end of a lever, namely m and M. They are located at distance x and X on an axis. The resulting center-of-mass is at a point \bar{x}.

    size(200,0); pair z0=(0,0); pair z1=(2,0); pair z2=(5,0); pair zf=z1+0.75*(z2-z1); draw(z1--z2); dot(z1,red+0.15cm); dot(z2,darkgreen+0.3cm); label("$m$",z1,1.2N,red); label("$M$",z2,1.5N,darkgreen); label("$\hat{\ }$",zf,0.2*S,fontsize(24pt)+blue); pair s=-0.2*I; draw("$x$",z0+s--z1+s,N,red,Arrows,Bars,PenMargins); s=-0.5*I; draw("$\bar{x}$",z0+s--zf+s,blue,Arrows,Bars,PenMargins); s=-0.95*I; draw("$X$",z0+s--z2+s,darkgreen,Arrows,Bars,PenMargins);

    And a colorful contour plot with logarithmic scale. Again, from the Asymptote documentation. This SVG image employs two additional PNG images for the two parts where the color varies continuously.

    Asymptote Contour Plot import graph; import palette; size(10cm,10cm,IgnoreAspect); real f(real x, real y) { return 0.9*pow10(2*sin(x/5+2*y^0.25)) + 0.1*(1+cos(10*log(y))); } scale(Linear,Log,Log); pen[] Palette=BWRainbow(); bounds range=image(f,Automatic,(0,1),(100,100),nx=200,Palette); xaxis("$x$",BottomTop,LeftTicks,above=true); yaxis("$y$",LeftRight,RightTicks,above=true); palette("$f(x,y)$",range,(0,200),(100,250),Top,Palette, PaletteTicks(ptick=linewidth(0.5*linewidth())));

    Here is the lever diagram again, but now we have added an integral to one of the legends, using a macro of our own, which is idential to one we used in the early part of this article. The point is, we only needed to define the macro once for the entire document, and it is available as we make Asymptote diagrams. This device can be used to maintain flexibility and consistency in your choice of notation.

    Aymptote Lever, plus Integral size(200,0); pair z0=(0,0); pair z1=(2,0); pair z2=(5,0); pair zf=z1+0.75*(z2-z1); draw(z1--z2); dot(z1,red+0.15cm); dot(z2,darkgreen+0.3cm); label("$m$",z1,1.2N,red); label("$M$",z2,1.5N,darkgreen); label("$\hat{\ }$",zf,0.2*S,fontsize(24pt)+blue); pair s=-0.2*I; draw("$x$",z0+s--z1+s,N,red,Arrows,Bars,PenMargins); s=-0.5*I; draw("$\bar{x}=\definiteintegral{0}{1}{x\delta(x)}{x}$",z0+s--zf+s,blue,Arrows,Bars,PenMargins); s=-1.05*I; draw("$X$",z0+s--z2+s,darkgreen,Arrows,Bars,PenMargins);
    Asymptote, 3D via WebGL

    Asymptote can create an HTML file that is an interactive version of a 3D shape. At this writing (2020-05-18) support via the pretext script is evolving. Plus, you will need newer versions of Asymptote and the dvisvgm utility to duplicate all of the results being displayed here in this testing document. The other distinction is that the author needs to provide the aspect ratio of the figure, and this should be placed on the asymptote element (not on the image element). is from the Asymptote Gallery.

    Work Cone (Asymptote Interactive 3D Image) import solids; size(0,150); currentprojection=orthographic(0,-30,5); real r=4; real h=10; real s=8; real x=r*s/h; real sr=5; real xr=r*sr/h; real s1=sr-0.1; real x1=r*s1/h; real s2=sr+0.2; real x2=r*s2/h; render render=render(compression=0,merge=true); draw(scale(x1,x1,-s1)*shift(-Z)*unitcone,lightblue+opacity(0.5),render); path3 p=(x2,0,s2)--(x,0,s+0.005); revolution a=revolution(p,Z); draw(surface(a),lightblue+opacity(0.5),render); path3 q=(x,0,s)--(r,0,h); revolution b=revolution(q,Z); draw(surface(b),white+opacity(0.5),render); draw((-r-1,0,0)--(r+1,0,0)); draw((0,0,0)--(0,0,h+1),dashed); path3 w=(x1,0,s1)--(x2,0,s2)--(0,0,s2); revolution b=revolution(w,Z); draw(surface(b),blue+opacity(0.5),render); draw(circle((0,0,s2),x2)); draw(circle((0,0,s1),x1)); draw("$x$",(xr,0,0)--(xr,0,sr),red,Arrow3,PenMargin3); draw("$r$",(0,0,sr)--(xr,0,sr),N,red); draw((string) r,(0,0,h)--(r,0,h),N,red); draw((string) h,(r,0,0)--(r,0,h),red,Arrow3,PenMargin3); draw((string) s,(-x,0,0)--(-x,0,s),W,red,Arrow3,Bar3,PenMargin3);

    These 3D images in HTML output are rotable with a pointing device (mouse, trackpad) with a click-and-drag. A finger should suffice on touch-sensitive devices (phones, tablets). Zooming in and out can be accomplished with a mouse wheel, or by pinching. As a contribution to the accessibility of HTML output, keyboard controls will also allow for exploration of these images. (Make sure the image has focus when you attempt to use these.)

    3D Image Keyboard Controls KeyAction xRotate around x-axis yRotate around y-axis zRotate around z-axis +Enlarge image -Shrink image hReturn to home position

    And finally, an example of a 3-D graph (from the Asymptote documentation again). This WebGL image is a beautiful example of a Riemann surface. As you rotate the image, notice how the reflection of the light source varies, along with the brightness of various regions of the surface. This example is accomplished with just 10 lines of Asymptote code.

    Asymptote 3-D Surface // Riemann surface of z^{1/n} import graph3; import palette; int n=3; size(200,300,keepAspect=false); currentprojection=orthographic(10,10,5); currentlight=(10,10,5); triple f(pair t) {return (t.x*cos(t.y),t.x*sin(t.y),t.x^(1/n)*sin(t.y/n));} surface s=surface(f,(0,0),(1,2pi*n),8,16,Spline); s.colors(palette(s.map(zpart),Rainbow())); draw(s,meshpen=black,render(merge=true));
    Mermaid Diagrams Mermaid diagrams

    Mermaid is a Markdown-inspired tool for authoring various kinds of diagrams. Below, three of the available diagram types are demonstrated. For a full listing of diagram types, see the Mermaid Documentation. The Mermaid live editoris a great tool for testing the syntax of your mermaid diagrams.

    In PreTeXt, you can specify a Mermaid theme via the theme in the common/mermaid/ publisher variable.

    For HTML output, if you switch back-and-forth between light-mode and dark-mode, you will need to refresh the page to see the changes in the Mermaid diagrams.

    Mermaid Git Diagram A git diagram in Mermaid --- title: Example Git diagram --- gitGraph commit commit branch develop checkout develop commit commit checkout main merge develop commit commit
    Mermaid Class Diagram A class diagram in Mermaid classDiagram Animal <|-- Duck Animal <-- Fish Animal <|-- Zebra Animal : +int age Animal : +String gender Animal: +isMammal() Animal: +mate() class Duck{ +String beakColor +swim() +quack() } class Fish{ -int sizeInFeet -canEat() } class Zebra{ +bool is_wild +run() }
    Mermaid Seuqnece Diagram A sequence diagram in Mermaid sequenceDiagram participant Alice participant Bob Alice->>John: Hello John, how are you? loop HealthCheck John->>John: Fight against hypochondria end Note right of John: Rational thoughts <br/>prevail! John-->>Alice: Great! John->>Bob: How about you? Bob-->>John: Jolly good!

    Mermaid has two layout enginesthe default and elk. The ELK engine often does a better job with complex diagrams. You can specify it as a default by setting the publisher variable common/mermaid/@layout-engine to "elk", or specify it in a single diagram by using standard Mermaid config frontmatter as shown in below.

    Mermaid Class Diagram using ELK layout engine
    Sage Plots Sage plots

    Any of the numerous capabilities of Sage may be used to produce any graphics object, be it the simple graph of a single-variable function or some realization of a more complicated object. All of the usual rules about formatting Sage code (esp. indentation) apply, along with one more caveat. The last line of your Sage code must return a Sage Graphics object (or 3D plot). The pretext script will isolate this last line, use it as the RHS of an assignment statement, and the Sage .save() method will be called to generate the image, which is either a Portable Document Format (PDF) file amenable to output, or a Scalable Vector Graphics (SVG) file amenable to HTML output. It is also possible to make a PNG image, which is necessary for an EPUB destined for a Kindle book. For visualizations of 3D plots, Sage will only produce Portable Network Graphics (PNG) files, which can be included in HTML pages or output. For complete documentation, see the Guide as this subsection is not comprehensive.

    A Sage standard parabola, on [-2,4] a standard parabola on the interval [-2,4] f(x) = x^2 plot(f, (x, -2, 4), color='green', thickness=3)

    Pay careful attention to the requirement that the last line of your code be a graphics object. In particular, while show() might appear to do the right thing, it evaluates to Python's None object and that is just what you will get. The code for Figure illustrates creating two graphics objects and combining them into an expression on the last line that evaluates to a graphics object.

    Two Sage plots on one set of axes f(x) = x^4 g(x) = -x^4 up = plot(f, (x, -1.5, 1.5), color='blue', thickness=2) down = plot(g, (x, -1.5, 1.5), color='red', thickness=2) up + down

    Sage code comprised of just a single line was once mishandled, leading to no ouput. From Jean-Sébastien Turcotte we have the example that revealed the problem.

    Les vecteurs \vec{u} et \vec{v}

    Les vecteurs \vec{u} et \vec{v}sont tracés tel que demandé, respectivement en rouge et en bleu.

    plot(vector([-1,2]),color='red')+plot(vector([2,1]),color='blue')

    The following examples are from the Sage Tour. We package them into a sidebyside layout element, see .

    A Sage multigraph of a sentence stnc = 'I am a cool multiedge graph with loops' g = DiGraph({}, loops=True, multiedges=True) for a,b in [(stnc[i], stnc[i+1]) for i in srange(len(stnc)-1)]: g.add_edge(a, b, b) g.plot(color_by_label=True, edge_style='solid', figsize=(8,8))
    Sage polynomial approximations of f(x)=1/(1+25x^2) def f(x): return RDF(1 / (1 + 25 * x^2)) def runge(): R = PolynomialRing(RDF, 'x') g = plot(f, -1, 1, rgbcolor='red', thickness=1) polynom = [] for i, n in enumerate([6, 8, 10, 12]): data = [(x, f(x)) for x in xsrange(-1, 1, 2 / (n - 1), include_endpoint=True)] polynom.append(R.lagrange_polynomial(data)) g += list_plot(data, rgbcolor='black', pointsize=5) g += plot(polynom, -1, 1, fill=f, fillalpha=0.2, thickness=0) return g runge()

    From the Sage documentation, with slight modifications, credited to Douglas Summers-Stay. A plot of the implicity defined surface 2 = \cos(x + ty) + \cos(x - ty) + \cos(y + tz) + \cos(y - tz) + \cos(z - tx) + \cos(z + tx) in rectangular xyz coordinates, with t equal to the golden ratio. If you set plot_points=100 in the Sage code, you will get a very smooth rendering, but also a quite large HTML file. We have used plot_points=50 to reduce the file size by a factor of four. Note the need for a value of 3d for the variant attribute, and an explicit aspect ratio with aspect. Arrow keys, a mouse scroll wheel, plus grabbing with a left or a right mouse button, can be used to manipulate the image.

    A Sage implicitly defined 3D surface var('x y z') T = RDF(golden_ratio) p = 2 - (cos(x + T*y) + cos(x - T*y) + cos(y + T*z) + cos(y - T*z) + cos(z - T*x) + cos(z + T*x)) r = 4.77 implicit_plot3d(p, (x, -r, r), (y, -r, r), (z, -r, r), plot_points=50, frame=False)
    Inkscape Images

    Inkscape is a great tool for creating images. It ticks all the boxes: open source, mature, cross-platform, standards-compliant. Read much more about it in The Guide. In HTML output the two images below are both in SVG format. The first is pure SVG, while the second has embedded information that makes it easier to edit in Inkscape. You could view the source for this page in the HTML version, deduce the filename of the second image, download it, and manipulate it profitably with Inkscape. Both files are quite small, but the first is half the size of the second. In PDF the two images come from files that are identical, so nothing is being tested. The PDF version is smaller still.

    Inkscape Stars, Plain SVG (left), Inkscape SVG (right), from Bethany Llewellyn
    Copies of Images

    Sometimes you want to use the same image more than once. Here we just point to a PNG file that we repeat often throughout this sample.

    Copy of raster image, in a figure, so now numbered and captioned

    For images described by code, such as TikZ code in a latex-image element, this is a bit subtler. See the Guide for a complete description. We also demonstrate this with the sample book, since it is all set up with the xinclude mechanism. See the two plots of the 8-th roots of unity in the complex numbers section of the chapter on cyclic groups.

    Caption Testing

    A caption could be as substantial as a paragraph, here we test out one such example.

    A caption can be a whole paragraph with lots of technical details, and maybe a hyperlink to something external, such as or . There could be some inline mathematics, such as x^2 + y^2 = c^2. Would a knowl open here? Recursively? Let's see: . Display mathematics, side-by-sides, theorems, and lots of other things should be banned. Footnotes sound like a bad idea. Strange characters should be fine: .
    Captionless Images

    We strongly suggest placing images within a figure, as we have done above, so that you can reference them, and use the (required) caption to explain what they are. However there are places, such as a preface, where numbered items are not permitted. So you might want a solo image there. Or maybe graphics are an illustration of sorts, and a numbered figure feels like overkill. Or it is part of an exercise or proof of a theorem. But notice that you cannot then use this image as the target of a cross-reference, so you may need to refer to some enclosing container.

    The image can be scaled by specifying the width as a percentage, including the percent-sign (%). The height is scaled to preserve the aspect ratio. There is no facility to change the height, it is your responsibility to manage the aspect ratio independently. The margins can be given as a pair of percentages, separated by a space. The width defaults to 100%, while margins defaults to the value auto, which will center the image. Missing values are computed sensibly, and there is robust error-checking. The layout control here is a subset of what is available for the more elaborate sidebyside element, see .

    Two simple examples. The first has width 10% and so defaults to being centered, and the second has width 10% and left margin of 25%.

    A paragraph, just to show where the first stops and the second ends.

    You might wish to place a single image flush-left, or flush-right. You can specify the margins attribute as a pair of percentages for different left and right margins. The following are laid out with two margins, with a 0% left margin and right margin (respectively).

    We place two images right above one another, to test spacing of consecutive images (provided they stay on the same page!).

    Testing (2019-06-02)

    All the images above are specified by filenames. We need to test how various options behave when incorporated into the (new) implementation for images, being introduced with solo images.

    A tikz image recycled from above, now 40% width, with 40% left margin, 20% right margin.

    ](1.643,1.853)--(1.643,.12); \filldraw[conefill](.913,1.8)--(1.369,.1)--(1.162,-.283) --(.775,1.545)--cycle; \draw[arrows=->,line width=.4pt](.274,-.5)--(0,0)--(0,2.86); \draw[arrows=-,line width=.4pt](0,0)--(-1.369,-.1); \draw[arrows=->,line width=.4pt](-1.369,-.1)--(-2.1,-.153); \filldraw[conefill](-.516,1.45)--(-.775,-.424)--(-1.369,-.1) --(-.913,1.667)--cycle; \draw(-1.369,.073)--(-1.369,2.76); \draw(1.004,1.807)--(1.734,1.86); \filldraw[conefill](.775,1.545)--(1.162,-.283)--(.274,-.5) --(.183,1.4)--cycle; \draw[arrows=<->](0,2.34)--(-.913,2.273); \draw(-.913,1.84)--(-.913,2.447); \draw[arrows=<->](0,2.687)--(-1.369,2.587); \filldraw[conefill](.183,1.4)--(.274,-.5)--(-.775,-.424) --(-.516,1.45)--cycle; \draw[arrows=<-,line width=.4pt](.42,-.767)--(.274,-.5); \node[ann] at (-.456,2.307) {$r_0$}; \node[ann] at (-.685,2.637) {$r_1$}; \node[ann] at (1.643,.987) {$h$}; \path (.42,-.767) node[below] {$x$} (0,2.86) node[above] {$y$} (-2.1,-.153) node[left] {$z$}; % Second version of the cone \begin{scope}[xshift=3.5cm] \filldraw[ghostdraw,ghostfill](-.775,1.922)--(-1.162,.283)--(-.274,.5) --(-.183,2.067)--cycle; \filldraw[ghostdraw,ghostfill](-.183,2.067)--(-.274,.5)--(.775,.424) --(.516,2.016)--cycle; \filldraw[ghostdraw,ghostfill](.516,2.016)--(.775,.424)--(1.369,.1) --(.913,1.8)--cycle; \filldraw[ghostdraw,ghostfill](-.913,1.667)--(-1.369,-.1)--(-1.162,.283) --(-.775,1.922)--cycle; \filldraw[ghostdraw,ghostfill](.913,1.8)--(1.369,.1)--(1.162,-.283) --(.775,1.545)--cycle; \filldraw[ghostdraw,ghostfill](-.516,1.45)--(-.775,-.424)--(-1.369,-.1) --(-.913,1.667)--cycle; \filldraw[ghostdraw,ghostfill](.775,1.545)--(1.162,-.283)--(.274,-.5) --(.183,1.4)--cycle; \filldraw[fill=red,fill opacity=0.5](-.516,1.45)--(-.775,-.424)--(.274,-.5) --(.183,1.4)--cycle; \fill(-.775,-.424) circle (2pt); \fill(.274,-.5) circle (2pt); \fill(-.516,1.45) circle (2pt); \fill(.183,1.4) circle (2pt); \path[font=\footnotesize] (.913,1.8) node[right] {$i\hbox{$=$}0$} (1.369,.1) node[right] {$i\hbox{$=$}1$}; \path[font=\footnotesize] (-.645,.513) node[left] {$j$} (.228,.45) node[right] {$j\hbox{$+$}1$}; \draw (-.209,.482)+(-60:.25) [yscale=1.3,->] arc(-60:240:.25); \fill[black,font=\footnotesize] (-.516,1.45) node [above] {$P_{00}$} (-.775,-.424) node [below] {$P_{10}$} (.183,1.4) node [above] {$P_{01}$} (.274,-.5) node [below] {$P_{11}$}; \end{scope} \end{tikzpicture}]]>

    A pgfplot image recycled from above, now 20% width, with 40% left margin, 40% right margin, and no longer legible.

    An Asymptote image, with zero layout control, so 100% width.

    moments on a lever // The next comment was seen in the wild, and the angle brackets // are non-ASCII Unicode characters, which was disrupting communication // with the Asymptote server, so we include the comment here for testing. // The actual comment is immaterial for the lever diagram. // // The path is an elliptical helix ⟨ cos t, 2sin t, t/pi ⟩. // size(200,0); pair z0=(0,0); pair z1=(2,0); pair z2=(5,0); pair zf=z1+0.75*(z2-z1); draw(z1--z2); dot(z1,red+0.15cm); dot(z2,darkgreen+0.3cm); label("$m$",z1,1.2N,red); label("$M$",z2,1.5N,darkgreen); label("$\hat{\ }$",zf,0.2*S,fontsize(24pt)+blue); pair s=-0.2*I; draw("$x$",z0+s--z1+s,N,red,Arrows,Bars,PenMargins); s=-0.5*I; draw("$\bar{x}$",z0+s--zf+s,blue,Arrows,Bars,PenMargins); s=-0.95*I; draw("$X$",z0+s--z2+s,darkgreen,Arrows,Bars,PenMargins);

    A Sage example, pushed to the right margin.

    a standard parabola on the interval [-2,4] f(x) = x^2 plot(f, (x, -2, 4), color='green', thickness=3)
    Technical Details

    The table below is a summary of how graphics and images are specified, constructed and manipulated. Additional processing is indicated by reference to the Python script pretext. Images need to be placed relative to the file that includes them during compilation, and placed relative to the HTML files which reference/include them. Author-provided image files may be placed in any subdirectory, and the @source attribute should include the complete relative path with the subdirectory. Files generated by the pretext script will be specified in the output using the relative directory images, which can be changed. There is no reason author-provided files cannot also be placed in this same directory (presuming no duplicate names). [This table is presently more readable in HTML, the PDF version will improve.]

    Element Specification /Print HTML Notes image/@source full relative path, w/ extension directly included directly included author-provided PNG, JPEG image/@source full relative path, w/o extension presumes PDF presumes SVG author-provided image/latex-image-code -compatible source directly included SVG via pretext tikz, pgfplots, xypic image/sageplot Sage code PDF via pretext SVG via pretext PNG for 3-D image/asymptote Asymptote code PDF via pretext SVG via pretext

    In the early stages of a writing project, it may be best not to track provisional image files built with pretext under version control, and just regenerate them periodically (see the -r option for pretext). As a project matures, then it makes sense to put stable files under version control for collaborators and others. In every case, managing graphics files (and other aspects of production), is much more pleasurable with a script (shell, Makefile, etc.)

    Accessibility

    An image should either have a non-empty description, a non-empty shortdescription, or set decorative to the value yes. Some of the following images comply, and some do not. There's not really anything to see here visually, this is testing notifications made elsewhere.

    No description, no shortdescription, no decorative set to yes

    No description, no shortdescription, decorative set to yes

    No description, empty shortdescription, no decorative set to yes

    No description, empty shortdescription, decorative set to yes

    No description, too long shortdescription, no decorative set to yes

    This shortdescription is too long because when alt text is longer than 125 characters, some screen readers will cut off reading the alt text after the 125th character.

    No description, too long shortdescription, decorative set to yes

    This shortdescription is too long because when alt text is longer than 125 characters, some screen readers will cut off reading the alt text after the 125th character.

    No description, good shortdescription, no decorative set to yes

    a white square outlined in blue covered by a black X

    No description, good shortdescription, decorative set to yes

    a white square outlined in blue covered by a black X

    Description, no shortdescription, no decorative set to yes

    A white square outlined in blue covered by a black X.

    Description, no shortdescription, decorative set to yes

    A white square outlined in blue covered by a black X.

    Description, empty shortdescription, no decorative set to yes

    A white square outlined in blue covered by a black X.

    Description, empty shortdescription, decorative set to yes

    A white square outlined in blue covered by a black X.

    Description, too long shortdescription, no decorative set to yes

    This shortdescription is too long because when alt text is longer than 125 characters, some screen readers will cut off reading the alt text after the 125th character.

    A white square outlined in blue covered by a black X.

    Description, too long shortdescription, decorative set to yes

    This shortdescription is too long because when alt text is longer than 125 characters, some screen readers will cut off reading the alt text after the 125th character.

    A white square outlined in blue covered by a black X.

    Description, good shortdescription, no decorative set to yes

    a white square outlined in blue covered by a black X

    A white square outlined in blue covered by a black X.

    Description, good shortdescription, decorative set to yes

    a white square outlined in blue covered by a black X

    A white square outlined in blue covered by a black X.

    Further Reading Specialized Subdivisions

    In a longer work you might wish to have some references on a per-chapter basis, or similar. You can make a references subdivision anywhere to hold bibliographic items, and you can reference the items like any other item. For example, we can cite the article below , included an indication that a specific chapter may be relevant.

    Exercises

    No problem here, but the next two are in an exercise group with an introduction and a conclusion, along with an optional title. The two problems of the exercise group should be indented some to indicate the grouping.

    N.B. An exercisegroup is meant to hold a collection of (short) exercises with common, shared, instructions. Do not use this structure to subdivide an exercises division, as you will eventually be disappointed. Instead, use the available, but under development as of 2019-11-02, subexercises, which requires a title.

    Two Derivative Problems exercise grouptwo derivatives

    In the next two problems compute the indicated derivative.

    You could connect the image above with the exercises following as part of this introduction for the exercisegroup.

    f(x)=x^3, \frac{df}{dx}. This sentence is just a bunch of gibberish to check where the second line of the problem begins relative to the first line.

    We cross-reference the next problem in this exercise group. For the phrase-global form, the common element of the cross-reference and the target should be the exercises division, and not the enclosing exercisegroup: .

    derivativecosine

    y = \cos(x), y^\prime.

    Note that the previous two problems used very different notation for the function and the resulting derivative.

    This isn't really an exercise, but an explanation that the next exercisegroup has a title and no introduction, which once resulted in some aberrant formatting in output.

    Two More Derivative Problems

    Some common instructions would go here in the introduction

    f(x)=x^3, \frac{df}{dx}. This sentence is just a bunch of gibberish to check where the second line of the problem begins relative to the first line.

    We cross-reference the next problem in this exercise group. For the phrase-global form, the common element of the cross-reference and the target should be the exercises division, and not the enclosing exercisegroup: .

    y = \cos(x), y^\prime.

    Compute \int 3x^2\,dx.

    One of the few things you can place inside of mathematics is a fill-in blank.fill-in blank We demonstrate a few scenarios here. See details on syntax in the use is identical within mathematics.

    • Inside inline math (short, space for x): \sin()

    • Inside inline math (default, space for XXX): \sin()

    • Inside exponents and subscripts (each is space for the string 12). In this case, be sure to wrap your exponents and subscripts in braces, as would be good practice anyway: x^{5+}\,y_{}

    • Inside inline math (too long for this line probably, 40 characters long): \tan()

    • So use inside a displayed equation16\log\spacelike this one.

    • Inside the second line of a multi-line display: y &= x^7\,x^8 &= x^{}

    • This fillin has the historical characters attribute for a fillin inside math: 1++4=10, which may be more convenient, but may not side properly in places like subscripts, superscripts, fractions, limits of integrals, and so on.

    More Exercises

    This exercises section should start on a new page in PDF output if the standard publisher file is used.

    This is not a real exercise, we just want to explain that this is another subsection of exercises, which has two consecutive exercise groups.

    Introduction to first exercise group.

    Only exercise of first group.

    Conclusion to first exercise group.

    Introduction to second exercise group.

    First exercise of second group.

    Second exercise of second group.

    Conclusion to second exercise group.

    An exercisegroup can have a cols attribute taking a value from 26. Exercises will progress by row, in so many columns. On a small screen, the HTML exercises may reorganize into fewer columns.

    1+2

    3+4+5

    Addition is associative.

    12

    First, add 3 and 4 to get 7, then add 5 to arrive at 12.

    5+6

    Add seven to eight.

    15

    9+10

    1+2

    3+4+5

    Addition is associative.

    12

    First, add 3 and 4 to get 7, then add 5 to arrive at 12.

    A simple argument.

    And a bit more.

    5+6

    Add seven to eight.

    15

    9+10

    1+2

    3+4+5

    Addition is associative.

    12

    First, add 3 and 4 to get 7, then add 5 to arrive at 12.

    5+6

    Add seven to eight.

    15

    9+10

    1+2

    3+4+5

    Addition is associative.

    12

    First, add 3 and 4 to get 7, then add 5 to arrive at 12.

    5+6

    Add seven to eight.

    15

    9+10

    This feature was designed with short drill exercises in mind. With long exercises, or exercises with long hints, answers, or solutions, there is a risk that the output will have bad page breaks in the vicinity (just before) such an exercise that occupies too much vertical space. Edit, rearrange, or use fewer columns to see if the situation improves.

    Make a table and a graph for the function f(x)=x^2.

    x f(x) 0 0 1 1 2 4 3 9 \begin{tikzpicture} \begin{axis} \addplot[domain=-1.5:4, blue, thick, {stealth}-{stealth}] {x^2}; \end{axis} \end{tikzpicture}
    References referenceswithin a section

    These items are here to test basic formatting of references.

    Gilbert Strang, The Fundamental Theorem of Linear Algebra, The American Mathematical Monthly November 1993, 100 9, 848855. J. B. Conrey and D. W. Farmer Mean values of <m>L</m>-functions and symmetry Internat. Math. Res. Notices 17 2000 Robert A. Beezer, A First Course in Linear Algebra, 3rd Edition, Congruent Press, 2012.

    An online, open-sourceA gratuitous footnote to test prior bug confusing this with a REMARK-LIKE note. offering.

    H. Davenport Multiplicative Number Theory GTM 74 Springer-Verlag New York, NY 2000 xiv+177 A note may accompany a bibliographic item, such as saying the manuscript is under review. But it cannot contain any formatting. Alexander Rosswell, Diffeomorphisms of Penciled Fiber Bundles, Mathematicians of America 2020, 2 6, 884888. , Diffeomorphisms of Penciled Fiber Bundles, Part 2, Mathematicians of America 2021, 3 4, 102103.

    This is a conclusion, which has not been used very much in this sample. Did you see that the entry for has a short annotation? So you can make annotated bibliographies easily.

    List Calisthenics Lists, Generally ordered list listordered unordered list listunordered

    Use ol to make an ordered list,ordered list and ul to make an unordered (bulleted) list. In both cases, use li for each entry. If an entry contains more than one paragraph, then each must be wrapped in p. unordered list listordered listunordered

    This section contains nested lists, to demonstrate how they get assigned labels (numbering, symbols). But we begin with two simple lists, demonstrating an ordered list and an unordered list. See the end of section for an example of a description list. Note in the source the optional use of a paragraph (p) for the list items of the list of colors.

    1. First.
    2. SecondFootnote in an unstructured list item.
    3. Third.
    • RedOne of our favorite colors

    • Green

    • Yellow

    • Purple

    Next, we have a list with no customization and multiple levels to test the defaults. allows a maximum of four levels of ordered/numbered lists, and a total of six levels if some unordered lists are mixed in. Note that to have nested lists you must structure your list items as paragraphs, since a list may only appear within a p element.

    1. A title on a top-level item

      Level 1, first.

    2. Level 1, second.

      1. Level 2, first.

      2. Level 2, second.

        1. Level 3, first.

        2. Level 3, second.

          1. Level 4, first.

          2. Level 4, second.

          3. Title on xref'ed list item

            Level 4, third.

        3. Level 3, third.

      3. A title on a nested item

        Level 2, third.

    3. Level 1, third.

    Items in ordered lists (only) may be be give an xml:id and then may be the target of an xref. We test three here, referencing down into the hierarchy above. Level 1, second: . Level 3, second: . Level 4, third: . Note that if a list item of an ordered list is contained within a list item of an unordered list, then its number will not be defined.

    And now a four-level deep unordered list with the default labels supplied by (disc, circle, square, disc). Again, the defalt order for Markdown/Jupyter (disc, square, circle, circle) is different than for and HTML (disc, circle, square, disc)

    • A title on a top-level item

      Level 1, first.

    • Level 1, second.

      • Level 2, first.

      • Level 2, second.

        • Level 3, first.

        • Level 3, second.

          • Level 4, first.

          • Level 4, second.

          • Level 4, third.

        • A title on a nested item

          Level 2, third.

      • Level 2, third.

    • Level 1, third.

    And a total of six levels with a mix of ordered and unordered lists, the most that out-of-the-box- is able to handle.

    1. Level 1, first.

    2. Level 1, second.

      1. Level 2, first.

      2. Level 2, second.

        • Level 3, first.

        • Level 3, second.

          1. Level 4, first.

          2. Level 4, second.

            1. Level 5, first.

            2. Level 5, second.

              • Level 6, first.

              • Level 6, second.

              • Level 6, third.

            3. Level 5, third.

          3. Level 4, third.

        • Level 3, third.

      3. Level 2, third.

    3. Level 1, third.

    Now, nested lists with the defaults replaced by custom choices. First, an ordered list, three deep, upper Roman numerals, then upper-case Latin, then more traditional Arabic numerals on the three elements of the third level. Note the adornments of the labels will not currently be rendered by WebKit-based browsers (such as Safari) when viewing HTML output.

    1. Level 1, first.

    2. Level 1, second.

      1. Level 2, first.

      2. Level 2, second.

        1. Level 3, first.

        2. Level 3, second.

        3. Level 3, third.

      3. Level 2, third.

    3. Level 1, third.

    A nested unordered list, with labels given as squares on the outer list and nothing (blank) on the inner lists.

    • Level 1, first.

    • Level 1, second.

      • Level 2, first.

      • Level 2, second.

    • Level 1, third.

    A nested ordered list, to test intramural cross-references.

    1. Level 1, first.

    2. Level 1, second.

      • Level 2, first.

      • Level 2, second.

    3. Level 1, third. With a cross-reference to second list item, .

    4. Level 1, fourth. Whose number should not change when the knowl just prior is opened.

    An ordered list may begin at zero by using a numeral zero in the label attribute, instead of numeral one.

    1. First
    2. Second

      1. Uno
      2. Dos
      3. Tres

    3. Third

    The next definition is very poorly worded. It is meant to test leading off with a list (bad form), for which normally begins right after the heading.

    Group Group

    groupdefinitionparagraphinitial list

    1. There is a binary operation, denoted \cdot.
    2. The operation is associative.
    3. There is an identity element, e.
    4. For every element b, there is an element c (the inverse), such that b\cdot c=c\cdot b = e.

    If these conditions are met for a set G, then we say G is a group.

    Exercises and References are specialized subdivisions you can put anywhere. They are implemented as top-level lists, so should share behavior. For example, an exercise may have many parts and when expressed as a list, should have the expected labels.

    Similarly, References may have lists in their annotations. Unlikely? But possible.

    The next two subdivisions are an Exercises subdivision and a References subdivision, which have lists within an exercise and a bibliographic item (respectively).

    List Spacing, I

    This is a short list that ends a subsection, so can be used to address the necessary spacing. We also test two XML elements separated by a space (which should not go missing).

    1. One item.
    2. Two ducks.
    3. Three items. Plus a few more words to check that long entries in a two column list look good.
    4. Four items.
    5. Another long entry that simultaneously tests that long entries look good in a list, and also tests an odd number of entries in a two column list.

    List Spacing, II

    This is another short list that ends a subsection, so can be used to address the necessary spacing.

    • Uno item.

    • Dos items.

    • Tres item.

    • Quattro items.

    And a paragraph after that list so that spacing can be checked.

    List items containing only inline math Testing list items containing only math

    There are many places where it makes sense to have a list of mathematical terms, or possibly equations. For example, one might wish to provide a list of derivative formulas. With such lists, the author may wish to have display mathematics, but almost certainly they don't want it centered. One can work around this by using the \displaystyle command. However, it would be nice if a list item containing only math used display mode by default.

    1. A list item containing some text in a paragraph, as well as some inline math: \int_a^b x^2\,dx = \frac{x^3}{3}.

    2. A list item with text and math \int_a^b x^2\,dx, not in a paragraph.
    3. \frac{d}{dx}\tan(x) = \sec^2(x) = \frac{1}{\cos^2(x)}
    4. \sum_{i=0}^n r^i = \frac{1-r^{n+1}}{1-r}
    \int f(x)\,dx math in lists \frac{d}{dx}(\sin(x))=\cos(x)

    Now, a p that isn't in a list, followed by a list that's in a p.

    • \sum_{n=1}^\infty\frac{1}{n^2}=\frac{\pi^2}{6} A list item starting with some math, followed by text, all in a p

    • \frac{a}{b}\div \frac{c}{d} = \frac{ad}{bc}
    • \tan\theta = \frac{\sin\theta}{\cos\theta}

    The above assemblage had some lists in it, just to see what will happen. While we're at it, we might try adding lists that are in a list.

    A list of items, some of which contain math
    1. A first list item, containing some text. The next list item will contain only math, with the m tag inline with the li tag.

    2. A list item with text and math \int_a^b x^2\,dx, not in a paragraph.
    3. \int_a^b f'(x)\, dx = f(b)-f(a)
    4. The next two list items will contain, respectively, a list item containing only math, where the math is on a new line, then the same again, but with two new lines, and a list item containing math within a p, first inline, and then after a line break.

    5. \frac{d}{dx}\sec^{-1}(x) = \frac{1}{x\sqrt{x^2-1}}
    6. \frac{d}{dx}\sec^{-1}(x) = \frac{1}{x\sqrt{x^2-1}}
    7. \frac{d}{dx}\sec^{-1}(x) = \frac{1}{x\sqrt{x^2-1}}

    8. \frac{d}{dx}\sec^{-1}(x) = \frac{1}{x\sqrt{x^2-1}}

    And now, a list in a paragraph.

    • A paragraph that begins with text, then some math: \sum_{n=1}^\infty\frac{1}{n^2}=\frac{\pi^2}{6} And now some more text. The next two list items contain:

      1. Math only, inline.

      2. Math only, with a newline.

      3. Math only, but in a paragraph. Also the next item on this list has math, just to see what happens in a nested list.

      4. \int_a^x \frac{d}{dt}f(t)\,dt = f(x)-f(a)

    • \frac{a}{b}\div \frac{c}{d} = \frac{ad}{bc}
    • \tan\theta = \frac{\sin\theta}{\cos\theta}
    • \frac{a}{b}\gt \sum_{i=3}^{76}\frac{x^2}{y^2}

    Inclusion of any text other than math will kill the automatic display style. For example, this would happen if one were to add punctuation after the math.

    • \int_a^b \frac{\sin(x)}{x}\,dx,
    • \int_a^b \frac{\sin(x)}{x}\,dx

    List items can have titles. We try that here, along with testing list items structured with paragraphs.

    • With <c>\displaystyle</c> added automatically

      \sum_{n=1}^\infty ar^n

    • Two paragraphs

      \sum_{n=1}^\infty ar^n

      \sum_{n=1}^\infty ar^n

    • One paragraph, extra text

      So, \sum_{n=1}^\infty ar^n

    • Two elements (only)

      \sum_{n=1}^\infty ar^n

    Difficult List Items

    In we were careful about lone bits of math inside list items. The cd element is used with indentation, which is likely superfluous inside a list item that is already being indented. Here we test lone cd elements inside of list items in various configurations.

    Unordered list, one-deep.

    • Foo Bar Foo Bar Foo Bar
    • This list item is a long paragraph with a cd in the middle which should be indented some to indicate its participation in the paragraph. Foo Bar Foo Bar Bar Foo Bar Foo This list item is a long paragraph with a cd in the middle which should be indented some to indicate its participation in the paragraph.

    • Foo Bar Foo Bar Bar Foo Bar Foo

    Intervening paragraph, to illuminate spacing at both the top and bottom of a list. Intervening paragraph, to illuminate spacing at both the top and bottom of a list. Intervening paragraph, to illuminate spacing at both the top and bottom of a list. Intervening paragraph, to illuminate spacing at top and bottom of a list.

    Ordered lists, two-deep, mixed.

    1. First item, outer level.

      1. First inner item, cd only Foo Bar Foo Bar Bar Foo Bar Foo
      2. Second inner item, a paragraph in a list item.

      3. Third inner item, cd only Foo Bar Foo Foo Bar Foo Bar Foo Bar

    2. cd inside second item, outer level Bar Bar Foo Bar Foo

    Description Lists

    Use dl to make a description listdescription listlistdescription. Inside of those tags, use li for each entry. Then, use title to specify the term being described and p to specify the description.

    A description list description listlistdescription has a short term or phrase that is prominent, followed by a short description. It is modeled on the lists of similar structure in both and HTML. It makes for a nice medium-weight way to define terms, somewhere in-between the term tag which just makes a term prominent in a sentence, and a definition, which is set off, has a heading, a number, and a title. Do not try to manage the separation between the title and the description by employing punctuation (but you can include a question-mark or exclamation-point if necessary). For example, do not include a colon to the end of the title. This example is from Bob Plantz.

  • Central Processing Unit (CPU)

    Controls most of the activities of the computer, performs the arithmetic and logical operations, and contains a small amount of very fast memory.

    This is a second paragraph that should appear indented in PDF output.

  • Memory

    Provides storage for the instructions for the CPU and the data they manipulate.

  • Input/Output (I/O)

    Communicates with the outside world and with mass storage devices (, disks).

  • Bus!

    A communication pathway with a protocol specifying exactly how the pathway is used. (The punctuation is just for testing.)

  • <m>\displaystyle \sum_{n=0}^\infty x^n = \frac{1}{1-x}</m>

    A geometric series. The formula is valid if |x| < 1.

  • Some presentations can be assisted by a hint from the author about the lengths of the titles. You can choose to provide a width attribute on a dl element with possible values narrow, medium, and wide. The value refers (somewhat confusingly) to the distance between the left margin and the description. The default is medium, which is illustrated above. An example with narrow:

  • Red

    The color of the sun at sunset.

  • Blue

    The color of a clear sky. Also a synonym for depressed or sad, the title of a 1971 Joni Mitchell album (and more than a dozen other musical albums), the period of Picasso's work between 1901 and 1904, and much more!

  • Aqua

    The color of shallow tropical waters.On a sunny day! (Testing footnotes in description lists for output.)

  • Math <m>x^2</m>

    Sorry, not a color but testing titles with math in them.

  • <q>i</q> before <q>e</q> except after <q>c,</q> unless it sounds like <q>a</q> as in <q>neighbor</q> and <q>weigh</q>

    Get feisty about that weird counterfeit rule: seize the day and don't have a heifer, man.

  • Avocado

    Avocado is the the color with hex code #568203, and also the main ingredient in guacamole.

  • Magenta

    Magenta is a color, and a character in Rocky Horror.

  • Zymurgist

    A scientist who studies the chemical process of fermentation in brewing and distilling. Also the alphabetically last 9-letter word in the English language.

  • Byzantium

    Byzantium is the the color with hex code #702963, and also an ancient Greek city which later became known as Constantinople, and today is called Istanbul.

  • Convection

    Circulating motion in a fluid.

  • Elementary

    No literary detective ever said Elementary my dear Watson. In particular, Sherlock Holmes never said that.

  • Understand

    Perceive the intended meaning of.

  • Washington

    A state, a district, the man on the US $1 bill and on the US quarter. Did you ever notice that on the US dime, the value is stated as one dime? But how is one to know that a dime is worth 10 cents?

  • Aquamarine

    Aquamarine is a color, and a mineral.

  • Those who cannot remember the past are condemned to repeat it.

    George Santayana wrote those words in 1905. A similar aphorism is misattributed to Winston Churchill. The idea is embodied in the 4th principle: respects the good design practices which have been developed over the past centuries.

  • <m>\displaystyle \zeta(s) = \sum_{n=1}^\infty n^{-s} </m>

    The Riemann \zeta-function is defined by a Dirichlet series, valid for \Re(s) > 1.

  • <c>main()</c> is a void function

    A dl with width="narrow" might be a useful way to give commentary on a program listing.

  • And the same example with wide:
  • Red

    The color of the sun at sunset.

  • Blue

    The color of a clear sky. Also a synonym for depressed or sad, the title of a 1971 Joni Mitchell album (and more than a dozen other musical albums), the period of Picasso's work between 1901 and 1904, and much more!

  • Aqua

    The color of shallow tropical waters.On a sunny day! (Testing footnotes in description lists for output.)

  • Math <m>x^2</m>

    Sorry, not a color but testing titles with math in them.

  • <q>i</q> before <q>e</q> except after <q>c,</q> unless it sounds like <q>a</q> as in <q>neighbor</q> and <q>weigh</q>

    Get feisty about that weird counterfeit rule: seize the day and don't have a heifer, man.

  • Avocado

    Avocado is the the color with hex code #568203, and also the main ingredient in guacamole.

  • Magenta

    Magenta is a color, and a character in Rocky Horror.

  • Zymurgist

    A scientist who studies the chemical process of fermentation in brewing and distilling. Also the alphabetically last 9-letter word in the English language.

  • Byzantium

    Byzantium is the the color with hex code #702963, and also an ancient Greek city which later became known as Constantinople, and today is called Istanbul.

  • Convection

    Circulating motion in a fluid.

  • Elementary

    No literary detective ever said Elementary my dear Watson. In particular, Sherlock Holmes never said that.

  • Understand

    Perceive the intended meaning of.

  • Washington

    A state, a district, the man on the US $1 bill and on the US quarter. Did you ever notice that on the US dime, the value is stated as one dime? But how is one to know that a dime is worth 10 cents?

  • Aquamarine

    Aquamarine is a color, and a mineral.

  • Those who cannot remember the past are condemned to repeat it.

    George Santayana wrote those words in 1905. A similar aphorism is misattributed to Winston Churchill. The idea is embodied in the 4th principle: respects the good design practices which have been developed over the past centuries.

  • <m>\displaystyle \zeta(s) = \sum_{n=1}^\infty n^{-s} </m>

    The Riemann \zeta-function is defined by a Dirichlet series, valid for \Re(s) > 1.

  • <c>main()</c> is a void function

    A dl with width="narrow" might be a useful way to give commentary on a program listing.

  • You can nest description lists, though items might get crowded horizontally. We expand our computer list a bit.

  • Expanded CPU

    Controls most of the activities of the computer, performs the arithmetic and logical operations, and contains a small amount of very fast memory.

  • Arithmetic

    The kind of computations that give a computer the name computer.

  • Logic

    Operations that make decisions, if this, then that, plus: and, or, and not.

  • Memory

    Space to store information and results, permanently or temporarily.

  • This is a second paragraph that should appear indented in PDF output.

  • Memory

    Provides storage for the instructions for the CPU and the data they manipulate.

  • Input/Output (I/O)

    Communicates with the outside world and with mass storage devices (, disks).

  • Bus!

    A communication pathway with a protocol specifying exactly how the pathway is used. (The punctuation is just for testing.)

  • <m>\displaystyle \sum_{n=0}^\infty x^n = \frac{1}{1-x}</m>

    A geometric series. The formula is valid if |x| < 1.

  • Named Lists named listlistnamed

    A list can be wrapped with a list element, so that it earns a number, can be given a title and have an introduction and conclusion. Cross-references to individual list items get a bit involved as they are prefixed with the number of the list and then the number of the item, so conceivably you could get a number like 4.5.3:2.a.ii. The colon is used to indicate the transition from the number of the list within divisions and the numbers coming from the list hierarchy, since it has two small dots.

    Colors of the Rainbow

    Because the colors are always in the same order, an ordered list is natural here. The colors change continuously, but are often divided up into large ranges that human perception can easily distinguish.

    1. Red

    2. Orange

    3. Yellow

    4. Green

    5. Blue

    6. Indigo

    7. Violet

    So some people use the acronym ROY-G-BIV to remember this sequence.

    This next list is used for testing cross-references to it. See .

    A named list of targets

    This is the introduction to this named list, which references an item within, via the hybrid text attribute: . At one time this paragraph was inadvertently centeredthat bug has been fixed.

      1. A and i
      2. A and ii
      3. A and iii

      1. B and a
      2. B and b
      3. B and c (target of some cross-references)

      • The next three cross-references point to a list item, just above. It is interesting because the list is named, hence numbered. The global reference uses the full number, while the local reference uses the number from within the list. The hybrid reference recognizes that the target is within the same named list, so the number can be shorter. An identical hybrid cross-reference appears within the introduction to this list, an immediately following, but outside the list.
      • Cross-reference within named list (global):
      • Cross-reference within named list (hybrid):
      • Cross-reference within named list (local):
        1. C and bullet and 1
        2. C and bullet and 2
        3. C and bullet and 3

      • C and bullet
      • C and bullet

    This is a paragraph just outside the preceding named list, which references an item within, via the hybrid text attribute: .

    listThis is a paragraph with three lists contained within it. For HTML output we have to inside-out the lists.

    1. A one item ordered list.
    In other words, the text before, after, and between, needs to each be encapsulated as an HTML p element of its own.
    • A one item unordered list.
    Including definition lists.
  • Define Me

    A one item definition list.

  • That's all!

    A one item list, whose item is a paragraph with two contained ordered lists, separated by text.

    • Introductory text.

      1. First item, first list.
      Intermediate text.
      1. First item, second list.
      Concluding text.

    Testing List Decompositions

    A list in a paragraph is a construction in HTML that browsers try to correct, which leads to unpredictable results, so we have to decompose an author's paragraph with lists into a sequence of HTML paragraphs, interrupted by lists. This subsection is only relevant to HTML output, and only for testing.paragraphnormal

    1. This paragraph opens with an ordered list.
    2. Testing the id, and other info that should be at the top of the paragraph.
    Now the paragraph continues, and we have an index item here, so we can test cross-references back here.paragraphopens with list

    List Column Testing

    This is a list arranged into two columns with some intentional layout challenges. The math is too long to fit in one column and can't be wrapped - it reduces the number of columns in its row. The long text items can be wrapped and stay within their column.

    1. One item.
    2. Two ducks.
    3. 3u \amp {}+{} 1v \amp {}+{} 3w \amp {}+{} 2x \amp {}+{} \amp y \amp {}+{} \amp 3z \amp {}={} \amp 10 2u \amp {}+{} 2v \amp {}-{} 2w \amp {}+{} x \amp \amp \amp {}+{} \amp z \amp {}={} \amp 6 1u \amp {}-{} 3v \amp {}+{} 1w \amp {}+{} x \amp {}+{} \amp 3y \amp {}+{} \amp 2z \amp {}={} \amp 13
    4. Short item.
    5. A long item that can be wrapped over multiple lines.
    6. Four items.
    7. Another long entry that simultaneously tests that long entries look good in a list, and also tests an odd number of entries in a two column list.

    Exercises (with lists)

    This exercise should have several parts, and labels should follow the defaults for second-level lists (since the exercise is numbered according to the top-level default).

    1. Exercise 1, first part.

    2. Exercise 1, second part.

      1. Exercise 1, second part, first refinement.

    3. Exercise 1, third part.

    Table Alignment Example 1111, 2222 3333 aaaa bbbb,cccc AAAA BBBB CCCC

    This exercise (a list item really) has a table first. Default aligns it vertically above the exercise number. Placement here tests correcting that alignment.

    A small test of cross-references to subsidiary parts of exercises. Exercise 1, third part: . Exercise 1, second part, first refinement: .

    References (with lists in Annotations) Some book would be listed here.

    Here is the annotation and an ordered list as part of that annotation.

    1. Book 1, first part.
    2. Book 1, second part.
    3. Book 1, third part.

    Table Calisthenics c = 832 c

    That was a Sage cell just now, which has nothing to do with tables. But we needed someplace to test placement right after a division heading. Carry on.

    A very minimal table, hence with left-justified cells, no borders. We do wrap the tabular element in a table element to get centering, numbering and a caption. Footnotes inside cells are tested here.

    Some Colors Red GreenGreen can be a very sick looking color. Yellow Blue White Pink

    Note that tables may be constructed using the Complex Table Editor tool online at latex-tables.comand then exported in syntax.

    Tables can be used and abused many ways. We describe long division of polynomials by using vertical and horizontal borders on individual entries of a tabular. The division lines are slightly thicker than the subtraction lines. This is a good example of the typical abuse of tables for horizontal and vertical layout. At least we have called it a Figure, not a Table.

    Polynomial Long Division x - 5 x + 2 x^2 - 3x - 8 x^2 + 2x -5x - 8 -5x - 10 2

    An example of aligning table cells' contents horizontally. See the source for comments.

    Horizontal Alignment Example 1234567890 1234567890 1234567890 1234567890 [First Second Third Fourth A B C D 1 2 3 4

    Example from above, but now with horizontal rules, plus an extra row to test the bottom border. See the source for comments.

    Horizontal Rules Example 1234567890 1234567890 1234567890 1234567890 First Second Third Fourth A B C D 1 2 3 4 1 2 3 4

    For a table without a caption, create a tabular and place it directly within the current division. This will allow control over the horizontal placment, but without a caption, there is no number, and the tabular cannot be cross-referenced.

    One

    Same example as before, but now with vertical rules. See the source for comments.

    Vertical Rules Example 1234567890 1234567890 1234567890 1234567890 First Second Third Fourth A B C D 1 2 3 4 1 2 3 4
    Progressively Thicker Rules Example 1111 2222 3333 aaaa bbbb cccc AAAA BBBB CCCC
    Column Span Example 1111, 2222 3333 aaaa bbbb,cccc AAAA BBBB CCCC

    A list whose first item is a table. In output a \leavevmode is necessary to keep this organized (item number, then table as content).

    1. Table Alignment Example 1111, 2222 3333 aaaa bbbb,cccc AAAA BBBB CCCC

    Example Environment with Leading Table Column Spans, No <c>col</c> Elements, Nine Columns 1 2+3 4 5+6+7 8+9 1 2 3 4 5 6 7+8 9 1 2 3 4 5 6 7 8 9

    This example tests several things. In output, figures, tables, listings and side-by-sides are floats whose placement can migrate, but we have tries to supress this behavior. However, a float that is the first item of an environment (like a theorem or an example) can still float to a position before its title. If that does not happen here, then our additional defenses are working.

    This example also checks that the total number of columns is correctly computed from the first row, which features several colspan attributes.

    A bare minimum table (one row with one cell) to test edge cases:

    One entry table One

    Table cells with a fixed width where text wraps are known as paragraph cells. A cell will be created as a paragraph cell if and only if it has p children. And such cells should only have p children. The width of a paragraph cell is determined by a width attribute on the corresponding col (as a percentage). If the column has a non-paragraph cell with contents that are wider than the paragraph cells, results will be undesirable. There is presently no implementation for a paragraph cell that has a colspan greater than 1, although cells with colspan greater than 1 that are above or below a paragraph cell will behave. Setting width on a col that has no paragraph cells may produce unexpected results. A valign for the parent row (or the ambient tabular) can control vertical alignment (top, middle, or bottom). A paragraph cell's halign attribute (left, center, right, or justify) controls how the text is justfied. Cells inherit halign from row, col, and tabular in that order of preference. In a non-paragraph cell where halign='justify', the horizontal alignment will match the behavior of halign='left'.

    Time Units Unit Stands For Definition Roughly second

    the duration of 9192631770 periods of the radiation corresponding to the transition between the two hyperfine levels of the ground state of the cesium-133 atom

    an extraneous paragraph just to demonstrate the inter-paragraph formatting.

    the time it takes you to say the phrase differential calculus

    minute

    exactly 60 seconds

    how long it takes to microwave a full dinner plate from the refrigerator

    hour

    exactly 3600 seconds; exaclty 60 minutes

    the length of one episode of a premium cable television show

    Table cells can have multiline content using line elements. This is not the same thing as a paragraph cellline breaking will happen precisely where the author tells it to. A line will not break, even on a narrow screen. If a cell uses a line, it must only use a sequence of lines and no other content. As with paragraph cells, you can use a valign attribute for the row.

    <abbr>Dr.</abbr> Seuss lines One Fish Two Fish Red Fish Blue Fish I am the Lorax. I speak for the trees. Self-referential: Look at me! Look at me! Look at me NOW! It is fun to have fun. But you have to know how.

    This is a table torture test with many combinations of halign, valign, colspan, p children, and line children.

    Table Torture Test Cell too wide Lf md

    Lef mid par cel

    Rt md

    Rig mid par cel

    Cn md

    Cen mid par cel

    Js md

    Jus mid par cel jus mid par cel

    Colspan=2lef midwith lines Colspan=3 rig mid LinesBetweenPar LinesBetweenNo Par

    Par in row with lines

    L t

    Lef top par cel

    R t

    Rig top par cel

    C t

    Cen top par cel

    J t

    Jus top par cel jus top par cel

    L b

    Lef bot par cel

    R b

    Rig bot par cel

    C b

    Cen bot par cel

    J b

    Jus bot par cel jus bot par cel

    Colspan=3 lef bot Colspan=2rig botwith lines LinesUnderPar LinesUnderNo Par

    Par in row with lines

    And now a sidebyside with a table and a tabular to check that width is scaled appropriately. See Section to learn about sidebysides.

    Some text from the US Constitution A1.S1

    All legislative Powers herein granted shall be vested in a Congress of the United States, which shall consist of a Senate and House of Representatives.

    Should be 50% of 45% except perhaps on small screens.

    A1.S2.C1

    The House of Representatives shall be composed of Members chosen every second Year by the People of the several States, and the Electors in each State shall have the Qualifications requisite for Electors of the most numerous Branch of the State Legislature.

    Should be 50% of 55% except perhaps on small screens.

    Tables are formed in output with copious use of the \multicolumn macro to override more global alignment settings, and to spread the content of one cell across several columns. However, sometimes 's special characters have behaved badly in this situation. So the table below, two items per row, is just designed for testing. But of course, it should still render fine in other formats. The three test cases are from , but without 50 alphabetic characters and 8 digits, which should not be problems in this context. That section says more about making a comprehensive, yet legal, test URL. In order to test the use of a percent sign (%) in a URL, we follow it by two hex digits, specifically, 58, which is a way to represent the character X in a URL. The first column's entries are forced to be wrapped in a \multicolumn by specifying their horizontal alignment. The second column's entries will not be wrapped in a \multicolumn. So the two columns will look identical, other than the first having a left alignment, and the second has the default center alignment. (This table is known to render poorly in a Jupyter notebook. The cause is four dollar signs present in rows 1 and 3, and is explained in .)

    Problematic Table Cells for <latex/> 1 09az%-._~:/%5B%5D@!$&'()*+,;=#? 09az%-._~:/%5B%5D@!$&'()*+,;=#? 2 e.com/09az%58-._~:/%5B%5D@!$&'()*+,;=#? e.com/09az%58-._~:/%5B%5D@!$&'()*+,;=#? 3

    Now, the same table repeatedly, but with different headers. No care has been taken with alignment or rules, which could improve how these look.

    No Headers State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850
    One Row Header State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850
    One Row Header, Multiline State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850
    Two Row Headers State Population Area Statehood (sq. mi.) (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850
    One Vertical Row Header State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850
    One Vertical Row Header, Multiline State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850
    Two Vertical Row Headers State Population Area Statehood (sq. mi.) (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850
    Test of vertical header orientation and padding with borders 0 (MTH111) 1 (MTH112) 2 (CS160) 3 (CS161) 4 (CS162) 5 (CS205) 0 (MTH111) 0 1 0 1 0 0
    One Row Header, with Rules State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850
    One Row Header, Multiline, with Rules State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850

    The next table has a progression of thicker rules in the header, plus a progression of thicker rules across the columns. For testing, not for aesthetics.

    Two Row Header, Many Rules State Population Area Statehood (sq. mi.) (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850

    We now finish this section with some long tables. Ones that will not fit on a single printed page. So this is only of interest when producing this sample article as a PDF. First a naked tabular, which should force a new page to start, and then still overrun the end of the page.

    Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink

    Now the same tabular, but within a table. Behavior should be similar, a new page and then it overruns the bottom of the page.

    A Lot of Colors Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink

    When you wish to allow a tabular to split itself at a page break, you can add the attribute break with the value yes. Certainly this will control a table or tabular which is longer than a page, but will also allow a shorter one to break. This might useful in a draft stage before undertaking page-fitting.

    Here is the long tabular again, but with the break attribute set to yes.

    Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink

    Here is the long table again, but with the break attribute set to yes on the tabular.

    A Lot of Colors, Breaking Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink Red Green Yellow Blue White Pink

    This device is not ideal, as some features of tables are not behaving as expected. More precisely, we switch from the standard tabular environment to the longtable environment from the package of the same name when table-breaking is requested. So there may be some undesirable interaction with other packages. For one, full-width horizontal rules seem to become as wide as the page (rather than as wide as the tabular). The following table is repeated but as a breakable tabular. The longtable package documentation suggests it accomodates the array package, but it also seems to make a variety of redefinitions. Furthermore, a panel of a side-by-side cannot be a breakable tabular, or a compilation error occurs.

    Horizontal Rules Example 1234567890 1234567890 1234567890 1234567890 First Second Third Fourth A B C D 1 2 3 4 1 2 3 4

    Here is a consecutive pair of bare tabular to test vertical space between them.

    t 2/3 2/303 2/30003 2/3000003 g(t) -1 -1 -1 -1 t 2/5 2/505 2/50005 2/5000005 g(t) 1 1 1 1

    The longtable package allows for headers and footers indicating continued tables. A possible enhancement is to support this feature in the case of a long table.

    Interactive Elements, Authored in Javascript Interactive Elements, Authored Interactive Elements, Authored interactive elementsauthored embedded interactive elementsauthored

    When outputting Web page versions, it is possible to embed a variety of dynamic interactive elements. In a /PDF version, these will necessarily need to be replaced by some static substitute, such as a screenshot. See for the specifics of embedding instances of the Sage Cell Server, which is more elaborate, and not entirely similar.

    Interactives in this section are those for which you provide code you have authored. Generally, the libraries involved to support this have open licenses, though the player for GeoGebra may be an exception. Creating these assumes some familiarity with HTML and Javascript. See for more interactives that are perhaps simpler to create or use.

    (2018-06-22) Almost everything in this section is under active development and not stable yet. Feel free to experiment and make suggestions and requests. This page takes a while to completely load, so be patient.

    HTML5 Canvas

    HTML5 introduced the canvas element, which can be thought of a blank slate, a place to draw or write on. So has the slate element for a similar purpose. Generally, but not exclusively, HTML5 writes on a canvas using the Javascript language. We demonstrate this approach to interactive diagrams in this subsection.

    The following examples are from David Austin's excellent Understanding Linear Algebra textbook, which can be found at understandinglinearalgebra.org David's contribution of examples, and assistance designing the elements is greatly appreciated. Alright, let's learn some linear algebra. Yes, there are some learning opportunities in this subsection.

    A simple eigenvector demonstration

    Let \vec{x} be represented by the red arrow, and A\vec{x} by the grey arrow, for some particular 2\times 2 matrix A. Drag the tip of the red arrow to see the grey arrow change.

    The interactive in shows a vector \vec{x} in red, and the matrix-vector product A\vec{x} in grey, for a particular 2\times 2 matrix A. The four entries of the matrix A are coded into the interactive. Can you deduce A simply by using the interactive? Which theorem is the key?

    Eigenvector demonstration

    Let \vec{x} be represented by the red arrow, and A\vec{x} by the grey arrow, for a 2\times 2 matrix A. Drag the tip of the red arrow to see the grey arrow change. Or drag the blue sliders to change the numerical values of the four entries of the 2\times 2 matrix A. You will not see the grey vector until you change the matrix using one of the two sliders on the left. Why is that? What are the eigenvectors of the initial matrix?

    The next example has ten slate elements communicating with each other, and arranged with the layout features of a sidebyside (see ).

    Affine Transformations Flipping Woody

    Parameters a, b, d, and e, form a 2\times 2 matrix A, while c and f form a vector \vec{b}. The two views of Woody shows the effect of the mapping \vec{x}\mapsto A\vec{x} + \vec{b}.

    If your interactive employs a slate with a surface attribute whose value is html, then you are advised to augment each top-level (HTML) element within the slate with the attribute: xmlns="http://www.w3.org/1999/xhtml" This will identify all of the elements within the slate as HTML elements and not as elements. The danger is that elements with the same name in both languages, such as li and table, will be mis-identified. This could be harmless, but could also create chaos, such as disrupting numbering of elements.

    See the source code of this document for examples: , .

    Note that the HTML that is output can vary slightly from your source in small, harmless ways, such as empty (self-closing) elements being output with both an opening and a closing tag. Please report any significant discrepancies. Soon this requirement will be enforced in the code.

    It is also possible to add script elements within an interactive that contain properly escaped JS code. These elements will be placed at the end of the document created to hold the interactive content and can interactive with the other elements within the interactive but can not directly interact with the surrounding page.

    Authors are strongly discouraged from trying to incorporate complex code in the form of a script, but it can be a useful tool to call more complex code that is linked via source on the interactive.

    This example uses a script to draw Hello World to a slate

    A simple embedded script example

    This next interactive uses ECMAScript module based code. That will not function unless the script's type is set to module in the HTML output. So let's set it here and pass it through. It also generates its own HTML elements, so we hopefully don't get a default empty div.

    A simple JS module test
    D3.js D3.js

    D3 is a Javascript library for Data-Driven Documents, which might greatly enhance some data you wish to display. In short, it uses the animation capabilities of SVG. Available examples seem sensitive to the version of the library, so we have examples using different versions. Use the version attribute on interactive to specify the version number. The default is 5.

    The first example uses the force layout and collision detection from Version 3. (The necessary commands are very different in Version 4.) Pretend you are a working shepherding dog. Can you separate, and catch, one of the herd?

    This is adapted from a block by Mike Bostock with a GPL license. A similar demonstration, only using an HTML5 canvas is at .

    Force layout and collision detection

    Place your mouse/pointer at the center of the interactive to repel the 200 circles.

    Similar, but different, this demonstration of a graph layout uses Version 4 of the library. Technical notes:

    • We have changed the size of the nodes, and their number, to fit in a smaller space.
    • The Javascript script uses introspection to size itself, which would be a good general practice. (Though it does not resize itself on window resize, only initial load.) The interactive also has the resize-behavior attribute set to responsive.

    This is adapted from a block by shimizu with a GPL license.

    Graph Layout

    Drag a vertex to a new location to see the graph adjust its layout.

    Graph Planarity

    Can you move the vertices to new locations such that the resulting graph is planar? (In other words, no edges cross?)

    Finally an example that actually uses some data. Here is the description from the original block by Martin Chorley with an MIT License.

    This visualisation uses a D3 force simulation to show the Twitter relationships between the Assembly Members in the Welsh Assembly in terms of the number of times each assembly member has mentioned another assembly member in a tweet.

    Twitter relationships were mined on 22/03/2017, and are representative of the conversational relationships on that date. Links between AMs represent a conversational relationship: one AM has mentioned the other. Party colour indicates the direction of the mention.

    Hover over the nodes to fade out non-connected nodes.

    Rather than using intermediate nodes to create curved links (as in Mike Bostock's block), this adds curves by adding a calculated control point for each edge.

    Technical notes:

    • Once the nodes organize themselves (automatically in the beginning), they cannot be moved.
    • We have adjusted the margins in an attempt to keep names visible on the right side, but without giving up too much space.
    • We have adjust the repelling force, and the collision buffer, to better fit the available space.
    • This example required its own CSS, which we have included as part of the interactive.
    • The aspect ratio of the interactive is set to slightly taller than that of the slate it contains. This accounts for the fact that the contents generated by the js/css in the slate occupy slightly too much vertical real estate.
    • The data collected from the Twitter analysis is contained in a JSON file, mention_network.json, and where the script loads that file, it has a hardcoded path. So this example is a bit brittle, should that file move.

    Tweet mentions within the Welsh Assembly

    Hover on the name of an Assembly Member to concentrate on their tweet mentions.

    SVG

    Entirely similar to using an HTML5 canvas element (), it is possible to control an SVG element with Javascript. This example is from Mark McClure.

    Look carefully at the source and rendering of this example as HTML. The functions to choose from via radio buttons, and the change in x, denoted later as h, are being rendered as mathematics by the Javascript MathJax library. However, this cannot be accomplished with simply $...$ nor by simply \(...\), but instead by using the \(...\) and then also wrapping that in a span element with a class attribute set to process-math. (The latter is how we instruct MathJax as to which parts of a page to process, or not). So to have MathJax render a nice x^2 in this context (math inside HTML inside a slate inside an interactive) would be accomplished with <span class="process-math">x^2</span>

    Tangent and secant slopes
    Calculus consists of those problems in mathematics that can be solved with the following basic approach:
    Approximate and take a limit!
    The simplest, standard, geometric example of this process is the approximation of the slope of a tangent line with a secant line. Here's an illustration of this basic idea.
    Choose \(f\): \(f(x)=x^2\) \(f(x)=\frac{1}{3}e^x\) \(f(x)=\sin(2x^2)+x/4\)
    Show secant line
    \(h\) =
    secant slope =
    tangent slope =

    Select a function with the radio buttons, then use the checkbox to add the secant line. The denominator of the difference quotient, h, can be adjusted with the slider and the red point will react to the different values. The green point is the point of tangency, and can be dragged with the mouse.

    Changing Secant Lines

    When discussing the derivative as a limit, we think of the point of tangency as being fixed (the green point in ) and the other point defining the secant line as changing (the red point in ). Switch it up! Fix a large value of h (positive or negative) and then change the point of tangency (the green point). Discuss what you observe.

    JSXGraph JSXGraph

    JSXGraph is a cross-browser JavaScript library for interactive geometry, function plotting, charting, and data visualization in the web browser. Now a slate will be what JSXGraph calls a board. Again, you use Javascript to write onto a slate, but have some powerful shortcuts available from the JSXGraph library. For this reason, calls JSXGraph a language, similar in may respects to how Sage is a language, but is really a Python library. So realize that the syntax for using JSXGraph is that of Javascript.

    Place Javascript inside a file that is specified with the source attribute of the interactive element. Then just be certain that xml:id of the interactive element is passed as the HTML id in an (early) call to JSXGraph's initBoard() method.

    The following example was contributed by Rick Roesler. The figure is comprised of four stack elements within a sidebyside. By varying the time in the top box, the reader can observe the displacement, velocity, and acceleration of a ball thrown upward with an initial velocity of 30 m/s.

    1-Dimensional Kinematics

    Use the time slider in the top panel to vary the time from 0 sec to 6 sec. Observe how the displacement, velocity, and acceleration vary with time.

    The plot below is the curve r=a+b\theta in polar coordinates, for 0\leq\theta\leq 8\pi. It may be manipulated with the sliders to control the shape of the curve. Point A is contrained to the curve, but may be dragged to a new location. At A the tangent line and normal line are plotted as dashed red lines. Use the controls in the lower left to adjust the viewing window. This Archimedean Spiral is taken from the JSXGraph example wiki. The code could be written in 7 lines. Width is 80% and aspect ratio is 4:3.

    The Archimedian Spiral r = a + b\theta, 0\leq\theta\leq 8\pi Archimedian Spiral

    Drag the sliders to change the parameters a and b. Controls in the lower-right will adjust the viewing window.

    Here is a more elaborate example, from the JSXGraph Showcase, titled Infinity.

    There are two active sliders to control the shape and shading of the graphic, and hovering the mouse near one of the edges will highlight the entirety of one of the 30 quadrangles. Finally, each of the four red corners may be dragged to a new location. Code is 47 lines. Width is 60% and aspect ratio is the default, 1:1, a square.

    Infinity, from the JSXGraph Showcase

    Drag the sliders to change the pattern, and drag any of the four red corners to change the overall shape.

    Here are the two new examples. They have been included in a sidebyside layout element with equal widths (see ) so they can be placed horizontally across the page. They are not wrapped as figures, so cannot be cross-referenced. These are again from the JSXGraph example wiki, the left being Fermat's Spiral and the right being a demonstration of B-splines.

    Drag the slider to change the curve.

    Any of the 8 red control points may be moved anywhere.

    Finally, a piecewise function you can control, with traces of the domain values and range values in two other JSXGraph boards. Boards and HTML buttons have been laid out using the sidebyside layout element.

    Piecewise Function

    The slider of the left panel will trace out the piecewise function. Simultaneously, the domain will be traced in the middle panel, and the range in the right panel.

    Generally, we load an interactive into an HTML iframe to sandbox (isolate) it from other interactives. We does this for your own protection. So, for example, one interactive cannot talk to another. If two slate need to communicate, then they are related, and should be placed into a single interactive, allowed to layout themselves, or grouped within a sidebyside allowing finer control. Even if we have this under control, you might still enjoy reading Your JS is a Mess at mikecavaliere.com/your-js-is-a-mess-javascript-namespacing/.

    JessieCode JessieCode

    JessieCode is a scripting language for JSXGraph. It provides the core geometric and graphing features of JSXGraph without accessing the underlying JavaScript. In order to use JessieCode, you simply create the HTML div element as you would for any other JSXGraph interactive plot and then provide the JessieCode script, which focuses on the geometric elements.

    Because JessieCode is provided by JSXGraph, the interactive platform is jsxgraph. The slate, however, uses surface with value jessiecode. The script can be embedded directly in your code. As usual, you would need to remember to escape the special characters. JessieCode uses < and > for inequalities as well as for declaring objects used to style geometric elements, and && is the boolean AND operator. Alternatively, you can provide the file as a separate resource, providing the URL with a source attribute. Attributes defining the JSXBoard at the time it is created should be included as attributes of the slate, including boundingbox, axis, and grid.

    For this first example, the JessieCode was included directly in the XML source as the contents of the associated slate.

    Finding the Tangent Line of a Quadratic Function a = slider([-4.5,4], [-1.5,4], [-2,1,2]) << name:"a", snapWidth:0.25, point1: << frozen: true >>, point2: << frozen: true >> >>; b = slider([-4.5,3.5], [-1.5,3.5], [-4,-1,4]) << name:"b", snapWidth:0.5, point1: << frozen: true >>, point2: << frozen: true >> >>; c = slider([-4.5,3], [-1.5,3], [-4,0,4]) << name:"c", snapWidth:0.5, point1: << frozen: true >>, point2: << frozen: true >> >>; fGraph = functiongraph(function(x) { return a.Value()*x^2 + b.Value()*x + c.Value(); }); P = glider(1,0, fGraph); Q = point(2,2) << name:"P" >>; secant = line(P,Q) << color: (function() { m = (Q.Y() - P.Y())/(Q.X() - P.X()); dydx = 2*a.Value()*P.X() + b.Value(); cVal = "red"; if (abs(m-dydx) < 0.001) { cVal = "blue"; } return cVal; }) >>; dydxValue = text(-4, 1.5, function() { m = 2*a.Value()*P.X() + b.Value(); return ("dy/dx = " + trunc(m,3)); }) << frozen: true >>; mValue = text(-4, 1, function() { m = (Q.Y() - P.Y())/(Q.X() - P.X()); return ("m = " + trunc(m,3)); }) << frozen: true >>;

    Use the sliders to set the parameters of the quadratic f(x)=ax^2+bx+c. Drag the point A on the graph and the point P to define a line. Try to make the line tangent at the point at A and observe the resulting slope of the tangent line.

    For this second example, the JessieCode was included through an associated script file, loaded by the browser.

    Graph of a function that is continuous but not differentiable at x=0 because the slope of the secant line has no limit.

    Drag the point B to move the point on the graph and change the secant line. Notice that there is no well-defined limiting tangent line as x \to 0.

    Sage Interacts Sageinteracts

    Sage, and the Sage Cell Server, support interactive demonstrations, called interacts.

    • The interactive elements are nearly trivial to construct.
    • An interact is simply a single Python function (acted on by a decorator).
    • You have the full mathematical power of Sage at your disposal, so can do some very powerful computations with high precision (or exactly).
    • The interface is not as polished as what you can achieve with Javascript libraries.
    • Graphics refresh with a round-trip to the server, so are not nearly as fluid as with other tools.
    Note that each interact is insulated from the others, unlike our other employment of the Sage Cell Server.

    This example is by Marshall Hampton, taken from the Sage interact wiki, specifically Numerical integrals with the midpoint rule.

    Also notice that when viewed in dark mode, this sample respects the rendering intent. That is due to dark-mode-enabled applied to it.

    Numerical integrals using the midpoint rule An interactive for numerical integration

    An interactive element with a slider allowing the value of m for the number of rectangles, the function f, and start and stop values for the interval of integration. There is an image showing the graph of f on the interval along with m rectangles of equal base width along the interval of integration. The height of each rectangle is determined by the value of f at the midpoint of the base of the rectangle. Above the image, the numerical value of the integral reported by SageMath is provided as well as the sum of the areas of the rectangles as the midpoint estimate.

    var('x') @interact def midpoint(n = slider(1,100,1,4), f = input_box(default = "x^2", type = str, width=40), start = input_box(default = "0", type = str, width=6), end = input_box(default = "1", type = str,width=6)): a = N(start) b = N(end) func = sage_eval(f, locals={'x':x}) dx = (b-a)/n midxs = [q*dx+dx/2 + a for q in range(n)] midys = [func(x=x_val) for x_val in midxs] rects = Graphics() for q in range(n): xm = midxs[q] ym = midys[q] rects = rects + line([[xm-dx/2,0],[xm-dx/2,ym],[xm+dx/2,ym],[xm+dx/2,0]], rgbcolor = (1,0,0)) + point((xm,ym), rgbcolor = (1,0,0)) min_y = min(0, find_local_minimum(func,a,b)[0]) max_y = max(0, find_local_maximum(func,a,b)[0]) pretty_print(html('<h3>Numerical integrals with the midpoint rule</h3>')) pretty_print(html('$\\int_{a}^{b}{f(x) dx} {\\approx} \\sum_i{f(x_i) \\Delta x}$')) print("\n\nSage numerical answer: " + str(integral_numerical(func,a,b,max_points = 200)[0])) print("Midpoint estimated answer: " + str(RDF(dx*sum([midys[q] for q in range(n)])))) show(plot(func,a,b) + rects, xmin = a, xmax = b, ymin = min_y, ymax = max_y,figsize=5)
    Geogebra

    To embed a GeoGebra applet as-is from GeoGebra's Classroom Resources site (by material ID), see . To design your own applet (either from scratch, or modifying something that already exists in one of those three forms) you may use one of Geogebra's Apps to embed the material in your document. (But note, use of the App comes with licensing restrictions.) will handle most of the technical details for you.

    Do one of the following:

    1. Identify a material ID from GeoGebra's Classroom Resources site. You might even make the material yourself on that site.
    2. Obtain a .ggb file from GeoGebra. You might construct something on a desktop installation of GeoGebra and save it. If you have a base64-encoded string for a GeoGebra applet, but you don't have a .ggb file, you can decode the string and save the result. For example, at .
    3. Obtain a base64 encoded string for a GeoGebra applet. You might first open a .ggb file in a desktop installation of GeoGebra, and push ctrl-shift-B (command-shift-B on a Mac) and then the string will be in your clipboard.
    4. None of the above, with the intention to make an applet from scratch.

    Then mimic the examples that follow, using GeoGebra API commands documented at Geogebra API Manual, but do not include the ggbApplet. or applet. used in examples to prefix the functionsthat part of the code will be provided automatically by .

    There are some optional control elements that Geogebra provides, such as the presence of the toolbar and the reset button. These can be controlled by adding the following additional attributes to the slate and are automatically included in the initialization for the Geogebra applet.

    • toolbar="yes": add the Geogebra toolbar above the material

    • algebra-input="yes": add an entry box below the material to add graphical objects using algebra formulas or Geogebra graphical commands

    • reset-icon="yes": enable the reset icon

    • shift-drag-zoom="yes": enable ability to drag and zoom the viewing context

    • zoom-buttons="yes": enable buttons that control zoom

    Jack Green created an applet on the Classroom Resources site with ID D4s2v4ft, which you may view at . Suppose you would like to use this in your project, but change something about it. We will change something trivial, making the y-axis ticks be separated 5 apart instead of 10 apart. We also decide we want a different aspect ratio and overall width. One gotcha: the original applet is loaded and then uses width and aspect attributes to resize the viewing window using the top left corner as an anchor. This does not rescale axes and that may leave you with important elements missing from the viewing window. So here we reset the viewing window to return to values that are in the original. Lastly, we disable zooming, which is not helpful for this applet. To do each of these things, we rely on the GeoGebra API manual at Geogebra API Manual. It is important to use one command per line.

    GeoGebra: modified material ID setAxisSteps(1, 1, 5, 1); setCoordSystem(-0.7, 8, -6, 56); enableShiftDragZoom(false);

    The same can be done with a .ggb file. Here we use two provided by David Rosoff, and one provided by Tevian Dray. The path to the file needs to be relative. First, David's original.

    GeoGebra: .ggb file

    Now we modify David's applet in a few ways.

    GeoGebra: modified from .ggb file setCoordSystem(-6, 10, -6, 6); setLabelVisible("b", false); setLabelVisible("c", false); setLabelVisible("d", false); setAxisLabels(1,"x","y","z"); evalCommand("r = Slider(1,4,0.1)"); showResetIcon(true);
    GeoGebra: modified from .ggb file setCoordSystem(-15,5,-5,5); setAnimating("θ", true);

    In this one provided by Tevian Dray, we make no modifications (except for those imposed by the scaling). You will need to zoom out a bit, and then pan over some, to see all the pieces.

    GeoGebra: a constructive proof that SAS congruence holds in Euclidean geometry (from Tevian Dray)

    Drag some of the points and some of the circles to change them, and watch the remainder react.

    You could also use a base64-encoded string of the .ggb file. You might come across such a string somewhere, or you might generate one by opening a .ggb file in a desktop installation of GeoGebra, and pushing ctrl-shift-B (command-shift-B on a Mac) to get the string in your clipboard. If you do this, you could use a base64 attribute in place of the source attribute in the previous example. We don't do that here because such a string is generally over 5000 characters long and we are keeping the sample article source a bit cleaner.

    The next example shows how you can communicate between a GeoGebra applet and a slate contained in the interactive. The process is mediated by javascript code specified in the source attribute of the interactive. Event listeners in the code update the HTML when the diagram changes or vice-versa. MathJax is also notified when it needs to update math.

    Note that this example has a slate whose surface is pretext and a slate whose surface is html, the latter requiring a namespace declaration. The former produces HTML according to the templates, which is fairly predictable, but never guaranteed to always be identical over time. A slate uses familiar syntax, produces results styled consistently, but might break in the future. While an HTML slate is similar, the results will not be styled, but it does allow for a wider range of HTML elements (a button element here) and will not change over time.

    The indefinite integral in the last row of the table is a gratuitious test that aurhors' macros from docinfo are available to MathJax. Finally, a slate will only recognize p, tabular, sidebyside, and sbsgroup as children. Make a feature request if you have a good case for more.

    Geogebra/ Communications evalCommand("B2 = 3"); evalCommand("C2 = -1"); evalCommand("D2 = 2"); evalCommand("B3 = -1"); evalCommand("C3 = 4"); evalCommand("D3 = 1"); setValue("showAB",true); setValue("showBA",false); evalCommand("ZoomIn(-Z,-Z,-Z/2,Z,Z,Z/2)"); evalCommand("SetViewDirection((1,1,1/2))"); enableRightClick(false); \ x y z \mathbf{A} \mathbf{B} \indefiniteintegral{x^4}{x}

    This interactive shows \vec{r}_{AB}, the displacement vector from \vec{A} to \vec{B} and the corresponding unit displacement vector \lambda_{AB}.

    You may change \vec{A} and \vec{B} by moving the red and blue dots. Click the dot to switch between x-y mode and z mode. Coordinates of \vec{A} and \vec{B} can also be entered into the table directly.

    Lastly, you may just wish to build something from scratch using GeoGebra API. Note that for accessibilty reasons, some objects are rendered unselectable with the setFixed command. Perhaps this should have been done with the previous examples, but that is more difficult when you do not know all of their names. Note that the GeoGebra scripting command setAttribute also changes the webpage's focus, so it is better to set the perspective using an attribute of the slate.

    GeoGebra: from scratch setRounding("3s"); setCoordSystem(-1,1,-1,1); setGridVisible(false); setAxesVisible(false, false); evalCommand("f(x)=If(x>0,sqrt(x),0)"); setVisible("f", false); evalCommand("T=20"); evalCommand("t=Slider(0,T)"); setAnimating("t", true); evalCommand("v=Vector((cos(t),sin(t)))"); evalCommand("r=Slider(0,1)"); evalCommand("r=(sqrt(5)-1)/2"); evalCommand("r=Slider(0,1,0.001)"); evalCommand("N=Min(100,floor(T/r))"); evalCommand("Seeds = Sequence(f(t - n r) / sqrt(T) (cos(n r 2 pi), sin(n r 2 pi)), n, 0, N)"); setFixed("v", false, false); setFixed("Seeds", false, false);
    CircuitJS

    CircuitJS is an electronic circuit simulator. A circuit can be described by a language, which PreTeXt will interpret and submit for rendering. The next two examples are identical, but provided in slightly different ways, see the source for more. Preview images for PDF will be added later.

    CircuitJS Example (source via an encoded attribute)
    CircuitJS Example (source authored directly) $ 1 0.000005 10.20027730826997 58 5 50 5e-11 R 464 32 464 -16 0 0 40 3.3 0 0 0.5 g 464 224 464 240 0 0 s 464 32 464 128 0 0 false s 464 128 464 224 0 1 false x 274 181 431 184 4 12 bottom\sswitch\s(to\sground) x 312 85 426 88 4 12 top\sswitch\s(to\sVdd) O 464 128 544 128 1 0 x 532 110 593 113 4 12 output\spin
    IFrames from Files

    An iframe is an HTML element that allows embedding of a complete web page within another one. Here we use this device to provide interactive 3D diagrams built with other tools.

    We begin with a Jupyter notebook hosted on . News of success on other hosts for Jupyter notebook servers will allow us to expand this description. We use a Sage kernel and create a 3D surface suggested by Juan Carlos Bustamante: var('x,y') plot3d(x^2 - y^2, (x,-1,1), (y,-1,1), color="orange", mesh=true) News of other computational engines that produce similar graphics will also allow us to further expand this description. Note that for the case of Sage 3D plots, support for the sageplot element makes this even easier. For example, see .

    A button in the lower right allows for several options, one is Save as HTML, which will produce a complete self-contained web page we can recycle. We save this file with our other externally-created images, in a directory that we choose to name iframeyou can use another name. Then we make an interactive with an iframe attribute that has the filename, starting from iframe/ (in other words, do not include the name of your managed directory of external images).

    Sage+Jupyter iframe

    Note that the downloaded file has links to specific versions of the three.js library, which are beyond our control, and beyond your control. So there is a future where these images may need updating. You could put your source code into a (large) comment with your project's source for safe-keeping in the future. See for the server version.

    threejs

    Once upon a time there was an example here using the threejs 3D Javascript library. It was one of the project's examples, licensed with an MIT License, with minimal modifications.

    But it would seem to have become a bit more complicated to embed and our example was not rendering. As of 2022-08-08, we have removed it. Of course, you can find it in the git repository, perhaps searching on the date string just mentioned. It woulld be interesting to see if our interactive framework could still support the changes.

    The following two examples are meant to be instructive (only). The end result is accomplished in a much more straightforward way be the method in . We illustrate a way to get a three.js image out of an HTML page as a Javascript file and render it on a slate. We follow the second method in a blog post from the n-Category Cafe.

    1. Open a Jupyter Notebook that utilizes a Sage kernel. This can be done easily at CoCalc (and for free initially).
    2. Sketch a surface using Sage code. We recycle the suggestion from Juan Carlos Bustamante in : var('x,y') plot3d(x^2 - y^2, (x,-1,1), (y,-1,1), color="orange", mesh=true)
    3. Look for a button (in the lower-right) which will provide a menu option Save as HTML. Save the resulting HTML file, and open a copy in a text editor.
    4. You are now looking for two HTML script elements. One will tell you just which version of three.js is being used, vis a @src attribute. For the second example below we located https://cdn.jsdelivr.net/gh/sagemath/threejs-sage@r122/build/three.min.js The @r122 will likely be a version number, which is a good thing for the longevity of your work. This will get used in the source attribute of your interactive, which will have platform set to javascript.

      The second script element is likely huge and has many generic functions defined it. There may be a huge variable full of data points computed by Sage. Copy the contents of this script element into a new Javascript file (so use a .js extension). Do not edit in any way until you read further. Once adjusted, this file too gets specified in the source attribute of your interactive.

    5. Your interactive needs a slate element for the graphic to draw on, and you will need to give it a proper xml:id attribute, plus teh surface will be set to div. Then you need to edit the Javascript file to connect the graphic with the slate, via IDs in your source and on teh HTML div created by the slate. Look at the provided examples to see how. Do not make any other edits to this file, even if tempted.
    6. Study the two examples below, and mimic how they were constructed.

    First, the example given in the blog post referenced above.

    threejs catenoid surface, from n-Category Cafe

    Second, the example from JC Bustamante.

    threejs saddle by Sage
    DoenetML

    DoenetML is a markup language inspired by for semantically describing interactive mathematics applets for the web. Use interactive[@platform="doenetml"] with a slate[@surface="doenetml"] to include DoenetML content within your document.

    Since DoenetML is similar to, but not completely compatible with, XML, it cannot be authored directly within a PreTeXt document without painstakingly escaping every < as &lt; and every & as &amp;. However, a convenient workflow to avoid this is to author your DoenetML in a separate file like example.doenetml, then include this file within your document using <xi:include parse="text" href="path/to/example.doenetml"/>. Altenatively, you can enclose your DoenetML in a CDATA, as we do below.

    DoenetML example Adjust the vectors \vec u, \vec v, and \vec w in the left graph to visualize the areas calculated by \det[\vec u\hspace{0.5em}\vec w], \det[\vec v\hspace{0.5em}\vec w], and \det[\vec u+\vec v\hspace{0.5em}\vec w].

    $cv.x/$v.x \det[\vec u\hspace{0.5em}\vec w], \det[\vec v\hspace{0.5em}\vec w] (6,2) (3,7) (9,5) \det[\vec u+\vec v\hspace{0.5em}\vec w] $w $uPlusV ]]>
    Interactive Elements, Server & Layouts interactive elementsserver interactive elementslayout embedded interactive elementsserver

    When outputting Web page versions, it is possible to embed a variety of dynamic interactive elements. In a /PDF version, these will necessarily need to be replaced by some static substitute, such as a screenshot. See for the specifics of embedding instances of the Sage Cell Server, which is more elaborate, and not entirely similar.

    Interactives in this section have code that lives on a server somewhere (in the cloud). So maybe you uploaded an interactive demonstration, or maybe somebody else did. In this sense, these are easier to create or use. But pay attention, the code may come with restrictive licenses, even if you are the author originally. See for more interactives that can be free as in freedom or liberté. CalcPlot3D is the notable exception here.

    (2018-06-22) Almost everything in this section is under active development and not stable yet. Feel free to experiment and make suggestions and requests. This page takes a while to completely load, so be patient.

    GeoGebra Geogebraserver Geogebramaterial

    A Geogebra material is something you might use in a class. It could also be called an interactive demonstration. Go browsing at and find something appropriate for your project. Or make an account and create your own.

    Once you find a material that looks instructive, it will be at a URL such ashttps://www.geogebra.org/m/KGn2d4Qd and you want to pick off the identifier on the end, in this case KGn2d4Qd. Then author<interactive geogebra="KGn2d4Qd" /> At this writing (2018-02-04) you will want to place this inside a figure, with a caption, as we do right now with material KGn2d4Qd.

    The shape of the material will be fixed, so determine the dimensions (measure with an on-screen ruler or inspect the underlying definition). Use material-width and material-height with the actual material width and height (units are pixels). These are treated by Geogebra as internal coordinate dimensions and are separate from the physical layout dimensions that appear in your text. In the absence of these attributes, default values are 800 pixels for the width and a height based on the provied aspect ratio.

    Right Triangle Paradox

    There are some optional control elements that Geogebra provides, such as the presence of the toolbar and the reset button. These can be controlled by adding the following additional attributes to the interactive.

    • toolbar="yes": add the Geogebra toolbar above the material

    • algebra-input="yes": add an entry box below the material to add graphical objects using algebra formulas or Geogebra graphical commands

    • reset-icon="yes": enable the reset icon

    • shift-drag-zoom="yes": enable ability to drag and zoom the viewing context

    • zoom-buttons="yes": enable buttons that control zoom

    Note that materials hosted at geogebra.org have a non-standard, non-commercial license you must agree to before you can download them as source code. Perhaps you must forfeit your copyright when you upload a material? We have not investigated this thoroughly.

    Desmos Graphs Desmos graphs

    Desmos provides interactive graphing applications. The following example was created by Ann Cary and made available via the Share function of Desmos. You can make your own Desmos graph, choose the Share icon, and the Embed option, to get a URL such as https://www.desmos.com/calculator/ttox1bvxku You want to pick off the identifier on the end, in this case ttox1bvxku, then author<interactive desmos="ttox1bvxku" width="60%" aspect="2:3" /> as we have done here.

    The static image employed in the version of this article was obtained by viewing the graph at the Desmos site (, not the embedded version in the HTML version), and using the Share button to export a PNG image. In this case, we used a Medium Rectangle and Thick lines.

    Graph of ln(x^2+5)-3

    Note that Desmos has extensive Terms of Service which include restrictions on commercial uses.

    CalcPlot3D CalcPlot3D

    CalcPlot3D is a Javascript application for creating, visualizing, and understanding plots of 3D surfaces. So it would be an ideal companion to a book on multivariate calculus, but should be useful in other courses of study.

    To use it, start at the online app version. Create a plot and adjust the image to a viewpoint and scale if you like. Then, click the menu/hamburger icon in the upper-left and choose File. From here you can save a PNG image for the static version, but you also want to select Encode View in URL. Now your browser address bar is filled with a query string (all the stuff after the question-mark) that has all the information necessary to reproduce your plot (and view). Copy everything after the first question-mark to the interactive/code element. Be sure to replace any ampersands by &amp; (see the Author's Guide for more about certain characters in URLs). Examine the source for the examples below to see how they are authored. The Help Manual for CalcPlot3D is also available off the menu/hamburger icon in the upper-left.

    In grab the image with your mouse and rotate it in various directions. Then while the image has focus, press the 3 key (short for 3-D), to get a 3D view, which will require some red-blue 3D glasses to fully appreciate. Press the key again to return to a regular view.

    When using a version with controls (e.g. ), or the full application (e.g. ), specify an aspect ratio that is wider than it is tall. Start with aspect="3:2", and perhaps fine-tune from there.

    Intersection of two planes (minimal embedding)
    Probability wavefunction with contours (includes controls)
    Plot of f(x,y)=\dfrac{1}{y-x^2} on [-2,2]\times[-2,2] (full application)
    IFrames from Servers

    The iFrame versions of interactives can point to a network location, presuming the endpoint is reasonably well-behaved. If you are using this sytematically, let us know and perhpas it should become a more dedicated construction. See for the local file version.

    This example is from PhET Interactive Simulations.

    Fourier: Making Waves iframe

    Anything that suggests you can embed an interactive widget via an iFrame is fair game for this feature. This is a Google Map of the state of California, for use in a French language document, from Julien Giol. The necessary URL is obtained by using the Share feature, and then the Embed a map option has HTML with the URL in a src attribute.

    California.
    Layout of Interactives

    In HTML, interactives are rendered in iframes, which can offer some layout challenges. The PreTeXt page has no direct control over the layout within the interactive. All it does is provide a fixed sized frame in which the interactive content can display itself. The width (a percentage) and aspect (a width:height ratio like 2.1:1 OR a number like 1.5) attributes on the interactive are the main tools to specify the dimensions. Below are three renderings of the same Google map using different widths/heights.

    If you know a particular interactive is designed to display at a particular pixel size, you can can specify a design-width like 300 to force exactly that width. Combine that with aspect to also force the height. The example below forces a size of 300x450.

    Graph of ln(x^2+5)-3

    What happens if there is not enough space to display the requested frame? That depends on the resize-behavior applied to the interactive. The default is fixed-height. In this case, the interactive's height will not change if the window becomes too small to display the full width of the interactive. Instead a horizontal scroll bar will appear. This can be seen in many of the samples in and this CircuitJS sample:

    CircuitJS with resize-behavior="fixed-height"

    The other option for resize-behavior is responsive. In this case, the interactive's aspect ratio will be maintained. If the width gets smaller, so will the height. This can be seen in the version below.

    CircuitJS with resize-behavior="responsive"

    The best behavior will be determined by the contents of the interactive. If the interactive knows how to dynamically size itself, responsive is likely the better option. If the interactive assumes that there is a certain amount of space and the contents will never resize themselves, fixed-height will likely work better.

    In addition to specifying the resize-behavior in a particular interactive, you can apply a document level default value in your pub file. You can also specify a different default for a specific types of interactive. See the PreTeXt guide for documentation, or the publication.xml file of this Sample Article for an example of configuring defaults.

    The code that generates content needs to make sure it does not overflow the available space or you will get scroll bars. Common culprits are canvas or svg elements that are not displayed as blocks or little bits of whitespace.

    If an interactive wants to request a change to the amount of vertical space available to it, it can pass a message to the PreTeXt page asking for a lti.frameResize. (It is also possible to request a different amount of horizontal space, but doing so is not guaranteed to work and is much more likely to result in breaking the overall page layout.) The simple demo below uses that process to allow for resizing. A resize request should trump the original aspect ratio.

    Growable interactive fixed-height
    Growable interactive responsive with % width
    Growable interactive responsive and design-width
    Interactive Exercises

    Interactive components, just for testing, no commentary.

    True/False

    A True/False question.

    True/False vector space

    Every vector space has finite dimension.

    The vector space of all polynomials with finite degree has a basis, B = \{1,x,x^2,x^3,\dots\}, which is infinte.

    P_n, the vector space of polynomials with degree at most n, has dimension n+1 by . [Cross-reference is just a demo, content is not relevant.] What happens if we relax the defintion and remove the parameter n?

    Multiple-Choice

    Multiple-Choice problem

    Multiple-Choice, Not Randomized, One Answer stop signs

    What color is a stop sign?

    Green

    Green means go!.

    Red

    Red is universally used for prohibited activities or serious warnings.

    White

    White might be hard to see.

    What did you see last time you went driving?

    Maybe go out for a drive?

    Parsons Problem, Math Proof

    With some MathJax.

    Parsons Problem, Mathematical Proof even numbers

    Create a proof of the theorem: If n is an even number, then n\equiv 0\mod 2.

    Suppose n is even.

    Then n is a prime number.

    Then there exists an m so that n = 2m.

    Then there exists an m so that n = 2m + 1.

    Click the heels of your ruby slippers together three times.

    So we have the displayed equation: n = 2m + 0.

    This is a superfluous second paragraph in this block.

    Thus n\equiv 0\mod 2.

    Dorothy will not be much help with this proof.

    Parsons Problem, Code

    Programming Parsons problem, requiring indentation.

    Parsons Problem, Programming prime numbers Sieve of Eratosthenes

    The Sieve of Eratosthenes computes prime numbers by starting with a finite list of the integers bigger than 1. The first member of the list is a prime and is saved/recorded. Then all multiples of that prime (which not a prime, excepting the prime itself!) are removed from the list. Now the first number remaining in the list is the next prime number. And the process repeats.

    The code blocks below can be rearranged to form one of the many possible programs to implement this algorithm to compute a list of all the primes less than 250. [Ed. this version of this problem requires the reader to provide the necessary indentation.]

    n = 250 primes = [] candidates = list(range(2,n)) candidates = [] primes = list(range(2,n)) primes = candidates + [p] while candidates: p = candidates[0] primes.append(p) for nonprime in range(p, n, p): if nonprime in candidates: candidates.remove(nonprime) print(primes)
    Matching

    Events and dates.

    Matching Problem, Dates matching US dates

    Match each event in United States history with the year it happened.

    Review Encyclopedia Brittania, 25 Decade-Defining Events in U.S. Historyurl.

    Monroe Doctrine 1823 Haymarket Riot 1886 Louisiana Purchase 1803 Battle of Gettysburg 1863
    Clickable Area

    Words, not code.

    Clickable Areas, <q>Regular</q> Text

    Identify (by clicking, or by circling) all of the nouns in this quotation by Eleanor Roosevelt.

    The future belongs to those who believe in the beauty of their dreams.

    The incorrect words are pronouns.

    Old-Style Fillin-In

    Do not use this as a model for new exercises. Just for backwards-compatibility.

    Fill-In, String and Number Answers

    Complete the following line of a Python program so that it will declare an integer variable age with an initial value of 5.

    age = ;

    A variable of type int is appropriate for whole number ages.

    Remember that Java uses just the first three letters of the word integer to define an integral type.

    An integer variable may be initialized to a value.

    Use 5 as the initial value of the variable.

    A Reading Question Short Answer

    This should be built with a text-box, only on a capable server (Runestone). So it can be answered

    Faux Subsection

    We used exercises divisions above, and need a subsection to feed the schema.

    Dynamic Exercises

    This section demonstrates the use of dynamic randomized exercises built upon the framework of Runestone components. These demonstration problems incorporate a library supporting mathematical expressions both for varying the content of the statement of the exercises as well as the checking of submitted answers.

    Dynamic Fill-In

    The first problem illustrates revised markup for fill-in problems that don't involve randomization and use simple string and number comparison tests. Later exercises illustrate the use of dynamically generated mathematical expressions.

    Fill-In, String and Number Answers

    Complete the following line of a Python program so that it will declare an integer variable age with an initial value of 5.

    age = ;

    A variable of type int is appropriate for whole number ages.

    .*

    Remember that Java uses just the first three letters of the word integer to define an integral type.

    An integer variable may be initialized to a value.

    .*

    Use 5 as the initial value of the variable.

    Fill-In, Multiple Strings, Custom Checker

    In order to apply the Integral Test to a sequence \{a_n\}, the function a(n) = a_n must be , and .

    You already gave that answer. You already gave that answer.
    Fill-In Formula (Dynamic)

    Find a formula for a cubic function f(x) that has roots at x=, x=, and x= and so that f(0)=.

    f(x)=

    Knowing the roots of a polynomial allows us to write down the formula of f(x) in factored form, f(x) = A with an unknown scaling multiple A.

    When we evaluate f(x) at x=0 using this formula, we find f(0) = A. Since we also know f(0)=, we can write down the equation A = and find that A=.

    Consequently, we can write our function in the form f(x)=.

    x1+d1 x2+d2 (x-x1)*(x-x2)*(x-x3) 0 y0/base_yint A*(x-x1)*(x-x2)*(x-x3)
    Decompose the Function

    Consider the function h(x)=. Find two nontrivial functions f(x) and g(x) so that h(x) = f(g(x)).

    f(x) = and g(x)=

    Noticing that the expression appears inside parentheses with a power, it makes sense to think of that as the inner function, defining g(x) = . The outer function describes what happens to that. If we imagined replacing the formula with a box and then call that box our variable x, we find the outer function is given by f(x) = .

    This is not the only non-trivial composition. Can you find others?

    a*x^n+b c*x+d x

    f(x)=x is not allowed for nontrivial compositions.

    You have composed in the wrong order.

    g(x)=x is not allowed for nontrivial compositions.

    Interactive Coding

    More interactive components, just for testing, no commentary.

    ActiveCode

    ActiveCode, Python program.

    An interactive Python program, using <pubtitle>Runestone</pubtitle> print("Hello, World!") An interactive Python program without codelens. print("Hello, World!")
    CodeLens

    A steppable Python program.

    A Python program, stepable with CodeLens print('Hello, World!')
    Activity with An ActiveCode

    Something to do with ActiveCode program.

    Activity Coding Exercise

    Similar to above, but now as a complete Python program inside an activity. This demonstrates the possibility to use any project-like block (project, activity, exploration, investigation), but not in the case when structured with task.

    for i in range(10): print(i)

    We're still not really sure.

    YouTube

    Video, observable on a Runestone server.

    Audio

    2019-05-24: this is preliminary, and mostly based on the code for video so read the next section and mimic the style from there. But use an audio element and have the source attribute point to an OGG, MP3, or WAV file. Plus, an aspect attribute will be ignored.

    We have not entirely decided how to handle the static version present in a PDF.

    First in a figure, so it can be cross-referenced.

    MP3 Piano Trill (www.kozco.com/tech/soundtests.html)

    Now, naked, between a couple of paragraphs, with specified asymmetric margins, and a computed width.

    Video

    First, a gratuitous reference to Exercise about the derivative of a cosine.

    You can specify a video by a filename if you host it as part of your document, or a URL giving a location on the Internet. There are a few extra features for YouTube and Vimeo videos, which are near the bottom of this page, so look there first if that meets your needs.

    Video Files

    Embedded videos can make sense for a web version of your document. This is a video promoting the University of Puget Sound to potential new students, in WebM format. Support is limited to HTML5-capable browsers. The file format can be MP4, Ogg, or WebM, though this may vary depending upon the browser. Use a video element, within either a figure (numbered, captioned) or a sidebyside for more precise control. The source attribute in this first example does not include an extension, and so three possibilities above will be searched for preferentially (you need only provide the video in one format, but providing additional versions will increase the chances every browser will find a compatible format).

    University of Puget Sound Promotional Video

    You can replace the preview image of a video with one of your own making. HTML refers to this as the poster, presumably because it advertises the video. The image you make should be of the same quality as the video, and with the same aspect-ratio, and is presumably one of the frames of the video. So a screenshot is the likely avenue. (Maybe we will have advice on how to do this easily, or see Issue #853.) linkexternal, url referenceexternal, url On the video tag, include a preview attribute which is the name of an image file, including a relative path. (JPEG or PNG formats are best. JPEG may be smaller for video screenshots, while PNG is lossless and so may work better for diagrams.) The next video has a preview/poster that is a fram part way into the introduction.

    University of Puget Sound Promotional Video

    If you find the posters provided automatically for a video to be distracting or objectionable, you can cover them up by requesting a generic poster with the attribute-value pair: preview = "generic".

    University of Puget Sound Promotional Video

    You can use a very similar construction to point to a video hosted somewhere on the Internet, just use a complete URL for the source attribute. Note that if the URL has a query string (parameters following a question-mark), then any ampersands (&) will need to be escaped, so as to not confuse the XML processor ( use &amp). Also, the question-mark character needs to not be URL-encoded (%3F), so presumably edit the URL to be the character. Here are several examples, the second one uses the start and stop attributes to limit the video to just the time between the 16-second and 30-second locations, and has asymmetric margins.

    Big Buck Bunny from Video for Everybody Test Page
    Big Buck Bunny, Controlled Start/End, Asymmetric Margins
    Big Buck Bunny, Ogg container, *.ogv extension
    Big Buck Bunny, MP4 format
    Big Buck Bunny, WebM format
    Big Buck Bunny, Automatic best format (temporarily broken)

    Videos are assumed to have a 16:9 aspect ratio (width:height). If this is not the case, then you must specify the aspect ratio with either a ratio (e.g. 4:3) or as a number expressing the fraction width/height (e.g. 1.3333). Four decimal places should suffice for the latter. Note that you cannot change the aspect ratio, and you must supply the aspect ratio for any video that does not have the default ratio. This is a technical requirement that allows us to smoothly scale the videos on small devices (try this page on your mobile phone!).

    YouTube

    YouTubeYouTube videosvideosYouTube videos may be embedded with only knowledge of a video's ID or a playlist ID. A single video's YouTube ID is a string of eleven seemingly random characters that show up in the URL when you watch a video. For the Led Zeppelin performance below, the ID is hAzdgU_kpGo, which you might normally watch directly from the URL . As described just above, you need to specify a different aspect ratio if the video does not have a 16:9 aspect ratio.

    Note: some of these videos may not play if viewed locally, and maybe not even if you start up a local web server (such as can be easily done with Python). So if you are testing new features, be careful about assuming videos from cloud services are not working properly.

    If you have ever owned a drone, you sympathize with this guy. Way funnier than a cat video.

    My first day with my drone First Drone Flight (1:28)

    If you are only interested in a piece of the action, you can limit the video with start and end attributes in seconds. You might make those times clear in the caption for readers getting the link out of a PDF. Some videos may not respect these parameters.

    My first day with my drone (Splashdown) First Drone Flight (Splashdown, 0:54 to 1:12)

    This next video comes with a default poster from YouTube featuring Robert Plant. We've replaced it with a poster featuring Jimmy Page.

    Kashmir (Live), Led Zeppelin Kashmir (Live), Led Zeppelin. O2 Arena, London. December 10, 2007. (8:55) Led Zeppelin video

    And if you don't want to be reminded of Plant, Page, Bonham, or Jones, you can cover them up entirely.

    Kashmir (Live), Led Zeppelin Kashmir (Live), Led Zeppelin. O2 Arena, London. December 10, 2007. (8:55) Led Zeppelin video

    Videos were first designed mostly on the assumption that they are wrapped in a figure with a title (which is distinct from a caption). But you can just place a video naked inbetween a couple of paragraphs. This is nice if you don't want the clutter of numbers, and/or if you plan to exclude videos from some edition of your document.

    Vimeo

    We support videos from Vimeo in much the same way as YouTube videos. Now the identifier is a long integer. For example, the video up next would normally be found at https://vimeo.com/27246366. But instead, you can embed the video with as little as <video vimeo="27246366"/>. As of 2019-05-18, we intend to support as many of the options described above as possible. Widths and heights (via the aspect ratio) will perform as expected. We have not investigated start and end times.

    MOVE, by Rick Mereki, vimeo.com/rickmereki

    Now with an author-supplied poster.

    MOVE, by Rick Mereki, vimeo.com/rickmereki
    Captions and Subtitles

    Experimental support for captions and subtitles first. Look at the source, which mimics the actual HTML. The words of the titles and/or subcaptions (there is a difference!) come from a file in Web Video Text Tracks (WEBVVT) format.

    Big Buck Bunny with subtitles adapted from

    This video is identical to the previous one, except it tests the use of a default track. The default attribute on track can be set to the value yes to make one set of captions the default (and only one!). Test is a bit lame, the two track use the same file, but just have different labels for the player's menu. Track named US English Two will show as in-use at start-up.

    Cross-Referencing

    Cross-referencescross-reference are easy, since that is a key reason for having a highly structured document. Here is a useful feature if you elect to use it. Any xref will know what it points to, so you can let it provide the naming part of the cross-reference text. You can turn this on globally with the command-line parameter autonameautoname set to 'yes'. If you do that, you will see most of the names in this document doubled, since the names are written into the source already in most places outside of this section.

    Moreover, the names themselves will change with the use of the one language dependent file. And another bonus is that with an autoname, you automatically get a non-breaking space between the name and the reference. The autoname switch makes no sense for provisional cross-references, since there is no information about what they point to.

    Here is a reference that has no indication of its type in the source: . So by default you will just see a number that you can click on. If you use the text="type-global" switch then you should see Theorem prepended. Note that if you changed the theorem to a lemma, then that change would be reflected here automatically when autonaming is in effect.

    If you set the autonaming behavior globally, or accept the default behavior, there will still be instances where you want to override that choice. Simple: just say text="type-global" or text="global" as part of the xref. Each example below should look the same each time this article is processed, no matter how the global autoname is set.

    • No name ever:

    • Always named:

    You might also wish to provide a prefix to a cross-reference and have it incorporated into the text of what you would click on in an electronic version. So if you make an xref with some content, then that content will prefix the cross-reference within the clickable/pokeable text and be attached with a non-breaking space. This xref content totally overrides any prefix that might happen otherwise. So the name of an item ( corollary) could be replaced, and if you make a cross-reference with custom text, that will be the clickable also. An example:

    • A grand result: Major Corollary

    • A grand result: a nice corollary

    Suppose you want to reference two theorems, so you might want to say something like Theorems 4.6 and 5.2. With global autonaming on, you can override the first Theorem by providing the content Theorems on the first xref and text="global" on the second xref. (With global autonaming off, you will also get what you want/expect.) Here is the test, which should look correct no matter what the global switch is: Sections and . (But notice that it is up to you to be certain the types of these targets do not change without you changing the content of the first xref. The author-tools mode and careful choices of xml:id strings can help avoid this trap.)

    If you set the value of text to title, then the title you assigned to the theorem will be used as the link for a cross-reference. Here is a the final example, which refers to a fundamental theorem by name .

    Cross-references to exercises with hard-coded numbers should respect the supplied number. Exercise should reference problem 42a.

    Here we form a list to test pointing at various structures. Each of the following should open a knowl in the HTML version, otherwise it will be a traditional hyperlink (if possible). Note that if a knowl opens, there will always be an in-context link which will take you to the actual location, should you have wished instead to just go there.

    • Footnotes: Fermat allusion at .

    • Citations: Judson's AATA with annotation at

    • Citations: Judson's AATA with autoname that should have zero effect

    • Citations: In a references division inside an appendix

    • Note: just the annotation of previous citation at

    • Examples: Mystery derivative at , or a question at .

    • Definition-like: A mathematical statement with no proof .

    • A numbered Note:

    • A link to a proposition element, while this document has globally renamed propositions as Conundrums, so this link should use the new name:

    • Theorems: Fundamental Theorem of Calculus, with proof at

    • Proof: of second version of FTC at

    • Figures: A plot with a derivative at .

    • A Figure within a side-by-side panel, with its own number:

    • A Table within a side-by-side panel, with a subnumber:

    • A Figure, containing a side-by-side with two sub-captioned images:

    • Display Mathematics: single, first with no name: . Then with an autoname: .

    • Display Mathematics: multi-row, first with no name: . Then with an autoname: . And two, with a plural form: Equations and .

    • You can cross-reference The Fundamental Theorem of Calculus via custom text of your choice.

    • Display mathematics: an equation with local tag, which should not be used so very far away: .

    • You can author a cross-reference to a displayed equation with no number, but it will not be very satisfying. You should get a warning if you try.

    • Exercises (divisional), a range, with plural form provided to override autonaming: Exercises.

    • Exercise (inline): with enclosed hint at

    • A group of two exercises, with introduction, conclusion:

    • Solution: An autonamed portion of an exercise:

    • Parts of a complicated exercise:

    • A subsidary part of an exercise:

    • knowlnested Three cross-references to individual exercises, but due to their location, they should have different type names in the cross-reference: in an exercises division, ; in the narrative, ; and in a worksheet, .

    • An item buried in nested ordered lists:

    • List item as knowls in HTML, including nested lists: ,

    • A titled list:

    • List item inside a named list, second color in rainbow list:

    • Second color in rainbow list, but now as a local reference:

    • An item in ordered list, but contained in an unordered list, hence without a number, so a cross-reference by number would be ambiguous. So we use a cross-reference which relies on custom text: No Number List Item

    • Several examples of hybrid cross-references to list items within a named list can be found in, and adjacent to, .

    • An assemblage, which never has a number. A cross-reference now requires content in the xref element, with text='custom': text to xref an assemblage

    • A cross-reference to a list item in a description list, which has a title, but never a number: . Note that you need to include the attribute text="title" even if that is obvious from the situation. This requirement may be relaxed in a future refactoring of the cross-reference system.

    • A very similar cross-reference to the previous one, but testing how final punctuation of titles is handled: .

    • A cross-reference to a paragraphs subdivision, which never has a number (so comments above about description list items and titles applies here too):

    • A case within the proof of :

    • A cross-reference to a description list item with a title containing math:

    • A cross-reference to an aside, by title necessarily, and with some formatting in the title:

    • A cross-reference to an objectives block, with an autoname. This demonstrates the number of the Objectives here, which is not shown in the original version since it is implicit:

    • A cross-reference to an individual objective. This is authored as a list item, but displayed as an objective (singular) via an autoname:

    • A cross-reference to the top-level element (book) will point to a summary page similar to a Table of Contents in HTML. For LaTeX output it will behave similarly, unless there is no Table of Contents, then it will go to the main title page: ToC or Title

    • Cross-references inside quotations previously lost track of their target, so this tests correcting that, not so much the cross-reference itself:

    • An activity with full details following:

    • A type-global cross-reference to a second-level task within a project: , the encompassing project: , and a local reference .

    • A subcaptioned named list:

    • This opens a knowl for an example. It has a solution, which is orginally presented as a hidden knowl. But since this version is a duplicate, the knowl for the solution is a file version, not an embedded version, and hence free from duplicating any unique identifaction like an HTML id. So we test its styling and function here:

    • A cross-reference to a poem, where we need to use a title for the link text, since a poem is not numbered:

    • A cross-reference to a references division in a subsection, which should not be numbered where born, but which has the number of its parent division in a cross-reference: . And a cross-reference to a references division, which is the main bibliography in the back matter, and so is not numbered where born, nor in a cross-reference (which we must accomplish via it's title): .

    • A cross-reference to a solutions division in a subsection, which should not be numbered where born, but which has the number of its parent division in a cross-reference: . And a cross-reference to a solutions division, which should appear as an appendix both where born and as a cross-reference: .

    • A cross-reference to an exercises division in a subsection, which is the only such division in that subsection and therefore should not be numbered where born, but which has the number of its parent division in a cross-reference: . In contrast we cross-reference an exercises division which is one of two inside a section, and therefore is numbered, when born and when cross-referenced, in continuity with the preceding subsections: . Also an exercise within an exercises which should have a cross-reference employing the number of the containing (unstructured) section: which is in which is in the (unstructured) .

    • A custom cross-reference: Custom

    • Cross-reference to instructions of an interactive:

    • A hyperlink to a subexercises via its required title (no number is assigned):

    • You can request the text to be a type, then a number, then a title:

    • Asking for the text to be a type, then a number, then a title, when there is no title, is not a problem:

    Cross-references to structural elements of the document will always take you there directly, since even in the HTML version these parts never get realized as knowls. You will find such links sprinkled through this document, but here is an autonamed link to a subsubsection: .

    Cross-references can be built into display mathematics, but they can only point to one item ( a comma-delimited list of targets is not supported). Examples below should test the distinction in HTML output between a link that opens a knowl and a link that jumps to a larger chunk of content. Notice that display mathematics is entirely syntax, no matter which output format you create. So if you do not use the autoname facility, you need to wrap non-math text in \text{} and perhaps use a tilde (~) as a non-breaking space (examine the source of this article).

    x^2 + y^2 &= z^2&& a^2 + b^2 &= c^2&&\text{Section}~ bugin-context broken

    Variations on the above include multiple xml:id as the value of a single ref attribute on an xref, in the form of a comma-separated list. In this case, only the numbers are links/knowls and the autonaming attribute is based on the type of the first ref. Wrapping with brackets (citations) or parentheses (equations) is also controlled by the type of the first ref. And the detail attribute for a bibliographic reference is silently ignored. So you can do silly things like have a reference to a theorem within a list of equation numbers and there will be no error message. Handle with care. Spaces after commas in the list will migrate to the output as spaces, so if you don't have any, you won't get any.

    • Four theorems, with spaces, autonamed:

    • Two equations, no spaces, autonamed:

    • Two bibliographic items, no autoname:

    If you have a long list of items (such as homework exercises, not in an exercisegroup, or perhaps several chapters), you can get a cross-reference that prints as a range by using xref with two attributes first and last, which may contain a single xml:id each. As with multiple references, first will control autonaming and other features.

    • A range of exercises, autonamed (this range appears out-of-order since the two exercise are numbered under two different schemes):

    • A range of equations:

    • A system of equations, given as range from first to last:

    • A range of sections, hand-named to be plural: Sections

    • A range of bibliographic items:

    The urlurl element may be used to link to a data file, either externally, or internally, if you want to make such an object available to a reader.referenceexternal A good example use case is a spreadsheet that might be part of an exercise, or contain data relevant to some discussion. First let us suppose the data resides somewhere on the Internet, then just use the complete address. Here is one from Microsoft: Sample Excel Spreadsheet.

    For a link like the previous one, you might want to provide advice appropriate for your audience about using a context menu to download a file, or how to configure helper/viewer applications.

    You can also provide a file yourself, but now it is your obligation to distribute the file with your document (HTML, PDF, ) and provide a relative link. This creates some complications, such as making sure an electronic PDF has the associated file in the same place relative to the PDF file. Of course, if you make a print PDF, this becomes impossible. Here is a test example anyway, which is highly likely to be broken in a PDF (including at the project site) unless you build this example on your own computer, locally. Here is a template from the Apache OpenOffice project, provided via the Public Documentation License (PDL): Running Statistics Template.

    The next four paragraphs are each a single dataurl element. Explore the source and the output from different conversions. Strictly for testing as of 2022-11-04.

    Foo Sample Excel Spreadsheet Bar

    Foo Runners Template Bar

    Foo Sample Excel Spreadsheet Bar

    Foo Runners Template Bar

    Testing of output positioning for xref's that are inside containers:

    Self-referential Xref In a table A B C D B C D
    Xref Inside MathJAX

    {\mathbb Z}_2 \times {\mathbb Z}_2 {\mathbb Z}_2 \times {\mathbb Z}_2

    Now we have two xref's to that same target that has a runestone component. Only the first one clicked should try to render the runestone.

    Internationalization internationalization

    Supporting a multitude of possible characters, across many languages and across many output formats can be a challenge. One of our goals is to make this much easier for authors. Fortunately, the Unicode standard has led to improvements from the 7-bit ASCII standard of old.

    Unicode Characters for HTML Output

    First, we discuss HTML output. If you include UnicodeUnicode characters in your source, they should survive just fine en route to a web browser or e-reader. Here are the caveats for HTML output:

    • So that you can continue to get the best results with print and PDF output, use available empty elements for obscure characters, even if targeting HTML output, before resorting to a Unicode character. For example, use copyright for the copyright symbol in text before resorting to the Unicode character U+00A9. It is a bit more work, but you will get better results with other conversions, even if you initially are only fascinated by HTML.

    • How you actually enter Unicode characters into your source file is dependent on your editor and operating system, and is therefore outside the scope of our documentation. You can cut-and-paste characters and text from the source of our examples for initial testing and experimentation.

    • Always, always identify your source as having Unicode characters by including the incantation <?xml version="1.0" encoding="UTF-8" ?> as the first line of your source file. (You may be able to accurately cut-and-paste this version here. But if the copy has non-standard characters in it, go back to the top of this source file for a copy.)

    • Alan Wood’s Unicode Resources has a plethora of samples of various groups of Unicode characters. If you, or your readers, are missing characters in a web browser, this is a good place to start testing the local setup.

    Characters in <latex/>, PDF, print

    The situation for is a bit more complicated, since pre-dates Unicode's widespread adoption.

    This sample article is intended to work well, out-of-the-box, for authors just starting with . So we only include here examples that we know are likely to convert to PDF without any errors. For more extensive examples and experiments, we provide the sample document examples/fonts/fonts-and-characters.xml, so be aware of that example as you look to see what is possible.

    Similarly, you should be able to process this sample article successfully with various engines. We test regularly with pdflatex and xelatex and provide online sample PDF output of this document processed by pdflatex. In principle, you should be able to use latex (to produce a DVI), and possibly other (unsupported) engines, such as lualatex.

    Once you get beyond the Latin alphabet, with accents common in Western Europe and the Western Hemisphere, you will almost assuredly need to restrict your attention to producing PDF output with the xelatex engine. This is discussed and tested in examples/fonts/fonts-and-characters.xml.

    Basic Latin, <c>U+0000</c><ndash/><c>U+007F</c>

    Unicode uses multiple 8-bit bytes to represent characters, and these are typically expressed in hexadecimal (base 16) notation. Using just a single byte, we can get 256 values, and the first 128 (hex 00 to 7F) are the usual Latin characters with some values used as control codes. These 95 characters are the most basic, and will all render using pdflatex or xelatex with no special setup (and will render easily in HTML). U+0000 to U+001F are control codes and not used here. U+007F is also a control code and so is excluded, while U+0020 is a space, so appears invisible in the table. In the source we have authored each character by its escaped version using its Unicode number (in hexadecimal). So, for example, capital-B is authored as &#x0042;.

    Basic Latin, Regular 0 1 2 3 4 5 6 7 8 9 A B C D E F 002_ !"#$%&' ()*+,-./ 003_01234567 89:;<=>? 004_@ABCDEFG HIJKLMNO 005_PQRSTUVW XYZ[\]^_ 006_`abcdefg hijklmno 007_pqrstuvw xyz{|}~
    Latin-1 Supplement, <c>U+0080</c><ndash/><c>U+00FF</c>

    Now we are interested in the next 128 possible bytes, (hex 80 to FF). The first 32 are again control codes and U+00A0 is a non-breaking space, so is invisible, while U+00AD is a soft hyphen (which we have not implemented and so is excluded). We have taken care to see that the remainder will render using pdflatex or xelatex with no special setup (and HTML). In the source we have authored each character by its escaped version using its Unicode number (in hexadecimal). So, for example, a copyright symbol is authored as &#x00A9;.

    Latin-1 Supplement, Regular 0 1 2 3 4 5 6 7 8 9 A B C D E F 00A_ ¡¢£¤¥¦§ ¨©ª«¬ ®¯ 00B_°±²³´µ· ¸¹º»¼½¾¿ 00C_ÀÁÂÃÄÅÆÇ ÈÉÊËÌÍÎÏ 00D_ÐÑÒÓÔÕÖ× ØÙÚÛÜÝÞß 00E_àáâãäåæç èéêëìíîï 00F_ðñòóôõö÷ øùúûüýþÿ
    Monospace, Basic Latin and Latin-1 Supplement, <c>U+0000</c><ndash/><c>U+00FF</c>

    A monospace font is critical for samples of keyboard input and to distinguish exact technical input from running commentary. We list here all of the reasonable characters from the first 256 Unicode code points. (We skip the same 65 control characters from above, and the soft hyphen.) These should all render fine in HTML and when processed with xelatex, however our focus with this sample article for PDF output is the capabilities when processed with pdflatex. First, characters from U+0000U+007F.

    Basic Latin, Monospace 0 1 2 3 4 5 6 7 8 9 A B C D E F 002_ !"#$%&' ()*+,-./ 003_01234567 89:;<=>? 004_@ABCDEFG HIJKLMNO 005_PQRSTUVW XYZ[\]^_ 006_`abcdefg hijklmno 007_pqrstuvw xyz{|}~

    Note that the single and double quotes are upright and dumb, not curly and smart: ' " ' " ' ". And a backtick is a backtick: ` ` `. The zero is distinguished from the capital oh: 0 O 0 O 0 O. And the numeral one is slightly different from the lower-case ell: 1 l 1 l 1 l. The hyphen should be short and not expanded into some other kind of dash: - - -. These characters should all cut/paste out of a PDF into a text editor with no conversion to other characters.

    Now the remaining characters from U+0080U+00FF. The program tag is implemented in via the listing package and these characters require ad-hoc replacements for processing by pdflatex. (You can see the replacements in the preamble of the source for this document.) The replacement mechanism provided by the listing package will cause the characters below to produce a compilation error if processed by pdflatex and in a table cell in certain situations (which we have avoided in the table below). The only workaround in this case is to switch to xelatex.

    Latin-1 Supplement, Monospace 0 1 2 3 4 5 6 7 8 9 A B C D E F 00A_ ¡¢£¤¥¦§ ¨©ª«¬ ®¯ 00B_°±²³´µ· ¸¹º»¼½¾¿ 00C_ÀÁÂÃÄÅÆÇ ÈÉÊËÌÍÎÏ 00D_ÐÑÒÓÔÕÖ× ØÙÚÛÜÝÞß 00E_àáâãäåæç èéêëìíîï 00F_ðñòóôõö÷ øùúûüýþÿ

    The pre tag is implemented in with the fancyvrb package. You can compare results here with the table above, lines here are rows above.

                          ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬   ® ¯
                        ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿
                        À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
                        Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
                        à á â ã ä å æ ç è é ê ë ì í î ï
                        ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
                    

    The console tag is also implemented with fancyvrb, with adjustments for the input lines. It will not look like it, but these are 8 such inputs, with similar results to above, but now bolded.

    ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

    We take care to render the U+0080U+00FF characters in Sage cells. This would allow some flexibility in comments and strings employed. The following is just a test of these characters in the input and output of a sage element. This is not functional code.

    ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

    The table below has a single column, and each cell of the table has a string of 10 characters inside a c element. It is meant to test if the font is monospace in this situation.

    Alignment Test 0123456789 9876543210 iiiiiiiiii mmmmmmmmmm

    Again, more examples and more thorough explanations can be found in the sample: examples/fonts/fonts-and-characters.xml. Be aware that the nature of the more advanced sample is that it will likely produce many errors when processed with pdflatex. Adding -interaction batchmode or -interaction nonstopmode to the pdflatex command-line will sometimes be less painless than acknowledging each error. The more advanced sample will perform well when processed with xelatex.

    Pre-Formatted Text

    In Sage, if you wanted to build a matrixmatrix, then you would use the matrix() constructor. Here is the matrix of second partials of f(x,y)=x^3+8x^2y^3 + y^4, as you would enter it in Sage. Notice that SR is the ring of symbolic expressions, Symbolic Ring.

                var('x', 'y')
                J = matrix(SR, [
                    [6*x + 16*y^3, 48*x*y^2],
                    [48*x*y^2, 48*x^2*y + 12*y^2]
                    ])
                

    That accomplished, Sage will easily and naturally provide a representation of the matrix with the command latex(J).

                \left(\begin{array}{rr}
                16 \, y^{3} + 6 \, x & -48 \, x y^{2} \\
                48 \, x y^{2} & 48 \, x^{2} y + 12 \, y^{2}
                \end{array}\right)
                

    The pre element surrounds text that should be preserved verbatim. It is like a special kind of paragraph, and can be used almost everywhere that a paragraph can be used. The realization of preformatted text should be robust enough that it can be cut from documents and pasted without any substitutions of fancier Unicode characters for generic ASCII characters. Try the minus sign on the 48 above to see if it does not become a dash, or the single quotes on the Sage variables.

    For Sage input code, the first non-whitespace character sets the left margin, since legitimate Python code has no subsequent lines outdented. For pre-formatted code, the line with the least whitespace leading the line will determine the left margin. If preserving indentation is important, do not mix spaces and tabs. For syntax highlighting of text representing computer programs, or parts of them, see Section. Examine the source of the following example to help understand this paragraph.

                A normal line
                        An indented line
        An outdented line
                

    Snippets should also be robust for cut/paste operations. For example, you should not get curly smart quote marks in verbatim text: this should have "dumb" quote marks. Here are a few characters that should migrate through to a PDF unmolested: '"----"'

    If you write a very long snippet of inline code (i.e. within a <c> element) it can impinge on the right margin, since very long words will not hypenate, unless you have a dash/hypen. Such as when you use words like pneumonoultramicroscopicsilicovolcanoconiosis, parastratiosphecomyia stratiosphecomyioides, floccinaucinihilipilification, or subdermatoglyphic. For output in LaTeX we get line-breaking, and perhaps word-spacing, but we do not get hyphenation and the font is fixed-width. So not always perfect. Consider other options like <cd> or <pre> below.

    An intermediate type of verbatim text can be accomplished with the cd tag, short for code display. It allows for larger chunks of verbatim text to show up in the middle of a paragraph, but with some vertical space above and below, and centered between the margins. It can beauthored as a single lineor if you wish to have multiple lines there is the <cline> tag meant to model the line tag and short for "code line" and you may even use a single cline if you like to have your source closely model the visual look of the output.

    With the showspaces attribute of cd set to all there will be a visual indication of every space character, which is nice if indentation is critical. For example, there is the <cline> tag meant to model the line tag and short for "code line" and as single line authored as a single line that is not structured with cline elements.

    The pre tag is meant for use outside of paragraphs, but is otherwise very similar. The source may also be structured as a sequence of cline as in the next example, recycling content from above.

                    If you write a very long snippet of inline code (i.e. within
                    a <c> element) it can impinge on the right margin, since
                    very long words will not hypenate, unless you have a dash/hypen.
                    Such as when you use words like
                    pneumonoultramicroscopicsilicovolcanoconiosis,
                    parastratiosphecomyia stratiosphecomyioides,
                    floccinaucinihilipilification, or subdermatoglyphic. For output
                    in LaTeX we get line-breaking, and perhaps word-spacing, but we
                    do not get hyphenation and the font is fixed-width. So not always
                    perfect. Consider other options like <cd> or <pre> below.
                

    We use a Unicode right arrow (Unicode Character 'RIGHTWARDS ARROW', U+2192) to sometimes indicate the truncation of long lines in a text file. It is available in our usual monospace font for /PDF, but we include a use here in order to make certain that is always the case. Here: .

    Program Listings (with <c>code</c> in the title)

    Sage cells can be used for Python examples, but Sage uses a mild amount of pre-parsing, so that might not be a wise decision, especially in instructional settings. We might implement Skulpt or Brython (in-browser Python) or the Python language argument to the Sage Cell Server. To see examples of authoring Sage cells, have a look at Section.

    In the meantime, program listings,listingprogram listing especially with syntax highlighting, is useful all by itself. The R language might not be a bad stand-in for pseudo-code, as it supports assignment with a left arrow and has fairly generic procedural syntax for control structures and data structures. Or maybe Pascal would be a good choice? Here is an example of R. Note in the source that the entire block of code is wrapped in a CDATA section due to the four left angle brackets. We do not recommend this technique for isolated problem characters, but it is a life-saver for situations like the XSLT code just following.

    And some self-referential XSL:

    . ]]>

    Matlab is a commercial language for mathematics, while Octave in an open source version. The language values of matlab and octave are somewhat interchangeable. Following is a very slighlty edited version of an example from 50 Basic Examples for Matlab.

    a = [0:0.5:5]; % A Matlab comment here b = 2*a.^2 + 3*a -5; c = 1.2*a.^2+4*a-3; subplot(1,2,1) plot(a,b,'-or','MarkerFaceColor','g','LineWidth',2) xlabel('X'); ylabel('Y'); legend('Curve ','Location','NorthWest') subplot(1,2,2) plot(a,c,'--ok','MarkerFaceColor','c','LineWidth',2) xlabel('X'); ylabel('Y'); legend('Curve 2','Location','NorthWest')

    You can write made-up pseudo-code, but you might explain to a reader what your symbols all mean. This routine takes the m\times n marix A to reduced row-echelon form. Note that with no language specified, there is no special formatting or use of color. Note in the source the use of escaped characters for the three less-than symbols.

    input m, n and A r := 0 for j := 1 to n i := r+1 while i <= m and A[i,j] == 0 i := i+1 if i < m+1 r := r+1 swap rows i and r of A (row op 1) scale A[r,j] to a leading 1 (row op 2) for k := 1 to m, k <> r make A[k,j] zero (row op 3, employing row r) output r and A

    Look in the pretext-common.xsl file to see the strings to use to identify languages. Always all-lowercase, no symbols, no punctuation.

    Note that the above examples all have slightly different widths (theser are very evident in print with the frames). As 2-D atomic objects, to place them in the narrative requires the layout features of a sidebyside element. Then width and/or margin attributes will influence the width of the panel.

    A program may also be nested inside a listing, which behaves similar to a figure. You can provide a title, and the listing will be numbered along with tables and figures. This then makes it possible to cross-reference the listing, such as . It also removes the requirement of wrapping the program in a sidebyside. For technical reasons, the three examples above will not split across a page break in PDF output, but the placement inside a listing will allow splits, as you should see in at least one example following.

    C Version of <q>Hello, World!</q> /* Hello World program */ #include<stdio.h> main() { printf("Hello, World!"); }

    A program may include line numbers.

    A static Java program with line numbers import javax.swing.JFrame; //Importing class JFrame import javax.swing.JLabel; //Importing class JLabel public class HelloWorld { public static void main(String[] args) { JFrame frame = new JFrame(); //Creating frame frame.setTitle("Hi!"); //Setting title frame frame.add(new JLabel("Hello, world!"));//Adding text to frame frame.pack(); //Setting size to smallest frame.setLocationRelativeTo(null); //Centering frame frame.setVisible(true); //Showing frame } }

    A program may also include highlighted lines.

    A static Java program with line numbers import javax.swing.JFrame; //Importing class JFrame import javax.swing.JLabel; //Importing class JLabel public class HelloWorld { public static void main(String[] args) { JFrame frame = new JFrame(); //Creating frame frame.setTitle("Hi!"); //Setting title frame frame.add(new JLabel("Hello, world!"));//Adding text to frame frame.pack(); //Setting size to smallest frame.setLocationRelativeTo(null); //Centering frame frame.setVisible(true); //Showing frame } }

    Although a program should have a code element surrounding its code, we attempt to provide one when it is missing. This next sample tests that and intentionally has no leading or trailing newline inside the program.

    print("Hello world")

    Sometimes it is nice to author an inline fragment of a program and have the styling of its text match that of a program. To do this we can use the pf tag (program fragment). It is similar to a c element, but will be syntax highlighted according to either a language or the default language for programs. Here is an example in C: printf("The cost is $%f.2", money);. And another that is in Python and tests problematic characters: print("& % $ # _ { } ~ ^ \").

    If you are discussing algorithms in the abstract (or even concretely), you can set them off like a theorem, with a number, a title and a target for cross-references. Sometimes you claim an algorithm produces something in particular, or has certain properties, such as a theoretical run time, so a proof may be included. See the discussion just preceding about (limited) options for pseudo-code.

    Sieve of Eratosthenes

    On input of a positive integer n this algorithm will compute all the prime numbers up to, and including, n. It was named for Eratosthenes of Cyrene ( 276 BC 195/194 BC) by Nicomachus ( 60 120 CE) in Introduction to Arithmetic. (Wikipedia, 2015)

    1. Input: n
    2. Form the list of all integers from 2 to n
    3. Set p = 2
    4. While p < sqrt(n)

      1. If present, remove from the list multiples 2p, 3p, ...
      2. If p is now the last element of the list, stop
      3. Otherwise, set p to the element of the list immediately after current p

    5. Output: the remaining elements of the list

    Any element removed is a non-trivial product of two integers and hence composite. So no prime is is ever removed from the list.

    Each composite number is a multiple of some prime, and since no prime is ever removed, each composite will be removed. Hence the removed elements are precisely the set of composite numbers in the list and thus the remainder are precisely the primes on the list.

    If you are writing about system-level software, you may need to write numbers in hexadecimal or binary. Here we use a numbered, displayed equation (mathematics) and macros such as \texttt for a monospace text font, and \; for spacing/grouping the bits of the binary number. \texttt{6C2A}_{16} = \texttt{0110}\;\texttt{1100}\;\texttt{0010}\;\texttt{1010}_{2} If you use these constructions repeatedly, then some macros might be useful. It might also be beneficial for us to add some markup for such numbers used in a paragraphsend us a feature request.

    This is a spurious theorem to break up the run of consecutive listing so we might test the effect.

    And this is a spurious paragraph to prove that the theorem beforehand, and the proof following, are distinct from one another.

    This is a proof that is authored detached. It is not associated with the theorem above in a way other than simply following it.Footnotes once behaved badly in a detached proof.

    Notice that this proof has a ref attribute that points to the theorem being proved. In this way, the proof element doubles as an xref. So the text attribute is also available to fashion how the cross-reference appears. Options are basically the same as for xref, though some things are not possible, such as custom text.

    A specialized version of a program listing is an interactive command/response session at a command-line, where differing fonts are used to differentiate the system prompt, the user's commands, and the system's reaction. A console session may be used by itself inside a sidebyside, or it can be wrapped in a listing to get a number and a caption. As elsewhere, you will need to escape ampersands and angle brackets (such as if you have a command using redirection), using &amp;, &lt;, and &gt; in your source.

    Console Session: <c>int</c> and <c>float</c> gcc -Wall -o intAndFloat intAndFloat.c ./intAndFloat The integer is 19088743 and the float is 19088.742188

    Here is the plain version, some layout control. We simply place a small margin on the left (at 4% width).

    gcc -Wall -o intAndFloat intAndFloat.c ./intAndFloat The integer is 19088743 and the float is 19088.742188

    If your console input exceeds more than one line, you can author it across several lines and your choice of line breaks will be reflected in the rendering. You can decide to indent lines after the first one for clarity, if desired. You can also decide if your audience needs line-continuation characters or not.

    Console Session: <c>int</c> and <c>float</c> (multi-line input) gcc -Wall -o intAndFloat intAndFloat.c ./intAndFloat The integer is 19088743 and the float is 19088.742188

    A console may specify a continuation symbol, as a prefix on every line but the first.

    for x in range(0:20): print(x) print("Excellent!") for x in range(0:20): print(x) print("Excellent!")

    Notice in the HTML version of the above example that when you highlight all, or a portion, of the listing for a cut-and-paste that the prompts are not included.

    Now a test of some listings (and pre-formatted text) in a block that likely has a background color in an HTML version.

    Code in a colored(?) container

    Not really much of an exercise, but it should force a colored box.

    Running a program in a console:

    ./program
                        A pre
                    

    The next listing is just absurdity, to check various characters from that are otherwise employed by the code supporting consoles, and some Latin-1 characters. We test each in a prompt, input, and output. We use (* and *) as sequences used to escape embedded commands, so we test those also.

    Console Session: problematic <latex /> characters A backslash \ here A backslash \ here A begin group { here A begin group { here An end group } here An end group } here An open escape sequence (* here An open escape sequence (* here An end escape sequence *) here An end escape sequence *) here Some quotation marks ` ' " here Some quotation marks ` ' " here The rest & % $ # _ ~ ^ of LaTeX The rest & % $ # _ ~ ^ of LaTeX Latin-1: ÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß Latin-1: ÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß

    A program can also have preamble and postamble. They are tested here mostly just for their handling of leading/trailing whitespace. Note that the indentation of the start/end tags for the subelements is intentionally chaotic, that should not affect the indentation of the output. (However, the actual contents of the various parts of the program must all be indented to a similar degree in the source.)

    # meta: text in preamble with one trailing authored blank line def foo(): return 42 # meta: text in code with one authored blank line before and after # meta: in the output there should be two blank lines above and three below # Your code for bar() # meta: text in postamble with two authored blank lines preceding print(bar())

    An interactive rendering of the same program should produce the same visible code. Both samples should end in a newline. There will be a visible difference between how this the empty line created by that newline rendered in plain HTML (the empty line is not included) and Runestone (the empty line is visible).

    # meta: text in preamble with one trailing authored blank line def foo(): return 42 # meta: text in code with one authored blank line before and after # meta: in the output there should be two blank lines above and three below # Your code for bar() # meta: text in postamble with two authored blank lines preceding print(bar())

    We conclude this section with a longer example of a program listing, an assembly language program from Bob Plantz, included to test a listing breaking across pages in PDF output.

    A longer program listing @ structPass2.s @ Allocates two structs and assigns a value to each field @ in each struct, then displays the values. @ Bob Plantz - 6 July 2016 @ Constants for assembler .include "theTag_struct.s" @ theTag struct defs. .equ y,-28 @ y struct .equ x,-16 @ x struct .equ locals,28 @ space for the structs @ Constant program data .section .rodata .align 2 displayX: .asciz "x fields:\n" displayY: .asciz "y fields:\n" dispAChar: .asciz " aChar = " dispAnInt: .asciz " anInt = " dispOtherChar: .asciz " anotherChar = " @ The program .text .align 2 .global main .type main, %function main: stmfd sp!, {r4, fp, lr} @ save caller's info add fp, sp, #8 @ our frame pointer sub sp, sp, #locals @ for the structs @ fill the x struct add r0, fp, #x @ address of x struct mov r1, #'1 mov r2, #456 mov r3, #'2 bl loadStruct @ fill the y struct add r0, fp, #y @ address of y struct mov r1, #'a mov r2, #123 mov r3, #'b bl loadStruct @ display x struct add r4, fp, #x @ address of x struct ldr r0, displayXaddr bl writeStr ldr r0, dispACharAddr @ display aChar bl writeStr ldrb r0, [r4, #aChar] bl putChar bl newLine ldr r0, dispAnIntAddr @ display anInt bl writeStr ldr r0, [r4, #anInt] bl putDecInt bl newLine ldr r0, dispOtherCharAddr @ display anotherChar bl writeStr ldrb r0, [r4, #anotherChar] bl putChar bl newLine @ display y struct add r4, fp, #y @ address of y struct ldr r0, displayXaddr bl writeStr ldr r0, dispACharAddr @ display aChar bl writeStr ldrb r0, [r4, #aChar] bl putChar bl newLine ldr r0, dispAnIntAddr @ display anInt bl writeStr ldr r0, [r4, #anInt] bl putDecInt bl newLine ldr r0, dispOtherCharAddr @ display anotherChar bl writeStr ldrb r0, [r4, #anotherChar] bl putChar bl newLine mov r0, #0 @ return 0; sub sp, fp, #8 @ restore sp ldmfd sp!, {r4, fp, pc} @ restore and return .align 2 @ addresses of messages displayXaddr: .word displayX displayYaddr: .word displayY dispACharAddr: .word dispAChar dispAnIntAddr: .word dispAnInt dispOtherCharAddr: .word dispOtherChar
    Units of Measure

    Units of measure can be given xml treatment too with the quantity element. In , the siunitxsiunitx packagepackagesiunitxunits package is loaded to achive unit handling. Since that package only offers SI units, some other common units will be added by in the preamble. In HTML, the capabilities of siunitx are simulated, weakly. Note that at present, you should not attempt to use the quantity element within a math environment.

    The value of gravitational constant g is 9.8. Force is measured in , also known as one . A quantity with rather ridiculous units is 23. One is the same as . You can have a unitless quantity, like 42, which may help with consistency between such numbers and units in the output. Some non-SI units are available, such as the absurd . The command \pi is recognized within mag in conversions to HTML, which is consistent with the behavior with a conversion to , for example there are 2\pi in a full circle. This is a similar quantity with multiple occurences of \pi to test a particular template used for HTML output. It is not meant to make any sense: 21\pi45\pi234\pi890 .

    For a full list of the allowed units and prefixes, see pretext-units.xsl. If you have a need for more units, they need to be added to pretext-units.xsl in the section that deals with units which are not part of siunitx by default. Note that the mag element should come first, followed by the unit element, followed by the per element.

    Side-By-Side Panels Introduction

    The flow of a page is almost universally top-to-bottom. But at times you would like to go across a page, perhaps to compare items (identical content in two different languages), or to make good use of a page real estate by grouping several small items together ( images). So the sidebyside tag is strictly a layout device, though it does convey some meaning by grouping certain objects together. A variety of different objects can be put side-by-side using the sidebyside element. Specifically, figure, image, tabular, p, ol, ul, dl, pre, poem, and more. The individual components of a sidebyside are generically called panelspanels.

    As a layout device, the sidebyside does not allow a caption, is never numbered, and therefore cannot be cross-referenced. You may cross-reference whatever element holds the sidebyside, and many of the panels may be cross-referenced individually.

    As a first example, we have two single paragraphs, laid out with different widths, and slight margins on each side. The widths have been chosen experimentally to get roughly identical heights for the two paragraphs of varying length.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin lorem diam, convallis in nulla sed, accumsan fermentum urna. Pellentesque aliquet leo elit, ut consequat nunc dapibus ac. Sed lobortis leo tincidunt, vulputate nunc at, ultricies leo. Vivamus purus diam, tristique laoreet purus eget, mollis gravida sapien. Nunc vulputate nisl ac mauris hendrerit cursus. Sed vel molestie velit. Suspendisse sem sem, elementum at vehicula id, volutpat ac mi. Nullam ullamcorper fringilla purus in accumsan. Mauris at nunc accumsan orci dictum vulputate id id augue. Suspendisse at dignissim elit, non euismod nunc. Aliquam faucibus magna ac molestie semper. Aliquam hendrerit sem sit amet metus congue tempor. Donec laoreet laoreet metus, id interdum purus mattis vulputate. Proin condimentum vitae erat varius mollis. Donec venenatis libero sed turpis pretium tempor.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra. Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    Figures with Numbers Side-By-Side

    Figures, or other captioned items such as tables or listings, can be placed side-by-side using the sidebyside element. The figures will be captioned and numbered as if they were part of the vertical flow of the document. For example, see and

    However, if the sidebyside is placed inside another figure, then the outer figure gets an overall caption and a regular number, while the captions of the interior items will be labelled as (a), (b), (c), etc; for example, see the subfigures in . You can also cross-reference the subfigures individually, for example: .

    The sidebyside tag can have an attribute widths that specifies a percentage width of the page for each panel of the layout. There are automatic margins by default, and any remaining width is divided evenly to space out the panels. When the margins attribute is given as auto, or in the default case, the margins provided each equal half of the inter-panel space.

    With no attributes on the sidebyside, each panel is the same width and there is no inter-panel space and no margin. For a sidebyside with a single panel, with its width specified, the panel will be centered.

    Side-by-Side, with figures as children, automatic margin
    a white square outlined in blue covered by a black X
    Side-by-Side, with figures as children, margin set to zero
    width=50%
    width=25%
    Widths calculated automatically, all defaults
    Interior figure
    Regular numbering
    Regular numbering
    Images

    We can use the sidebyside element to put imagesimage next to each other. These will illustrate a text, but with no captions or numbers, cannot be cross-referenced. This next example has 10% margins, and the panels have widths 25% and 40%, leaving 15% computed as the one inter-panel space.

    Now we fine-tune with different widths (which add up to 100%). The five images have been given different vertical alignments, top middle bottom top middle via the valigns attribute.

    If you want an overall caption to a group of images, but no sub-captions on your images, that is also straightforward. This example has no attributes specified. The overall figure may be cross-referenced, as

    Two equally-spaced (identical) images
    Common Side-By-Side Constructions

    We have now seen at least one example of each of the four most common constructions involving sidebyside. Working from the exterior inward, we can go figure, sidebyside, figure, X, where X is some atomic (unnumbered) item we might use elsewhere in a document, the inner figure may be repeated with different objects X, and the figures have captions. Each figure is independently optional, leading to the four combinations in this table. Note this applies to any captioned item used inside the sidebyside, but a figure is the most flexible.

    <c>sidebyside</c> and <c>figure</c> interactions Outer FigureInner FigureEffect AbsentAbsentLayout only, no numbers nor captions AbsentPresentNumbers and captions on figure(s) PresentAbsentNumber and overall caption PresentPresentNumber and overall caption,sub-numbers and captions on figure(s)
    Vertical Alignment

    Vertical alignment can be specified using the valign attribute which admits a space-separated list of top, middle, and bottom; the default is top.

    Middle
    Top
    Middle

    The singular version of the attribute, valign, can provide the same alignment to each panel, here we use five different widths, but all with vertical alignment of middle.

    Text Next to Text and Images

    Text can be put next to other blocks of text using the stack element, which can contain multiple paragraphs using the p element (see ). If only one paragraph is required, simply use the p element on its own.

    here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text

    here is some text here is some text here is some text here is some text here

    here is some text here is some text here is some text here is some text here

    here is some text here is some text here is some text here is some text here

    here is some text here is some text here is some text here is some text here

    here is some text here is some text here is some text here is some text here

    Similarly, text can be put next to images.

    here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text cross reference: and math: x^2

    You can place text next to numbered figures, as shown below in .

    here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text here is some text; cross reference: and math: x^2

    Text next to a figure
    Image Formats, Side-by-Sides

    Most of our demonstrations here use our square blue cross test image, which is provided as a PNG image. You may specify images by any of the methods described in the section on graphics, . The complete graph below is specified with no file extension, on the assumption that an SVG version exists for HTML output, and a PDF version exists for output. The second is a JPEG image that we use elsewhere for a YouTube video, but recycle here as an image provided in that format. By default, they are aligned at their tops.

    Here are two TikZ images, authored side-by-side. The first has had its geometric portions of the original scaled down to 75%, with the effect of increasing the text, relatively, so the application in a side-by-side panel with 25% width has legible text. We caption only the second panel, which has no text adjustments. From TeXample.net.

    \begin{tikzpicture}[scale=0.75] \begin{scope}[blend group = soft light] \fill[red!30!white] ( 90:1.2) circle (2); \fill[green!30!white] (210:1.2) circle (2); \fill[blue!30!white] (330:1.2) circle (2); \end{scope} \node at ( 90:2) {Typography}; \node at ( 210:2) {Design}; \node at ( 330:2) {Coding}; \node [font=\Large] {\LaTeX}; \end{tikzpicture}
    Work Flow \smartdiagram[circular diagram:clockwise]{Edit, pdf\LaTeX, Bib\TeX/ biber, make\-index, pdf\LaTeX}

    Images by Stefan Kottwitz

    • Venn Diagram
    • Work Flow

    Tables Side-By-Side

    Tablestable can also be put side-by-side, as demonstrated below in ; naturally, subtables can be referenced as in .

    Side-by-Side, with tables as children width=50% 1111 2222 aaaa bbbb AAAA BBBB
    width=25% 1111 2222 aaaa bbbb AAAA BBBB
    Widths can be calculated automatically Table with automatic widths 1111 2222 aaaa bbbb AAAA BBBB
    Table with automatic widths 1111 2222 aaaa bbbb AAAA BBBB

    If you put two table elements side-by-side without an enclosing figure, then they will use regular numbering; see Tables.

    1111 2222 aaaa bbbb AAAA BBBB
    1111 2222 aaaa bbbb AAAA BBBB
    1111 2222 aaaa bbbb AAAA BBBB
    Tables Next to Figures

    Tables and figures can go next to each other, as demonstrated in and , plus within an overall captioned figure, .

    Table next to a Figure 1111 2222 aaaa bbbb AAAA BBBB
    Figure next to a Table
    Figure and Table, with overall caption, hence sub-captioned Table next to a Figure 1111 2222 aaaa bbbb AAAA BBBB
    Figure next to a Table
    Tables Next to Text

    Tables can go next to blocks of text using the stack element (see ).

    Table next to text 1111 2222 aaaa bbbb AAAA BBBB

    here is some text here is some text here is some text here is some text here

    here is some text here is some text here is some text here is some text here

    here is some text here is some text here is some text here is some text here

    here is some text here is some text here is some text here is some text here

    here is some text here is some text here is some text here is some text here

    Tabular Next to Each Other

    Four tabular elements inside a single sidebyside will result in no captions at all.

    1111 2222 aaaa bbbb AAAA BBBB CCCC DDDD 1111 2222 aaaa bbbb AAAA BBBB 1111 2222 aaaa bbbb AAAA BBBB 1111 2222 aaaa bbbb AAAA BBBB
    Lists in Side-by-Sides

    A regular list normally belongs in a p but it can be placed unadorned into a panel of a side-by-side, as demonstrated below in . You can also put named lists into a panel, and then the title, introduction, conclusion, and caption will behave as expected, along with a number that might be used in a cross-reference (), or perhaps we might cross-reference by title, .

    Two named lists Sea Life

    Dr. Seuss again.

    • One fish
    • Two fishNot fishes
    • Red fish
    • Blue fish
    Color Shades colorsshades
    1. Bluein many shades

      1. Light
      2. Navy
      3. Royal

    2. Red

      1. Maroon
      2. Pink
      3. Shocking

    This ends our example.

    These same two lists can individually be the panels of a sidebyside, where here vertical alignment on the bottom attempts to align the titles, which are placed below for panels of a sidebyside.

    Sea Life

    Dr. Seuss again.

    • One fishNo more fishes
    • Two fish
    • Red fish
    • Blue fish
    Color Shades colorsshades
    1. Blue

      1. Light
      2. Navy
      3. Royal

    2. Reda really nice color

      1. Maroon
      2. Pink
      3. Shocking

    This ends our example.

    We also need to test a sidebyside in a list. The widths are now relative to the space given over to an indented item. Here we nest and nest and nest and nest to get a big, obvious indentation, and then include an image at 100% width and no margin. In your mind's eye, or with a ruler, check that the image spans all the way over to the right margin.

    1. This is

      1. a very

        1. wide

          1. rectangle

    Stacking: Back to Vertical Flow

    You might wish to mix disparate items within a panel, returning to a vertical flow within a panel. For example, you might want a diagram to the left and some paragraphs of commentary to the right. Or perhaps a photograph on one side and a list of bullet points to the other side. A stack is a container that can only be used to collect several items into a single panel of a sidebyside. You cannot point to it, but you can point to its contents as usual. Contents may be anything you could otherwise put into a sidebyside panel that does not have a caption or a title. In particular, these panels cannot be sub-numbered since the panel cannot be made into a figure.

    Similar items can also be stacked, of course. Most importantly, a normal panel will accept a single paragraph. If you want several paragraphs, simply collect them in a stack.

    A simple sentence inside a single p as the first item in a stack.

    A less simple sentence that will wrap inside the panel to make the right panel taller and allow us to experiment with sliding the left panel contents up and down, here it is placed in the middle.

    We have an image to the left, as a regular panel (not a stack). In the right panel we stack a list of properties, followed by a descriptive paragraph. We middle-align the stack at the bottom, just as a demonstration (it would likely look better with top alignment).

    • Blue
    • Square
    • Geometric

    The blue-ness of the border contrasts with the stark emptieness of the white interior, evoking images of blue skies and vast sandy deserts. The harsh black cross draws the viewer's attention to the exact center.

    In an image or a tabular can be used within a paragraph. Here we test a mixture of the three items to make sure they are properly separated in a conversion to .

    Paragraph one.

    Paragraph two.

    1111 2222 aaaa bbbb AAAA BBBB

    We imagine a sidebyside using a stack to enable constructions like a table of data in one panel, and maybe a plot with some text next to it.

    In the toy example next, the list of data is rigid, so we have set the first panel width to 40%, a value obtained experimentally to just contain the list. This allow us to set the second panel to a width of 58%, and we use no margins. If you try to balance the heights of the two panels, this can become a bit of a zero-sum game. A wider second column means the text occupies fewer lines, but the wider image also creates a taller image, consuming more vertical space.

    Experimental results collected in a figure i t_i x_i y_i 00.000.00000.5000 10.200.10000.4800 20.400.19600.4560 30.600.28720.4295 40.800.37310.4027 51.000.45360.3783 61.200.52930.3591 71.400.60110.3480 81.600.67070.3474 91.800.74020.3603 102.000.81230.3900

    This set of values and this plot have nothing to do with each other. You'll recognize that they've been liberated from earlier in this work.

    Step back and simply examine how the pieces all fit together within a figure.

    The next paragraphs should start on a new page in PDF output if the standard publisher file is used.

    Bully Pulpit

    Remember that sidebyside has attributes that strongly influence layout. That is intentional. But to support a variety of output formats, it does not allow overly-precise control, and they be viewed as providing hints to an implementer of a conversion. So for example, do not expect sidebyside to function like a tabular or an HTML table.

    In particular, elements of two consecutive stack will not line up, unless perhaps you construct them identically. Consider a sbsgroup for something closer to putting items into rows.

    Other Panels

    Other elements may be placed within a sidebyside element. Pure lists first.

    1. Footnotes: Fermat allusion at .

    2. Examples: Mystery derivative at .

    3. Definition-like: A mathematical statement with no proof .

    4. Figures: An early plot, Figure.

    • Footnotes: Fermat allusion at .

    • Examples: Mystery derivative at .

    • Definition-like: A mathematical statement with no proof .

    • Figures: An early plot, Figure.

    You can place aligned equations in paragraphs within a sidebyside element.

    here is some text, and here is an equation that contains alignment. f(x)&= x^2+3x+2 &=(x+2)(x+1)

    here is some text, and here is an equation that contains alignment. f(x)&= x^2+3x+2 &=(x+2)(x+1)

    here is some text, and here is an equation that contains alignment. f(x)&= x^2+3x+2 &=(x+2)(x+1)

    Pre-formatted text may be included by using the pre element. This content is horizontally-rigid, so as the author, you need to be sure to provide enough width for the panel to contain the content. It is easy to see the boundary of the panels when rendered in HTML since there is a background that fills the panel.

    Hello, World! in Pascal and C++
                                program HelloWorld;
                                begin
                                  WriteLn('Hello, world!');
                                end.
                            
                            #include
    
                            int main()
                            {
                                std::cout << "Hello, world!";
                                return 0;
                            }
                            
    A graph defined by data (from Keller and Trotter's Applied Combinatorics)
                                graph1.txt
                                9
                                6 2
                                1 5
                                1 7
                                6 8
                                9 1
                                4 3
                                5 7
                                1 3
                                5 9
                                7 9
                            
    Poems as Side-By-Side Panels

    Poemspoem may be panels of a side-by-side layout. Here we place some commentary alongside. See for general information about poetry.

    Fire and Ice Fire and Ice, Frost Robert Frost Some say the world will end in fire, Some say in ice. From what I've tasted of desire I hold with those who favor fire. But if it had to perish twice, I think I know enough of hate To say that for destruction ice Is also great And would suffice.

    You might have several things to say about a poem and you could use a sequence of paragraphs immediately adjacent.

    This is a second paragraph of commentary.

    Poems are not horizontally-rigid, but they are not perfectly horizontally-flexible either. The left copy of this next poem is in a panel roughly 2/3 the width of the page and fits there. The right copy has the first five lines and is in space about half the previous width, and you can see the lines being wrapped with obvious indentation. So you can constrain the width of a poem if you do not mind the additional indentation. (Recognize that this example is a bit extreme.)

    Sonnet to Liberty Sonnet to Liberty, Wilde Oscar Wilde Not that I love thy children, whose dull eyes See nothing save their own unlovely woe, Whose minds know nothing, nothing care to know, But that the roar of thy Democracies, Thy reigns of Terror, thy great Anarchies, Mirror my wildest passions like the sea, And give my rage a brother! Liberty! For this sake only do thy dissonant cries Delight my discreet soul, else might all kings By bloody knout or treacherous cannonades Rob nations of their rights inviolate And I remain unmoved-and yet, and yet, These Christs that die upon the barricades, God knows it I am with them, in some things. Sonnet to Liberty Oscar Wilde Not that I love thy children, whose dull eyes See nothing save their own unlovely woe, Whose minds know nothing, nothing care to know, But that the roar of thy Democracies, Thy reigns of Terror, thy great Anarchies,
    Side-By-Side Groups

    A side-by-side group, sbsgroup, is still in development. (Notably, subcaptions do not behave as expected.) It is a sequence of sidebyside, which may conceivably use the same margins, widths and vertical alignments for each horizontal run of panels. Attributes on the sbsgroup are global to the group's enclosed sidebyside, and will be used by each contained sidebyside. If attributes are present on an individual sidebyside, they override the global values. The next two examples demonstrate some of this behavior, in a limited way.

    Overall SBS Group

    One.

    Two.

    Three.

    Four.

    Five.

    Six.

    A long poem, when placed into a sidebyside will not fit onto a physical page and will not break across pages. With a sbsgroup you can put each stanza (say) into its own sidebyside and place something (commentary) next to it. We include the title with the first stanza and the author with the last stanza. This device can also be useful to attach commentary to specific stanzas.

    The Stolen Child Stolen Child, The, Yeats Where dips the rocky highland Of Sleuth Wood in the lake, There lies a leafy island Where flapping herons wake The drowsy water-rats; There we've hid our faery vats, Full of berries And of reddest stolen cherries. Come away, O human child! To the waters and the wild With a faery, hand in hand, For the world's more full of weeping than you can understand.

    Some commentary on Stanza One.

    Where the wave of moonlight glosses The dim grey sands with light, Far off by furthest Rosses We foot it all the night, Weaving olden dances, Mingling hands and mingling glances Till the moon has taken flight; To and fro we leap And chase the frothy bubbles, While the world is full of troubles And is anxious in its sleep. Come away, O human child! To the waters and the wild With a faery, hand in hand, For the world's more full of weeping than you can understand.

    Some commentary on Stanza Two.

    Where the wandering water gushes From the hills above Glen-Car, In pools among the rushes That scarce could bathe a star, We seek for slumbering trout And whispering in their ears Give them unquiet dreams; Leaning softly out From ferns that drop their tears Over the young streams. Come away, O human child! To the waters and the wild With a faery, hand in hand, For the world's more full of weeping than you can understand.

    Some commentary on Stanza Three.

    William Butler Yeats Away with us he's going, The solemn-eyed: He'll hear no more the lowing Of the calves on the warm hillside Or the kettle on the hob Sing peace into his breast, Or see the brown mice bob Round and round the oatmeal-chest. For he comes, the human child, To the waters and the wild With a faery, hand in hand, From a world more full of weeping than he can understand.

    Some commentary on Stanza Four.

    The main rationale for sbsgroup is to layout a grid of items, and by placing the layout parameters on the sbsgroup element, the items can line up across sidebyside and subcaptioning can run across the whole group. So, for example, if you have images to compare by placing in a grid, then making them all the same size, or of the same aspect ratio, can help with the overall consistency.

    This example has three sidebyside, each with four figure containing an identical image. Since the images are identical and the width is set to 20% they should all line up nicely with little effort. Since the default for margins is automatic, the remaining 20% of the overall width will be used for three inter-panel spaces of 5% and two margins of 2.5% each. Note the numbering of these as independent figures. We have left the captions empty for reasons of space, but you could add more information. Note that in print, a page break is allowed between any two of the sidebyside and cannot be suppressed.

    We recycle the prior sbsgroup but now put it in its own overall figure. That will allow a caption for the whole group, and will cause the twelve figures to be subcaptioned. Except the subcaptioning is not implemented. Soon.

    Twelve images, arranged in a grid

    One more test. We override the spacing and vertical alignments of the middle sidebyside. Note that it is easy to make a panel so skinny that even the smallest possible caption does not fit in the width.

    Now an sbsgroup that should start on a new page if this sample article is built to PDF using the distribution publisher file.

    The following is a sbsgroup full of operation tables. Once upon a time it was rather cramped vertically in HTML output, but Andrew Scholer improved the spacing at GitHub #2387. The example is from Valerio Monti.

    Tabelle delle operazioni per 1\le n\le 4

    \begin{array}{c|c} + \amp \class[1]{0} \\ \hline \class[1]{0} \amp \class[1]{0} \end{array}

    \begin{array}{c|c} \cdot \amp \class[1]{0} \\ \hline \class[1]{0} \amp \class[1]{0} \end{array}

    \begin{array}{c|cc} + \amp \class[2]{0} \amp \class[2]{1} \\ \hline \class[2]{0} \amp \class[2]{0} \amp \class[2]{1}\\ \class[2]{1} \amp \class[2]{1} \amp \class[2]{0} \end{array}

    \begin{array}{c|cc} \cdot \amp \class[2]{0} \amp \class[2]{1} \\ \hline \class[2]{0} \amp \class[2]{0} \amp \class[2]{0}\\ \class[2]{1} \amp \class[2]{0} \amp \class[2]{1} \end{array}

    \begin{array}{c|ccc} + \amp \class[3]{0} \amp \class[3]{1} \amp \class[3]{2} \\ \hline \class[3]{0} \amp \class[3]{0} \amp \class[3]{1} \amp \class[3]{2} \\ \class[3]{1} \amp \class[3]{1} \amp \class[3]{2} \amp \class[3]{0} \\ \class[3]{2} \amp \class[3]{2} \amp \class[3]{0} \amp \class[3]{1} \\ \end{array}

    \begin{array}{c|ccc} \cdot \amp \class[3]{0} \amp \class[3]{1} \amp \class[3]{2} \\ \hline \class[3]{0} \amp \class[3]{0} \amp \class[3]{0} \amp \class[3]{0} \\ \class[3]{1} \amp \class[3]{0} \amp \class[3]{1} \amp \class[3]{2} \\ \class[3]{2} \amp \class[3]{0} \amp \class[3]{2} \amp \class[3]{1} \\ \end{array}

    \begin{array}{c|cccc} + \amp \class[4]{0} \amp \class[4]{1} \amp \class[4]{2} \amp \class[4]{3} \\ \hline \class[4]{0} \amp \class[4]{0} \amp \class[4]{1} \amp \class[4]{2} \amp \class[4]{3} \\ \class[4]{1} \amp \class[4]{1} \amp \class[4]{2} \amp \class[4]{3} \amp \class[4]{0} \\ \class[4]{2} \amp \class[4]{2} \amp \class[4]{3} \amp \class[4]{0} \amp \class[4]{1} \\ \class[4]{3} \amp \class[4]{3} \amp \class[4]{0} \amp \class[4]{1} \amp \class[4]{2} \\ \end{array}

    \begin{array}{c|cccc} \cdot \amp \class[4]{0} \amp \class[4]{1} \amp \class[4]{2} \amp \class[4]{3} \\ \hline \class[4]{0} \amp \class[4]{0} \amp \class[4]{0} \amp \class[4]{0} \amp \class[4]{0} \\ \class[4]{1} \amp \class[4]{0} \amp \class[4]{1} \amp \class[4]{2} \amp \class[4]{3} \\ \class[4]{2} \amp \class[4]{0} \amp \class[4]{2} \amp \class[4]{0} \amp \class[4]{2} \\ \class[4]{3} \amp \class[4]{0} \amp \class[4]{3} \amp \class[4]{2} \amp \class[4]{1} \\ \end{array}

    Testing a Side-By-Side First

    A sidebyside that appears first within some other container can wreak havoc in output. Below we have this situation twice, once in an activity, then in an example, then in a paragraphs.

    Here is text block 1

    Here is text block 2

    Here is text block 1

    Here is text block 2

    And a sbsgroup in similar circumstances.

    Here is text block 1

    Here is text block 2

    Here is text block 3

    Here is text block 4

    First Child of a Paragraphs A B C D \alpha \beta \gamma \delta
    Testing Styling of Related Elements

    This subsection has non-side-by-side structures, to aid with the effects of styling decisions across the range of possibilities. First a figure with a caption holding a scaled image and a cross-reference for knowl testing: .

    A traditional figure
    Side-by-Side Gallery

    This subsection attempts to survey all the possible items that can be placed into a sidebyside element, in various combinations. While intended to be exhaustive across contents, it does not test all possibilities, and is not meant to be instructive (see for that). The layout is identical for each sidebyside, 5% margins, panel widths of 40% and 45%, leaving 5% for the space between the panels. The vertical alignment is left at the default, top.

    We begin with simpler atomic items. If necessary, comments follow each.

    Single p (left), stack (right)

    Vestibulum sit amet est non lacus accumsan iaculis aliquam nec leo. Maecenas placerat consequat quam, a lobortis odio convallis vitae. Curabitur sagittis, risus non suscipit pulvinar, enim tortor posuere purus, id dignissim sapien sapien non dui. Vestibulum ultrices, enim a ornare consectetur, nisl est iaculis arcu, eget scelerisque nunc magna a nisl. Vestibulum vestibulum ante sit amet ex vulputate, eu facilisis sapien tempor.

    Aliquam dui nisi, pharetra id enim vel, imperdiet laoreet risus. Nunc convallis elit eu erat imperdiet tincidunt. Sed eget augue et nunc mollis tempor. Suspendisse luctus elit non lorem scelerisque, nec lacinia lectus dictum.

    Vivamus ut orci nisl. Donec eleifend ultricies tortor, a pellentesque neque dignissim in. Praesent maximus, augue eu pretium auctor, dolor quam feugiat augue, ut vulputate nunc eros vitae massa. Phasellus quis ante quis est venenatis dapibus eget luctus ipsum.

    An ol with simple items, a ul with items with paragraphs
    1. Blue
    2. Red
    3. Green
    4. Purple
    5. Violet
    6. Brown
    • Vestibulum sit amet est non lacus accumsan iaculis aliquam nec leo. Maecenas placerat consequat quam, a lobortis odio convallis vitae.

      Curabitur sagittis, risus non suscipit pulvinar, enim tortor posuere purus, id dignissim sapien sapien non dui.

    • Vestibulum ultrices, enim a ornare consectetur, nisl est iaculis arcu, eget scelerisque nunc magna a nisl.

      Vestibulum vestibulum ante sit amet ex vulputate, eu facilisis sapien tempor.

    A program and a console n_loops <- 10 x.means <- numeric(n_loops) for (i in 1:n_loops){ x <- as.integer(runif(100, 1, 7)) x.means[i] <- mean(x) } x.means gcc -o intAndFloat intAndFloat.c ./intAndFloat 19088743 (integer) and 19088.742188 (float)

    Note that these two chunks of verbatim text will very likely exceed the right side of a too-skinny panel. We have severly edited these two examples from previous appearances just to fit here.

    An poem and a tabular To A Friend Whose Work Has Come To Nothing William Butler Yeats Now all the truth is out, Be secret and take defeat From any brazen throat, For how can you compete, Being honour bred, with one Who, were it proved he lies, Were neither shamed in his own Nor in his neighbours' eyes? Bred to a harder thing Than Triumph, turn away And like a laughing string Whereon mad fingers play Amid a place of stone, Be secret and exult, Because of all things known That is most difficult. OrganismClassification TroutFish MonkeyMammal CrowBird CriminiFungus BeeInsect

    A tabular can exceed the width of its panel in print, while in HTML it may reflow individual cells to stay within a panel, depending on their contents.

    A pre, and a pre employing cline
                        Vestibulum sit amet est non
                            lacus accumsan iaculis
                        aliquam nec leo. Maecenas
                        placerat consequat quam, a
                        lobortis odio convallis
                        vitae.
                        
                            Vestibulum sit amet est non
                                lacus accumsan iaculis
                            aliquam nec leo. Maecenas
                                placerat consequat quam,
                            a lobortis odio convallis
                                    vitae.
                        

    Be aware that the lines of pre can spill outside of its panel without any word-wrapping. So you may need to vary panel widths or rearrange line breaks manually. Page width is a scarce resource.

    An identical image, twice

    Images will scale to fill their panel's width. We provide no services to change the aspect ratio of your images, that is your responsibility to accomplish elsewhere. This rectangular image will have slightly different widths, and so will be slightly deeper in the right panel (at a 45:40 ratio). Remember, vertical alignment is at the top.

    Now we turn to captioned items: figure, table, listing, and the anomalous named list, list, whose future is uncertain. We test subcaptions here. Note that many different atomic items can go in a figure, and largely they will behave in a sidebyside much as they do when placed in a panel all by themselves ( captionless).

    A figure and a table
    A Rectangular Test Image
    Classifying Organisms OrganismClassification TroutFish MonkeyMammal CrowBird CriminiFungus BeeInsect
    A listing and a list A statistical computation n_loops <- 10 x.means <- numeric(n_loops) for (i in 1:n_loops){ x <- as.integer(runif(100, 1, 7)) x.means[i] <- mean(x) } x.means Colors Again

    We have named list of colors.

    1. Blue
    2. Red
    3. Green
    4. Purple
    5. Violet
    6. Brown

    That was nice.

    Now let's test the alignment of various items that might be placed with an image in a figure. We want asymptote links and long descriptions close to the image. The caption for figures should be aligned.

    Two Asympote images side-by-side
    Asymptote Lever Demonstration moments on a lever

    This diagram has two masses at either end of a lever, namely m and M. They are located at distance x and X on an axis. The resulting center-of-mass is at a point \bar{x}.

    size(200,0); pair z0=(0,0); pair z1=(2,0); pair z2=(5,0); pair zf=z1+0.75*(z2-z1); draw(z1--z2); dot(z1,red+0.15cm); dot(z2,darkgreen+0.3cm); label("$m$",z1,1.2N,red); label("$M$",z2,1.5N,darkgreen); label("$\hat{\ }$",zf,0.2*S,fontsize(24pt)+blue); pair s=-0.2*I; draw("$x$",z0+s--z1+s,N,red,Arrows,Bars,PenMargins); s=-0.5*I; draw("$\bar{x}$",z0+s--zf+s,blue,Arrows,Bars,PenMargins); s=-0.95*I; draw("$X$",z0+s--z2+s,darkgreen,Arrows,Bars,PenMargins);
    Asymptote Contour Plot import graph; import palette; size(10cm,10cm,IgnoreAspect); real f(real x, real y) { return 0.9*pow10(2*sin(x/5+2*y^0.25)) + 0.1*(1+cos(10*log(y))); } scale(Linear,Log,Log); pen[] Palette=BWRainbow(); bounds range=image(f,Automatic,(0,1),(100,100),nx=200,Palette); xaxis("$x$",BottomTop,LeftTicks,above=true); yaxis("$y$",LeftRight,RightTicks,above=true); palette("$f(x,y)$",range,(0,200),(100,250),Top,Palette, PaletteTicks(ptick=linewidth(0.5*linewidth())));

    Now we have some more interactive elements.

    Videos can be placed quite compactly for HTML output, but we display a fair amount of information for a YouTube video in print, and therefore two videos side-by-side gets pretty crowded. The examples above have the bare minimum amount of information attached (not in an overarching figure), and the bare amount which which is displayed in print. We could relax our common spacing to make it a bit better. Read about side-by-side groups (sbsgroup) and experiment with stacking several sub-captioned videos into an overall captioned figure (). For other examples see and .

    Open Problems

    Like for mathematical research. Experimental as of 2023-07-06.

    Solve the Riemann HypothesisFootnotes were once incomplete on open problems. and provide a short proof of Fermat's Last Theorem.

    Poetry

    There is support for poems via the poempoem tag, which can contain a title, author and multiple stanza, each containing multiple line. See the source of the following poem for an example of the exact arrangement. Note how the first quote crosses two line elements and how this is handled in the source. There are many very flexible options for horizontal alignment and indentation. Further extensive examples, constructed by Jahrme Risner, are available in the example Humanities document.

    The Charge of the Light Brigade Charge of the Light Brigade, The, Tennyson Alfred Lord Tennyson Half a league, half a league, Half a league onward, All in the valley of Death Rode the six hundred. Forward, the Light Brigade! Charge for the guns! he said: Into the valley of Death Rode the six hundred. Charge of the Light Brigadesecond stanza Forward, the Light Brigade! Was there a man dismay'd? Not tho' the soldier knew Someone had blunder'd: Theirs not to make reply, Theirs not to reason why, Theirs but to do and die: Into the valley of Death Rode the six hundred.

    Ken Levasseur, who teaches at UMass-Lowell, has limericks in his Applied Discrete Structures textbook. When he reported that they were unable to be the target of a cross-reference, Karl-Dieter Crisman penned the following limerick.

    Karl-Dieter Crisman CS students studying in Lowell Required their books to have soul. Along came their teacher Who asked for this feature: A poem that lives in a knowl.

    And when yours truly tried to joke about poetry on GitHub CLI #182, back came:

    Steven Clontz There once was a maintainer named Rob Who told bad jokes while on the job While they were lame You could say the same Of Steven's limericks that cause you to sob
    Literate Programming

    There is support for literate programming using the fragment tag. It should always contain an @xml:id or a @filename attribute, and may contain code segments as well as fragref segments referencing other fragments. The final code is to be assembled starting from a fragment with a filename attribute and traversing the tree of fragment references.

    For example here is the gcd algorithm in Python. Note that indentation is hard to get right at the moment.

    The GCD algorithm def gcd(a, b): while(b): return a

    The key part is the inner part of the loop:

    The key loop part a, b = b, a % b

    This double assignment changes both a and b.

    Atomic Objects

    Some objects are relatively indivisable and are used as components of other structures. We call them atomic, even if the term is not perfect. A good example is image (next, ). This section is arranged according to these objects and tests the various ways they can be employed.

    We frequently include some nonsense text inside short intervening paragraphs to test spacing and establish margins.

    <tag>image</tag>

    An image can be placed in five different ways:

    1. all by itself, as a peer of p typically, with layout control,
    2. inside a figure, earning a number and caption,
    3. inside a sidebyside, with size and layout configured,
    4. inside a figure inside a sidebyside, with size and layout configured, with a number and caption, and
    5. inside a figure inside a sidebyside inside a figure, with size and layout configured, with a number and caption, but now sub-numbered ((a), (b), (c),).
    Examples of each, and more.

    All by itsef, with no layout specified, so showing the default size and placement. Vivamus in congue massa. Morbi condimentum ac magna at accumsan. Vestibulum ac augue eu lorem semper gravida.

    Width set at 40%, so equal margins and thus centered. Aenean faucibus augue tellus, et sollicitudin tortor finibus non. Maecenas semper dolor quis diam placerat, iaculis sollicitudin augue finibus. Vestibulum facilisis ligula lectus, ac tristique nisl aliquet non.

    Asymmetric margins of 20% and 40% given, implying 40% width, equal to previous instance. Vivamus suscipit diam eget mi cursus viverra.

    As a plain component of a sidebyside. Widths here are 20% and 30%, margins and gaps are automatic, default alignment on top edges. Nulla pharetra imperdiet elit, in sodales nibh blandit ultricies. Maecenas efficitur ac felis ut pharetra.

    Inside a figure with no adjustments, so default behavior. Note how a figure occupies the entire width of the page, so then does the caption.

    New Zealand Landscape

    Inside a figure with asymmetric (large) margins of 30% and 60%. Quisque finibus augue sit amet facilisis fringilla. Aenean faucibus augue tellus, et sollicitudin tortor finibus non.

    New Zealand Landscape

    Inside figures inside a sidebyside. Same widths as previous sidebyside but alignment on bottoms of the panels, to partially align captions. Note how the captions are constrained in width by the width of the panels of the side-by-side.

    NZ Landscape
    New Zealand Terrascape

    Identical code to previous example, but now wrapped in an overall figure, which has its own caption and number, leaving the interior figures to be sub-numbered. Cross-references use the full number: .

    Amalgamation of Scapes
    NZ Landscape
    New Zealand Terrascape

    For , in some circumstances it is desirable to print the image on the next line, but backed up by some amount. This top-aligns the image with a number of some sort off to the left. The following are tests for this behavior. Here is a list.

    A rotation="n" attribute applied to a bare image will rotate the image by n. The vertical space adjusts to accomodate the rotated image in the latex version but not in the html version.

    Rotated Images
    rotate="180"
    rotate="15"

    For pdf output destined for print, when the publication file entry latex/@print="yes", a @landscape="yes" attribute applied to a figure, table, list or listing will cause the object to be rotated 90 and presented on its own page. Placement of the float is determined by and multipage objects are not supported.

    This landscape figure will be rotated so the long edge is vertical, and will appear on its own page in print PDF output.
    Wide figure containing a sidebyside containing a rotated image. This will be rotated and appear on its own page in print PDF output.
    Quack
    Propulsion System
    <tag>video</tag>

    An video can be placed in five different ways:

    1. all by itself, as a peer of p typically, with layout control,
    2. inside a figure, earning a number and caption,
    3. inside a sidebyside, with size and layout configured,
    4. inside a figure inside a sidebyside, with size and layout configured, with a number and caption, and
    5. inside a figure inside a sidebyside inside a figure, with size and layout configured, with a number and caption, but now sub-numbered ((a), (b), (c),).
    Examples of each, and more.

    Videos can be realized in many forms, and can come from a variety of sources. See for tests of some of that variety. Here we are testing placement within surroundings and testing the schema for location. But we do have two videos in each test, one provided as a local file and one embedded from a service.

    All by itsef, with no layout specified, so showing the default size and placement. Vivamus in congue massa. Morbi condimentum ac magna at accumsan. Vestibulum ac augue eu lorem semper gravida.

    <tag>program</tag>, <tag>console</tag>

    A program and/or console can be placed in at least six different ways:

    1. all by itself, as a peer of p typically, with layout control
    2. inside a listing, earning a number and caption, with layout control
    3. inside a sidebyside, with size and layout configured
    4. inside a sidebyside, with size and layout configured, and inside a figure
    5. inside a sidebyside, with size and layout configured, with each inside a listing, earning different numbers
    6. inside a figure inside a sidebyside inside a listing, with size and layout configured, with a number and title, but now sub-numbered ((a), (b), (c),).
    Examples of each, and more.

    Programs can be realized in many forms, and can come from a variety of sources. See for tests of some of that variety. Here we are testing placement within surroundings and testing the schema for location. But we do have two videos in each test, one provided as a local file and one embedded from a service.

    All by itsef, with no layout specified, so showing the default size and placement. Vivamus in congue massa. Morbi condimentum ac magna at accumsan. Vestibulum ac augue eu lorem semper gravida.

    n_loops <- 10 x.means <- numeric(n_loops) # create a vector of zeros for results for (i in 1:n_loops){ x <- as.integer(runif(100, 1, 7)) # 1 to 6, uniformly x.means[i] <- mean(x) } x.means

    Now a program with shorter lines, with no layout control.

    /* Hello World program */ #include<stdio.h> main() { printf("Hello, World!"); }

    And a console element, also with no layout control.

    gcc -o intAndFloat intAndFloat.c ./intAndFloat The integer is 19088743 and the float is 19088.742188

    Now similar examples, but with layout control: margins and width.

    A program with a width attribute, so centered and with equal margins. Note how the lines word wrap due to the smaller width.

    n_loops <- 10 x.means <- numeric(n_loops) # create a vector of zeros for results for (i in 1:n_loops){ x <- as.integer(runif(100, 1, 7)) # 1 to 6, uniformly x.means[i] <- mean(x) } x.means

    A program with short lines, so significant, and asymmetric margins, which experimentally do not induce any word-wrapping.

    /* Hello World program */ #include<stdio.h> main() { printf("Hello, World!"); }

    A longer console, with margins so significant the appearance is ill-advised.

    gcc -Wall -o intAndFloat intAndFloat.c ./intAndFloat The integer is 19088743 and the float is 19088.742188

    Two listing, with title, and no layout control.

    Hello, World! in C /* Hello World program */ #include<stdio.h> main() { printf("Hello, World!"); } A console session on a Raspberry Pi gcc -Wall -o intAndFloat intAndFloat.c ./intAndFloat The integer is 19088743 and the float is 19088.742188

    Same two listing, but now with layout control on the program and console.

    Hello, World! in C /* Hello World program */ #include<stdio.h> main() { printf("Hello, World!"); } A console session on a Raspberry Pi gcc -Wall -o intAndFloat intAndFloat.c ./intAndFloat The integer is 19088743 and the float is 19088.742188

    This sidebyside gives each panel a 30% width. The remaining 10% is apportioned for margins and separation.

    /* Hello World program */ #include<stdio.h> main() { printf("Hello, World!"); } gcc -Wall -o intAndFloat intAndFloat.c ./intAndFloat The integer is 19088743 and the float is 19088.742188 n_loops <- 10 x.means <- numeric(n_loops) # create a vector of zeros for results for (i in 1:n_loops){ x <- as.integer(runif(100, 1, 7)) # 1 to 6, uniformly x.means[i] <- mean(x) } x.means

    This is the same three-panel sidebyside, but now inside of a figure, earning a number and a caption.

    Some Code Samples /* Hello World program */ #include<stdio.h> main() { printf("Hello, World!"); } gcc -Wall -o intAndFloat intAndFloat.c ./intAndFloat The integer is 19088743 and the float is 19088.742188 n_loops <- 10 x.means <- numeric(n_loops) # create a vector of zeros for results for (i in 1:n_loops){ x <- as.integer(runif(100, 1, 7)) # 1 to 6, uniformly x.means[i] <- mean(x) } x.means

    Finally, a smaller program and a smaller console, each inside a listing, as the two panels of a sidebyside with no margins, and slightly different widths (to control word-wrapping). The panels have been aligned vertically so their captions align.

    Hello! /* Hello World program */ #include<stdio.h> main() { printf("Hello, World!"); } Raspberry Pi gcc -Wall -o intAndFloat intAndFloat.c ./intAndFloat The integer is 19088743 and the float is 19088.742188

    And again, the two-panel sidebyside of listing, but now inside a figure that has a number and a title. And then the listing are sub-numbered as (a) and (b).

    Two Code Listings Hello! /* Hello World program */ #include<stdio.h> main() { printf("Hello, World!"); } Raspberry Pi gcc -Wall -o intAndFloat intAndFloat.c ./intAndFloat The integer is 19088743 and the float is 19088.742188
    <tag>tabular</tag>

    A tabular can be placed in six different ways:

    1. all by itself, as a peer of p typically, with no layout control and hence with a natural width, and centered
    2. all by itself, as a peer of p typically, with explicit layout control,
    3. inside a table, earning a number and title,
    4. inside a sidebyside, with size and layout configured,
    5. inside a table inside a sidebyside, with size and layout configured, with a number and title, and
    6. inside a table inside a sidebyside inside a figure, with size and layout configured, with a number and title, but now sub-numbered ((a), (b), (c),).
    Examples of each, and more.

    A tabular realized by for PDF/print will normally be as wide as necessary to hold the content, without word-wrapping the content of any cell that is not explicitly authored that way. This is the most rigid of the content types we call planar. So for output as , when you explicitly constrain the width to be less than the natural width (including use as a panel of a sidebyside, or even setting margins) the table will be scaled down in width, which can result in an apparent font size very much smaller than that of the surrounding text. Note that we do not ever scale a tabular up to be wider with a larger font size. Note also that if there is no attempt to control the space for the table (no layout control, not in a sidebyside) then no scaling is attempted at all and the table may be wider than the text and protrude into the right margin. For more, see the three examples at: , , . Generally, much of the commentary and testing here is about /PDF/print. While for HTML output the cells will usually automatically word-wrap to fit in the available space, without adjusting the font size. Some might like this behavior and some might not.

    Data in a table form can be placed in amongst a series of paragraphs. With no layout control, it will occupy its natural width and be centered.

    State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850

    The same effect can be had by specifying that the width attribute have the value auto, but do not specify any margins. We test multiple footnotes in a tabular, not included in a table.

    StateOnly from the West Coast. Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223Wow! That is as big as many countries. 163,696 1850

    In amongst a run of paragraphs (or similar) a tabular can be placed with layout control. For output, this will scale the table to fit within the explicit, or implicit, width. This can result in obvious differences in the apparent font size. We first have a width that is experimentally similar to the natural width, with asymetric margins. Then a narrow width, and a wide width, as an illustration.

    State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850

    Narrow. 45% width. 20% margin left, 35% margin right.

    State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850

    Wide. 97% width. 1% margin left, 2% right.

    State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850

    Naturally, a tabular can be placed inside a table, earning a number and a title.

    Natural Width State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850

    A little narrower, but still centered by default.

    Width of 60%, automatic centering State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850

    Very narrow, asymmetric margins.

    Width of 30%, 30% left margin, 40% right margin State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850

    Wider than necessary, asymmetric margins.

    Width of 90%, 8% left margin, 2% right margin State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850

    The next table is purposely much too wide. In we make no attempt to control the width, and so it will extend into the margins. In we have simple added the attribute width="auto". This attempt to use layout control will cause an automatic reduction in width and a smaller apparent font size. Adjusting margins providing an explicit percentage width, or placing the tabular as a panel of sidebyside will have the same effect. In we have set the width explicity to 100% and so it should be identical to the automatic width case just prior.

    Tabular too wide, no layout control State Population Area (sq. mi.) Statehood (Year) Capitol City Largest City Washington 7,614,893 71,362 1889 Olympia Seattle Oregon 4,217,737 98,381 1859 Salem Portland California 39,512,223 163,696 1850 Sacremento Los Angeles
    Tabular too wide, scale to automatic width State Population Area (sq. mi.) Statehood (Year) Capitol City Largest City Washington 7,614,893 71,362 1889 Olympia Seattle Oregon 4,217,737 98,381 1859 Salem Portland California 39,512,223 163,696 1850 Sacremento Los Angeles
    Tabular too wide, scale to 100% width State Population Area (sq. mi.) Statehood (Year) Capitol City Largest City Washington 7,614,893 71,362 1889 Olympia Seattle Oregon 4,217,737 98,381 1859 Salem Portland California 39,512,223 163,696 1850 Sacremento Los Angeles

    Now into sidebyside in various ways and with various sizes. First, two tabular as panels with widths at 60% and 30%. Note that in /PDF/print the tabular of functional values does not need the full 30% width, so it is at its natural size and centered within its panel.

    State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850 x f(x) 3 9.734 5 2.175

    Let's do that again, but with widths experimentally set to make font sizes match (approximately).

    State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850 x f(x) 3 9.734 5 2.175

    Same tabular, which fills roughly 80% by itself, packed into a single sidebyside with just a 2% gap, and no side margins.

    State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850 State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850

    Natural widths, but now as a pair of tables.

    West Coast State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850
    Function Values x f(x) 3 9.734 5 2.175

    Finally, as two individual table, grouped and laid out via a sidebyside, and collected as a figure. Which causes sub-numbering of the two enclosed table.

    Geography and Mathematics West Coast State Population Area (sq. mi.) Statehood (Year) Washington 7,614,893 71,362 1889 Oregon 4,217,737 98,381 1859 California 39,512,223 163,696 1850
    Function Values x f(x) 3 9.734 5 2.175
    Advanced Numbering

    This section demonstrates the numberingnumbering patterns used throughout . There are five subsections. Two intermediate subsections each have two subsubsections. This creates a total of seven divisions that are leaves of the document tree. In each leaf we have placed two numbered theorems, for a total of fourteen. There is no real content, this is just a demonstration.

    Use values of 0 through 3 for the numbering.theorems.level parameter to see how these numbers change accordingly. It is easiest to compare if you use chunk.level < 2 so the theorems all land on the same page if you are previewing in HTML.

    One

    A document leaf.

    First Theorem Cauchy

    No statement.

    Second Theorem Bunyakovsky

    No statement.

    Two

    Further subdivided.

    Uno

    A document leaf.

    First Theorem! Schwarz

    No statement.

    Second Theorem? Inequality

    No statement.

    Dos

    A document leaf.

    First Theorem?

    No statement.

    Second Theorem!

    No statement.

    Three

    A document leaf.

    First Theorem

    No statement.

    Second Theorem

    No statement.

    Four

    Further subdivided. We include two theorems as numbered items in the introduction to test their numbers, which should always be logical.

    Good Numbered Theorem One

    No statement.

    Good Numbered Theorem Two

    No statement.

    Uno

    A document leaf.

    First Theorem

    No statement.

    Second Theorem

    No statement.

    Dos

    A document leaf.

    First Theorem

    No statement.

    Second Theorem

    No statement.

    Conclusion now. We include two theorems as numbered items in the conclusion to test their numbers, which are sometimes totally illogical and are inconsistent across output formats. To see the effect, set the level for numbering theorems to 3. See this GitHub Issue #139 for details.

    Bad Numbered Theorem One

    No statement.

    Bad Numbered Theorem Two

    No statement.

    Five

    A document leaf.

    First Theorem

    No statement.

    Second Theorem

    No statement.

    Theorems in This Section

    We have a lot of theorems in this section, so we illustrate including an automatic list of these here. We use the elements attribute to limit the list to theorem elements, and we use the scope attribute to limit the list to this section. You can use an introductory p like this one, or not. The list gets no title or visual separation, so use the usual subdivision elements to make that happen. The elements attribute can be a space-delimited list of many different elements. This list should not include the Fundamental Theorem of Calculus, Theorem. See a slightly different example in .

    Definitions in This Article

    Here is a similar list, but for definition elements across the whole article. This list also serves as a regression test. contains a diagram whose source uses a definition element of its own, in the XML namespace. An earlier version of list-of matched descendants by local name only, ignoring namespaces, and so would catch definitions and then fail to produce numbers for them. The list below correctly contains only the definitions.

    A Title with ] a Right Bracket

    has trouble with brackets that end up inside optional arguments, so this subsection title is only a check on the defense against that. And now an exercise with a title that could really be a problem.

    A Right Brace } and a Right Bracket]

    The right brace is is used as a grouping character in so this is just a test of its behavior in titles.

    A faux hint to get this exercise to migrate into a solutions.

    A Title with } a Right Brace

    And now a right brace in a division title.

    A Title with <m>a]b</m> a Math Right Bracket

    And now a right bracket within math in a division title.

    We do not test a right brace within math, since it should be escaped, as is normal practice.

    Just an Exercise An Extraneous Exercise

    This exercise is here just as a test of the solutions division coming next. So it is serving a purpose, even if it is not apparent.

    A hint, so this exercise looks identical in structure to the one in the previous subsection.

    This is a solutions division, which will be a peer of the other subsection in this section. The default behavior is to look to the parent division (a section here) and collect all the hints, answers, and solutions from every exercise (and friends) inside this containing division. (There are just two, similar inline exercise.)

    But instead of the default, we employ a scope attribute to define the parent division of the exercises whose solutions will be shown. In this example we specify the subsection that is two back, the one which tests brackets in titles.

    Customizations Renaming Document Parts, Plus This Is A Really Long Title So That We Can Test How Well It Reacts To The Right Margin And Wraps Around To Form A Couple Of Lines, Plus How It Sits Relative To The Number Of The Subsection

    Namesname for various parts of a document are determined exactly once for each language, ensuring consistency and saving you the bother of always typing them in.

    However, you may want to have Conundrumsconundrumrepurposed from proposition in your document and you have no use for any Propositions. conundrumrepurposed from proposition rename an environmentconundrum So you can repurpose the proposition tag to render a different name. Or you might have a Lab Manual and want to rename subsection as Activity. See the docinfo portion of this sample article to see how this is done, in concert with the example below. Note that you may provide versions for different languages by specifying a xml:lang attribute.

    Smith

    Aah, this is confusing!

    Important Notes

    If you are renaming many parts of your document, then you may not understand the design philosophy of . In particular, you should not be doing a wholesale shuffle of part, chapter, section, This feature is intended for very limited use and is not considered best practice.

    This feature could also be abused to provide a comprehensive suite of translations into a language not yet supported. If so, please contact us about moving your translations into for the benefit of all. Thanks.

    Customizing Phrases

    There is a facility for providing alternate text for small or short phrases, or other components of a paragraph. Here we just provide some tests. Each is inside of a block quote to identify it clearly.

    We have two auxiliary files of custom elements, so you need to adjust the publisher file to specify the second one during testing. First, a very simple string as the variation.

    This is an article about .

    Now a string which is partially text and partially simple markup.

    We like to write with .

    And a mildly more complicated structure (a list) as the variable text.

    Some of our favorite colors are

    A cross-reference to test, since context is critical.

    See also .

    The URLs used as a replacement have the visual attribute which is also managed by the assembly pre-processor to provide a parenthetical for print PDF production. So this is a good test of the organization of the multiple passes employed by the pre-processor.

    A URL that should have a parenthetical in the print PDF version: .

    MyOpenMath Interactive Problems

    This is a test with two inline exercises containing MyOpenMath (MOM) problems. None of this is in the schema, and all of it is subject to change.

    Negative Numbers and Exponents

    This is an introduction, providing articulation between the MOM problem and the contents of the text. For example, you might cross-reference a result or example given previously.

    A Statistical Test

    This is an introduction, providing articulation between the MOM problem and the contents of the text. For example, you might cross-reference a result or example given previously.

    With an image

    This is an introduction, providing articulation between the MOM problem and the contents of the text. For example, you might cross-reference a result or example given previously.

    Geometry of a Cone

    This problem has two figures. They come from the MOM server as SVG files. These image files are then converted to PDF for static formats like PDF, and into PNG for formats like Kindle.

    STACK Interactive Questions STACK

    These are interactive exercises provided by the STACK Assessment system. In HTML output you will need to ask for a new question to make each question render initially.

    STACK integration question

    An introduction to a test question, providing context within the larger document.

    STACK multiple choice question

    This is a multiple choice question where multiple answers can (in principle) be correct.

    STACK matrix input question

    This is a question where the input is a matrix.

    STACK question with generated plot

    This is a question that generates a plot that must be rendered in the question text.

    STACK question with advanced typesetting and embedded image

    This question comes from the HELM project. It features an embedded image in its solution, as well as advanced typesetting and multi-line latex.

    Ancillaries

    Once your content is in place, you can begin thinking about various useful derivative works. A natural example for a textbook is an Instructor's Version. Various switches for hints, answers, and solutions to exercises would allow you to include more of these for the use of just an instructor. Here we also demonstrate the commentary element. It is similar in many ways to a paragraphs in that it can be placed within any division and must be titled. The main difference is that it is not displayed by default, so you must set the string parameter commentary to the value yes. Other distinctions are:

    • Since it is elective, you need to be careful about cross-references to and from a commentary. It is highly likely that you will want to make cross-references within a commentary pointing to other portions of your text, and this is always a good idea. You will want to avoid making cross-references to a commentary from other parts of the text, with the exception of a cross-reference that originates within some commentary.
    • Numbered items are prohibited within a commentary, such as a figure or a theorem. Doing so would disrupt consecutive numbering in different versions, with or without, commentary included. Numbered equations are not prohibited in the schema, but should definitely be avoided anyway.

    After some nonsense text in a paragraph, there is a commentary with two paragraphs. For the online version of this sample article, we have enabled commentaries. But if you are experimenting yourself, you will want to be aware if you are enabling these or not.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam odio orci, ullamcorper eget quam et, viverra tristique magna. Integer auctor arcu a sapien pulvinar elementum. Mauris porta, nulla id molestie dignissim, urna dolor rutrum ligula, eu elementum odio nisl sed libero. Nulla nec libero sem.

    Sed justo ex, efficitur dictum risus nec, eleifend consequat nibh. Proin rutrum mi id metus viverra blandit. In vel ligula a nibh aliquam pellentesque. Duis placerat purus et ligula sollicitudin, sodales consectetur ante viverra.

    Mauris fringilla nulla arcu, sagittis ultrices quam malesuada eleifend. Proin tristique elit eu bibendum tincidunt. Donec commodo lorem in magna egestas, vitae malesuada velit ornare. Pellentesque finibus neque in venenatis tristique. In id blandit est, in euismod urna. Donec commodo sagittis ligula, in venenatis nulla porttitor in. Donec nec tortor sit amet felis posuere ultricies. Suspendisse euismod quis ex eu placerat.

    Worksheets About Worksheets

    This is a section full of worksheets. Each is a division of its own, via the worksheet element. This is an optional introduction to the current section. In practice you might want to rip out all the worksheets of an entire book and bundle them up as an activity book.

    If you make PDF output you will notice an increased amount of control over layout. Also, if the publication file elects draft mode, then there will be visual indicators of prescribed whitespace.

    A Geometric Prelude (without authored pages)
    • Practice visualizing vector addition
    • Use vectors without explicit coordinates

    This two-page worksheet was generously donated to the sample article by Dave Rosoff at a CuratedCourses workshop in August2018. It has the default (skinny) margins.

    It was known to Euclid, and probably earlier, that the midpoints of the sides of any quadrilateral all lie in the same plane (even if the vertices of the quadrilateral do not). In fact, these midpoints are the vertices of a parallelogram, as pictured in .

    The midpoints of the sides of a quadrilateral are the vertices of a parallelogram. \begin{tikzpicture}[xscale=0.8, yscale=0.8] \draw[style={black, ultra thick}] (0,0) -- (5,0) -- (4,4) -- (2,5) -- (0,0); \draw[style={black, dashed, very thick}] (2.5, 0) -- (4.5, 2) -- (3, 4.5) -- (1, 2.5) -- (2.5, 0); \end{tikzpicture}
    The sides of a triangle presented as vectors. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); % \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node % {} -- (1.5,0) node[below right=0mm and 3mm] {$\vec{A}$}; %\draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node % {} -- (2,1) node[above left=5mm and 1mm] {$\vec{B}$}; %\draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node % {} -- (0.5,1) node[below left=1mm and 3mm] {$\vec{C}$}; %\node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; %\node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; % \node {$P$} (1.3333,0.6667); \end{tikzpicture}
    The medians of the triangle are \vec{M}_1, \vec{M}_2, and \vec{M}_3. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node {$\vec{M}_{1}$} -- (1.5,0);% node[below right=0mm and 3mm] {$\vec{A}$}; \draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node {$\vec{M}_{2}$} -- (2,1);% node[above left=5mm and 1mm] {$\vec{B}$}; \draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node {$\vec{M}_{3}$} -- (0.5,1);% node[below left=1mm and 3mm] {$\vec{C}$}; \node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; \node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; % \node {$P$} (1.3333,0.6667); \end{tikzpicture}

    In this exercise, we'll use vectors to show that the medians of any triangle () intersect at a point. Recall that medians are the lines connecting the vertices of the triangle to the midpoints of their opposite edges, as in the figure. We'll do this in a few steps.

    What is the value of \vec{A} + \vec{B} + \vec{C}?

    from the previous page is reproduced for your convenience.

    The medians of the triangle are \vec{M}_1, \vec{M}_2, and \vec{M}_3.

    The medians of the triangle are \vec{M}_1, \vec{M}_2, and \vec{M}_3. This image description should show up in the regular view, but disappear when printing.

    \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node {$\vec{M}_{1}$} -- (1.5,0);% node[below right=0mm and 3mm] {$\vec{A}$}; \draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node {$\vec{M}_{2}$} -- (2,1);% node[above left=5mm and 1mm] {$\vec{B}$}; \draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node {$\vec{M}_{3}$} -- (0.5,1);% node[below left=1mm and 3mm] {$\vec{C}$}; \node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; \node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; % \node {$P$} (1.3333,0.6667); \end{tikzpicture}

    Show that \vec{M}_{1} + \vec{M}_{2} + \vec{M}_{3} = 0.

    Use .

    To show that the point P exists (as the common intersection of the \vec{M}_{i}), show that \vec{A} + \frac{2}{3} \vec{M}_{3} = \frac{2}{3} \vec{M}_{2} = .

    If you have time, try to devise a vector proof of Euclid's result presented at the beginning of the workshop. Recall that a parallelogram is a four-sided polygon whose opposite sides are parallel.

    Wrap-up

    It's possible to do interesting things with vector arithmetic in a coordinate-free way: we didn't specify an origin, or any entries of any vectors in the examples.

    A Geometric Prelude (with authored pages)
    • Practice visualizing vector addition
    • Use vectors without explicit coordinates

    This two-page worksheet was generously donated to the sample article by Dave Rosoff at a CuratedCourses workshop in August2018. It has the default (skinny) margins.

    It was known to Euclid, and probably earlier, that the midpoints of the sides of any quadrilateral all lie in the same plane (even if the vertices of the quadrilateral do not). In fact, these midpoints are the vertices of a parallelogram, as pictured in .

    The midpoints of the sides of a quadrilateral are the vertices of a parallelogram. \begin{tikzpicture}[xscale=0.8, yscale=0.8] \draw[style={black, ultra thick}] (0,0) -- (5,0) -- (4,4) -- (2,5) -- (0,0); \draw[style={black, dashed, very thick}] (2.5, 0) -- (4.5, 2) -- (3, 4.5) -- (1, 2.5) -- (2.5, 0); \end{tikzpicture}
    The sides of a triangle presented as vectors. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); % \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node % {} -- (1.5,0) node[below right=0mm and 3mm] {$\vec{A}$}; %\draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node % {} -- (2,1) node[above left=5mm and 1mm] {$\vec{B}$}; %\draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node % {} -- (0.5,1) node[below left=1mm and 3mm] {$\vec{C}$}; %\node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; %\node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; % \node {$P$} (1.3333,0.6667); \end{tikzpicture}
    The medians of the triangle are \vec{M}_1, \vec{M}_2, and \vec{M}_3. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node {$\vec{M}_{1}$} -- (1.5,0);% node[below right=0mm and 3mm] {$\vec{A}$}; \draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node {$\vec{M}_{2}$} -- (2,1);% node[above left=5mm and 1mm] {$\vec{B}$}; \draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node {$\vec{M}_{3}$} -- (0.5,1);% node[below left=1mm and 3mm] {$\vec{C}$}; \node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; \node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; % \node {$P$} (1.3333,0.6667); \end{tikzpicture}

    In this exercise, we'll use vectors to show that the medians of any triangle () intersect at a point. Recall that medians are the lines connecting the vertices of the triangle to the midpoints of their opposite edges, as in the figure. We'll do this in a few steps.

    What is the value of \vec{A} + \vec{B} + \vec{C}?

    from the previous page is reproduced for your convenience.

    The medians of the triangle are \vec{M}_1, \vec{M}_2, and \vec{M}_3. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node {$\vec{M}_{1}$} -- (1.5,0);% node[below right=0mm and 3mm] {$\vec{A}$}; \draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node {$\vec{M}_{2}$} -- (2,1);% node[above left=5mm and 1mm] {$\vec{B}$}; \draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node {$\vec{M}_{3}$} -- (0.5,1);% node[below left=1mm and 3mm] {$\vec{C}$}; \node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; \node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; % \node {$P$} (1.3333,0.6667); \end{tikzpicture}

    Show that \vec{M}_{1} + \vec{M}_{2} + \vec{M}_{3} = 0.

    Use .

    To show that the point P exists (as the common intersection of the \vec{M}_{i}), show that \vec{A} + \frac{2}{3} \vec{M}_{3} = \frac{2}{3} \vec{M}_{2} = .

    If you have time, try to devise a vector proof of Euclid's result presented at the beginning of the workshop. Recall that a parallelogram is a four-sided polygon whose opposite sides are parallel.

    Wrap-up

    It's possible to do interesting things with vector arithmetic in a coordinate-free way: we didn't specify an origin, or any entries of any vectors in the examples.

    Networks Worksheet (no authored pages) Basic laws for electrical circuits

    This two-page worksheet was generously donated to the sample article by Virgil Pierce at a CuratedCourses workshop in August2018. It has default (skinny) left and right margins, but we have specified longer top and bottom margins, with the top being the larger of the two.

    Ohms Law

    The current through a resistor is proportional to the ratio of the Voltage to the Resistance I = \frac{V}{R} Or for our purposes I R = V

    Kirchoffs Current Law

    The sum of the currents in a network meeting at a point is zero. \sum_{k=1}^n I_k = 0

    Kirchoff's Current Law

    For the circuit below I_1 + I_2 = I_3 .

    \begin{circuitikz} \draw (0,0) to[R, i=$I_1$, *-o](2,2); \draw (0,0) to[R, i=$I_2$, *-o](2,-2); \draw (-3, 0) to[R, i=$I_3$, o-*](0,0); \end{circuitikz}
    Kirchoffs Voltage Law

    The sum of the voltages around any closed circuit (or subcircuit) is zero. \sum_{k=1}^n V_k = 0

    Kirchoffs Current Law and Kirkoffs Voltage Law combined with Ohms Law gives for any circuit of resistors and sources a linear system that may (or may not) determine the currents.

    For the simple network pictured, calculuate the amperage in each part of the network by setting up a system of linear equations for the amperages.

    \begin{circuitikz} \draw (0,0) to[V, v=$11\quad \mbox{volt}$](0, 3) to[short](2,3) to[R, R=$4\quad \mbox{ohm}$] (3, 3) to[short](4,3) to[R, R=$3\quad \mbox{ohm}$](4,0) to[short](3,0) to[R, R=$3\quad \mbox{ohm}$](2,0) to[short](0,0); \end{circuitikz}

    Compare it with a parallel circuit network. Calculate the amperage in each part of the network by setting up a system of linear equations for the amperages.

    \begin{circuitikz} \draw(0,0) to[V, v=$11\quad \mbox{volt}$](0, 3) to[short](5,3) to[R, R=$4\quad \mbox{ohm}$](6,3) to[short](7,3) to[R, R=$3\quad \mbox{ohm}$](7,0) to[short](6,0) to[R, R=$3\quad \mbox{ohm}$](5,0) to[short](0,0); \draw(4,0) to[R, R=$3\quad \mbox{ohm}$](4,3); \end{circuitikz}

    Now for a more complicated network. Calculate the amperage in each part of the network by setting up a system of linear equations for the amperages.

    \begin{circuitikz} \draw(0,0) to[V, v=$11 \quad \mbox{volt}$](0, 3) to[short](5,3) to[R, R=$4 \quad \mbox{ohm}$](6,3) to[short](9,3) to[R, R=$4 \quad \mbox{ohm}$](10,3) to[short](11,3) to[R, R=$3 \quad \mbox{ohm}$](11, 0) to[short](10,0) to[R, R=$2\quad \mbox{ohm}$](9,0) to[short](6,0) to[R, R=$2\quad \mbox{ohm}$](5,0) to[short](0,0); \draw(4,0) to[R, R=$3\quad \mbox{ohm}$](4,3); \draw(8,0) to[R, R=$1\quad \mbox{ohm}$](8,3); \end{circuitikz}

    Now generalize these ideas to a context outside of electrical circuits. Consider the network of streets given in the diagram (with one-way directions as indicated).

    =stealth] \draw[->, very thick] (0,0) -- (10, 0) node[midway, below]{East Bound Winooski Ave}; \draw[<-, very thick] (0, 1) -- (10, 1) node[midway, above]{West Bound Winooski Ave}; \draw[<-, very thick] (0, 4) -- (10, 4) node[midway, above]{Shelburne St}; \draw[<-, very thick] (1, -1) -- (1, 5) node[midway, above, sloped]{Willow}; \draw[->, very thick] (9, -1) -- (9, 5) node[midway, above, sloped]{Jay}; \end{tikzpicture} ]]>

    A traffic engineer counts the hourly flow of cars into and out of this network at the entrances. They get (EB = East Bound; WB = West Bound):

    Estimated hourly traffic flow for the road network EB Winooski WB Winooski Shelburne St Willow Jay into 50 400 0 10 50 out of 55 390 20 15 30

    Use a variable for each segment inside of the network and set up a system of linear equations restricting the flow. Solve the system. Note that you should not get a unique solution as traffic should be able to flow through the network in various ways.

    Networks Worksheet (with authored pages) Basic laws for electrical circuits

    This two-page worksheet was generously donated to the sample article by Virgil Pierce at a CuratedCourses workshop in August2018. It has default (skinny) left and right margins, but we have specified longer top and bottom margins, with the top being the larger of the two.

    Ohms Law

    The current through a resistor is proportional to the ratio of the Voltage to the Resistance I = \frac{V}{R} Or for our purposes I R = V

    Kirchoffs Current Law

    The sum of the currents in a network meeting at a point is zero. \sum_{k=1}^n I_k = 0

    Kirchoff's Current Law

    For the circuit below I_1 + I_2 = I_3 .

    \begin{circuitikz} \draw (0,0) to[R, i=$I_1$, *-o](2,2); \draw (0,0) to[R, i=$I_2$, *-o](2,-2); \draw (-3, 0) to[R, i=$I_3$, o-*](0,0); \end{circuitikz}
    Kirchoffs Voltage Law

    The sum of the voltages around any closed circuit (or subcircuit) is zero. \sum_{k=1}^n V_k = 0

    Kirchoffs Current Law and Kirkoffs Voltage Law combined with Ohms Law gives for any circuit of resistors and sources a linear system that may (or may not) determine the currents.

    For the simple network pictured, calculuate the amperage in each part of the network by setting up a system of linear equations for the amperages.

    \begin{circuitikz} \draw (0,0) to[V, v=$11\quad \mbox{volt}$](0, 3) to[short](2,3) to[R, R=$4\quad \mbox{ohm}$] (3, 3) to[short](4,3) to[R, R=$3\quad \mbox{ohm}$](4,0) to[short](3,0) to[R, R=$3\quad \mbox{ohm}$](2,0) to[short](0,0); \end{circuitikz}

    Compare it with a parallel circuit network. Calculate the amperage in each part of the network by setting up a system of linear equations for the amperages.

    \begin{circuitikz} \draw(0,0) to[V, v=$11\quad \mbox{volt}$](0, 3) to[short](5,3) to[R, R=$4\quad \mbox{ohm}$](6,3) to[short](7,3) to[R, R=$3\quad \mbox{ohm}$](7,0) to[short](6,0) to[R, R=$3\quad \mbox{ohm}$](5,0) to[short](0,0); \draw(4,0) to[R, R=$3\quad \mbox{ohm}$](4,3); \end{circuitikz}

    Now for a more complicated network. Calculate the amperage in each part of the network by setting up a system of linear equations for the amperages.

    \begin{circuitikz} \draw(0,0) to[V, v=$11 \quad \mbox{volt}$](0, 3) to[short](5,3) to[R, R=$4 \quad \mbox{ohm}$](6,3) to[short](9,3) to[R, R=$4 \quad \mbox{ohm}$](10,3) to[short](11,3) to[R, R=$3 \quad \mbox{ohm}$](11, 0) to[short](10,0) to[R, R=$2\quad \mbox{ohm}$](9,0) to[short](6,0) to[R, R=$2\quad \mbox{ohm}$](5,0) to[short](0,0); \draw(4,0) to[R, R=$3\quad \mbox{ohm}$](4,3); \draw(8,0) to[R, R=$1\quad \mbox{ohm}$](8,3); \end{circuitikz}

    Now generalize these ideas to a context outside of electrical circuits. Consider the network of streets given in the diagram (with one-way directions as indicated).

    =stealth] \draw[->, very thick] (0,0) -- (10, 0) node[midway, below]{East Bound Winooski Ave}; \draw[<-, very thick] (0, 1) -- (10, 1) node[midway, above]{West Bound Winooski Ave}; \draw[<-, very thick] (0, 4) -- (10, 4) node[midway, above]{Shelburne St}; \draw[<-, very thick] (1, -1) -- (1, 5) node[midway, above, sloped]{Willow}; \draw[->, very thick] (9, -1) -- (9, 5) node[midway, above, sloped]{Jay}; \end{tikzpicture} ]]>

    A traffic engineer counts the hourly flow of cars into and out of this network at the entrances. They get (EB = East Bound; WB = West Bound):

    Estimated hourly traffic flow for the road network EB Winooski WB Winooski Shelburne St Willow Jay into 50 400 0 10 50 out of 55 390 20 15 30

    Use a variable for each segment inside of the network and set up a system of linear equations restricting the flow. Solve the system. Note that you should not get a unique solution as traffic should be able to flow through the network in various ways.

    This is a mock one-page worksheet for testing purposes. We have specified an overall margin just slightly less than the default.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    This is a hint. You can hide it in the print preview before printing.

    Here is an answer. Also hidable.

    This is a rather long solution. When you hide or show it in the print preview, the workspace should be adjusted (the page will reload).

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    A two-line paragraph interspersed to check on spacing, breaks and all that.

    A full-width exercise

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    Another two-line paragraph interspersed to check on spacing, breaks and all that.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    A Mock Activity

    The problem, as we see it.

    A worksheet could have hints, no? But no spacing. Note row below has widths set to balance the heights.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Dot products and projection

    Let {\vec v}_1 = (-4,1), {\vec v}_2 = (2,2), {\vec v}_3 = (1,2,3), {\vec v}_4 = (-2,1,0). Find the values of the following expressions:

    {\vec v}_1 \cdot {\vec v}_2 =

    {\vec v}_3 \cdot {\vec v}_4 =

    \lVert{\vec v}_1\rVert =

    \lVert{\vec v}_4\rVert =

    Are any of these vectors perpendicular to each other?

    The vectors \vec a = (3,9) and \vec b = (4,2) are pictured below. Derive the formula for projection on a line and use it to find the projection of \vec a on the line spanned by \vec u. Also compute the length of the residual vector.

    x y \vec a \vec b two vectors in a Cartesian plane Two vectors \vec a and \vec b.

    Consider the vector equation m \begin{bmatrix}2 \\ 5\end{bmatrix} = \begin{bmatrix}3 \\ 7\end{bmatrix} .

    Check that there is no solution m that makes the equation true.

    Use projection to find the best approximation \hat m.

    Compute \hat m \begin{bmatrix}2 \\ 5\end{bmatrix} .

    Compute the residual vector.

    Compute the length of the residual vector and explain what it means.

    Consider the system of equations 3t \amp =5 2t \amp = 9 .

    Write the system in vector form.

    Find the best estimate, \hat t, of t using projection.

    Compute the length of the residual vector.

    Just a simple activity here.

    Here is a second activity.

    This is going to be an activity with tasks.

    Here is the first task.

    Here is the second task.

    Here is the third task.

    This is a conclusion that comes after the last task.

    This is a mock worksheet for testing the use of workspace for exercise within an exercisegroup.

    Do things to the following.

    Apple

    Banana

    Cherry

    Durian

    Elderberry (with workspace override)

    Fig

    Guava

    Habanero

    I can't think of an I fruit.

    Jackfruit

    Now with one column, do things to the following.

    Apple

    Banana

    Cherry

    Durian

    Elderberry (with workspace override)

    Fig

    Guava

    Habanero

    I can't think of an I fruit.

    Jackfruit

    Worksheet with an exercise with tasks and subtasks

    Page breaking between tasks in a single exercise can be tricky. This is a test for that.

    Here are multiple tasks with just enough workspace to cause a page break after the third one.

    This task has two short subtasks that should be indented under it.

    The first subtask.

    The second subtask.

    Conclusion for the first task.

    The second task.

    The third task.

    The fourth task.

    Conclusion for the entire exercise.

    An exercise without any tasks but some workspace.

    Worksheet with <tag>paragraphs</tag>

    This is a test of the paragraphs element within a worksheet. It should be able to contain exercises that have workspace, and we should be able to insert page breaks even inside of paragraphs.

    Warm up

    This is a warm-up exercise. It should have a small workspace and be on the first page of the worksheet.

    More exercises

    This is a second exercise. It should have a larger workspace and be on the second page of the worksheet.

    This is a third exercise with some tasks. The workspace should be such that there will be a page break between tasks.

    Do the first thing.

    Do the second thing.

    Do the third thing.

    A third division

    This is a paragraph that starts the third paragraphs division.

    This is an exercise in the third paragraphs division inside a side-by-side.

    This is a second exercise in the third paragraphs division. It should have a larger workspace and be on the fourth page of the worksheet.

    This is a third exercise in the third paragraphs division. It should have a larger workspace and be on the fifth page of the worksheet.

    Handouts About Handouts

    Like worksheets, a handout is a division that is inteded to be printed for use in a classroom. In HTML output, you get the same print preview and page layout as you do with worksheets; in PDF, these will start on a new page with possibly different margins than the rest of the document.

    Unlike worksheets, handouts do not have a special class of exercises or activities (exercises in a handout are treated like an inline exercise). The other main distinction is that a handout lets workspace be specified on pretty much any block or paragraph element, not just exercises, tasks, and project-like elements. This allows them to be used in the creation of guided notes containing some premade content with lots of space for students to fill in details during class.

    Derivative Rules Rules for specific types of functions
  • Constant functions

    (k)' = 0

  • Power functions

    (x^{n})' = nx^{n-1}

  • Exponential functions

    (a^{x})' = \ln(a) a^{x} \text{ (for } a>0\text{)}

    (e^{x})' = e^{x}

  • Logarithmic functions

    (\ln(x))' = \frac{1}{x}

  • Trigonometric functions

    (\sin(x))' = \cos(x).

    (\cos(x))' = -\sin(x).

    (\tan(x))' = \sec^{2}(x) = \frac{1}{\cos^{2}(x)}.

    (\arcsin(x))' = \frac{1}{\sqrt{1-x^{2}}}.

    (\arctan(x))' = \frac{1}{1+x^{2}}.

  • Rules for combinations of functions
  • Constant multiples

    (k\cdot f(x))' = k\cdot f'(x)

  • Sum and difference

    (f(x) \pm g(x))' = f'(x) \pm g'(x)

  • Products (the product rule)

    (f(x)\cdot g(x))' = f'(x)g(x) + f(x)g'(x)

  • Quotients (the quotient rule)

    \left(\frac{f(x)}{g(x)}\right)' = \frac{f'(x)g(x) - f(x)g'(x)}{(g(x))^{2}}

  • Compositions (the chain rule)

    (f(g(x)))' = f'(g(x))\cdot g'(x)

  • Guided Notes: Derivatives of sums

    Today we will explore how to take the derivative of the sum of two functions. For example, if f(x) = x^2 + 3x, what is f'(x)? What two functions is this the sum of? What are the derivatives of each of those functions?

    To be sure of the derivative of the sum, we should use the definition of the derivative.

    Definition of the Derivative

    The derivative of a function f(x) at any point x is defined as...

    Now let's apply this definition to the function f(x) = x^2 + 3x. We have:

    What should the general rule be?

    For any two differentiable functions f(x) and g(x), the derivative of their sum h(x) = f(x) + g(x) is given by:

    Let f(x) and g(x) be differentiable functions and let h(x) = f(x) + g(x). Then by the limit definition of the derivative,

    Find the derivative of f(x) = x^5 + e^x.

    Find the derivative of f(x) = \sqrt{x} + x^3 + 7x.

    Find the derivative of f(x) = 5x^4.

    Worksheet Solution Testing

    Solutions to projects and worksheets can both be selected independently for the auto-generated solutions divisions. What happens when a worksheet contains a project? Here we explore the various combinations.

    Subsection with only exercise

    This is an exercise's statement.

    This is an exercise's answer.

    This is the exercise's solution.

    Subsection with only project

    This is a project's statement.

    This is a project's answer.

    This is the project's solution.

    Subsection with both exercise and project

    This is an exercise's statement.

    This is an exercise's answer.

    This is the exercise's solution.

    This is a project's statement.

    This is a project's answer.

    This is the project's solution.

    Worksheet with only exercise

    This is an exercise's statement.

    This is an exercise's answer.

    This is the exercise's solution.

    Worksheet with only project

    This is a project's statement.

    This is a project's answer.

    This is the project's solution.

    Worksheet with both exercise and project

    This is an exercise's statement.

    This is an exercise's answer.

    This is the exercise's solution.

    This is a project's statement.

    This is a project's answer.

    This is the project's solution.

    Inline answers only Project answers only Worksheet answers only Inline answers, project statement Inline answers, worksheet statement Project answers, worksheet statement Inline answers, project statement, worksheet solution
    Exercises, One Subsection

    This section of the sample article demonstrates an unstructured division. There are no subsection, you are just reading the first two paragraphs, followed by some nonsense text. Then there is a single exercises division. Note that this division is not numbered (since it is unique within the section). And a cross-reference to one of the contained exercise will be numbered as a member of the section, .

    If you use the unstructured form of a division, and have both inline and divisional exercises, there is a potential to form ambiguous cross-references. To wit, check that and are really different exercises (which you are unable to do if you are reading this in print!). The solution is to include the type of exercise in the reference, which will assist everybody, but especially your print readers: and .

    Compare this section with the similar , next. The following text is mostly nonsense, just for testing purposes.

    Inline One

    Aliquam vitae risus placerat, pellentesque leo vitae, iaculis ante. Praesent ac odio eget mi bibendum eleifend ac eget metus. Morbi in dolor et diam accumsan mattis. Aenean elementum pulvinar efficitur. Etiam viverra ut tellus quis consequat. Phasellus sit amet nisl a ligula pharetra tempus id in elit. Maecenas congue quam eu purus fermentum pretium. Fusce pellentesque ultricies arcu, egestas sollicitudin erat condimentum non. Integer non velit at dolor dictum aliquam et rhoncus mauris. Sed nec nibh id nunc convallis tincidunt ut at ligula. Etiam elementum nisl eu erat dapibus rhoncus.

    Pellentesque nec condimentum ligula, quis interdum mauris. Ut sed urna lacinia, aliquam arcu id, faucibus nisi. Suspendisse potenti. Curabitur in erat ultricies, condimentum mi nec, vehicula mauris. Duis faucibus risus fermentum velit hendrerit, non laoreet massa maximus. Donec bibendum elit ac lectus lobortis luctus. Ut finibus, dolor ut euismod tristique, ligula tortor tempus arcu, finibus semper purus erat ut ligula. Aenean accumsan ut ante vel euismod.

    Inline Two

    Ut porttitor neque a pharetra euismod. Vivamus ut metus pretium, placerat massa tempor, condimentum metus. Phasellus vestibulum iaculis turpis non posuere. Vestibulum quis aliquet neque. Donec nec metus iaculis, laoreet massa vitae, suscipit tellus. Etiam et ultrices quam, quis pretium ligula. In ut cursus metus. Aenean volutpat quam odio, quis tempus dolor egestas eget. Nunc fringilla lobortis nunc, ut interdum lorem posuere sed. Sed sodales risus a laoreet venenatis. Nunc sodales tempor mollis. Nam sollicitudin velit sed ex viverra feugiat. Nunc consectetur mi vitae urna sollicitudin malesuada. Fusce eget risus lectus. Mauris augue velit, vestibulum vitae tempus sit amet, porttitor eget turpis.

    Major Result

    Vivamus tortor tortor, lobortis et sem vel, accumsan placerat libero. Sed eget metus non magna accumsan efficitur a non turpis. Curabitur maximus arcu ipsum, eget vestibulum nulla mollis ac. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis vel eleifend risus. Morbi hendrerit tellus eget nibh imperdiet, ac mollis nisl sagittis. Ut commodo pharetra leo. Suspendisse consequat velit eget velit condimentum feugiat.

    Inline Three

    Suspendisse lacinia mattis risus, eget viverra urna dictum eu. Maecenas ut sem in turpis egestas varius nec at ipsum. Praesent bibendum nisi et turpis congue, a pellentesque felis tempor. Vivamus non dolor in risus interdum mattis. In tempus iaculis velit, sit amet rhoncus tellus aliquam convallis. Sed ut tellus id ipsum blandit convallis sed eget tortor. Nunc leo felis, scelerisque vel ante porta, volutpat rhoncus neque. Mauris convallis, felis at aliquam aliquet, felis ipsum semper mi, vitae auctor purus ante non erat. Ut nec felis mi.

    Exercise Collection Drill One

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras congue urna nulla. Aliquam eget euismod tellus. Maecenas nibh libero, venenatis a laoreet in, tempor sit amet sem. Morbi sit amet justo tempor velit auctor placerat. Maecenas nec lobortis orci. Aenean dictum enim lacus, ac blandit lacus elementum nec. Mauris porttitor neque volutpat tincidunt sollicitudin. Cras porta lectus ac facilisis tempor. Suspendisse in velit nisl. Sed convallis leo at nunc aliquet fermentum. Pellentesque feugiat at ex sed elementum. In porta vulputate ipsum sit amet consectetur.

    A figure in an exercise in an unstructured division to test that it is numbered as if the containing exercises is not present
    A side-by-side in a figure in an exercise in an unstructured division to test that it is numbered as if the containing exercises is not present and to test the numbering of the panels in a solutions manual
    First Panel, subcaptioned
    Second Panel, subcaptioned
    First Panel, not subcaptioned
    Second Panel, not subcaptioned
    Drill Two

    Aliquam sagittis ex at magna porttitor, quis scelerisque ligula malesuada. Vestibulum vitae mauris id nisi pretium ornare a id lectus. Nam suscipit magna id sem ultricies vestibulum. Nulla facilisi. Duis venenatis lectus massa, ac mollis nisi suscipit non. Sed et sapien vulputate, imperdiet nibh vel, lobortis nisl. Curabitur sagittis justo nibh. Nulla vulputate sodales justo at efficitur. Cras justo augue, mollis vitae nulla sed, vestibulum tincidunt ante. Vestibulum et lorem lectus. Maecenas accumsan lacus a nisi euismod rutrum eu dapibus justo. Etiam scelerisque a odio a euismod. Pellentesque vestibulum pellentesque nisi, a tempus erat cursus ac. Morbi ut auctor lectus.

    Testing numbering, figure in a exercise in an un-numbered exercises
    Drill Three

    Nam congue ex nec justo iaculis maximus. Vestibulum lobortis magna sed urna auctor, vel dignissim massa posuere. In sed venenatis elit. Vivamus congue gravida tempus. Nunc quis fermentum nisi. Nullam hendrerit lorem et tellus semper, sit amet scelerisque purus lobortis. Quisque sollicitudin quis neque eu suscipit. Praesent volutpat justo quis magna vehicula molestie.

    Challenging One

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras congue urna nulla. Aliquam eget euismod tellus. Maecenas nibh libero, venenatis a laoreet in, tempor sit amet sem. Morbi sit amet justo tempor velit auctor placerat. Maecenas nec lobortis orci. Aenean dictum enim lacus, ac blandit lacus elementum nec. Mauris porttitor neque volutpat tincidunt sollicitudin. Cras porta lectus ac facilisis tempor. Suspendisse in velit nisl. Sed convallis leo at nunc aliquet fermentum. Pellentesque feugiat at ex sed elementum. In porta vulputate ipsum sit amet consectetur.

    An introduction to an exercisegroup. This is here to attempt to interrupt the flow of the counting from this division to the next.

    Challenging Two

    Aliquam sagittis ex at magna porttitor, quis scelerisque ligula malesuada. Vestibulum vitae mauris id nisi pretium ornare a id lectus. Nam suscipit magna id sem ultricies vestibulum. Nulla facilisi. Duis venenatis lectus massa, ac mollis nisi suscipit non. Sed et sapien vulputate, imperdiet nibh vel, lobortis nisl. Curabitur sagittis justo nibh.

    Nulla vulputate sodales justo at efficitur. Cras justo augue, mollis vitae nulla sed, vestibulum tincidunt ante. Vestibulum et lorem lectus. Maecenas accumsan lacus a nisi euismod rutrum eu dapibus justo. Etiam scelerisque a odio a euismod. Pellentesque vestibulum pellentesque nisi, a tempus erat cursus ac. Morbi ut auctor lectus.

    Challenging Three

    Nam congue ex nec justo iaculis maximus. Vestibulum lobortis magna sed urna auctor, vel dignissim massa posuere. In sed venenatis elit. Vivamus congue gravida tempus. Nunc quis fermentum nisi. Nullam hendrerit lorem et tellus semper, sit amet scelerisque purus lobortis. Quisque sollicitudin quis neque eu suscipit. Praesent volutpat justo quis magna vehicula molestie.

    Impossible One

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras congue urna nulla. Aliquam eget euismod tellus. Maecenas nibh libero, venenatis a laoreet in, tempor sit amet sem. Morbi sit amet justo tempor velit auctor placerat. Maecenas nec lobortis orci. Aenean dictum enim lacus, ac blandit lacus elementum nec. Mauris porttitor neque volutpat tincidunt sollicitudin. Cras porta lectus ac facilisis tempor. Suspendisse in velit nisl. Sed convallis leo at nunc aliquet fermentum. Pellentesque feugiat at ex sed elementum. In porta vulputate ipsum sit amet consectetur.

    Impossible Two

    Aliquam sagittis ex at magna porttitor, quis scelerisque ligula malesuada. Vestibulum vitae mauris id nisi pretium ornare a id lectus. Nam suscipit magna id sem ultricies vestibulum. Nulla facilisi. Duis venenatis lectus massa, ac mollis nisi suscipit non. Sed et sapien vulputate, imperdiet nibh vel, lobortis nisl. Curabitur sagittis justo nibh. Nulla vulputate sodales justo at efficitur. Cras justo augue, mollis vitae nulla sed, vestibulum tincidunt ante. Vestibulum et lorem lectus. Maecenas accumsan lacus a nisi euismod rutrum eu dapibus justo. Etiam scelerisque a odio a euismod. Pellentesque vestibulum pellentesque nisi, a tempus erat cursus ac. Morbi ut auctor lectus.

    Impossible Three

    Nam congue ex nec justo iaculis maximus. Vestibulum lobortis magna sed urna auctor, vel dignissim massa posuere. In sed venenatis elit. Vivamus congue gravida tempus. Nunc quis fermentum nisi. Nullam hendrerit lorem et tellus semper, sit amet scelerisque purus lobortis. Quisque sollicitudin quis neque eu suscipit. Praesent volutpat justo quis magna vehicula molestie.

    More Reading

    Left intentionally blank, just checking sectioning.

    David C. Lay, Subspaces and Echelon Forms. The College Mathematics Journal, January 1993, 24 1, 5762.
    Exercise Section, Structured

    A collection of exercises, in a top-level exercises division, structured with subexercises.

    Easy Exercises Arithmetic

    Compute 3+4.

    7

    Trigonometry

    Compute \sin(\pi/4).

    Hard Problems Number Theory

    Prove Fermat's Last Theorem.

    Millenial

    Find general solutions to the Navier-Stokes equation.

    With an Exercise Group

    This is an exercise group, and this is its introduction.

    One

    6-5

    Subtract.

    Two

    1+1

    Outside exercisegroup, inside subexercises

    6+5

    Exercises, Multiple Subsections

    This section of the sample article demonstrates a structured division. You are reading the introduction to the division, then there is a faux subsection, followed by three exercises divisions. Note that the three are numbered as if they are also fellowsubsection. And a cross-reference to one of the contained exercise will be numbered use the number of the subsection, .

    Compare this section with the similar , previous. The following text is mostly nonsense, just for testing purposes.

    Faux Subsection Inline One

    Aliquam vitae risus placerat, pellentesque leo vitae, iaculis ante. Praesent ac odio eget mi bibendum eleifend ac eget metus. Morbi in dolor et diam accumsan mattis. Aenean elementum pulvinar efficitur. Etiam viverra ut tellus quis consequat. Phasellus sit amet nisl a ligula pharetra tempus id in elit. Maecenas congue quam eu purus fermentum pretium. Fusce pellentesque ultricies arcu, egestas sollicitudin erat condimentum non. Integer non velit at dolor dictum aliquam et rhoncus mauris. Sed nec nibh id nunc convallis tincidunt ut at ligula. Etiam elementum nisl eu erat dapibus rhoncus.

    Pellentesque nec condimentum ligula, quis interdum mauris. Ut sed urna lacinia, aliquam arcu id, faucibus nisi. Suspendisse potenti. Curabitur in erat ultricies, condimentum mi nec, vehicula mauris. Duis faucibus risus fermentum velit hendrerit, non laoreet massa maximus. Donec bibendum elit ac lectus lobortis luctus. Ut finibus, dolor ut euismod tristique, ligula tortor tempus arcu, finibus semper purus erat ut ligula. Aenean accumsan ut ante vel euismod.

    Inline Two

    Ut porttitor neque a pharetra euismod. Vivamus ut metus pretium, placerat massa tempor, condimentum metus. Phasellus vestibulum iaculis turpis non posuere. Vestibulum quis aliquet neque. Donec nec metus iaculis, laoreet massa vitae, suscipit tellus. Etiam et ultrices quam, quis pretium ligula. In ut cursus metus. Aenean volutpat quam odio, quis tempus dolor egestas eget. Nunc fringilla lobortis nunc, ut interdum lorem posuere sed. Sed sodales risus a laoreet venenatis. Nunc sodales tempor mollis. Nam sollicitudin velit sed ex viverra feugiat. Nunc consectetur mi vitae urna sollicitudin malesuada. Fusce eget risus lectus. Mauris augue velit, vestibulum vitae tempus sit amet, porttitor eget turpis.

    Major Result

    Vivamus tortor tortor, lobortis et sem vel, accumsan placerat libero. Sed eget metus non magna accumsan efficitur a non turpis. Curabitur maximus arcu ipsum, eget vestibulum nulla mollis ac. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis vel eleifend risus. Morbi hendrerit tellus eget nibh imperdiet, ac mollis nisl sagittis. Ut commodo pharetra leo. Suspendisse consequat velit eget velit condimentum feugiat.

    Inline Three

    Suspendisse lacinia mattis risus, eget viverra urna dictum eu. Maecenas ut sem in turpis egestas varius nec at ipsum. Praesent bibendum nisi et turpis congue, a pellentesque felis tempor. Vivamus non dolor in risus interdum mattis. In tempus iaculis velit, sit amet rhoncus tellus aliquam convallis. Sed ut tellus id ipsum blandit convallis sed eget tortor. Nunc leo felis, scelerisque vel ante porta, volutpat rhoncus neque. Mauris convallis, felis at aliquam aliquet, felis ipsum semper mi, vitae auctor purus ante non erat. Ut nec felis mi.

    Drill Exercises Drill One

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras congue urna nulla. Aliquam eget euismod tellus. Maecenas nibh libero, venenatis a laoreet in, tempor sit amet sem. Morbi sit amet justo tempor velit auctor placerat. Maecenas nec lobortis orci. Aenean dictum enim lacus, ac blandit lacus elementum nec. Mauris porttitor neque volutpat tincidunt sollicitudin. Cras porta lectus ac facilisis tempor. Suspendisse in velit nisl. Sed convallis leo at nunc aliquet fermentum. Pellentesque feugiat at ex sed elementum. In porta vulputate ipsum sit amet consectetur.

    A figure in an exercise in a structured division to test that it is numbered with consideration of the containing exercises
    Drill Two

    Aliquam sagittis ex at magna porttitor, quis scelerisque ligula malesuada. Vestibulum vitae mauris id nisi pretium ornare a id lectus. Nam suscipit magna id sem ultricies vestibulum. Nulla facilisi. Duis venenatis lectus massa, ac mollis nisi suscipit non. Sed et sapien vulputate, imperdiet nibh vel, lobortis nisl. Curabitur sagittis justo nibh. Nulla vulputate sodales justo at efficitur. Cras justo augue, mollis vitae nulla sed, vestibulum tincidunt ante. Vestibulum et lorem lectus. Maecenas accumsan lacus a nisi euismod rutrum eu dapibus justo. Etiam scelerisque a odio a euismod. Pellentesque vestibulum pellentesque nisi, a tempus erat cursus ac. Morbi ut auctor lectus.

    Drill Three

    Nam congue ex nec justo iaculis maximus. Vestibulum lobortis magna sed urna auctor, vel dignissim massa posuere. In sed venenatis elit. Vivamus congue gravida tempus. Nunc quis fermentum nisi. Nullam hendrerit lorem et tellus semper, sit amet scelerisque purus lobortis. Quisque sollicitudin quis neque eu suscipit. Praesent volutpat justo quis magna vehicula molestie.

    Challenging Exercises Challenging One

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras congue urna nulla. Aliquam eget euismod tellus. Maecenas nibh libero, venenatis a laoreet in, tempor sit amet sem. Morbi sit amet justo tempor velit auctor placerat. Maecenas nec lobortis orci. Aenean dictum enim lacus, ac blandit lacus elementum nec. Mauris porttitor neque volutpat tincidunt sollicitudin. Cras porta lectus ac facilisis tempor. Suspendisse in velit nisl. Sed convallis leo at nunc aliquet fermentum. Pellentesque feugiat at ex sed elementum. In porta vulputate ipsum sit amet consectetur.

    An introduction to an exercisegroup. This is here to attempt to interrupt the flow of the counting from this division to the next.

    Challenging Two

    Aliquam sagittis ex at magna porttitor, quis scelerisque ligula malesuada. Vestibulum vitae mauris id nisi pretium ornare a id lectus. Nam suscipit magna id sem ultricies vestibulum. Nulla facilisi. Duis venenatis lectus massa, ac mollis nisi suscipit non. Sed et sapien vulputate, imperdiet nibh vel, lobortis nisl. Curabitur sagittis justo nibh.

    Nulla vulputate sodales justo at efficitur. Cras justo augue, mollis vitae nulla sed, vestibulum tincidunt ante. Vestibulum et lorem lectus. Maecenas accumsan lacus a nisi euismod rutrum eu dapibus justo. Etiam scelerisque a odio a euismod. Pellentesque vestibulum pellentesque nisi, a tempus erat cursus ac. Morbi ut auctor lectus.

    Challenging Three

    Nam congue ex nec justo iaculis maximus. Vestibulum lobortis magna sed urna auctor, vel dignissim massa posuere. In sed venenatis elit. Vivamus congue gravida tempus. Nunc quis fermentum nisi. Nullam hendrerit lorem et tellus semper, sit amet scelerisque purus lobortis. Quisque sollicitudin quis neque eu suscipit. Praesent volutpat justo quis magna vehicula molestie.

    Impossible Exercises Impossible One

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras congue urna nulla. Aliquam eget euismod tellus. Maecenas nibh libero, venenatis a laoreet in, tempor sit amet sem. Morbi sit amet justo tempor velit auctor placerat. Maecenas nec lobortis orci. Aenean dictum enim lacus, ac blandit lacus elementum nec. Mauris porttitor neque volutpat tincidunt sollicitudin. Cras porta lectus ac facilisis tempor. Suspendisse in velit nisl. Sed convallis leo at nunc aliquet fermentum. Pellentesque feugiat at ex sed elementum. In porta vulputate ipsum sit amet consectetur.

    Impossible Two

    Aliquam sagittis ex at magna porttitor, quis scelerisque ligula malesuada. Vestibulum vitae mauris id nisi pretium ornare a id lectus. Nam suscipit magna id sem ultricies vestibulum. Nulla facilisi. Duis venenatis lectus massa, ac mollis nisi suscipit non. Sed et sapien vulputate, imperdiet nibh vel, lobortis nisl. Curabitur sagittis justo nibh. Nulla vulputate sodales justo at efficitur. Cras justo augue, mollis vitae nulla sed, vestibulum tincidunt ante. Vestibulum et lorem lectus. Maecenas accumsan lacus a nisi euismod rutrum eu dapibus justo. Etiam scelerisque a odio a euismod. Pellentesque vestibulum pellentesque nisi, a tempus erat cursus ac. Morbi ut auctor lectus.

    Impossible Three

    Nam congue ex nec justo iaculis maximus. Vestibulum lobortis magna sed urna auctor, vel dignissim massa posuere. In sed venenatis elit. Vivamus congue gravida tempus. Nunc quis fermentum nisi. Nullam hendrerit lorem et tellus semper, sit amet scelerisque purus lobortis. Quisque sollicitudin quis neque eu suscipit. Praesent volutpat justo quis magna vehicula molestie.

    Layout challenge

    A multicolumn exercisegroup with layout challenges. The first two should be on one row. The next two should be on one row until the hint is opened. Then one that takes up an entire row. The final row should always have two exercises.

    2x \amp {}+{} \amp y \amp {}={} \amp 10 x \amp \amp \amp {}={} \amp 6 x \amp {}+{} \amp 3y \amp {}={} \amp 13

    2x \amp {}+{} \amp y \amp {}={} \amp 10 x \amp \amp \amp {}={} \amp 6 x \amp {}+{} \amp 3y \amp {}={} \amp 13

    2x \amp {}+{} \amp y \amp {}={} \amp 10 x \amp \amp \amp {}={} \amp 6 x \amp {}+{} \amp 3y \amp {}={} \amp 13

    2x \amp {}+{} \amp y \amp {}={} \amp 10 x \amp \amp \amp {}={} \amp 6 x \amp {}+{} \amp 3y \amp {}={} \amp 13

    OPEN ME!

    3u \amp {}+{} 1v \amp {}+{} 3w \amp {}+{} 2x \amp {}+{} \amp y \amp {}+{} \amp 3z \amp {}={} \amp 10 2u \amp {}+{} 2v \amp {}-{} 2w \amp {}+{} x \amp \amp \amp {}+{} \amp z \amp {}={} \amp 6 1u \amp {}-{} 3v \amp {}+{} 1w \amp {}+{} x \amp {}+{} \amp 3y \amp {}+{} \amp 2z \amp {}={} \amp 13

    200t \amp {}+{} 3u \amp {}+{} 1v \amp {}+{} 3w \amp {}+{} 2x \amp {}+{} \amp y \amp {}+{} \amp 3z \amp {}={} \amp 10 \amp {}+{} 2u \amp {}+{} 2v \amp {}-{} 2w \amp {}+{} x \amp \amp \amp {}+{} \amp z \amp {}={} \amp 6 100t \amp {}+{} 1u \amp {}-{} 3v \amp {}+{} 1w \amp {}+{} x \amp {}+{} \amp 3y \amp {}+{} \amp 2z \amp {}={} \amp 13

    2x \amp {}+{} \amp y \amp {}={} \amp 10 x \amp \amp \amp {}={} \amp 6 x \amp {}+{} \amp 3y \amp {}={} \amp 13

    2x \amp {}+{} \amp y \amp {}={} \amp 10 x \amp \amp \amp {}={} \amp 6 x \amp {}+{} \amp 3y \amp {}={} \amp 13

    More Reading

    Left intentionally blank, just checking sectioning.

    David C. Lay, Subspaces and Echelon Forms. The College Mathematics Journal, January 1993, 24 1, 5762.
    Exercises, Top-Level

    This exercises of the sample article is a peer of all the preceding section and is the only such exercises. As such, it is not numbered, and contains only exercise, but for this introduction you are reading. The exercises contained within will be numbered in cross-references according to the enclosing division, in this case the entire article and so without any qualification, to wit, .

    Drill One

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras congue urna nulla. Aliquam eget euismod tellus. Maecenas nibh libero, venenatis a laoreet in, tempor sit amet sem. Morbi sit amet justo tempor velit auctor placerat. Maecenas nec lobortis orci. Aenean dictum enim lacus, ac blandit lacus elementum nec. Mauris porttitor neque volutpat tincidunt sollicitudin. Cras porta lectus ac facilisis tempor. Suspendisse in velit nisl. Sed convallis leo at nunc aliquet fermentum. Pellentesque feugiat at ex sed elementum. In porta vulputate ipsum sit amet consectetur.

    Drill Two

    Aliquam sagittis ex at magna porttitor, quis scelerisque ligula malesuada. Vestibulum vitae mauris id nisi pretium ornare a id lectus. Nam suscipit magna id sem ultricies vestibulum. Nulla facilisi. Duis venenatis lectus massa, ac mollis nisi suscipit non. Sed et sapien vulputate, imperdiet nibh vel, lobortis nisl. Curabitur sagittis justo nibh. Nulla vulputate sodales justo at efficitur. Cras justo augue, mollis vitae nulla sed, vestibulum tincidunt ante. Vestibulum et lorem lectus. Maecenas accumsan lacus a nisi euismod rutrum eu dapibus justo. Etiam scelerisque a odio a euismod. Pellentesque vestibulum pellentesque nisi, a tempus erat cursus ac. Morbi ut auctor lectus.

    Testing numbering in a exercises without a number
    Drill Three

    Nam congue ex nec justo iaculis maximus. Vestibulum lobortis magna sed urna auctor, vel dignissim massa posuere. In sed venenatis elit. Vivamus congue gravida tempus. Nunc quis fermentum nisi. Nullam hendrerit lorem et tellus semper, sit amet scelerisque purus lobortis. Quisque sollicitudin quis neque eu suscipit. Praesent volutpat justo quis magna vehicula molestie.

    Challenging One

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras congue urna nulla. Aliquam eget euismod tellus. Maecenas nibh libero, venenatis a laoreet in, tempor sit amet sem. Morbi sit amet justo tempor velit auctor placerat. Maecenas nec lobortis orci. Aenean dictum enim lacus, ac blandit lacus elementum nec. Mauris porttitor neque volutpat tincidunt sollicitudin. Cras porta lectus ac facilisis tempor. Suspendisse in velit nisl. Sed convallis leo at nunc aliquet fermentum. Pellentesque feugiat at ex sed elementum. In porta vulputate ipsum sit amet consectetur.

    An introduction to an exercisegroup. This is here to attempt to interrupt the flow of the counting from this division to the next.

    Challenging Two

    Aliquam sagittis ex at magna porttitor, quis scelerisque ligula malesuada. Vestibulum vitae mauris id nisi pretium ornare a id lectus. Nam suscipit magna id sem ultricies vestibulum. Nulla facilisi. Duis venenatis lectus massa, ac mollis nisi suscipit non. Sed et sapien vulputate, imperdiet nibh vel, lobortis nisl. Curabitur sagittis justo nibh.

    Nulla vulputate sodales justo at efficitur. Cras justo augue, mollis vitae nulla sed, vestibulum tincidunt ante. Vestibulum et lorem lectus. Maecenas accumsan lacus a nisi euismod rutrum eu dapibus justo. Etiam scelerisque a odio a euismod. Pellentesque vestibulum pellentesque nisi, a tempus erat cursus ac. Morbi ut auctor lectus.

    Challenging Three

    Nam congue ex nec justo iaculis maximus. Vestibulum lobortis magna sed urna auctor, vel dignissim massa posuere. In sed venenatis elit. Vivamus congue gravida tempus. Nunc quis fermentum nisi. Nullam hendrerit lorem et tellus semper, sit amet scelerisque purus lobortis. Quisque sollicitudin quis neque eu suscipit. Praesent volutpat justo quis magna vehicula molestie.

    Impossible One

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras congue urna nulla. Aliquam eget euismod tellus. Maecenas nibh libero, venenatis a laoreet in, tempor sit amet sem. Morbi sit amet justo tempor velit auctor placerat. Maecenas nec lobortis orci. Aenean dictum enim lacus, ac blandit lacus elementum nec. Mauris porttitor neque volutpat tincidunt sollicitudin. Cras porta lectus ac facilisis tempor. Suspendisse in velit nisl. Sed convallis leo at nunc aliquet fermentum. Pellentesque feugiat at ex sed elementum. In porta vulputate ipsum sit amet consectetur.

    Impossible Two

    Aliquam sagittis ex at magna porttitor, quis scelerisque ligula malesuada. Vestibulum vitae mauris id nisi pretium ornare a id lectus. Nam suscipit magna id sem ultricies vestibulum. Nulla facilisi. Duis venenatis lectus massa, ac mollis nisi suscipit non. Sed et sapien vulputate, imperdiet nibh vel, lobortis nisl. Curabitur sagittis justo nibh. Nulla vulputate sodales justo at efficitur. Cras justo augue, mollis vitae nulla sed, vestibulum tincidunt ante. Vestibulum et lorem lectus. Maecenas accumsan lacus a nisi euismod rutrum eu dapibus justo. Etiam scelerisque a odio a euismod. Pellentesque vestibulum pellentesque nisi, a tempus erat cursus ac. Morbi ut auctor lectus.

    Impossible Three

    Nam congue ex nec justo iaculis maximus. Vestibulum lobortis magna sed urna auctor, vel dignissim massa posuere. In sed venenatis elit. Vivamus congue gravida tempus. Nunc quis fermentum nisi. Nullam hendrerit lorem et tellus semper, sit amet scelerisque purus lobortis. Quisque sollicitudin quis neque eu suscipit. Praesent volutpat justo quis magna vehicula molestie.

    An Exercise in a Section

    Exercises can appear in a section of their own. You need to give the section a title, even if it seems obvious what to call it. Individual exercises may have titles, as you choose. Problem: How should we hide solutions?

    Maybe a global switch should be used to suppress solutions, while a separate processing regime could use them as part of a solutions manual.

    An Exercise with a Hard-Coded Problem Number

    Compute the definite integral \definiteintegral{2}{4}{x^2}{x}, not as an approximate value from a Riemann sum, but as an exact value based of the limit by using the Fundamental Theorem.

    An antiderivative of x^2 is F(x)=x^3/3, so by the FTC,\definiteintegral{2}{4}{x^2}{x}=F(4)-F(2)=\frac{1}{3}\left(4^3-2^3\right)=\frac{56}{3}!?! This is indeed an exciting result, but we are mostly interested in seeing that the sentence-ending punctuation is absorbed properly into the displayed equation.

    And sentence-ending punctuation is also placed carefully when display math finishes with a cases environment. To wit, the absolute value can be defined by |x| = \begin{cases} x \amp \text{if } x \ge 0 \\ -x \amp \text{if } x \lt 0 \end{cases} .

    Can you prove Corollary directly? If not consider that a problem could have several parts, which should be formatted as a second-level list, since the problems normally get numbered at the top level.

    1. Why is this result a Corollary?

    2. Could you interchange the Theorem and Corollary?

    MVT

    Consider the definite integral as an area function and employ the Mean Value Theorem.

    Motivator

    Think harder!

    Helpful

    1. It follows easily.

    2. Yes.

    We could prove either result first, then obtain the other as an easy consequence.

    Reference Notation

    This is some notation introduced in the article. allows the notation list generator anywhere, so we have this paragraph to test spacing above and below the table. We'll say that again.

    This is some notation introduced in the article. allows the notation list generator anywhere, so we have this paragraph to test spacing above and below the table. We'll say that again.

    This is some notation introduced in the article. allows the notation list generator anywhere, so we have this paragraph to test spacing above and below the table. We'll say that again.

    This is some notation introduced in the article. allows the notation list generator anywhere, so we have this paragraph to test spacing above and below the table. We'll say that again.

    Solutions to Selected Exercises solutionsas an appendix

    This is an introduction, where you might explain that this division of the back matter contains various hints, answers, solutions of inline exercises, divisional exercises, project-like blocks, worksheet exercises, and/or reading questions. See the source to see just how this solutions division was built.

    And a conclusion to this solutions division, which may not be readily apparent as distinct from the final division's worth of solutions, but since it is not prefixed with a number, it may be different enough.

    Solutions to a Single Exercises Division solutionsfor one group of exercises

    Sometimes you may want the solutions to exercises within a single exercises division (or similar, like a worksheet). Default behavior in this situation can produce two titles, when just one would be sufficient. Here we have used the scope attribute to point to a specific exercises, and provided a (single) very specific title.

    All Solutions that are Answers solutionsall answers

    The back matter solutions appendix requests every answer, and only answer, of all types of exercises: inline, divisional, worksheet, reading questions, and projects. Now, as observed by Bruce Yoshiwara, it gets a bit tedious to see the Answer heading over and over in print, when every entry has that heading. So we squelch it for you in print/PDF output. (For HTML output we use knowls and need to have something to click on. But perhaps for EPUB we should be more careful?) Note that you might want to use a title, or an introduction, that explains which component of the exercises is being displayed, so there is no confusion.

    All Solutions that are Answers to Odd Exercises solutionsall even answers

    This should be identical to the previous collection of answers, except only exercises with an even number are reported (via the admit attribute).

    List of Results

    We had an automatic list of theorems for just one section, back in . Here we expand to include corollary in our space-delimited list of elements and we request divisions (headings) at each subsection and section. The default scope is the entire document, which is appropriate here in the backmatter. There are many subsections with no results, so we set the empty attribute to no to suppress them, though this is the default behavior (yes being the other option to see divisions with no list items). These lists are most valuable if you are in the practice of giving items titles.

    Lists of Exercises

    Since exercise come in several flavors, we use pseudo-elements to specify the distinct types. There are not many reading questionsbut here is a list of all of them, by section, using a readingquestion pseudo-element.

    And now a list of all the inline exercises, and including the title of every section, even if there is no inline exercise contained inside it. The pseudo-element is inlineexercise.

    A Structured Appendix

    A deeply-structured appendix for testing purposes.

    A Subsection in an Appendix

    Inside a subsection.

    A Subsubsection in a Subsection in an Appendix

    Nearly terminal.

    Paragraphs in a Subsubsection in a Subsection in an Appendix

    The paragraphs element can go in any division, but does not get a number.

    Index

    There is an index manufactured at the end of the back matter. So we are talking about it here, rather than within the index, which is an impossibility. It contains some sample entries, and is not meant to be comprehensive. Look at the source of this XML file, searching on idx, to see how they are written. They may be placed inside of a a variety of structures, and their location greatly influences the cross-references produced in the HTML version of the index.

    The version of the index is more traditional, using page numbers to reference locations. A newer package is used to create the index, and so there is no extra intermediate step required to process the index. The one downside of this convenience is that index entries may not be placed in the back colophon (which is the only subdivision that may follow the index).

    There is an index entry about multicolumn lists which spans more than one page. This requires doubly-linked index entries, the first has the index content and points to the xml:id of the second. The second is an empty element, but points back to the xml:id of the first entry. So each has a marker and a reference, which allows the span of the index topic to cut across XML boundaries in the source. This is the mechanism to produce a page range in the index. See the source of this article for syntax details.

    Bully Pulpit: Index Headings

    Professionals do not capitalize the headings (entries) of an index, unless it is a proper noun (name, place, ). We do not provide any enforcement of this advice, nor any assistance. It is your responsibility to provide quality source material in this regard.

    Note

    Most all of the index entries below to page 2 (PDF output) are just from a suite of non-sensical tests. These are harder to recognize in the HTML output.

    glossary

    A glossary may have a headnote, perhaps with some explanation. This glossary is placed in the back matter. Placement as a specialized division is another option, see .

    bar

    A part of foobar. See .

    foobar

    A synonym for the acronym FUBAR.

    Multiple References Multiple Specialized References

    You might want to have lists of references, in the back, but with multiple such lists. Make an appendix to hold them, give it some structure (for an article, a leading subsection, such as the one you are reading right now), then follow with multiple references divisions. A typical citation will then look like: .

    2025-05-23: currently testing citations to CSL-style references in the back matter. These should go eventually somewhere besides right where the references are.

    • Judson:
    • Lay:
    • Doe:
    • Doe, later:
    • Conrey/Farmer:
    • D'Arcus:
    • Two, authored in-order:
    • Two, authored out-of-order:
    • Three, authored reverse-order:

    General References Gilbert Strang, The Fundamental Theorem of Linear Algebra, The American Mathematical Monthly November 1993, 100 9, 848855. Specialized References Tom Judson, Abstract Algebra: Theory and Applications.

    Another online, open-source offering.

    Gilbert Strang, The Fundamental Theorem of Linear Algebra, The American Mathematical Monthly November 1993, 100 9, 848855.
    References Thomas Judson Abstract Algebra: Theory and Applications David C. Lay Subspaces and Echelon Forms The College Mathematics Journal 24 1 57-62 Doe John Still Anonymous, But now Ibid Doe John His Anonymous Life Conrey J. B. Farmer D. W. Mean values of <m>L</m>-functions and symmetry Internat. Math. Res. Notices 17 883-908 D'Arcus Bruce false Boundaries of Dissent: Protest and State Power in the Media Age Routledge New York http://www.test01.com Index

    This article was authored in, and produced with, . It is typeset with the Latin Modern font.

    ================================================ FILE: examples/sample-book/README.md ================================================ # PreTeXt Sample Book This sample book began as a subset of Tom Judson's _Abstract Algebra: Theory and Applications_ textbook. Superfluous material has been added to demonstrate and test various aspects of a book-length project. So this should not be taken as representative of the real version of Judson's book. It is meant to illustrate - how to structure the "extra" components of a book, such as the preface, appendices, index, and so on. - how to modularize a large project across multiple files - how Runestone's chapter/subchapter model maps onto a PreTeXt `book` with `chapter` and `section` - as an example for Runestone, many Runestone features are tested in a new chapter devoted to these features. The Sample Book comes in several flavors: * Wihout any parts, use `sample-book.xml` as the source with the "no-parts" publication file. * With parts, use `sample-book-parts.xml` as the source with the "decorative" or "structural" publication files. * As a solution manual, use `sample-book-solutions-manual.xsl` as the source, with the "solution-manual" publication file. Other than changes in organization, the only difference in content comes in the front matter, where the Preface has cross-references to items in parts, or no such cross-references. ================================================ FILE: examples/sample-book/appendix-two.xml ================================================ Second Appendix

    This is a nonsense appendix, to check that numbering (lettering) proceeds correctly.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam finibus lacus at molestie tristique. Vivamus in feugiat nibh, ut condimentum nibh. Praesent pretium est ante, et sagittis nisi tempor sed. Aenean eu odio nunc. Suspendisse dolor sem, feugiat nec ullamcorper in, cursus eu lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla at diam ac ex efficitur sagittis vitae sit amet est. Suspendisse fermentum orci at justo feugiat, a molestie mi consectetur. Proin volutpat eleifend accumsan. Ut sit amet dolor leo. Morbi tempus tortor at gravida rutrum. Morbi ultricies pharetra lobortis. Cras mollis, massa nec convallis luctus, erat magna finibus lectus, non venenatis massa magna quis lectus. In eu mollis odio. In hac habitasse platea dictumst. Nulla elementum urna ut felis rhoncus fermentum.

    Nullam vitae velit vel ligula ultricies dapibus sit amet et sapien. Sed consequat, purus vitae dictum viverra, nunc dui molestie purus, quis luctus ipsum turpis sit amet justo. Aenean faucibus leo eget risus blandit, posuere semper felis placerat. Donec bibendum fringilla pellentesque. Nam vehicula risus placerat arcu scelerisque lacinia. Suspendisse vitae neque in ipsum rhoncus dignissim eu id magna. Phasellus vel eros est.

    Integer congue quam eget augue fermentum porttitor. Aliquam erat volutpat. Nunc tempus mi leo, non vehicula sapien mollis in. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris lorem arcu, pretium ut convallis at, malesuada non libero. Curabitur ac eros efficitur eros ullamcorper facilisis. Morbi tellus erat, aliquet in metus et, posuere facilisis metus. Duis nulla augue, dictum nec pharetra blandit, elementum et mauris. Nunc vestibulum vestibulum blandit.

    Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum at mattis nisl. Nunc sit amet libero vel neque consectetur interdum a eu purus. Mauris lacus eros, vulputate ut erat ac, viverra tristique lectus. Proin sed pellentesque neque. Proin bibendum lorem quis volutpat porttitor. Aenean a est orci. Morbi imperdiet et nisl quis ultrices. Maecenas at tellus quis magna accumsan semper id posuere quam. Quisque eu orci sit amet mauris aliquam mattis vitae sed mi. Etiam nec justo semper, malesuada justo sed, convallis lorem. Mauris consequat sit amet dui at hendrerit. Praesent quis arcu felis.

    Aliquam pellentesque pellentesque lacus, in gravida magna ullamcorper et. Maecenas vitae nisl lectus. Mauris sed erat ipsum. Aliquam vestibulum vel sem nec ultricies. Donec mattis egestas sodales. Sed quis pulvinar orci. Nam ultrices finibus augue, id convallis eros consequat id. Quisque elementum hendrerit ex, vitae tristique purus convallis sed. Nullam ut eros at magna pretium cursus. Mauris iaculis pulvinar dolor, in lacinia nisl molestie in. Donec molestie hendrerit elit ac sagittis. Nullam id luctus ligula. Sed bibendum nibh non dapibus feugiat. Mauris elit sapien, maximus tempus turpis at, luctus accumsan velit. Etiam id libero vel ante aliquet elementum. Morbi efficitur mauris sed nunc egestas egestas.

    Cras pellentesque nunc ligula, at accumsan lacus sodales eget. Donec a pulvinar sem. Sed sollicitudin pretium tortor. Proin eget nibh mauris. Nam non justo sodales, hendrerit velit vitae, tincidunt nisl. Suspendisse in eros non ligula aliquam fringilla. Ut a dignissim erat. Quisque iaculis justo nisi, eget vehicula elit condimentum tincidunt. Duis scelerisque tincidunt tincidunt. In mollis nibh ut nisl malesuada feugiat. Vestibulum nisl nisi, consectetur et purus vel, mattis pharetra nunc.

    Sed pretium lorem et felis mollis laoreet. Donec laoreet lorem sed urna fringilla, eget ullamcorper massa finibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas suscipit nibh iaculis nibh lacinia ultrices. Aenean eget laoreet odio. Vivamus nec euismod libero, at vestibulum dui. Aliquam sodales pretium mauris varius venenatis. Nam sit amet porta lacus, eget tempus ante. Suspendisse potenti. Nunc dignissim suscipit urna, ut fringilla urna bibendum sed. Donec eget placerat sem. Curabitur ut augue sodales, aliquet ex a, aliquet ex. Maecenas sagittis convallis justo, sed pellentesque elit tempus sed. Pellentesque a scelerisque erat. Vestibulum suscipit rhoncus sem, nec fermentum ante consectetur ut.

    Pellentesque ac diam mi. Suspendisse vitae semper sapien, vel iaculis ipsum. Suspendisse interdum pretium eros in venenatis. In nec est in nunc accumsan condimentum. Sed vulputate ultricies ipsum, sit amet tincidunt nisi. Vivamus aliquet interdum lacus, vel porttitor erat sollicitudin id. Donec eu tortor aliquam, vehicula lorem vel, condimentum nulla. Cras pellentesque congue est eget iaculis. Morbi ut mauris tristique risus fermentum ultrices quis sed magna. Etiam faucibus nisi dui, a bibendum ante sagittis vitae. Suspendisse nunc turpis, posuere eu sodales et, condimentum eu diam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce tempus eget turpis vitae pulvinar. Aenean magna augue, sodales non tempor ut, lobortis auctor nunc. Nunc gravida lectus vel sapien hendrerit feugiat. Duis et nibh pellentesque, auctor nunc id, suscipit purus.

    Nullam bibendum enim justo, sit amet dictum justo ullamcorper quis. Curabitur vitae molestie metus. Proin convallis, lorem nec ullamcorper ullamcorper, ante libero hendrerit nunc, et sollicitudin ante nisi varius massa. Pellentesque accumsan dolor vel porta vestibulum. Suspendisse in lacus suscipit, fringilla dui vitae, fermentum leo. Sed ultricies maximus lectus quis suscipit. Sed dignissim interdum ipsum sed ullamcorper. Suspendisse fringilla eleifend est at lobortis.

    ================================================ FILE: examples/sample-book/backmatter.xml ================================================ Back Matter Notation

    The following table defines the notation used in this book. Page numbers or references refer to the first appearance of each symbol.

    Hints and Answers to Selected Odd Exercises Hints and Answers to Selected Even Exercises Hints and Answers to Selected Exercises A Structured Appendix

    A deeply-structured appendix for testing purposes.

    A Section in an Appendix

    Inside a section.

    A Subsection in a Section in an Appendix

    Inside a subsection.

    A Subsubsection in a Subsection in a Section in an Appendix

    Nearly terminal.

    Paragraphs in a Subsubsection in a Subsection in a Section in an Appendix

    The paragraphs element can go in any division, but does not get a number.

    Numbering in the Back Matter

    Numbered blocks in an appendix in the backmatter of a book with part were once getting an extra level in HTML output. With standard defaults, the number of the following example should have two periods as separators, just like an example in the main matter when the part number is not included.

    An Example Example

    What's my number?

    Some Runestone Elements

    These elements should end up in the Runestone manifest.

                Ipsum lorem...
                
    print("Hello from the appendix!")

    This book was authored in MathBook XML.

    ================================================ FILE: examples/sample-book/bookinfo.xml ================================================ This is a book written in PreTeXt, in order to provide testing for a variety of purposes, not least a conversion to Runestone Academy. PTXSB SB \newcommand{\identity}{\mathrm{id}} \newcommand{\notdivide}{{\not{\mid}}} \newcommand{\notsubset}{\not\subset} \newcommand{\lcm}{\operatorname{lcm}} \newcommand{\gf}{\operatorname{GF}} \newcommand{\inn}{\operatorname{Inn}} \newcommand{\aut}{\operatorname{Aut}} \newcommand{\Hom}{\operatorname{Hom}} \newcommand{\cis}{\operatorname{cis}} \newcommand{\chr}{\operatorname{char}} \newcommand{\Null}{\operatorname{Null}} \usepackage{tikz} \usetikzlibrary{backgrounds} \usetikzlibrary{arrows,matrix} \usetikzlibrary{snakes} ================================================ FILE: examples/sample-book/code/symmetric-group-8.sage ================================================ S8 = SymmetricGroup(8) a = S8.random_element() [a(x) for x in S8.domain()] # random ================================================ FILE: examples/sample-book/codechat_config.yaml ================================================ # .. Copyright (C) 2012-2020 Bryan A. Jones. # # This file is part of the CodeChat System. # # The CodeChat System is free software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # The CodeChat System is distributed in the hope that it will be # useful, but WITHOUT ANY WARRANTY; without even the implied warranty # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the CodeChat System. If not, see # . # # ************************************************ # |docname| - Configuration for a CodeChat project # ************************************************ # This file defines the configuration for a CodeChat project. It contains a working `Sphinx `_ configuration. # # ``source_path``: optional; defaults to ``.`` (the current directory). A path to the root of the source tree. Relative paths are rooted in the directory containing this configuration file. #source_path: . # ``output_path``: required. A path to the root of the HTML output produced by this renderer. Relative paths are rooted in the directory containing this configuration file. output_path: _build # ``args``: required string or sequence of strings. This provides the arguments to invoke the renderer. These strings may optionally contain the following replacement values: # # - ``{project_path}``: an absolute path to the directory containing this file. # - ``{source_path}``: the ``source_path`` above, but as an absolute path. # - ``{output_path}``: the ``output_path`` above, but as an absolute path. # # The line below could also be written ``args: sphinx-build . _build``. args: c:/Users/bjones/documents/git/CodeChat_System/.venv/Scripts/python ../../pretext/pretext --component all --format html --directory {output_path} sample-book.xml # ``html_ext``: optional; defaults to ``.html``. The extension used by this renderer when generating HTML files. #html_ext: .html # ``project_type``: optional; defaults to ``general``. Define the project type, which enables special processing based on the type. Valid values are ``general`` (no special processing), ``Doxygen``, and ``PreTeXt``. project_type: PreTeXt ================================================ FILE: examples/sample-book/cyclic.xml ================================================ Cyclic Groups Cyclicity

    The groups \mathbb Z and {\mathbb Z}_n, which are among the most familiar and easily understood groups, are both examples of what are called cyclic groups. In this chapter we will study the properties of cyclic groups and cyclic subgroups, which play a fundamental part in the classification of all abelian groups.

    Cyclic groups

    Often a subgroup will depend entirely on a single element of the group; that is, knowing that particular element will allow us to compute any other element in the subgroup.

    An Infinite Cyclic Subgroup, Modular Addition

    Suppose that we consider 3 \in {\mathbb Z} and look at all multiples (both positive and negative) of 3. As a set, this is 3 {\mathbb Z} = \{ \ldots, -3, 0, 3, 6, \ldots \}. It is easy to see that 3 {\mathbb Z} is a subgroup of the integers. This subgroup is completely determined by the element 3 since we can obtain all of the other elements of the group by taking multiples of 3. Every element in the subgroup is generated by 3.

    An Infinite Cyclic Subgroup, Multiplication of Rational Numbers

    If H = \{ 2^n : n \in {\mathbb Z} \}, then H is a subgroup of the multiplicative group of nonzero rational numbers, {\mathbb Q}^*. If a = 2^m and b = 2^n are in H, then ab^{-1} = 2^m 2^{-n} = 2^{m-n} is also in H. By , H is a subgroup of {\mathbb Q}^* determined by the element 2.

    Let G be a group and a be any element in G. Then the set \langle a \rangle = \{ a^k : k \in {\mathbb Z} \} is a subgroup of G. Furthermore, \langle a \rangle is the smallest subgroup of G that contains~a. \langle a \rangle cyclic group generated by a

    The identity is in \langle a \rangle since a^0 = e. If g and h are any two elements in \langle a \rangle , then by the definition of \langle a \rangle we can write g = a^m and h = a^n for some integers m and n. So gh = a^m a^n = a^{m+n} is again in \langle a \rangle . Finally, if g = a^n in \langle a \rangle , then the inverse g^{-1} = a^{-n} is also in \langle a \rangle . Clearly, any subgroup H of G containing a must contain all the powers of a by closure; hence, H contains \langle a \rangle . Therefore, \langle a \rangle is the smallest subgroup of G containing a.

    If we are using the + notation, as in the case of the integers under addition, we write \langle a \rangle = \{ na : n \in {\mathbb Z} \}.

    For a \in G, we call \langle a \rangle the cyclic subgroupSubgroupcyclic generated by a. If G contains some element a such that G = \langle a \rangle , then G is a cyclic groupGroupcyclic. In this case a is a generatorGenerator of a cyclic subgroup of G. If a is an element of a group G, we define the orderElementorder of of a to be the smallest positive integer n such that a^n= e, and we write |a| = n. |a|the order of an element a If there is no such integer n, we say that the order of a is infinite and write |a| = \infty to denote the order of a.

    Generators of a Finite Cyclic Group

    Notice that a cyclic group can have more than a single generator. Both 1 and 5 generate {\mathbb Z}_6; hence, {\mathbb Z}_6 is a cyclic group. Not every element in a cyclic group is necessarily a generator of the group. The order of 2 \in {\mathbb Z}_6 is 3. The cyclic subgroup generated by 2 is \langle 2 \rangle = \{ 0, 2, 4 \}.

    The groups {\mathbb Z} and {\mathbb Z}_n are cyclic groups. The elements 1 and -1 are generators for {\mathbb Z}. We can certainly generate {\mathbb Z}_n with 1 although there may be other generators of {\mathbb Z}_n, as in the case of {\mathbb Z}_6.

    A Cyclic Group of Units

    The group of units, U(9), in {\mathbb Z}_9 is a cyclic group. As a set, U(9) is \{ 1, 2, 4, 5, 7, 8 \}. The element 2 is a generator for U(9) since 2^1 & = 2 \qquad 2^2 = 4 2^3 & = 8 \qquad 2^4 = 7 2^5 & = 5 \qquad 2^6 = 1 .

    A Group That is Not Cyclic

    Not every group is a cyclic group. Consider the symmetry group of an equilateral triangle S_3. The subgroups of S_3 are shown in . Notice that every subgroup is cyclic; however, no single element generates the entire group.

    Subgroups of S_3

    Every cyclic group is abelian.

    Let G be a cyclic group and a \in G be a generator for G. If g and h are in G, then they can be written as powers of a, say g = a^r and h = a^s. Since g h = a^r a^s = a^{r+s} = a^{s+r} = a^s a^r = h g, G is abelian.

    Subgroups of a Cyclic Group

    We can ask some interesting questions about cyclic subgroups of a group and subgroups of a cyclic group. If G is a group, which subgroups of G are cyclic? If G is a cyclic group, what type of subgroups does G possess?

    Every subgroup of a cyclic group is cyclic.

    The main tools used in this proof are the division algorithm and the Principle of Well-Ordering. Let G be a cyclic group generated by a and suppose that H is a subgroup of G. If H = \{ e \}, then trivially H is cyclic. Suppose that H contains some other element g distinct from the identity. Then g can be written as a^n for some integer n. Since H is a subgroup, g^{-1} = a^{n} must also be in H. Since either n or -n is positive, we can assume that H contains positive powers of a and n \gt 0. Let m be the smallest natural number such that a^m \in H. Such an m exists by the Principle of Well-Ordering.

    We claim that h = a^m is a generator for H. We must show that every h' \in H can be written as a power of h. Since h' \in H and H is a subgroup of G, h' = a^k for some integer k. Using the division algorithm, we can find numbers q and r such that k = mq +r where 0 \leq r \lt m; hence, a^k = a^{mq +r} = (a^m)^q a^r = h^q a^r. So a^r = a^k h^{-q}. Since a^k and h^{-q} are in H, a^r must also be in H. However, m was the smallest positive number such that a^m was in H; consequently, r=0 and so k=mq. Therefore, h' = a^k = a^{mq} = h^q and H is generated by h.

    The subgroups of {\mathbb Z} are exactly n{\mathbb Z} for n = 0, 1, 2,\ldots.

    Let G be a cyclic group of order n and suppose that a is a generator for G. Then a^k=e if and only if n divides k.

    First suppose that a^k=e. By the division algorithm, k = nq + r where 0 \leq r \lt n; hence, e = a^k = a^{nq + r} = a^{nq} a^r = e a^r = a^r. Since the smallest positive integer m such that a^m = e is n, r= 0.

    Conversely, if n divides k, then k=ns for some integer s. Consequently, a^k = a^{ns} = (a^n)^s = e^s = e.

    Let G be a cyclic group of order n and suppose that a \in G is a generator of the group. If b = a^k, then the order of b is n/d, where d = \gcd(k,n).

    We wish to find the smallest integer m such that e = b^m = a^{km}. By , this is the smallest integer m such that n divides km or, equivalently, n/d divides m(k/d). Since d is the greatest common divisor of n and k, n/d and k/d are relatively prime. Hence, for n/d to divide m(k/d) it must divide m. The smallest such m is n/d.

    The generators of {\mathbb Z}_n are the integers r such that 1 \leq r \lt n and \gcd(r,n) = 1.

    A Finite Cyclic Group of Order <m>16</m>

    Let us examine the group {\mathbb Z}_{16}. The numbers 1, 3, 5, 7, 9, 11, 13, and 15 are the elements of {\mathbb Z}_{16} that are relatively prime to 16. Each of these elements generates {\mathbb Z}_{16}. For example, 1 \cdot 9 & = 9 & 2 \cdot 9 & = 2 & 3 \cdot 9 & = 11 4 \cdot 9 & = 4 & 5 \cdot 9 & = 13 & 6 \cdot 9 & = 6 7 \cdot 9 & = 15 & 8 \cdot 9 & = 8 & 9 \cdot 9 & = 1 10 \cdot 9 & = 10 & 11 \cdot 9 & = 3 & 12 \cdot 9 & = 12 13 \cdot 9 & = 5 & 14 \cdot 9 & = 14 & 15 \cdot 9 & = 7 .

    Cyclic Groups of Complex Numbers

    The complex numbers are defined as {\mathbb C} = \{ a + bi : a, b \in {\mathbb R} \}, where i^2 = -1. If z = a + bi, then a is the real part of z and b is the imaginary part of z.

    To add two complex numbers z=a+bi and w= c+di, we just add the corresponding real and imaginary parts: z + w=(a + bi ) + (c + di) = (a + c) + (b + d)i. Remembering that i^2 = -1, we multiply complex numbers just like polynomials. The product of z and w is (a + bi )(c + di) = ac + bdi^2 + adi + bci = (ac -bd) +(ad + bc)i.

    Every nonzero complex number z = a +bi has a multiplicative inverse; that is, there exists a z^{-1} \in {\mathbb C}^\ast such that z z^{-1} = z^{-1} z = 1. If z = a + bi, then z^{-1} = \frac{a-bi}{ a^2 + b^2 }. The complex conjugateConjugate, complex of a complex number z = a + bi is defined to be \overline{z} = a- bi. The absolute value or modulus of z = a + bi is |z| = \sqrt{a^2 + b^2}.

    Complex Number Operations

    Let z = 2 + 3i and w = 1-2i. Then z + w = (2 + 3i) + (1 - 2i) = 3 + i and z w = (2 + 3i)(1 - 2i ) = 8 - i. Also, z^{-1} & = \frac{2}{13} - \frac{3}{13}i |z| & = \sqrt{13} \overline{z} & = 2-3i .

    Rectangular coordinates of a complex number ] (0,-5) -- (0,5); \draw [->] (-8,0) -- (8,0); \node [right] at (0,5) {$y$}; \node [below] at (8,0) {$x$}; \node [below] at (0.5,0) {$0$}; \filldraw[fill=black, draw=black] (2,3) circle (0.05cm); \node [right] at (2,3) {$z_1 = 2 + 3i$}; \filldraw[fill=black, draw=black] (-3,2) circle (0.05cm); \node [left] at (-3, 2) {$z_3 = -3 + 2i$}; \filldraw[fill=black, draw=black] (1,-2) circle (0.05cm); \node [right] at (1, -2) {$z_2 = 1 - 2i$}; \end{tikzpicture}]]>

    There are several ways of graphically representing complex numbers. We can represent a complex number z = a +bi as an ordered pair on the xy plane where a is the x (or real) coordinate and b is the y (or imaginary) coordinate. This is called the rectangular or Cartesian representation. The rectangular representations of z_1 = 2 + 3i, z_2 = 1 - 2i, and z_3 = - 3 + 2i are depicted in .

    Polar coordinates of a complex number ] (0,-5) -- (0,5); \draw [->] (-8,0) -- (8,0); \node [right] at (0,5) {$y$}; \node [below] at (8,0) {$x$}; \node [below] at (0.5,0) {$0$}; \draw (0,0) -- (35:6); \draw (2,0) arc (0:35:2); \filldraw[fill=black, draw=black] (35:6) circle (0.05cm); \node [right] at (35:6) {$a + bi$}; \node [above] at (35:3) {$r$}; \node [right] at (17:2) {$\theta$}; \end{tikzpicture}]]>

    Nonzero complex numbers can also be represented using polar coordinates. To specify any nonzero point on the plane, it suffices to give an angle \theta from the positive x axis in the counterclockwise direction and a distance r from the origin, as in . We can see that z = a + bi = r( \cos \theta + i \sin \theta). Hence, r = |z| = \sqrt{a^2 + b^2} and a & = r \cos \theta b & = r \sin \theta . We sometimes abbreviate r( \cos \theta + i \sin \theta) as r \cis \theta. To assure that the representation of z is well-defined, we also require that 0^{\circ} \leq \theta \lt 360^{\circ}. If the measurement is in radians, then 0 \leq \theta \lt2 \pi. \cis \theta \cos \theta + i \sin \theta

    Complex Numbers in Polar Form

    Suppose that z = 2 \cis 60^{\circ}. Then a = 2 \cos 60^{\circ} = 1 and b = 2 \sin 60^{\circ} = \sqrt{3}. Hence, the rectangular representation is z = 1+\sqrt{3}\, i.

    Conversely, if we are given a rectangular representation of a complex number, it is often useful to know the number's polar representation. If z = 3 \sqrt{2} - 3 \sqrt{2}\, i, then r = \sqrt{a^2 + b^2} = \sqrt{36 } = 6 and \theta = \arctan \left( \frac{b}{a} \right) = \arctan( - 1) = 315^{\circ}, so 3 \sqrt{2} - 3 \sqrt{2}\, i=6 \cis 315^{\circ}.

    The polar representation of a complex number makes it easy to find products and powers of complex numbers. The proof of the following proposition is straightforward and is left as an exercise.

    Let z = r \cis \theta and w = s \cis \phi be two nonzero complex numbers. Then zw = r s \cis( \theta + \phi).

    Multiplication of Complex Numbers in Polar Form

    If z = 3 \cis( \pi / 3 ) and w = 2 \cis(\pi / 6 ), then zw = 6 \cis( \pi / 2 ) = 6i.

    DeMoivre DeMoivre's Theorem

    Let z = r \cis \theta be a nonzero complex number. Then [r \cis \theta ]^n = r^n \cis( n \theta) for n = 1, 2, \ldots.

    We will use induction on n (see ). For n = 1 the theorem is trivial. Assume that the theorem is true for all k such that 1 \leq k \leq n. Then z^{n+1} & = z^n z & = r^n( \cos n \theta + i \sin n \theta ) r( \cos \theta + i\sin \theta ) & = r^{n+1} [( \cos n \theta \cos \theta - \sin n \theta \sin \theta ) + i ( \sin n \theta \cos \theta + \cos n \theta \sin \theta)] & = r^{n+1} [ \cos( n \theta + \theta) + i \sin( n \theta + \theta) ] & = r^{n+1} [ \cos( n +1) \theta + i \sin( n+1) \theta ] .

    Powers of Complex Numbers

    Suppose that z= 1+i and we wish to compute z^{10}. Rather than computing (1 + i)^{10} directly, it is much easier to switch to polar coordinates and calculate z^{10} using DeMoivre's Theorem: z^{10} & = (1+i)^{10} & = \left( \sqrt{2} \cis \left( \frac{\pi }{4} \right) \right)^{10} & = ( \sqrt{2}\, )^{10} \cis \left( \frac{5\pi }{2} \right) & = 32 \cis \left( \frac{\pi }{2} \right) & = 32i .

    The multiplicative group of the complex numbers, {\mathbb C}^*, possesses some interesting subgroups. Whereas {\mathbb Q}^* and {\mathbb R}^* have no interesting subgroups of finite order, {\mathbb C}^* has many. We first consider the circle groupGroupcircle, {\mathbb T} = \{ z \in {\mathbb C} : |z| = 1 \}. The following proposition is a direct result of . \mathbb T the circle group

    The circle group is a subgroup of {\mathbb C}^*.

    Although the circle group has infinite order, it has many interesting finite subgroups. Suppose that H = \{ 1, -1, i, -i \}. Then H is a subgroup of the circle group. Also, 1, -1, i, and -i are exactly those complex numbers that satisfy the equation z^4 = 1. The complex numbers satisfying the equation z^n=1 are called the nth roots of unitynth root of unity.

    If z^n = 1, then the nth roots of unity are z = \cis\left( \frac{2 k \pi}{n } \right), where k = 0, 1, \ldots, n-1. Furthermore, the nth roots of unity form a cyclic subgroup of {\mathbb T} of order n

    By DeMoivre's Theorem, z^n = \cis \left( n \frac{2 k \pi}{n } \right) = \cis( 2 k \pi ) = 1. The z's are distinct since the numbers 2 k \pi /n are all distinct and are greater than or equal to 0 but less than 2 \pi. We will leave the proof that the nth roots of unity form a cyclic subgroup of {\mathbb T} as an exercise.

    A generator for the group of the nth roots of unity is called a primitive nth root of unityPrimitive nth root of unity.

    Roots of Unity

    The 8th roots of unity can be represented as eight equally spaced points on the unit circle (). The primitive 8th roots of unity are \omega & = \frac{\sqrt{2}}{2} + \frac{\sqrt{2}}{2} i \omega^3 & = -\frac{\sqrt{2}}{2} + \frac{\sqrt{2}}{2} i \omega^5 & = -\frac{\sqrt{2}}{2} - \frac{\sqrt{2}}{2} i \omega^7 & = \frac{\sqrt{2}}{2} - \frac{\sqrt{2}}{2}i.

    8th roots of unity

    We interrupt this exposition to repeat the previous diagram, wrapped as different figure with a different caption. The TikZ code to produce these diagrams lives in an external file, tikz/cyclic-roots-unity.tex, which is pure text, freed from any need to format for XML processing. So, in particular, there is no need to escape ampersands and angle brackets, nor is there employment of the CDATA mechanism. But the real value is that there is just one version to edit, and any changes will be reflected in both copies.

    Repeat: 8th roots of unity

    Another version of this diagram, authored in , is also included in .

    8th roots of unity, authored in alignments=['se','ne','ne','nw','sw','sw','sw','se'] labels=['1',r'\omega','i',r'\omega^3','-1',r'\omega^5','-i',r'\omega^7'] f(t)=(cos(pi*t/4),sin(pi*t/4)) ${labels[k]}
    Large Powers of Integers

    Computing large powers can be very time-consuming. Just as anyone can compute 2^2 or 2^8, everyone knows how to compute 2^{2^{1000000} }. However, such numbers are so large that we do not want to attempt the calculations; moreover, past a certain point the computations would not be feasible even if we had every computer in the world at our disposal. Even writing down the decimal representation of a very large number may not be reasonable. It could be thousands or even millions of digits long. However, if we could compute something like 2^{37398332 } \pmod{ 46389}, we could very easily write the result down since it would be a number between 0 and 46,388. If we want to compute powers modulo n quickly and efficiently, we will have to be clever.The results in this section are needed only in (not really).

    The first thing to notice is that any number a can be written as the sum of distinct powers of 2; that is, we can write a = 2^{k_1} + 2^{k_2} + \cdots + 2^{k_n}, where k_1 \lt k_2 \lt \cdots \lt k_n. This is just the binary representation of a. For example, the binary representation of 57 is 111001, since we can write 57 = 2^0 + 2^3 + 2^4 + 2^5.

    The laws of exponents still work in {\mathbb Z}_n; that is, if b \equiv a^x \pmod{ n} and c \equiv a^y \pmod{ n}, then bc \equiv a^{x+y} \pmod{ n}. We can compute a^{2^k} \pmod{ n} in k multiplications by computing a^{2^0} \pmod{ n} a^{2^1} \pmod{ n } \vdots a^{2^k} \pmod{ n} . Each step involves squaring the answer obtained in the previous step, dividing by n, and taking the remainder.

    Repeated Squares

    We will compute 271^{321} \pmod{ 481}. Notice that 321 = 2^0 +2^6 + 2^8; hence, computing 271^{321} \pmod{ 481} is the same as computing 271^{2^0 +2^6 + 2^8 } \equiv 271^{2^0} \cdot 271^{2^6} \cdot 271^{2^8} \pmod{481}. So it will suffice to compute 271^{2^i} \pmod{481} where i = 0, 6, 8. It is very easy to see that 271^{2^1} = \mbox{73,441} \equiv 329 \pmod{481}. We can square this result to obtain a value for 271^{2^2} \pmod{481}: 271^{ 2^2} & \equiv (271^{ 2^1})^2 \pmod{ 481} & \equiv (329)^2 \pmod{ 481} & \equiv \mbox{108,241} \pmod{ 481} & \equiv 16 \pmod{ 481} . We are using the fact that (a^{2^n})^2 \equiv a^{2 \cdot 2^n} \equiv a^{ 2^{n+1} } \pmod{ n}. Continuing, we can calculate 271^{ 2^6 } \equiv 419 \pmod{ 481} and 271^{ 2^8 } \equiv 16 \pmod{ 481}. Therefore, 271^{ 321} & \equiv 271^{ 2^0 +2^6 + 2^8 } \pmod{ 481} & \equiv 271^{ 2^0 } \cdot 271^{ 2^6 } \cdot 271^{ 2^8 } \pmod{ 481} & \equiv 271 \cdot 419 \cdot 16 \pmod{ 481} & \equiv \mbox{1,816,784} \pmod{ 481} & \equiv 47 \pmod{ 481} .

    The method of repeated squares will prove to be a very useful tool when we explore RSA cryptography. To encode and decode messages in a reasonable manner under this scheme, it is necessary to be able to quickly compute large powers of integers mod n.

    Programming Exercises

    Write a computer program that will write any decimal number as the sum of distinct powers of 2. What is the largest integer that your program will handle?

    Write a computer program to calculate a^x \pmod{ n} by the method of repeated squares. What are the largest values of n and x that your program will accept?

    References and Suggested Readings Koblitz, N. A Course in Number Theory and Cryptography. 2nd ed. Springer, New York, 1994. Pomerance, C. Cryptology and Computational Number TheoryAn Introduction, in Cryptology and Computational Number Theory, Pomerance, C., ed. Proceedings of Symposia in Applied Mathematics, vol. 42, American Mathematical Society, Providence, RI, 1990. This book gives an excellent account of how the method of repeated squares is used in cryptography.
    ================================================ FILE: examples/sample-book/exercises/cyclic.xml ================================================ Exercises

    Prove or disprove each of the following statements.

    1. All of the generators of {\mathbb Z}_{60} are prime.

    2. U(8) is cyclic.

    3. {\mathbb Q} is cyclic.

    4. If every proper subgroup of a group G is cyclic, then G is a cyclic group.

    5. A group with a finite number of subgroups is finite.

    Find the order of each of the following elements.

    1. 5 \in {\mathbb Z}_{12}

    2. \sqrt{3} \in {\mathbb R}

    3. \sqrt{3} \in {\mathbb R}^\ast

    4. -i \in {\mathbb C}^\ast

    5. 72 in {\mathbb Z}_{240}

    6. 312 in {\mathbb Z}_{471}

    List all of the elements in each of the following subgroups.

    1. The subgroup of {\mathbb Z} generated by 7

    2. The subgroup of {\mathbb Z}_{24} generated by 15

    3. All subgroups of {\mathbb Z}_{12}

    4. All subgroups of {\mathbb Z}_{60}

    5. All subgroups of {\mathbb Z}_{13}

    6. All subgroups of {\mathbb Z}_{48}

    7. The subgroup generated by 3 in U(20)

    8. The subgroup generated by 5 in U(18)

    9. The subgroup of {\mathbb R}^\ast generated by 7

    10. The subgroup of {\mathbb C}^\ast generated by i where i^2 = -1

    11. The subgroup of {\mathbb C}^\ast generated by 2i

    12. The subgroup of {\mathbb C}^\ast generated by (1 + i) / \sqrt{2}

    13. The subgroup of {\mathbb C}^\ast generated by (1 + \sqrt{3}\, i) / 2

    Find the subgroups of GL_2( {\mathbb R }) generated by each of the following matrices.

    1. \displaystyle \begin{pmatrix} 0 & 1 \\ -1 & 0 \end{pmatrix}

    2. \displaystyle \begin{pmatrix} 0 & 1/3 \\ 3 & 0 \end{pmatrix}

    3. \displaystyle \begin{pmatrix} 1 & -1 \\ 1 & 0 \end{pmatrix}

    4. \displaystyle \begin{pmatrix} 1 & -1 \\ 0 & 1 \end{pmatrix}

    5. \displaystyle \begin{pmatrix} 1 & -1 \\ -1 & 0 \end{pmatrix}

    6. \displaystyle \begin{pmatrix} \sqrt{3}/ 2 & 1/2 \\ -1/2 & \sqrt{3}/2 \end{pmatrix}

    Find the order of every element in {\mathbb Z}_{18}.

    Find the order of every element in the symmetry group of the square, D_4.

    What are all of the cyclic subgroups of the quaternion group, Q_8?

    List all of the cyclic subgroups of U(30).

    List every generator of each subgroup of order 8 in {\mathbb Z}_{32}.

    Find all elements of finite order in each of the following groups. Here the \ast indicates the set with zero removed.

    1. {\mathbb Z}

    2. {\mathbb Q}^\ast

    3. {\mathbb R}^\ast

    If a^{24} =e in a group G, what are the possible orders of a?

    Find a cyclic group with exactly one generator. Can you find cyclic groups with exactly two generators? Four generators? How about n generators?

    For n \leq 20, which groups U(n) are cyclic? Make a conjecture as to what is true in general. Can you prove your conjecture?

    Let A = \begin{pmatrix} 0 & 1 \\ -1 & 0 \end{pmatrix} \qquad \text{and} \qquad B = \begin{pmatrix} 0 & -1 \\ 1 & -1 \end{pmatrix} be elements in GL_2( {\mathbb R} ). Show that A and B have finite orders but AB does not.

    Evaluate each of the following.

    1. (3-2i)+ (5i-6)

    2. (4-5i)-\overline{(4i -4)}

    3. (5-4i)(7+2i)

    4. (9-i) \overline{(9-i)}

    5. i^{45}

    6. (1+i)+\overline{(1+i)}

    Convert the following complex numbers to the form a + bi.

    1. 2 \cis(\pi / 6 )

    2. 5 \cis(9\pi/4)

    3. 3 \cis(\pi)

    4. \cis(7\pi/4) /2

    Change the following complex numbers to polar representation.

    1. 1-i

    2. -5

    3. 2+2i

    4. \sqrt{3} + i

    5. -3i

    6. 2i + 2 \sqrt{3}

    Calculate each of the following expressions.

    1. (1+i)^{-1}

    2. (1 - i)^{6}

    3. (\sqrt{3} + i)^{5}

    4. (-i)^{10}

    5. ((1-i)/2)^{4}

    6. (-\sqrt{2} - \sqrt{2}\, i)^{12}

    7. (-2 + 2i)^{-5}

    Prove each of the following statements.

    1. |z| = | \overline{z}|

    2. z \overline{z} = |z|^2

    3. z^{-1} = \overline{z} / |z|^2

    4. |z +w| \leq |z| + |w|

    5. |z - w| \geq | |z| - |w||

    6. |z w| = |z| |w|

    List and graph the 6th roots of unity. What are the generators of this group? What are the primitive 6th roots of unity?

    List and graph the 5th roots of unity. What are the generators of this group? What are the primitive 5th roots of unity?

    Calculate each of the following.

    1. 292^{3171} \pmod{ 582}

    2. 2557^{ 341} \pmod{ 5681}

    3. 2071^{ 9521} \pmod{ 4724}

    4. 971^{ 321} \pmod{ 765}

    Let a, b \in G. Prove the following statements.

    1. The order of a is the same as the order of a^{-1}.

    2. For all g \in G, |a| = |g^{-1}ag|.

    3. The order of ab is the same as the order of ba.

    Let p and q be distinct primes. How many generators does {\mathbb Z}_{pq} have?

    Let p be prime and r be a positive integer. How many generators does {\mathbb Z}_{p^r} have?

    Prove that {\mathbb Z}_{p} has no nontrivial subgroups if p is prime.

    If g and h have orders 15 and 16 respectively in a group G, what is the order of \langle g \rangle \cap \langle h \rangle ?

    Let a be an element in a group G. What is a generator for the subgroup \langle a^m \rangle \cap \langle a^n \rangle?

    Prove that {\mathbb Z}_n has an even number of generators for n \gt 2.

    Suppose that G is a group and let a, b \in G. Prove that if |a| = m and |b| = n with \gcd(m,n) = 1, then \langle a \rangle \cap \langle b \rangle = \{ e \}.

    Let G be an abelian group. Show that the elements of finite order in G form a subgroup. This subgroup is called the torsion subgroup of G.

    Let G be a finite cyclic group of order n generated by x. Show that if y = x^k where \gcd(k,n) = 1, then y must be a generator of G.

    If G is an abelian group that contains a pair of cyclic subgroups of order 2, show that G must contain a subgroup of order 4. Does this subgroup have to be cyclic?

    Let G be an abelian group of order pq where \gcd(p,q) = 1. If G contains elements a and b of order p and q respectively, then show that G is cyclic.

    Prove that the subgroups of \mathbb Z are exactly n{\mathbb Z} for n = 0, 1, 2, \ldots.

    Prove that the generators of {\mathbb Z}_n are the integers r such that 1 \leq r \lt n and \gcd(r,n) = 1.

    Prove that if G has no proper nontrivial subgroups, then G is a cyclic group.

    Prove that the order of an element in a cyclic group G must divide the order of the group.

    Prove that if G is a cyclic group of order m and d \mid m, then G must have a subgroup of order d.

    For what integers n is -1 an nth root of unity?

    If z = r( \cos \theta + i \sin \theta) and w = s(\cos \phi + i \sin \phi) are two nonzero complex numbers, show that zw = rs[ \cos( \theta + \phi) + i \sin( \theta + \phi)].

    Prove that the circle group is a subgroup of {\mathbb C}^*.

    Prove that the nth roots of unity form a cyclic subgroup of {\mathbb T} of order n.

    Let \alpha \in \mathbb T. Prove that \alpha^m =1 and \alpha^n = 1 if and only if \alpha^d = 1 for d = \gcd(m,n).

    Let z \in {\mathbb C}^\ast. If |z| \neq 1, prove that the order of z is infinite.

    Let z =\cos \theta + i \sin \theta be in {\mathbb T} where \theta \in {\mathbb Q}. Prove that the order of z is infinite.

    ================================================ FILE: examples/sample-book/exercises/groups.xml ================================================ Exercises

    Find all x \in {\mathbb Z} satisfying each of the following equations.

    1. 3x \equiv 2 \pmod{7}

    2. 5x + 1 \equiv 13 \pmod{23}

    3. 5x + 1 \equiv 13 \pmod{26}

    4. 9x \equiv 3 \pmod{5}

    5. 5x \equiv 1 \pmod{6}

    6. 3x \equiv 1 \pmod{6}

    (a) 3 + 7 \mathbb Z = \{ \ldots, -4, 3, 10, \ldots \}; (c) 18 + 26 \mathbb Z; (e) 5 + 6 \mathbb Z.

    Which of the following multiplication tables defined on the set G = \{ a, b, c, d \} form a group? Support your answer in each case.

    1. \begin{array}{c|cccc} \circ & a & b & c & d \\ \hline a & a & c & d & a \\ b & b & b & c & d \\ c & c & d & a & b \\ d & d & a & b & c \end{array}

    2. \begin{array}{c|cccc} \circ & a & b & c & d \\ \hline a & a & b & c & d \\ b & b & a & d & c \\ c & c & d & a & b \\ d & d & c & b & a \end{array}

    3. \begin{array}{c|cccc} \circ & a & b & c & d \\ \hline a & a & b & c & d \\ b & b & c & d & a \\ c & c & d & a & b \\ d & d & a & b & c \end{array}

    4. \begin{array}{c|cccc} \circ & a & b & c & d \\ \hline a & a & b & c & d \\ b & b & a & c & d \\ c & c & b & a & d \\ d & d & d & b & c \end{array}

    (a) Not a group; (c) a group.

    Write out Cayley tables for groups formed by the symmetries of a rectangle and for ({\mathbb Z}_4, +). How many elements are in each group? Are the groups the same? Why or why not?

    Describe the symmetries of a rhombus and prove that the set of symmetries forms a group. Give Cayley tables for both the symmetries of a rectangle and the symmetries of a rhombus. Are the symmetries of a rectangle and those of a rhombus the same?

    Describe the symmetries of a square and prove that the set of symmetries is a group. Give a Cayley table for the symmetries. How many ways can the vertices of a square be permuted? Is each permutation necessarily a symmetry of the square? The symmetry group of the square is denoted by D_4.

    Give a multiplication table for the group U(12).

    \begin{array}{c|cccc} \cdot & 1 & 5 & 7 & 11 \\ \hline 1 & 1 & 5 & 7 & 11 \\ 5 & 5 & 1 & 11 & 7 \\ 7 & 7 & 11 & 1 & 5 \\ 11 & 11 & 7 & 5 & 1 \end{array}

    Let S = {\mathbb R} \setminus \{ -1 \} and define a binary operation on S by a \ast b = a + b + ab. Prove that (S, \ast) is an abelian group.

    Give an example of two elements A and B in GL_2({\mathbb R}) with AB \neq BA.

    Pick two matrices. Almost any pair will work.

    Prove that the product of two matrices in SL_2({\mathbb R}) has determinant one.

    Prove that the set of matrices of the form \begin{pmatrix} 1 & x & y \\ 0 & 1 & z \\ 0 & 0 & 1 \end{pmatrix} is a group under matrix multiplication. This group, known as the Heisenberg group, is important in quantum physics. Matrix multiplication in the Heisenberg group is defined by \begin{pmatrix} 1 & x & y \\ 0 & 1 & z \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} 1 & x' & y' \\ 0 & 1 & z' \\ 0 & 0 & 1 \end{pmatrix} = \begin{pmatrix} 1 & x+x' & y+y'+xz' \\ 0 & 1 & z+z' \\ 0 & 0 & 1 \end{pmatrix}.

    Prove that \det(AB) = \det(A) \det(B) in GL_2({\mathbb R}). Use this result to show that the binary operation in the group GL_2({\mathbb R}) is closed; that is, if A and B are in GL_2({\mathbb R}), then AB \in GL_2({\mathbb R}).

    Let {\mathbb Z}_2^n = \{ (a_1, a_2, \ldots, a_n) : a_i \in {\mathbb Z}_2 \}. Define a binary operation on {\mathbb Z}_2^n by (a_1, a_2, \ldots, a_n) + (b_1, b_2, \ldots, b_n) = (a_1 + b_1, a_2 + b_2, \ldots, a_n + b_n). Prove that {\mathbb Z}_2^n is a group under this operation. This group is important in algebraic coding theory.

    Show that {\mathbb R}^{\ast} = {\mathbb R} \setminus \{0 \} is a group under the operation of multiplication.

    Given the groups {\mathbb R}^{\ast} and {\mathbb Z}, let G = {\mathbb R}^{\ast} \times {\mathbb Z}. Define a binary operation \circ on G by (a,m) \circ (b,n) = (ab, m + n). Show that G is a group under this operation.

    Prove or disprove that every group containing six elements is abelian.

    There is a nonabelian group containing six elements.

    Give a specific example of some group G and elements g, h \in G where (gh)^n \neq g^nh^n.

    Look at the symmetry group of an equilateral triangle or a square.

    Give an example of three different groups with eight elements. Why are the groups different?

    The are five different groups of order 8.

    Show that there are n! permutations of a set containing n items.

    Let \sigma = \begin{pmatrix} 1 & 2 & \cdots & n \\ a_1 & a_2 & \cdots & a_n \end{pmatrix} be in S_n. All of the a_is must be distinct. There are n ways to choose a_1, n-1 ways to choose a_2, \ldots, 2 ways to choose a_{n - 1}, and only one way to choose a_n. Therefore, we can form \sigma in n(n - 1) \cdots 2 \cdot 1 = n! ways.

    Show that 0 + a \equiv a + 0 \equiv a \pmod{ n } for all a \in {\mathbb Z}_n.

    Prove that there is a multiplicative identity for the integers modulo n: a \cdot 1 \equiv a \pmod{n}.

    For each a \in {\mathbb Z}_n find an element b \in {\mathbb Z}_n such that a + b \equiv b + a \equiv 0 \pmod{ n}.

    Show that addition and multiplication mod $n$ are well defined operations. That is, show that the operations do not depend on the choice of the representative from the equivalence classes mod n.

    Show that addition and multiplication mod n are associative operations.

    Show that multiplication distributes over addition modulo n: a(b + c) \equiv ab + ac \pmod{n}.

    Let a and b be elements in a group G. Prove that ab^na^{-1} = (aba^{-1})^n for n \in \mathbb Z.

    (aba^{-1})^n & = (aba^{-1})(aba^{-1}) \cdots (aba^{-1}) & = ab(aa^{-1})b(aa^{-1})b \cdots b(aa^{-1})ba^{-1} & = ab^na^{-1}.

    Let U(n) be the group of units in {\mathbb Z}_n. If n \gt 2, prove that there is an element k \in U(n) such that k^2 = 1 and k \neq 1.

    Prove that the inverse of g _1 g_2 \cdots g_n is g_n^{-1} g_{n-1}^{-1} \cdots g_1^{-1}.

    Prove the remainder of : if G is a group and a, b \in G, then the equation xa = b has a unique solution in G.

    Prove .

    Prove the right and left cancellation laws for a group G; that is, show that in the group G, ba = ca implies b = c and ab = ac implies b = c for elements a, b, c \in G.

    Show that if a^2 = e for all elements a in a group G, then G must be abelian.

    Since abab = (ab)^2 = e = a^2 b^2 = aabb, we know that ba = ab.

    Show that if G is a finite group of even order, then there is an a \in G such that a is not the identity and a^2 = e.

    Let G be a group and suppose that (ab)^2 = a^2b^2 for all a and b in G. Prove that G is an abelian group.

    Find all the subgroups of {\mathbb Z}_3 \times {\mathbb Z}_3. Use this information to show that {\mathbb Z}_3 \times {\mathbb Z}_3 is not the same group as {\mathbb Z}_9. (See for a short description of the product of groups.)

    Find all the subgroups of the symmetry group of an equilateral triangle.

    H_1 = \{ id \}, H_2 = \{ id, \rho_1, \rho_2 \}, H_3 = \{ id, \mu_1 \}, H_4 = \{ id, \mu_2 \}, H_5 = \{ id, \mu_3 \}, S_3.

    Compute the subgroups of the symmetry group of a square.

    Let H = \{2^k : k \in {\mathbb Z} \}. Show that H is a subgroup of {\mathbb Q}^*.

    Let n = 0, 1, 2, \ldots and n {\mathbb Z} = \{ nk : k \in {\mathbb Z} \}. Prove that n {\mathbb Z} is a subgroup of {\mathbb Z}. Show that these subgroups are the only subgroups of \mathbb{Z}.

    Let {\mathbb T} = \{ z \in {\mathbb C}^* : |z| =1 \}. Prove that {\mathbb T} is a subgroup of {\mathbb C}^*.

    \begin{pmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{pmatrix} where \theta \in {\mathbb R}. Prove that G is a subgroup of SL_2({\mathbb R}).

    Prove that G = \{ a + b \sqrt{2} : a, b \in {\mathbb Q} \text{ and } a \text{ and } b \text{ are not both zero} \} is a subgroup of {\mathbb R}^{\ast} under the group operation of multiplication.

    The identity of G is 1 = 1 + 0 \sqrt{2}. Since (a + b \sqrt{2}\, )(c + d \sqrt{2}\, ) = (ac + 2bd) + (ad + bc)\sqrt{2}, G is closed under multiplication. Finally, (a + b \sqrt{2}\, )^{-1} = a/(a^2 - 2b^2) - b\sqrt{2}/(a^2 - 2 b^2).

    Let G be the group of 2 \times 2 matrices under addition and H = \left\{ \begin{pmatrix} a & b \\ c & d \end{pmatrix} : a + d = 0 \right\}. Prove that H is a subgroup of G.

    Prove or disprove: SL_2( {\mathbb Z} ), the set of 2 \times 2 matrices with integer entries and determinant one, is a subgroup of SL_2( {\mathbb R} ).

    List the subgroups of the quaternion group, Q_8.

    Prove that the intersection of two subgroups of a group G is also a subgroup of G.

    Prove or disprove: If H and K are subgroups of a group G, then H \cup K is a subgroup of G.

    Look at S_3.

    Prove or disprove: If H and K are subgroups of a group G, then H K = \{hk : h \in H \text{ and } k \in K \} is a subgroup of G. What if G is abelian?

    Let G be a group and g \in G. Show that Z(G) = \{ x \in G : gx = xg \text{ for all } g \in G \} is a subgroup of G. This subgroup is called the center of G. Z(G)the center of a group

    Let a and b be elements of a group G. If a^4b = ba and a^3 = e, prove that ab = ba.

    Since a^4b = ba, it must be the case that b = a^6 b = a^2 b a, and we can conclude that ab = a^3 b a = ba.

    Give an example of an infinite group in which every nontrivial subgroup is infinite.

    If xy = x^{-1} y^{-1} for all x and y in G, prove that G must be abelian.

    Prove or disprove: Every proper subgroup of an nonabelian group is nonabelian.

    Let H be a subgroup of G and C(H) = \{ g \in G : gh = hg \text{ for all } h \in H \}. Prove C(H) is a subgroup of G. This subgroup is called the centralizer of H in G.

    Let H be a subgroup of G. If g \in G, show that gHg^{-1} = \{g^{-1}hg : h\in H\} is also a subgroup of G.

    In each group, how many solutions are there to x^2=e?

    C_n, n odd.

    1

    C_n, n even.

    2

    D_n, n odd.

    n

    D_n, n even.

    n+1

    This is an odd-numbered exercise with tasks.

    What is 1+1?

    2

    This task has subtasks.

    What is 3+3?

    6

    What is 5+5?

    10

    This is an even-numbered exercise with tasks.

    What is 2+2?

    4

    This task has subtasks.

    What is 4+4?

    8

    What is 6+6?

    12

    ================================================ FILE: examples/sample-book/exercises/integers.xml ================================================ Exercises

    Prove that 1^2 + 2^2 + \cdots + n^2 = \frac{n(n + 1)(2n + 1)}{6} for n \in {\mathbb N}.

    The base case, S(1): [1(1 + 1)(2(1) + 1)]/6 = 1 = 1^2 is true.

    Assume that S(k): 1^2 + 2^2 + \cdots + k^2 = [k(k + 1)(2k + 1)]/6 is true. Then 1^2 + 2^2 + \cdots + k^2 + (k + 1)^2 & = [k(k + 1)(2k + 1)]/6 + (k + 1)^2 & = [(k + 1)((k + 1) + 1)(2(k + 1) + 1)]/6, and so S(k + 1) is true. Thus, S(n) is true for all positive integers n.

    Prove that 1^3 + 2^3 + \cdots + n^3 = \frac{n^2(n + 1)^2}{4} for n \in {\mathbb N}.

    Prove that n! \gt 2^n for n \geq 4.

    The base case, S(4): 4! = 24 \gt 16 =2^4 is true. Assume S(k): k! \gt 2^k is true. Then (k + 1)! = k! (k + 1) \gt 2^k \cdot 2 = 2^{k + 1}, so S(k + 1) is true. Thus, S(n) is true for all positive integers n.

    Prove that x + 4x + 7x + \cdots + (3n - 2)x = \frac{n(3n - 1)x}{2} for n \in {\mathbb N}.

    Prove that 10^{n + 1} + 10^n + 1 is divisible by 3 for n \in {\mathbb N}.

    Prove that 4 \cdot 10^{2n} + 9 \cdot 10^{2n - 1} + 5 is divisible by 99 for n \in {\mathbb N}.

    Show that \sqrt[n]{a_1 a_2 \cdots a_n} \leq \frac{1}{n} \sum_{k = 1}^{n} a_k.

    Use induction to prove that 1 + 2 + 2^2 + \cdots + 2^n = 2^{n + 1} - 1 for n \in {\mathbb N}.

    Prove the Leibniz rule for f^{(n)} (x), where f^{(n)} is the nth derivative of f; that is, show that (fg)^{(n)}(x) = \sum_{k = 0}^{n} \binom{n}{k} f^{(k)}(x) g^{(n - k)}(x).

    Follow the proof in .

    Prove that \frac{1}{2}+ \frac{1}{6} + \cdots + \frac{1}{n(n + 1)} = \frac{n}{n + 1} for n \in {\mathbb N}.

    If x is a nonnegative real number, then show that (1 + x)^n - 1 \geq nx for n = 0, 1, 2, \ldots.

    The base case, S(0): (1 + x)^0 - 1 = 0 \geq 0 = 0 \cdot x is true. Assume S(k): (1 + x)^k -1 \geq kx is true. Then (1 + x)^{k + 1} - 1 & = (1 + x)(1 + x)^k -1 & = (1 + x)^k + x(1 + x)^k - 1 & \geq kx + x(1 + x)^k & \geq kx + x & = (k + 1)x, so S(k + 1) is true. Therefore, S(n) is true for all positive integers n.

    Power Sets

    Let X be a set. Define the power set of X, denoted {\mathcal P}(X), to be the set of all subsets of X. \mathcal P(X)power set of X For example, {\mathcal P}( \{a, b\} ) = \{ \emptyset, \{a\}, \{b\}, \{a, b\} \}. For every positive integer n, show that a set with exactly n elements has a power set with exactly 2^n elements.

    Prove that the two principles of mathematical induction stated in are equivalent.

    Show that the Principle of Well-Ordering for the natural numbers implies that 1 is the smallest natural number. Use this result to show that the Principle of Well-Ordering implies the Principle of Mathematical Induction; that is, show that if S \subset {\mathbb N} such that 1 \in S and n + 1 \in S whenever n \in S, then S = {\mathbb N}.

    For each of the following pairs of numbers a and b, calculate \gcd(a,b) and find integers r and s such that \gcd(a,b) = ra + sb.

    1. 14 and 39

    2. 234 and 165

    3. 1739 and 9923

    4. 471 and 562

    5. 23,771 and 19,945

    6. -4357 and 3754

    Let a and b be nonzero integers. If there exist integers r and s such that ar + bs =1, show that a and b are relatively prime.

    Fibonacci Numbers

    The Fibonacci numbers are 1, 1, 2, 3, 5, 8, 13, 21, \ldots. We can define them inductively by f_1 = 1, f_2 = 1, and f_{n + 2} = f_{n + 1} + f_n for n \in {\mathbb N}.

    1. Prove that f_n \lt 2^n.

    2. Prove that f_{n + 1} f_{n - 1} = f^2_n + (-1)^n, n \geq 2.

    3. Prove that f_n = [(1 + \sqrt{5}\, )^n - (1 - \sqrt{5}\, )^n]/ 2^n \sqrt{5}.

    4. Show that \lim_{n \rightarrow \infty} f_n / f_{n + 1} = (\sqrt{5} - 1)/2.

    5. Prove that f_n and f_{n + 1} are relatively prime.

    For and use mathematical induction. Show that f_1 = 1, f_2 = 1, and f_{n + 2} = f_{n + 1} + f_n. Use part . Use part and .

    Let a and b be integers such that \gcd(a,b) = 1. Let r and s be integers such that ar + bs =1. Prove that \gcd(a,s) = \gcd(r,b) = \gcd(r,s) = 1.

    Let x, y \in {\mathbb N} be relatively prime. If xy is a perfect square, prove that x and y must both be perfect squares.

    Use the Fundamental Theorem of Arithmetic.

    Using the division algorithm, show that every perfect square is of the form 4k or 4k + 1 for some nonnegative integer k.

    Suppose that a, b, r, s are pairwise relatively prime and that a^2 + b^2 & = r^2 a^2 - b^2 & = s^2.

    Prove that a, r, and s are odd and b is even.

    Let n \in {\mathbb N}. Use the division algorithm to prove that every integer is congruent mod n to precisely one of the integers 0, 1, \ldots, n-1. Conclude that if r is an integer, then there is exactly one s in {\mathbb Z} such that 0 \leq s \lt n and [r] = [s]. Hence, the integers are indeed partitioned by congruence mod n.

    Define the least common multiple of two nonzero integers a and b, denoted by \lcm(a,b), to be the nonnegative integer m such that both a and b divide m, and if a and b divide any other integer n, then m also divides n. \lcm(m,n)the least common multiple of m and n Prove that any two integers a and b have a unique least common multiple.

    Let S = \{s \in {\mathbb N} : a \mid s, b \mid s \}. Then S \neq \emptyset, since |ab| \in S. By the Principle of Well-Ordering, S contains a least element m. To show uniqueness, suppose that a \mid n and b \mid n for some n \in {\mathbb N}. By the division algorithm, there exist unique integers q and r such that n = mq + r, where 0 \leq r \lt m. Since a and b divide both m, and n, it must be the case that a and b both divide r. Thus, r = 0 by the minimality of m. Therefore, m \mid n.

    If d= \gcd(a, b) and m = \lcm(a, b), prove that dm = |ab|.

    Show that \lcm(a,b) = ab if and only if \gcd(a,b) = 1.

    Prove that \gcd(a,c) = \gcd(b,c) =1 if and only if \gcd(ab,c) = 1 for integers a, b, and c.

    Let a, b, c \in {\mathbb Z}. Prove that if \gcd(a,b) = 1 and a \mid bc, then a \mid c.

    Since \gcd(a,b) = 1, there exist integers r and s such that ar + bs = 1. Thus, acr + bcs = c. Since a divides both bc and itself, a must divide c.

    Let p \geq 2. Prove that if 2^p - 1 is prime, then p must also be prime.

    Prove that there are an infinite number of primes of the form 6n + 5.

    Every prime must be of the form 2, 3, 6n + 1, or 6n + 5. Suppose there are only finitely many primes of the form 6k + 5.

    Prove that there are an infinite number of primes of the form 4n - 1.

    Using the fact that 2 is prime, show that there do not exist integers p and q such that p^2 = 2 q^2. Demonstrate that therefore \sqrt{2} cannot be a rational number.

    ================================================ FILE: examples/sample-book/exercises/sets.xml ================================================ Exercises Warm-up

    This is a meaningless subdivision of the exercises for the sake of testing output.

    Suppose that A & = \{ x : x \in \mathbb N \text{ and } x \text{ is even} \}, B & = \{x : x \in \mathbb N \text{ and } x \text{ is prime}\}, C & = \{ x : x \in \mathbb N \text{ and } x \text{ is a multiple of 5}\}.

    Describe each of the following sets.

    1. A \cap B

    2. B \cap C

    3. A \cup B

    4. A \cap (B \cup C)

    If A = \{ a, b, c \}, B = \{ 1, 2, 3 \}, C = \{ x \}, and D = \emptyset, list all of the elements in each of the following sets.

    1. A \times B

    2. B \times A

    3. A \times B \times C

    4. A \times D

    (a) A \times B = \{ (a,1), (a,2), (a,3), (b,1), (b,2), (b,3), (c,1), (c,2), (c,3) \}; (d) A \times D = \emptyset.

    Find an example of two nonempty sets A and B for which A \times B = B \times A is true.

    Prove A \cup \emptyset = A and A \cap \emptyset = \emptyset.

    Prove A \cup B = B \cup A and A \cap B = B \cap A.

    Prove A \cup (B \cap C) = (A \cup B) \cap (A \cup C).

    If x \in A \cup (B \cap C), then either x \in A or x \in B \cap C. Thus, x \in A \cup B and A \cup C. Hence, x \in (A \cup B) \cap (A \cup C). Therefore, A \cup (B \cap C) \subset (A \cup B) \cap (A \cup C). Conversely, if x \in (A \cup B) \cap (A \cup C), then x \in A \cup B and A \cup C. Thus, x \in A or x is in both B and C. So x \in A \cup (B \cap C) and therefore (A \cup B) \cap (A \cup C) \subset A \cup (B \cap C). Hence, A \cup (B \cap C) = (A \cup B) \cap (A \cup C).

    Prove A \cap (B \cup C) = (A \cap B) \cup (A \cap C).

    Prove A \subset B if and only if A \cap B = A.

    Prove (A \cap B)' = A' \cup B'.

    Prove A \cup B = (A \cap B) \cup (A \setminus B) \cup (B \setminus A).

    (A \cap B) \cup (A \setminus B) \cup (B \setminus A) = (A \cap B) \cup (A \cap B') \cup (B \cap A') = [A \cap (B \cup B')] \cup (B \cap A') = A \cup (B \cap A') = (A \cup B) \cap (A \cup A') = A \cup B.

    Prove (A \cup B) \times C = (A \times C ) \cup (B \times C).

    Prove (A \cap B) \setminus B = \emptyset.

    Prove (A \cup B) \setminus B = A \setminus B.

    Prove A \setminus (B \cup C) = (A \setminus B) \cap (A \setminus C).

    A \setminus (B \cup C) = A \cap (B \cup C)' = (A \cap A) \cap (B' \cap C') = (A \cap B') \cap (A \cap C') = (A \setminus B) \cap (A \setminus C).

    More Exercises

    This is a meaningless subdivision of the exercises for the sake of testing output.

    Prove A \cap (B \setminus C) = (A \cap B) \setminus (A \cap C).

    Prove (A \setminus B) \cup (B \setminus A) = (A \cup B) \setminus (A \cap B).

    Which of the following relations f: {\mathbb Q} \rightarrow {\mathbb Q} define a mapping? In each case, supply a reason why f is or is not a mapping.

    1. \displaystyle f(p/q) = \frac{p+ 1}{p - 2}

    2. \displaystyle f(p/q) = \frac{3p}{3q}

    3. \displaystyle f(p/q) = \frac{p+q}{q^2}

    4. \displaystyle f(p/q) = \frac{3 p^2}{7 q^2} - \frac{p}{q}

    Determine which of the following functions are one-to-one and which are onto. If the function is not onto, determine its range.

    1. f: {\mathbb R} \rightarrow {\mathbb R} defined by f(x) = e^x

    2. f: {\mathbb Z} \rightarrow {\mathbb Z} defined by f(n) = n^2 + 3

    3. f: {\mathbb R} \rightarrow {\mathbb R} defined by f(x) = \sin x

    4. f: {\mathbb Z} \rightarrow {\mathbb Z} defined by f(x) = x^2

    (a) f is one-to-one but not onto. f({\mathbb R} ) = \{ x \in {\mathbb R} : x \gt 0 \}. (c) f is neither one-to-one nor onto. f(\mathbb R) = \{ x : -1 \leq x \leq 1 \}.

    Let f :A \rightarrow B and g : B \rightarrow C be invertible mappings; that is, mappings such that f^{-1} and g^{-1} exist. Show that (g \circ f)^{-1} =f^{-1} \circ g^{-1}.

    1. Define a function f: {\mathbb N} \rightarrow {\mathbb N} that is one-to-one but not onto.

    2. Define a function f: {\mathbb N} \rightarrow {\mathbb N} that is onto but not one-to-one.

    (a) f(n) = n + 1.

    Prove the relation defined on {\mathbb R}^2 by (x_1, y_1 ) \sim (x_2, y_2) if x_1^2 + y_1^2 = x_2^2 + y_2^2 is an equivalence relation.

    Let f : A \rightarrow B and g : B \rightarrow C be maps.

    1. If f and g are both one-to-one functions, show that g \circ f is one-to-one.

    2. If g \circ f is onto, show that g is onto.

    3. If g \circ f is one-to-one, show that f is one-to-one.

    4. If g \circ f is one-to-one and f is onto, show that g is one-to-one.

    5. If g \circ f is onto and g is one-to-one, show that f is onto.

    (a) Let x, y \in A. Then g(f(x)) = (g \circ f)(x) = (g \circ f)(y) = g(f(y)). Thus, f(x) = f(y) and x = y, so g \circ f is one-to-one. (b) Let c \in C, then c = (g \circ f)(x) = g(f(x)) for some x \in A. Since f(x) \in B, g is onto.

    Define a function on the real numbers by f(x) = \frac{x + 1}{x - 1}. What are the domain and range of f? What is the inverse of f? Compute f \circ f^{-1} and f^{-1} \circ f.

    Let f: X \rightarrow Y be a map with A_1, A_2 \subset X and B_1, B_2 \subset Y.

    1. Prove f( A_1 \cup A_2 ) = f( A_1) \cup f( A_2 ).

    2. Prove f( A_1 \cap A_2 ) \subset f( A_1) \cap f( A_2 ). Give an example in which equality fails.

    3. Prove f^{-1}( B_1 \cup B_2 ) = f^{-1}( B_1) \cup f^{-1}(B_2 ), where f^{-1}(B) = \{ x \in X : f(x) \in B \}.

    4. Prove f^{-1}( B_1 \cap B_2 ) = f^{-1}( B_1) \cap f^{-1}( B_2 ).

    5. Prove f^{-1}( Y \setminus B_1 ) = X \setminus f^{-1}( B_1).

    (a) Let y \in f(A_1 \cup A_2). Then there exists an x \in A_1 \cup A_2 such that f(x) = y. Hence, y \in f(A_1) or f(A_2) . Therefore, y \in f(A_1) \cup f(A_2). Consequently, f(A_1 \cup A_2) \subset f(A_1) \cup f(A_2). Conversely, if y \in f(A_1) \cup f(A_2), then y \in f(A_1) or f(A_2). Hence, there exists an x \in A_1 or there exists an x \in A_2 such that f(x) = y. Thus, there exists an x \in A_1 \cup A_2 such that f(x) = y. Therefore, f(A_1) \cup f(A_2) \subset f(A_1 \cup A_2), and f(A_1 \cup A_2) = f(A_1) \cup f(A_2).

    Determine whether or not the following relations are equivalence relations on the given set. If the relation is an equivalence relation, describe the partition given by it. If the relation is not an equivalence relation, state why it fails to be one.

    1. x \sim y in {\mathbb R} if x \geq y

    2. m \sim n in {\mathbb Z} if mn > 0

    3. x \sim y in {\mathbb R} if |x - y| \leq 4

    4. m \sim n in {\mathbb Z} if m \equiv n \pmod{6}

    Define a relation \sim on {\mathbb R}^2 by stating that (a, b) \sim (c, d) if and only if a^2 + b^2 \leq c^2 + d^2. Show that \sim is reflexive and transitive but not symmetric.

    Show that an m \times n matrix gives rise to a well-defined map from {\mathbb R}^n to {\mathbb R}^m.

    Find the error in the following argument by providing a counterexample. The reflexive property is redundant in the axioms for an equivalence relation. If x \sim y, then y \sim x by the symmetric property. Using the transitive property, we can deduce that x \sim x.

    Let X = {\mathbb N} \cup \{ \sqrt{2}\, \} and define x \sim y if x + y \in {\mathbb N}.

    Projective Real Line

    Define a relation on {\mathbb R}^2 \setminus \{ (0,0) \} by letting (x_1, y_1) \sim (x_2, y_2) if there exists a nonzero real number \lambda such that (x_1, y_1) = ( \lambda x_2, \lambda y_2). Prove that \sim defines an equivalence relation on {\mathbb R}^2 \setminus (0,0). What are the corresponding equivalence classes? This equivalence relation defines the projective line, denoted by {\mathbb P}({\mathbb R}) , which is very important in geometry.

    ================================================ FILE: examples/sample-book/ext/datafiles/stackoverflow.csv ================================================ Respondent|Country|JobSatisfaction|UndergradMajor|ConvertedSalary|Exercise|Gender|RaceEthnicity|EducationParents|HoursOutside|Age|LastNewJob|LanguageWorkedWith 51900|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|94455.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|35 - 44 years old|Between 1 and 2 years ago|C;C#;Java;JavaScript;Objective-C;PHP;Swift;HTML;CSS 95836|Argentina|Slightly satisfied|A business discipline (ex. accounting, finance, marketing)|45600.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;CoffeeScript;JavaScript;Ruby;HTML;CSS;Bash/Shell 51710|Germany|Slightly dissatisfied|A social science (ex. anthropology, psychology, political science)|807756.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;Python;TypeScript;HTML;Bash/Shell 44125|United States|Moderately dissatisfied|A social science (ex. anthropology, psychology, political science)|175000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|45 - 54 years old|Between 1 and 2 years ago|JavaScript;Python 35167|United Kingdom|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|90288.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Go;JavaScript;Ruby;HTML;CSS 31721|Japan|Slightly dissatisfied|Information systems, information technology, or system administration|77433.0|3 - 4 times per week|Male|East Asian|They never completed any formal education|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP 36729|Brazil|Moderately dissatisfied|Computer science, computer engineering, or software engineering|16848.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS 38620|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|73433.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Groovy;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 54695|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|82000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;Python;SQL 22810|Turkey|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|25428.0|I don't typically exercise|Male|Middle Eastern|Primary/elementary school|1 - 2 hours|35 - 44 years old|More than 4 years ago|C# 6289|Germany|Extremely satisfied|Information systems, information technology, or system administration|79552.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Java;JavaScript;HTML 48220|Turkey|Moderately dissatisfied|Computer science, computer engineering, or software engineering|12720.0|1 - 2 times per week|Male|Middle Eastern|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;PHP;SQL;HTML;CSS 72519|Belgium|Extremely satisfied|Information systems, information technology, or system administration|44064.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C#;Erlang;Haskell;Java;JavaScript;Matlab;Objective-C;PHP;Python;R;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS 99498|Estonia|Slightly satisfied|Computer science, computer engineering, or software engineering|32316.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Python;SQL;HTML;CSS 42989|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|57170.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;CoffeeScript;F#;JavaScript;SQL;VB.NET;HTML;CSS;Bash/Shell 75468|Ukraine|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|6684.0|Daily or almost every day|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;HTML;CSS 4814|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|50000.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;JavaScript;PHP;Python;SQL;Delphi/Object Pascal;HTML;CSS;Bash/Shell 62436|Argentina|Slightly dissatisfied|Computer science, computer engineering, or software engineering|27336.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Java;JavaScript;Python;HTML;Bash/Shell 54029|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|115000.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|Assembly;C;C++;C#;Java;Bash/Shell 9393|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|70000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|45 - 54 years old|More than 4 years ago|Python;SQL;VB.NET;Visual Basic 6 80650|Australia|Extremely satisfied|Computer science, computer engineering, or software engineering|73576.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Go;Groovy;Java;JavaScript;Python;Kotlin;Delphi/Object Pascal;HTML;CSS 1105|Switzerland|Extremely satisfied|Computer science, computer engineering, or software engineering|99056.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C++;Go;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 20184|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|67313.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 64870|France|Extremely satisfied|Mathematics or statistics|61194.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Matlab;Python;HTML;CSS 50097|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|78000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;HTML;CSS;Bash/Shell 45899|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|83000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|JavaScript;Objective-C;Python;Swift;HTML;CSS 1862|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|71597.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;Java;JavaScript;HTML 41764|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|146000.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Erlang;JavaScript;Ruby;HTML;CSS 566|Canada|Moderately dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|1000000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Go;JavaScript;PHP;SQL;HTML;CSS 86353|United Kingdom|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|34726.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Python;SQL;HTML;CSS 47618|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|57400.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 49562|Mexico|Slightly dissatisfied|Information systems, information technology, or system administration|22560.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;SQL;VB.NET;Visual Basic 6;HTML;CSS 98428|Philippines|Slightly dissatisfied|Computer science, computer engineering, or software engineering|119088.0|3 - 4 times per week|Male|East Asian;South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;Java;JavaScript;Python;TypeScript;HTML;CSS;Bash/Shell 97868|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|67313.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C# 35152|Netherlands|Moderately dissatisfied|Web development or web design|58752.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;HTML;CSS;Bash/Shell 20771|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|26513.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 25005|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|50000.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C#;CoffeeScript;Java;JavaScript;SQL;HTML;CSS 60393|Australia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|115162.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;C++;Python;Rust 43413|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|62486.0|1 - 2 times per week|Female|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Julia;Bash/Shell 4998|Argentina|Slightly dissatisfied|Computer science, computer engineering, or software engineering|23500.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS 20573|Qatar|Moderately satisfied|Computer science, computer engineering, or software engineering|75000.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 69177|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|36716.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C++ 40065|Sri Lanka|Slightly satisfied|Information systems, information technology, or system administration|12000.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;HTML;CSS 58855|United States|Extremely satisfied|Information systems, information technology, or system administration|60000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;TypeScript;HTML;CSS 51948|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|110000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;CoffeeScript;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 62327|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|44916.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C#;Java;JavaScript;SQL;VBA;HTML;CSS;Bash/Shell 84278|Russian Federation|Slightly satisfied|Information systems, information technology, or system administration|25476.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;Python;Bash/Shell 16749|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|143328.0|Daily or almost every day|Female;Non-binary, genderqueer, or gender non-conforming|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Haskell;Java;JavaScript;TypeScript;Ocaml;HTML;CSS;Bash/Shell 100350|The former Yugoslav Republic of Macedonia|Slightly satisfied|Computer science, computer engineering, or software engineering|7152.0|1 - 2 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|18 - 24 years old|Less than a year ago|Assembly;C++;C#;F#;Java;SQL;CSS 71690|Canada|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|72469.0|3 - 4 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Python;HTML;CSS;Bash/Shell 6329|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|72469.0|1 - 2 times per week|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Python;HTML;CSS 76220|United Kingdom|Extremely dissatisfied|Computer science, computer engineering, or software engineering|48616.0|1 - 2 times per week|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 21455|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|70000.0|1 - 2 times per week|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;CoffeeScript;Groovy;Java;JavaScript;Objective-C;Ruby;SQL;Swift;HTML;CSS;Bash/Shell 26541|Italy|Moderately satisfied|Computer science, computer engineering, or software engineering|440592.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;SQL;HTML;CSS 5282|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|70368.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 1859|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|82890.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 94909|Mexico|Extremely satisfied|Computer science, computer engineering, or software engineering|19980.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C#;Java;JavaScript;PHP;SQL;HTML;CSS 91689|Netherlands|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|44064.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 62081|Netherlands|Extremely satisfied|Mathematics or statistics|41124.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 15965|Germany|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|67313.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|3 - 4 hours|35 - 44 years old|Less than a year ago|JavaScript;Ruby;VBA 62544|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|12396.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;PHP;Python;Ruby;SQL;TypeScript;Visual Basic 6;HTML;CSS;Bash/Shell 92573|Japan|Slightly dissatisfied|Computer science, computer engineering, or software engineering|36015.0|Daily or almost every day|Female|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|18 - 24 years old|Less than a year ago|C#;Java;SQL 55775|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|35000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|I've never had a job|C#;Java;JavaScript;Python;HTML;CSS 60088|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|50005.0|3 - 4 times per week|Male|White or of European descent|They never completed any formal education|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 83226|Israel|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|94788.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|Java;JavaScript;TypeScript;HTML;CSS 85616|Sweden|Moderately dissatisfied|Computer science, computer engineering, or software engineering|68868.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Groovy;Java;Python 19271|Sri Lanka|Moderately satisfied|Information systems, information technology, or system administration|11076.0|1 - 2 times per week|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C;JavaScript;Objective-C;PHP;Swift;Kotlin;HTML;CSS 20776|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|120000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;PHP;Python;HTML;CSS;Bash/Shell 61323|India|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|150288.0|I don't typically exercise|Male|South Asian|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Objective-C;Swift;TypeScript;HTML;CSS 92023|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|72209.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;Python;Bash/Shell 29397|New Zealand|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|1000000.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;Perl;Python;SQL;VBA;HTML;Bash/Shell 22450|Germany|Slightly satisfied|Mathematics or statistics|44060.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;Java;JavaScript;Matlab;PHP;Python;R;HTML;CSS 32148|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|58410.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 79753|United Kingdom|Neither satisfied nor dissatisfied|Web development or web design|41671.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Objective-C;Python;Swift;TypeScript;HTML;CSS;Bash/Shell 96505|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|137000.0|1 - 2 times per week|Female|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;Python;HTML;CSS;Bash/Shell 3462|United Kingdom|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|83342.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;Groovy;Java;Python;Ruby;Bash/Shell 86789|Belgium|Extremely satisfied|Computer science, computer engineering, or software engineering|26436.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;Objective-C;PHP;SQL;HTML;Bash/Shell 77857|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|260000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 34236|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|55 - 64 years old|More than 4 years ago|C++;C#;Java;JavaScript;SQL;HTML;CSS 55287|United States|Slightly satisfied|Mathematics or statistics|145000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|35 - 44 years old|Between 1 and 2 years ago|Java;Python;Scala;SQL;Bash/Shell 89804|United States|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|114000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 42366|Bangladesh|Moderately satisfied|Computer science, computer engineering, or software engineering|9552.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Java;JavaScript;PHP;Python;SQL;VBA;VB.NET;HTML;CSS 4505|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|58752.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 34225|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|50005.0|Daily or almost every day|Male;Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 52702|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|57576.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|JavaScript;SQL;HTML;CSS 50169|United Kingdom|Moderately dissatisfied|Web development or web design|241692.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS 69694|United States|Slightly satisfied|I never declared a major|65000.0|I don't typically exercise|Male|White or of European descent|Associate degree|Less than 30 minutes|18 - 24 years old|Less than a year ago|C#;Go;Java;SQL;VB.NET;HTML;CSS;Bash/Shell 83115|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|66674.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;Swift;Kotlin;Bash/Shell 40830|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|45000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C++;C#;Java;JavaScript;Objective-C;SQL;Swift;HTML;CSS 71351|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|83000.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C;C++;C#;Visual Basic 6;Bash/Shell 19495|Belgium|Moderately satisfied|Computer science, computer engineering, or software engineering|30840.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 9180|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|67977.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;PHP;SQL;TypeScript;VB.NET;HTML;CSS 101526|Lithuania|Moderately dissatisfied|Computer science, computer engineering, or software engineering|44064.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python;SQL;CSS;Bash/Shell 34897|Serbia|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|11784.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Swift 28328|Belgium|Slightly satisfied|Computer science, computer engineering, or software engineering|1000000.0|1 - 2 times per week|Female|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Python;SQL;HTML;CSS 14652|Austria|Extremely satisfied|Computer science, computer engineering, or software engineering|85671.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;Swift;HTML;CSS 14638|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|112000.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;C#;Java;Python;SQL;Kotlin;HTML;CSS;Bash/Shell 31224|Australia|Moderately dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|53582.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 90398|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|59880.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;Java;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 73197|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|63642.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java 61385|United Kingdom|Moderately dissatisfied|Computer science, computer engineering, or software engineering|45838.0|I don't typically exercise|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;JavaScript;HTML;CSS;Bash/Shell 71885|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|79552.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Go;Java;JavaScript;Lua;Python;R;SQL;HTML;CSS;Bash/Shell 89480|Canada|Neither satisfied nor dissatisfied|A business discipline (ex. accounting, finance, marketing)|40261.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|CoffeeScript;JavaScript;Ruby;SQL;HTML;CSS 57133|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|75000.0|3 - 4 times per week|Female|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Go;JavaScript;HTML;CSS;Bash/Shell 50575|United Kingdom|Moderately satisfied|Information systems, information technology, or system administration|62507.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;SQL 9757|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|73619.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 7628|France|Extremely dissatisfied|Computer science, computer engineering, or software engineering|110149.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;HTML;CSS 83801|Netherlands|Slightly satisfied|Information systems, information technology, or system administration|61194.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C#;SQL 99551|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|70138.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Go;Java;JavaScript;Objective-C;Python;Swift;TypeScript;Kotlin 13809|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|61194.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Go;Java;JavaScript;Perl;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 45507|Denmark|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|77416.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 57858|Poland|Moderately dissatisfied|A humanities discipline (ex. literature, history, philosophy)|73428.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|CoffeeScript;JavaScript;Ruby;SQL;HTML;CSS 14173|Pakistan|Slightly dissatisfied|Computer science, computer engineering, or software engineering|12000.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;JavaScript;Matlab;Objective-C;PHP;SQL;Swift 87452|United Kingdom|Moderately satisfied|I never declared a major|566724.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;PHP;Python;VB.NET;Delphi/Object Pascal;HTML;CSS 8752|United States|Extremely satisfied|Web development or web design|70000.0|3 - 4 times per week|Male|Native American, Pacific Islander, or Indigenous Australian;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 60397|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|2000000.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;Go;Java;JavaScript;Python;Scala;SQL 27294|France|Moderately satisfied|Computer science, computer engineering, or software engineering|48955.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 21557|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|65000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|Python;HTML 90588|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|152000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C++;Groovy;Java;JavaScript;SQL;Bash/Shell 74127|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|120000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript;Python;Ruby;SQL;TypeScript;Kotlin;Ocaml;HTML;CSS;Bash/Shell 76121|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|74316.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 17443|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|80000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|PHP;SQL;HTML;Bash/Shell 17481|Netherlands|Slightly dissatisfied|Computer science, computer engineering, or software engineering|22030.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;JavaScript;Python;HTML;CSS 101129|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|30597.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Go;Java;JavaScript;R;Rust;Scala;SQL;TypeScript;Kotlin;HTML;CSS;Bash/Shell 73468|Germany|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|75880.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C;C++;C#;JavaScript;PHP;SQL;HTML;Bash/Shell 27037|Denmark|Moderately satisfied|Computer science, computer engineering, or software engineering|78900.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;TypeScript 46999|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;F#;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 59557|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|85000.0|3 - 4 times per week|Male|Black or of African descent|Other doctoral degree (Ph.D, Ed.D., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Java;Python;R;SQL;VBA 36288|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|48000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;Matlab;TypeScript;Kotlin;HTML;CSS;Bash/Shell 34997|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|48300.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 96751|United States|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|100000.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|Less than 30 minutes|45 - 54 years old|More than 4 years ago|Java;JavaScript;PHP;SQL;VBA;HTML;CSS 59125|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|50179.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 42688|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|40000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;Java;JavaScript;SQL;TypeScript;VB.NET;HTML;CSS 50437|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|77100.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;HTML;Bash/Shell 13782|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|123000.0|Daily or almost every day|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|Java;Kotlin 27915|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|108000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Go;JavaScript;SQL;HTML;CSS;Bash/Shell 69925|Canada|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|72469.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Ruby;HTML;CSS 96804|Brazil|Extremely satisfied|Information systems, information technology, or system administration|30504.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Go;Java;PHP 25904|United States|Extremely dissatisfied|Web development or web design|42000.0|Daily or almost every day|Female|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 31547|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|104000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;F#;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 25690|Finland|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|64620.0|Daily or almost every day|Male|White or of European descent|Primary/elementary school|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;SQL 34181|United States|Extremely satisfied|Information systems, information technology, or system administration|28000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 76968|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|97826.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;JavaScript;PHP;SQL;HTML;CSS 68780|Australia|Moderately satisfied|Mathematics or statistics|71976.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|More than 4 years ago|C;C++;Python 47710|United Kingdom|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|194466.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;SQL 74024|Russian Federation|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|24000.0|Daily or almost every day|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|PHP;Python;SQL;Bash/Shell 50677|China|Moderately dissatisfied|Computer science, computer engineering, or software engineering|37400.0|3 - 4 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Java;Lua;Rust;Bash/Shell 78292|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|21133.0|Daily or almost every day|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;TypeScript;CSS 56626|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|50005.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 9541|Iran, Islamic Republic of...|Moderately satisfied|Computer science, computer engineering, or software engineering|23304.0|1 - 2 times per week|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 17867|Pakistan|Moderately satisfied|Computer science, computer engineering, or software engineering|8136.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;Objective-C;Python;Swift 6115|India|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|14089.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 233|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|105000.0|Daily or almost every day|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;Python;HTML;CSS 58499|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|85000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 80960|Bangladesh|Extremely satisfied|Computer science, computer engineering, or software engineering|48000.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;Java;JavaScript;PHP;SQL;HTML;CSS 25948|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|105000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS 83560|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|48955.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 36407|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|68868.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;C++;Python;Bash/Shell 53292|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|126000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;PHP;Python;Bash/Shell 69311|Sweden|Moderately dissatisfied|Computer science, computer engineering, or software engineering|682692.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 62109|Georgia|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|29220.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;SQL;Kotlin;HTML;CSS;Bash/Shell 38148|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Ruby;HTML;CSS 48896|Spain|Slightly dissatisfied|Computer science, computer engineering, or software engineering|1000000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Bash/Shell 632|United States|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|75000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 78373|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|135000.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|45 - 54 years old|Between 2 and 4 years ago|C;C++;Go;Java;JavaScript;Julia;Lua;Perl;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 78062|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|130000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;R;SQL;HTML;CSS 43389|Romania|Moderately satisfied|Information systems, information technology, or system administration|17628.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Python;HTML;CSS 51075|South Africa|Moderately satisfied|Web development or web design|10872.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 58655|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|2000000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;HTML;CSS 45914|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|87800.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;Java;JavaScript;Python;HTML;CSS 54054|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|93000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C;C++ 96458|Lithuania|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|51408.0|1 - 2 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|C;C++;C#;Go;Groovy;Java;JavaScript;Lua;Perl;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 68501|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|400000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C++;Matlab;Python;R;HTML;Bash/Shell 27846|United Kingdom|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|500052.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|Python;Scala;SQL;Bash/Shell 71610|India|Slightly satisfied|Computer science, computer engineering, or software engineering|11268.0|3 - 4 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|C;C++;C#;Java;JavaScript;SQL;VB.NET;HTML;CSS;Bash/Shell 43064|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|90000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Erlang;JavaScript;PHP;SQL;Swift;HTML;CSS;Bash/Shell 79434|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;JavaScript;TypeScript;HTML;CSS 92105|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|100000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|JavaScript;Ruby;TypeScript 91341|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|916764.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;PHP;Python;Scala;SQL;TypeScript;HTML;CSS;Bash/Shell 71899|United States|Moderately satisfied|Information systems, information technology, or system administration|59000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;PHP;R;SQL;HTML;CSS;Bash/Shell 2243|India|Extremely satisfied|Computer science, computer engineering, or software engineering|11724.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|35 - 44 years old|Less than a year ago|Java;JavaScript;Python;Scala;Kotlin;HTML;CSS 42435|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|115000.0|I don't typically exercise|Male|East Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 43236|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|50000.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Ruby;HTML;CSS 99014|Portugal|Moderately dissatisfied|Computer science, computer engineering, or software engineering|39164.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;SQL 84028|India|Moderately satisfied|Computer science, computer engineering, or software engineering|15654.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;Python;HTML;CSS;Bash/Shell 63602|Spain|Moderately dissatisfied|Computer science, computer engineering, or software engineering|70350.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C# 65984|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|82000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 41064|United States|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|25000.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;VBA;HTML;CSS;Bash/Shell 19829|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|12000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;C++;C#;Java;JavaScript;Python;R;SQL;HTML;CSS 36969|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|36716.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Erlang;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 48326|United Kingdom|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|650076.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Matlab;Python;Bash/Shell 9434|Poland|Moderately dissatisfied|Computer science, computer engineering, or software engineering|24696.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 25721|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|24478.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;VB.NET;Visual Basic 6;HTML;CSS 12916|Belarus|Moderately satisfied|Computer science, computer engineering, or software engineering|49308.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Objective-C;Swift 81997|Brazil|Extremely satisfied|Information systems, information technology, or system administration|22452.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 97467|United States|Slightly dissatisfied|A social science (ex. anthropology, psychology, political science)|85000.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Ruby;HTML;CSS;Bash/Shell 91866|Bulgaria|Moderately satisfied|Computer science, computer engineering, or software engineering|9756.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|SQL;Delphi/Object Pascal 48114|South Africa|Moderately satisfied|Computer science, computer engineering, or software engineering|29664.0|I don't typically exercise|Male|Black or of African descent|Primary/elementary school|3 - 4 hours|35 - 44 years old|Between 1 and 2 years ago|C#;JavaScript;Perl;PHP;SQL;HTML;CSS 94729|Brazil|Extremely satisfied|Computer science, computer engineering, or software engineering|74856.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|PHP;Delphi/Object Pascal 70724|Brazil|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|6360.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;PHP;HTML;CSS 79053|Czech Republic|Extremely satisfied|Computer science, computer engineering, or software engineering|73428.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;Go;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 3034|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|60216.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C++;C#;Java;JavaScript;Matlab;Objective-C;PHP;SQL;Delphi/Object Pascal;HTML;CSS 40519|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|72000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|More than 4 years ago|Assembly;C;C#;VB.NET 26919|Denmark|Slightly dissatisfied|Computer science, computer engineering, or software engineering|87768.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Scala;TypeScript;HTML;CSS 90797|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|153000.0|1 - 2 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C;C++;C#;JavaScript;Matlab;Python;SQL;Bash/Shell 73676|India|Moderately satisfied|Computer science, computer engineering, or software engineering|3984.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Java;JavaScript;Swift;TypeScript;HTML;CSS 29857|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|55020.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 91701|France|Moderately satisfied|Computer science, computer engineering, or software engineering|47736.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|Java;Python;Scala;SQL;HTML 99652|Germany|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|20556.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;Java;Matlab;Python;SQL;VBA 7328|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|90000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 73680|Ireland|Moderately dissatisfied|Computer science, computer engineering, or software engineering|352476.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Haskell;JavaScript;PHP;Python;SQL;HTML;CSS 50527|India|Moderately satisfied|Computer science, computer engineering, or software engineering|4128.0|3 - 4 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Java;JavaScript;HTML;CSS 979|Russian Federation|Slightly satisfied|Mathematics or statistics|28800.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C++;Java;JavaScript;PHP;Python;SQL;Visual Basic 6;Delphi/Object Pascal;HTML;CSS;Bash/Shell 42592|Switzerland|Moderately satisfied|Computer science, computer engineering, or software engineering|118872.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|45 - 54 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Java;JavaScript;SQL;TypeScript;VBA;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 97920|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|54755.0|Daily or almost every day|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Python 20179|Hong Kong (S.A.R.)|Moderately satisfied|Computer science, computer engineering, or software engineering|76754.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;Python 20072|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|70000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;SQL;TypeScript;HTML;CSS 51748|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|102000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;SQL 80139|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|141960.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 60418|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|160000.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;HTML;CSS;Bash/Shell 27251|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|36115.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Go;JavaScript;PHP;Python;Rust;SQL;HTML;CSS;Bash/Shell 78798|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|79562.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|Assembly;Perl;Python;Ruby;SQL;HTML;CSS;Bash/Shell 32731|United States|Moderately satisfied|Mathematics or statistics|105000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 96407|Germany|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|96686.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Go;Groovy;Java;Python;Ruby;Scala;SQL;HTML;CSS;Bash/Shell 28910|Singapore|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|59052.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Java;Python 92718|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 28835|Mexico|Extremely satisfied|Computer science, computer engineering, or software engineering|103140.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Primary/elementary school|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;SQL;Delphi/Object Pascal 82654|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|144000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Matlab;HTML;CSS;Bash/Shell 74770|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|125000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;Groovy;JavaScript;PHP;Python;Ruby;SQL;TypeScript;VB.NET;HTML;Bash/Shell 21127|Germany|Slightly satisfied|Mathematics or statistics|29376.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Java;JavaScript;Python;R;SQL;TypeScript;HTML;CSS;Bash/Shell 60626|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|97233.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Ruby;SQL;HTML 11953|Turkey|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|25428.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|Between 2 and 4 years ago|C#;CoffeeScript;Groovy;Java;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS 52894|United States|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|110000.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;Python;Ruby;SQL;HTML;CSS;Bash/Shell 56008|United States|Slightly satisfied|A business discipline (ex. accounting, finance, marketing)|55000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 12951|India|Slightly satisfied|Computer science, computer engineering, or software engineering|25047.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Python 87993|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|39699.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Java;Python;SQL 45781|Netherlands|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|53851.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 68304|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|58752.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;SQL;HTML;CSS 36223|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|160000.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Go;Java;JavaScript;Objective-C;R;Ruby;Rust;Scala;HTML;CSS 13353|France|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|61194.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;Java;Bash/Shell 1422|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|140800.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Go;JavaScript;Python;Scala 27013|Mexico|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|20000.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;C#;JavaScript;SQL;HTML;CSS 81806|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|152794.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|35 - 44 years old|Between 2 and 4 years ago|Python 37503|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|86120.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;Python;Bash/Shell 64322|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|115000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Go;JavaScript;PHP;TypeScript;HTML;CSS;Bash/Shell 74894|Russian Federation|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|33972.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 16235|Argentina|Extremely satisfied|Computer science, computer engineering, or software engineering|38136.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Python;R;SQL;HTML;Bash/Shell 13398|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|Assembly;C;C++;CoffeeScript;Clojure;JavaScript;Lua;Python;Rust;HTML;CSS;Bash/Shell 75170|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|48313.0|1 - 2 times per week|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Go;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 27884|Poland|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|22056.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Perl;SQL 87973|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|140000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript 62138|United States|Moderately dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|70000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;Lua;PHP;Python 50736|Belarus|Extremely satisfied|Information systems, information technology, or system administration|27528.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript;Bash/Shell 95007|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|95000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;CoffeeScript;JavaScript;TypeScript;HTML;CSS 19505|United States|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|95000.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;HTML;CSS 49495|New Zealand|Moderately satisfied|Information systems, information technology, or system administration|1000000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;C#;Java;JavaScript;Objective-C;Swift;HTML;CSS 38099|United Kingdom|Moderately satisfied|Information systems, information technology, or system administration|41671.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|JavaScript;PHP;Python;HTML;CSS;Bash/Shell 48266|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|126000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;Python;TypeScript;HTML;CSS 91534|China|Moderately satisfied|Computer science, computer engineering, or software engineering|32725.0|1 - 2 times per week|Male|East Asian|Primary/elementary school|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;Groovy;Java;JavaScript;SQL;HTML;CSS 8104|Brazil|Extremely dissatisfied|Computer science, computer engineering, or software engineering|11232.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;Objective-C;SQL;TypeScript;HTML;CSS;Bash/Shell 47331|Serbia|Slightly satisfied|Computer science, computer engineering, or software engineering|70500.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|C++;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 15819|India|Moderately satisfied|Computer science, computer engineering, or software engineering|7827.0|I don't typically exercise|Male|South Asian|Primary/elementary school|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Python;TypeScript 15957|Czech Republic|Extremely satisfied|Computer science, computer engineering, or software engineering|20268.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C#;PHP;SQL;HTML;CSS 54501|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|140000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;TypeScript;HTML;CSS 8734|Lithuania|Extremely satisfied|Computer science, computer engineering, or software engineering|23796.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 43219|New Zealand|Moderately satisfied|Computer science, computer engineering, or software engineering|631452.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Go;JavaScript;Python;Rust;SQL;TypeScript;HTML;CSS;Bash/Shell 73138|India|Moderately satisfied|Computer science, computer engineering, or software engineering|6262.0|Daily or almost every day|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;Java;JavaScript;SQL;HTML;CSS 24294|United States|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|195000.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;Python;Scala;SQL 161|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Go;JavaScript;Python;R;SQL;HTML;CSS;Bash/Shell 100021|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|58500.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C;Java;JavaScript;PHP;Python;SQL;HTML;Bash/Shell 12271|Germany|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|63642.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|Erlang;Go;Java;JavaScript;Lua;PHP;Python;Ruby;Scala;Cobol;HTML;CSS;Bash/Shell 95493|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|36720.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;Python;Bash/Shell 88632|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|107152.0|I don't typically exercise|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 13279|Romania|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|33780.0|Daily or almost every day|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;HTML;CSS 76677|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|30708.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C++;Java;JavaScript;Matlab;Python;R;VBA;HTML;CSS 87157|Portugal|Moderately satisfied|Computer science, computer engineering, or software engineering|8808.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Clojure;Haskell;JavaScript;Python;HTML;CSS;Bash/Shell 24815|United Kingdom|Neither satisfied nor dissatisfied|A natural science (ex. biology, chemistry, physics)|69452.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Go;Scala;SQL 86897|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|41671.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|Less than a year ago|C#;F#;JavaScript;PHP;Python;SQL;HTML;CSS 21899|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|89000.0|1 - 2 times per week|Female|White or of European descent|Associate degree|30 - 59 minutes|35 - 44 years old|Less than a year ago|JavaScript;PHP;HTML;CSS 76693|Canada|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|64417.0|I don't typically exercise|Female|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Python;R;SQL;HTML;CSS;Bash/Shell 23199|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|108000.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C++;Objective-C;PHP;Python 97499|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|109000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Objective-C;Scala;SQL;HTML;CSS 71741|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|130000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Python;Scala;TypeScript 12770|United Kingdom|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|101400.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|45 - 54 years old|More than 4 years ago|Assembly;C;Perl;Python;Bash/Shell 1036|Pakistan|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|2172.0|Daily or almost every day|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Java;JavaScript;PHP;SQL;VB.NET;HTML;CSS 25907|United States|Slightly dissatisfied|A business discipline (ex. accounting, finance, marketing)|85000.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python;R;SQL;Delphi/Object Pascal 66091|United Kingdom|Extremely dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|26808.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Haskell;Python 66572|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|52933.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|More than 4 years ago|C++;C#;CoffeeScript;Go;Java;JavaScript;PHP;Python;SQL;HTML;CSS 28783|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|29376.0|I don't typically exercise|Female|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|HTML;CSS 25944|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|36115.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS 7957|France|Moderately satisfied|Computer science, computer engineering, or software engineering|22032.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|55 - 64 years old|Less than a year ago|C;C++;Java;JavaScript;Objective-C;PHP;Python;SQL;Visual Basic 6;HTML;CSS;Bash/Shell 78262|Switzerland|Moderately satisfied|Computer science, computer engineering, or software engineering|93842.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;Go;Perl;Python;SQL;Bash/Shell 35444|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|75000.0|1 - 2 times per week|Male|Black or of African descent;East Asian;Hispanic or Latino/Latina|Associate degree|3 - 4 hours|45 - 54 years old|More than 4 years ago|C#;Java;JavaScript;Perl;Visual Basic 6;HTML;Bash/Shell 62429|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|883428.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 97893|Indonesia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|111880.0|I don't typically exercise|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Scala;SQL;Kotlin;HTML;CSS 97450|India|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|5640.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|I've never had a job|Java;JavaScript;PHP;Python;SQL;HTML;CSS 94978|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|48313.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;PHP;Delphi/Object Pascal;HTML;CSS 48989|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|13619.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C;C++;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 54953|Italy|Slightly dissatisfied|Mathematics or statistics|381852.0|I don't typically exercise|Female|White or of European descent|Primary/elementary school|Less than 30 minutes|25 - 34 years old|Less than a year ago|Python;R;Scala;SQL 63438|Ukraine|Slightly satisfied|Computer science, computer engineering, or software engineering|24000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;JavaScript;Python;SQL;Bash/Shell 21169|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|38000.0|I don't typically exercise|Male|East Asian;South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C;JavaScript;Python;HTML 81659|Chile|Moderately dissatisfied|Information systems, information technology, or system administration|9912.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Over 4 hours|18 - 24 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;SQL;HTML;CSS 20022|United States|Slightly dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|92500.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;SQL;TypeScript 23928|New Zealand|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|74911.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;Groovy;Java;SQL;Bash/Shell 73270|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 58397|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|38893.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;Go;Haskell;Java;JavaScript;PHP;Python;Scala;SQL;HTML;CSS;Bash/Shell 41705|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|74856.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;Java;JavaScript;SQL;TypeScript;Kotlin;Delphi/Object Pascal;HTML;CSS 29213|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|40261.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 16141|Argentina|Slightly dissatisfied|Information systems, information technology, or system administration|50844.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 7888|Iran, Islamic Republic of...|Moderately dissatisfied|Computer science, computer engineering, or software engineering|21648.0|1 - 2 times per week|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Objective-C;Python;Swift 42002|Germany|Extremely satisfied|Information systems, information technology, or system administration|73428.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;JavaScript;Python;R;Ruby;Rust;Scala;SQL;Swift;HTML;CSS;Bash/Shell 19662|Taiwan|Slightly satisfied|Computer science, computer engineering, or software engineering|22368.0|I don't typically exercise|Male|East Asian|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python;Ruby 64228|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|49404.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|Go;Groovy;Java;JavaScript;Python;Scala;Kotlin;HTML;Bash/Shell 79523|Germany|Moderately satisfied|Mathematics or statistics|73433.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|JavaScript;PHP;Python;SQL;Bash/Shell 98224|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|77786.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C# 88422|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|106000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 75860|Austria|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|22032.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Matlab;R 88525|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|145000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;VB.NET;HTML;CSS 75420|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|130000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;TypeScript;HTML;CSS 71276|Sweden|Extremely satisfied|Computer science, computer engineering, or software engineering|224550.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Over 4 hours|25 - 34 years old|Between 2 and 4 years ago|C#;F#;SQL;VB.NET;Bash/Shell 65182|Belarus|Slightly dissatisfied|Computer science, computer engineering, or software engineering|11748.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C# 37265|Brazil|Extremely satisfied|Computer science, computer engineering, or software engineering|52404.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;Scala 2146|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|73000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;Ruby;SQL;VB.NET;HTML;CSS;Bash/Shell 82663|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|96000.0|Daily or almost every day|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;Java;JavaScript;Lua;Perl;PHP;Python;R;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 62307|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|120000.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;C#;SQL 62113|Colombia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|42000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 33973|United States|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|72000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Objective-C;Swift 76763|Czech Republic|Extremely satisfied|Computer science, computer engineering, or software engineering|40536.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;Python;SQL 25030|United States|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|128000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;Groovy;Java;JavaScript;Python;SQL;TypeScript;HTML;CSS 20403|South Africa|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|9888.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 40920|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|160000.0|I don't typically exercise|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;F#;JavaScript;SQL;CSS 94403|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|67560.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;Swift;HTML;CSS;Bash/Shell 2697|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|50769.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|More than 4 years ago|Java;Bash/Shell 69237|India|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|25047.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C# 100877|United States|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|135000.0|Daily or almost every day|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;JavaScript;Python 38373|Canada|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|72469.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|Go;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 30518|Thailand|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|39492.0|3 - 4 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;Python;TypeScript;HTML;CSS 14866|India|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|35379.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;TypeScript;HTML;CSS 83946|Egypt|Moderately satisfied|Computer science, computer engineering, or software engineering|1020.0|I don't typically exercise|Male|Middle Eastern|Associate degree|3 - 4 hours|18 - 24 years old|Less than a year ago|Assembly;C++;C#;Groovy;Java;JavaScript;R;SQL;HTML;CSS 15325|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;SQL;Kotlin 83054|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|35292.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Scala;SQL;HTML;CSS;Bash/Shell 32758|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|20664.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;SQL 57764|United States|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|125000.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;Ruby;Rust;Bash/Shell 85168|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|93000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 16206|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|70000.0|1 - 2 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Java;JavaScript;TypeScript;HTML;CSS 54436|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|82612.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;HTML;CSS 40563|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Java;JavaScript;Ruby;HTML;CSS;Bash/Shell 46381|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|59988.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS 66863|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|95000.0|3 - 4 times per week|Female|Black or of African descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|PHP;Python 1668|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|61194.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Scala;SQL 9106|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|73433.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 97921|Azerbaijan|Slightly satisfied|Computer science, computer engineering, or software engineering|44064.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|Java;SQL 41555|Italy|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|183582.0|3 - 4 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|65 years or older|More than 4 years ago|Assembly;C++;C#;Python;SQL;VBA;VB.NET;Visual Basic 6;Cobol;HTML 56808|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|39164.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;C#;JavaScript;HTML;CSS;Bash/Shell 10539|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|156000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|45 - 54 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Kotlin;HTML;CSS;Bash/Shell 45687|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|94000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|CoffeeScript;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 8628|Germany|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|17628.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C# 42827|United Kingdom|Moderately satisfied|Mathematics or statistics|48616.0|Daily or almost every day|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|R;SQL;VBA 64556|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|52089.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Objective-C;SQL;Swift;Bash/Shell 15629|United Kingdom|Slightly satisfied|Web development or web design|34726.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Go;Groovy;Java;JavaScript;PHP;Python;SQL;HTML;CSS 28282|Italy|Slightly satisfied|Computer science, computer engineering, or software engineering|30597.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;TypeScript;HTML;CSS 16317|Bosnia and Herzegovina|Slightly dissatisfied|Computer science, computer engineering, or software engineering|15024.0|3 - 4 times per week|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|JavaScript;SQL;TypeScript;HTML;CSS 78299|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|80000.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Clojure;JavaScript;SQL;CSS;Bash/Shell 7335|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|125014.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 66330|Romania|Extremely satisfied|Computer science, computer engineering, or software engineering|29376.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 37599|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|36720.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Go;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 565|Latvia|Moderately satisfied|Computer science, computer engineering, or software engineering|31664.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;TypeScript;HTML;CSS 45923|Israel|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|112344.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|C#;Java 46902|South Africa|Moderately satisfied|Computer science, computer engineering, or software engineering|23916.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 42928|Netherlands|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|36716.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C++;C#;Python 26295|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|14089.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;PHP;SQL;Visual Basic 6;HTML;CSS 77641|United States|Moderately satisfied|Mathematics or statistics|95000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|JavaScript;Python;SQL 31097|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|35559.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C++;Java;JavaScript;PHP;SQL 10322|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|110000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 35045|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;VB.NET;HTML;CSS 51528|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|23482.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;SQL 29004|Slovakia|Moderately satisfied|Computer science, computer engineering, or software engineering|35244.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;HTML;Bash/Shell 83837|India|Moderately satisfied|Computer science, computer engineering, or software engineering|13463.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;Matlab 73897|United States|Moderately satisfied|Information systems, information technology, or system administration|60000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|Assembly;C++;C#;Java;JavaScript;Matlab;Python;Ruby;Scala;SQL;HTML;CSS;Bash/Shell 63371|Estonia|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|29376.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;JavaScript;PHP;Python;R;Swift;HTML;CSS 60107|Poland|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|31764.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;F#;Haskell;Java;JavaScript;Python;SQL;TypeScript;Kotlin;HTML;CSS 49408|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|30559.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;C#;SQL;Cobol;Bash/Shell 80854|United States|Moderately dissatisfied|I never declared a major|120000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|55 - 64 years old|Less than a year ago|Java;JavaScript;Objective-C;Ruby;Swift 63075|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|165000.0|3 - 4 times per week|Male|East Asian;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|CoffeeScript;Groovy;Java;JavaScript;Python;SQL;Kotlin;HTML;CSS;Bash/Shell 83339|Iran, Islamic Republic of...|Moderately satisfied|Web development or web design|22860.0|1 - 2 times per week|Non-binary, genderqueer, or gender non-conforming|Middle Eastern|Associate degree|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;SQL;Delphi/Object Pascal;HTML;CSS 86784|Hungary|Moderately satisfied|Computer science, computer engineering, or software engineering|28584.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Objective-C;SQL;TypeScript;HTML;CSS 51733|Canada|Extremely satisfied|Mathematics or statistics|79555.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Java;JavaScript;Perl;SQL;HTML;CSS 55963|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|80000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C;C#;JavaScript;Objective-C;Perl;PHP;Python;R;SQL;HTML;Bash/Shell 13843|Russian Federation|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|16140.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Matlab;VBA;VB.NET;Visual Basic 6;Bash/Shell 47935|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|73433.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;Python;Rust;SQL 13722|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|60948.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C++;C#;JavaScript;SQL;HTML;CSS 88204|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|21300.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;Java;JavaScript;Python;SQL;VB.NET;HTML;CSS 60859|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|538968.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;JavaScript;SQL;TypeScript;HTML;CSS 37586|France|Moderately satisfied|Computer science, computer engineering, or software engineering|73433.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;F#;Java;JavaScript;SQL;HTML;CSS 38441|Colombia|Extremely dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|13500.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;JavaScript;PHP;SQL;HTML;CSS 56436|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|483384.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS 46408|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|45000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C++;C#;JavaScript;Ruby;SQL;HTML;CSS 33179|Spain|Extremely satisfied|Computer science, computer engineering, or software engineering|48955.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C#;Go;JavaScript;R;SQL;TypeScript;HTML;CSS;Bash/Shell 86764|Italy|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|23496.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java 70560|Ireland|Extremely satisfied|Web development or web design|1000000.0|3 - 4 times per week|Male|White or of European descent|They never completed any formal education|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Ruby;SQL;Swift;HTML;CSS 72249|Greece|Moderately dissatisfied|Web development or web design|14688.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 63834|United States|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|720000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|Between 1 and 2 years ago|JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 5935|New Zealand|Moderately satisfied|Computer science, computer engineering, or software engineering|69430.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java;JavaScript;PHP;Python;SQL;VB.NET;HTML;CSS;Bash/Shell 63942|United States|Extremely satisfied|Mathematics or statistics|105000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 93367|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|140000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Some college/university study without earning a degree|Over 4 hours|35 - 44 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Swift;Kotlin;HTML;CSS 55870|Sweden|Slightly dissatisfied|Web development or web design|65868.0|Daily or almost every day|Male|White or of European descent|They never completed any formal education|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Objective-C;PHP;Ruby;HTML;CSS;Bash/Shell 15420|United Kingdom|Extremely dissatisfied|Information systems, information technology, or system administration|41671.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Go;JavaScript;PHP;Python;SQL;TypeScript;Kotlin;HTML;CSS;Bash/Shell 26635|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|I don't typically exercise|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;Python;R;SQL 92152|India|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|31309.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript 85207|Sweden|Moderately satisfied|Information systems, information technology, or system administration|76353.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C++;C#;Java;JavaScript;Objective-C;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 76533|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|95015.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Scala;SQL;Kotlin;HTML;Bash/Shell 29345|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|46533.0|Daily or almost every day|Male|Native American, Pacific Islander, or Indigenous Australian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;Python;Kotlin 18706|Iran, Islamic Republic of...|Moderately dissatisfied|Computer science, computer engineering, or software engineering|13320.0|1 - 2 times per week|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;HTML;CSS 76852|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|0.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Objective-C;PHP;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 74072|United Kingdom|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|51672.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 24638|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|80000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;Perl;Python;SQL;HTML;CSS;Bash/Shell 74593|United States|Moderately dissatisfied|I never declared a major|1800000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;HTML;CSS 3595|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|48616.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;VB.NET;HTML;CSS;Bash/Shell 90796|India|Slightly satisfied|Computer science, computer engineering, or software engineering|6012.0|Daily or almost every day|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Between 2 and 4 years ago|JavaScript;PHP;HTML;CSS 14145|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|102500.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;Kotlin;HTML;CSS 78475|Australia|Moderately satisfied|Information systems, information technology, or system administration|43985.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;SQL;VB.NET;CSS 53176|Australia|Moderately satisfied|Information systems, information technology, or system administration|87971.0|I don't typically exercise|Male|Middle Eastern;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 56840|Sweden|Extremely satisfied|Computer science, computer engineering, or software engineering|70368.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Erlang;Ruby;Scala 45343|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|111123.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|JavaScript;Python;SQL;VBA;Delphi/Object Pascal 29200|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|49200.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;JavaScript;Python;HTML;CSS;Bash/Shell 63063|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|156000.0|I don't typically exercise|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS;Bash/Shell 100663|United States|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|96000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;Go;Groovy;Java;JavaScript;Objective-C;Python;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 54808|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|100000.0|Daily or almost every day|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS;Bash/Shell 1997|Germany|Moderately satisfied|Information systems, information technology, or system administration|60216.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;JavaScript;PHP;SQL;HTML;CSS 30642|Sweden|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|104799.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;Python;R;Scala;SQL;Bash/Shell 21906|Russian Federation|Slightly dissatisfied|Computer science, computer engineering, or software engineering|17616.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;JavaScript;PHP;SQL;HTML;CSS 60364|Canada|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|36235.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;PHP;SQL;Delphi/Object Pascal;HTML;CSS;Bash/Shell 90384|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|91791.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Groovy;Java;Python;SQL;Kotlin;Bash/Shell 34114|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|97680.0|I don't typically exercise|Female|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL 25671|United Kingdom|Slightly satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|66674.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;VBA;Bash/Shell 70751|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;Java;JavaScript;PHP;Python;HTML;CSS;Bash/Shell 13064|Spain|Slightly dissatisfied|Computer science, computer engineering, or software engineering|55075.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;PHP;Python;HTML;CSS;Bash/Shell 42614|India|Extremely dissatisfied|Computer science, computer engineering, or software engineering|9393.0|1 - 2 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;Groovy;Java;Kotlin 8260|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|130000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;C#;JavaScript;Matlab;Ruby;SQL;HTML;CSS;Bash/Shell 81737|Iran, Islamic Republic of...|Moderately satisfied|Computer science, computer engineering, or software engineering|14988.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;C# 73407|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|83800.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 89963|Norway|Slightly dissatisfied|Computer science, computer engineering, or software engineering|79064.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Groovy;Haskell;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 15481|France|Slightly satisfied|Computer science, computer engineering, or software engineering|42836.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;SQL;HTML 69980|United States|Moderately satisfied|Information systems, information technology, or system administration|74000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;SQL;Bash/Shell 24271|Belgium|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|925248.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;TypeScript;HTML;CSS 13675|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|70000.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Haskell;JavaScript;Python;SQL;TypeScript;Kotlin;Ocaml;HTML;CSS;Bash/Shell 22188|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|39164.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;HTML;CSS 48286|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|500052.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;C#;Java;JavaScript;Matlab;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 89668|Austria|Slightly satisfied|Computer science, computer engineering, or software engineering|39648.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;JavaScript;Lua;PHP;SQL;TypeScript;HTML;CSS 58671|Finland|Moderately satisfied|Computer science, computer engineering, or software engineering|66089.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 84019|Canada|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|95015.0|1 - 2 times per week|Male|White or of European descent|They never completed any formal education|30 - 59 minutes|25 - 34 years old|Less than a year ago|Clojure;Java;JavaScript;PHP;Ruby;Scala;SQL;TypeScript;HTML;CSS;Bash/Shell 29406|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|83224.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;C# 54802|France|Moderately satisfied|Computer science, computer engineering, or software engineering|807756.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C#;Java;JavaScript;PHP;SQL;VB.NET;HTML;CSS;Bash/Shell 8375|Bangladesh|Slightly satisfied|Computer science, computer engineering, or software engineering|30000.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;CoffeeScript;Java;JavaScript;Matlab;Perl;PHP;Python;Ruby;SQL;Swift;TypeScript;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 101245|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|79552.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|Python;Ruby;Rust;Bash/Shell 42802|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|140000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Go;Groovy;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 29567|South Africa|Slightly satisfied|Computer science, computer engineering, or software engineering|48.0|Daily or almost every day|Male|South Asian|Primary/elementary school|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C#;JavaScript;SQL;TypeScript;HTML;CSS 86256|United States|Extremely satisfied|I never declared a major|125000.0|Daily or almost every day|Male|Hispanic or Latino/Latina;Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Ruby;HTML;CSS 24541|Australia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|111963.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C++;C#;JavaScript;Lua;SQL;TypeScript;HTML;CSS 7596|Finland|Extremely satisfied|Computer science, computer engineering, or software engineering|69761.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;Python;TypeScript 28442|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|108000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|CoffeeScript;JavaScript;PHP;Python;SQL;HTML;CSS 70216|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Java;JavaScript;Ruby;Swift;HTML;CSS 74451|India|Extremely dissatisfied|Computer science, computer engineering, or software engineering|15811.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Matlab;PHP;Python;SQL 3805|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|48955.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;Java;JavaScript;Objective-C;Python;R;Swift;Visual Basic 6;HTML;CSS;Bash/Shell 61154|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|110000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C;Matlab;Python 8347|Switzerland|Slightly dissatisfied|A natural science (ex. biology, chemistry, physics)|250248.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;Python;SQL;HTML;Bash/Shell 68949|France|Moderately satisfied|Computer science, computer engineering, or software engineering|51408.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;JavaScript;PHP;Ruby;HTML;CSS 10018|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|10400.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Java;JavaScript 95677|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|102000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C++;C#;Java;JavaScript;SQL;VBA;HTML;CSS;Bash/Shell 36277|France|Moderately satisfied|Computer science, computer engineering, or software engineering|56298.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Python 2255|Dominican Republic|Slightly satisfied|Computer science, computer engineering, or software engineering|24000.0|3 - 4 times per week|Male|Black or of African descent;Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 66935|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|75000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;SQL;TypeScript;HTML;CSS 12339|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|47904.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C;C++;Matlab;Python;HTML;CSS;Bash/Shell 28876|United Kingdom|Moderately dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|20836.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 13489|Brazil|Moderately dissatisfied|Computer science, computer engineering, or software engineering|6552.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C#;JavaScript;Python;R;Ruby;HTML;CSS 9968|Greece|Moderately dissatisfied|Computer science, computer engineering, or software engineering|23496.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;C++;Java;JavaScript 75116|Czech Republic|Extremely satisfied|Information systems, information technology, or system administration|69024.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;PHP;Python;SQL;HTML;CSS;Bash/Shell 17069|Sweden|Moderately satisfied|Mathematics or statistics|52404.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Matlab;Objective-C;Python;SQL;VBA 87128|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|29376.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;PHP;HTML;CSS;Bash/Shell 86670|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|40584.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;C#;Java;JavaScript;Matlab;PHP;SQL;TypeScript;HTML;CSS 75820|Spain|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|30597.0|Daily or almost every day|Female|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|R 43725|India|Moderately satisfied|Computer science, computer engineering, or software engineering|12524.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Python;Ruby;SQL;HTML;CSS 60465|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|1500.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C#;Java;JavaScript;Perl;PHP;Python;SQL;HTML;CSS;Bash/Shell 64424|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|41916.0|I don't typically exercise|Female|East Asian;Hispanic or Latino/Latina;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;HTML;CSS;Bash/Shell 99135|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|91800.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java 65264|Romania|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|58752.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|3 - 4 hours|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS 95790|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|82000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;SQL;TypeScript;HTML;CSS 20664|United Kingdom|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|56395.0|3 - 4 times per week|Male|Middle Eastern;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 49222|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|83342.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 71095|Greece|Moderately satisfied|Computer science, computer engineering, or software engineering|33192.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Scala;SQL;HTML;CSS 3088|Turkey|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|50868.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|JavaScript;R;HTML;CSS 6575|United States|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|60000.0|Daily or almost every day|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 25531|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|60000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;JavaScript;Python;HTML;CSS 32882|Poland|Extremely satisfied|Computer science, computer engineering, or software engineering|35292.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;TypeScript;CSS 23924|Poland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|14704.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 68845|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|86000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Perl;Rust;SQL;TypeScript;HTML;CSS;Bash/Shell 88454|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|127000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|C;C++;C#;Clojure;Go;Groovy;Java;JavaScript;SQL;TypeScript;VB.NET;Visual Basic 6;HTML;Bash/Shell 13767|Germany|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|14688.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;C#;Matlab;Bash/Shell 19973|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|100652.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|45 - 54 years old|More than 4 years ago|C;C++;JavaScript;Perl;Python;SQL;HTML;CSS;Bash/Shell 75213|Switzerland|Slightly satisfied|Computer science, computer engineering, or software engineering|106356.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;Java;JavaScript;PHP;R;SQL;VB.NET;HTML 74530|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|135000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;Go;Python;Ruby;HTML;CSS 64951|United States|Extremely satisfied|Mathematics or statistics|140000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|65 years or older|More than 4 years ago|C;C++;C#;Java;VB.NET;Delphi/Object Pascal;HTML;CSS 49683|United Kingdom|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|108345.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;SQL;VB.NET;HTML;CSS 69835|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|85000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;Python;Ruby;Scala;SQL;HTML;CSS;Bash/Shell 16223|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|15000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 21043|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|132000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C++;C#;Java;JavaScript;Objective-C;SQL;Swift;VB.NET;HTML;CSS 93935|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|62412.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C;C++;C#;Java;JavaScript;Lua 76975|Bangladesh|Moderately satisfied|Computer science, computer engineering, or software engineering|17328.0|I don't typically exercise|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;PHP;Python;SQL;HTML;CSS 27005|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|163000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 41122|United States|Moderately satisfied|Mathematics or statistics|65000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|PHP;Python;HTML;CSS;Bash/Shell 93236|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|75880.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;Java 64376|Australia|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|63979.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C++;C#;Java;JavaScript;Lua;Objective-C;PHP;SQL;TypeScript;VBA;VB.NET;HTML;CSS 22857|Greece|Extremely satisfied|Computer science, computer engineering, or software engineering|73428.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C++;C#;Groovy;Java;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 13870|Brazil|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|33684.0|I don't typically exercise|Male|Hispanic or Latino/Latina|They never completed any formal education|Over 4 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;TypeScript;HTML;CSS 89681|Netherlands|Extremely satisfied|Information systems, information technology, or system administration|66084.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;Objective-C;Perl;PHP;SQL;Swift;VBA;HTML;CSS;Bash/Shell 65773|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|55562.0|1 - 2 times per week|Male|Middle Eastern|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;Java;JavaScript;Matlab;PHP;Python;SQL;VBA;VB.NET;Visual Basic 6;Delphi/Object Pascal;HTML;CSS;Bash/Shell 24093|Malaysia|Slightly satisfied|Information systems, information technology, or system administration|29640.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;HTML;CSS 14962|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|20292.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;R;SQL;HTML;CSS;Bash/Shell 75196|Netherlands|Slightly satisfied|Computer science, computer engineering, or software engineering|65352.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;CoffeeScript;Erlang;Groovy;Java;JavaScript;Matlab;Objective-C;PHP;Python;Ruby;SQL;Swift;HTML;CSS;Bash/Shell 76278|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|44916.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;Python;SQL;Swift;HTML;CSS;Bash/Shell 60180|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|78750.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;SQL;CSS;Bash/Shell 69084|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|70985.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;SQL;HTML;CSS 41201|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|58746.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;HTML;CSS 41836|India|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|109581.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Python;R 91450|Israel|Moderately satisfied|Computer science, computer engineering, or software engineering|93960.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Python 45100|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|54000.0|3 - 4 times per week|Male|Black or of African descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 35653|Croatia|Moderately satisfied|Mathematics or statistics|29373.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|Haskell;Python 24202|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|85000.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;SQL;HTML;CSS 75819|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|74000.0|Daily or almost every day|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Ruby;TypeScript;HTML;CSS;Bash/Shell 20880|Iceland|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|62856.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C;C#;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 754|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|80000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C;C++;C#;Python;VB.NET 57449|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|21168.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;TypeScript;HTML;CSS;Bash/Shell 59294|Switzerland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|109483.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Python;Bash/Shell 11006|France|Extremely satisfied|Computer science, computer engineering, or software engineering|31821.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 90683|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|170000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;Java;JavaScript;Lua;Matlab;Python;Ruby 65610|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|59970.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;SQL 6002|Poland|Moderately satisfied|Information systems, information technology, or system administration|49404.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 48952|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|24478.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;SQL;HTML;CSS 19805|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|146000.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C;Go;Java;Perl;Python;SQL;Bash/Shell 30961|Iran, Islamic Republic of...|Extremely satisfied|Computer science, computer engineering, or software engineering|27636.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C++;Python;Bash/Shell 63771|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|55981.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 49234|Jordan|Slightly satisfied|Computer science, computer engineering, or software engineering|15600.0|I don't typically exercise|Male|Middle Eastern;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Objective-C;Swift 89142|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|55000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;Lua;Python;Ruby;Rust;SQL;TypeScript;HTML;CSS;Bash/Shell 2659|Serbia|Moderately dissatisfied|Computer science, computer engineering, or software engineering|44064.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;Objective-C 97902|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|8076.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;C#;Java;JavaScript;Python;Scala;HTML;CSS;Bash/Shell 37626|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|75000.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Java;SQL;Swift;VBA;VB.NET;Visual Basic 6;HTML;CSS 70039|Finland|Moderately satisfied|Computer science, computer engineering, or software engineering|44064.0|1 - 2 times per week|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|Less than a year ago|C++;C#;Java;JavaScript;Matlab;Python;Scala;SQL;HTML;CSS;Bash/Shell 33939|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|68537.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 64138|Bulgaria|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|37500.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C#;Java;JavaScript;PHP;Python;VBA;VB.NET;Visual Basic 6;HTML;CSS 30442|Germany|Extremely satisfied|Information systems, information technology, or system administration|134627.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 86149|United States|Moderately satisfied|Information systems, information technology, or system administration|78200.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 84599|Italy|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|36716.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 19005|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|140000.0|I don't typically exercise|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;TypeScript;Kotlin;HTML;CSS;Bash/Shell 42046|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|165000.0|1 - 2 times per week|Male|East Asian|Some college/university study without earning a degree|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;Python;TypeScript;HTML;CSS 81760|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|95000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|C;Java;JavaScript;Perl;PHP;SQL;HTML;CSS;Bash/Shell 82502|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|58752.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Assembly;C;C++;Hack;Java;JavaScript;Objective-C;PHP;Rust;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 29036|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|36000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Assembly;C;C++;Matlab;Python;SQL;HTML;CSS 35735|Russian Federation|Moderately satisfied|Computer science, computer engineering, or software engineering|74304.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Go;Groovy;Java;JavaScript;Lua;Scala;SQL;TypeScript;HTML;CSS;Bash/Shell 53616|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|42300.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Java;Python;HTML;CSS 40332|India|Extremely satisfied|Computer science, computer engineering, or software engineering|23482.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;Go;Java;JavaScript;Matlab;PHP;Python;R;SQL;HTML;CSS;Bash/Shell 63937|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|90000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;Objective-C;Ruby;Swift;Kotlin;Bash/Shell 53663|Canada|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|32209.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|45 - 54 years old|Between 2 and 4 years ago|Java;SQL;Visual Basic 6 94766|United States|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|200000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|Assembly;C;C++;Python;Bash/Shell 57422|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|66027.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Go;Java;JavaScript;Objective-C;PHP;Python;SQL;Swift;Kotlin;HTML;CSS 95987|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|1000000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Groovy;Java;JavaScript;Objective-C;SQL;Swift;TypeScript;Kotlin;HTML;CSS 53434|France|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|56543.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;Haskell;Python;SQL;Bash/Shell 28845|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|84000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 18841|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|53851.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;HTML;CSS 73618|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|2000000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Python;SQL;Swift;TypeScript;HTML;CSS 11924|Venezuela, Bolivarian Republic of...|Extremely satisfied|Information systems, information technology, or system administration|600.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 76150|Sweden|Extremely satisfied|Computer science, computer engineering, or software engineering|49404.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C# 63262|Germany|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|72209.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Objective-C;TypeScript;HTML;CSS 1759|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|154000.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;Perl;Ruby;SQL;HTML;CSS;Bash/Shell 84550|United States|Moderately satisfied|I never declared a major|100000.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Perl;PHP;Python;HTML;CSS;Bash/Shell 35747|Canada|Slightly satisfied|Computer science, computer engineering, or software engineering|104678.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;PHP;Python;SQL;TypeScript;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 43292|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|100000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;Java;JavaScript;Objective-C;Python;Swift;HTML;CSS;Bash/Shell 6987|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|59880.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;Lua;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 21801|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|121000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 75652|Philippines|Extremely satisfied|Computer science, computer engineering, or software engineering|14652.0|I don't typically exercise|Male|East Asian;South Asian|Associate degree|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;SQL;VBA;VB.NET;Visual Basic 6;Delphi/Object Pascal 47300|Canada|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|72469.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Lua;Python;Bash/Shell 98155|Italy|Moderately dissatisfied|Computer science, computer engineering, or software engineering|22284.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C;C++;Haskell;Java;JavaScript;PHP;Python;SQL;Visual Basic 6;HTML;CSS;Bash/Shell 81920|Armenia|Moderately satisfied|Computer science, computer engineering, or software engineering|23628.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;SQL;HTML;CSS 51944|Russian Federation|Slightly satisfied|Mathematics or statistics|14856.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;Python;SQL;Bash/Shell 14261|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|125014.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 51422|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|103000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Python 7868|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript;Python;R;Scala;TypeScript 19604|United States|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|108252.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Kotlin;HTML;CSS;Bash/Shell 91500|United States|Extremely satisfied|Information systems, information technology, or system administration|88500.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Go;Java;JavaScript;Ruby;SQL;VB.NET;HTML;CSS;Bash/Shell 8570|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|58000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Lua;SQL;HTML;CSS 62203|Ireland|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|61194.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|JavaScript;Python;SQL;HTML;CSS 77965|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|120000.0|I don't typically exercise|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Perl;Python;SQL;HTML;CSS;Bash/Shell 54241|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|53892.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Python;Swift;Kotlin;HTML;CSS;Bash/Shell 51899|Russian Federation|Moderately satisfied|Computer science, computer engineering, or software engineering|20808.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;Scala;SQL 42384|Indonesia|Extremely satisfied|Computer science, computer engineering, or software engineering|107400.0|I don't typically exercise|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;PHP;Python;SQL;VB.NET;Visual Basic 6;Kotlin;HTML;CSS 63202|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|6204.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;Python 35898|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|80000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;Groovy;Java;JavaScript;Objective-C;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 84867|Pakistan|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|11820.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL 71735|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|38820.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;HTML;CSS 54691|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|25047.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript 83990|Brazil|Neither satisfied nor dissatisfied|A business discipline (ex. accounting, finance, marketing)|10476.0|Daily or almost every day|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;HTML;CSS 98776|India|Moderately satisfied|Computer science, computer engineering, or software engineering|28178.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;JavaScript;Python;R 1742|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|160000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;JavaScript;Objective-C;SQL;Swift;HTML;CSS;Bash/Shell 662|Bulgaria|Extremely dissatisfied|A business discipline (ex. accounting, finance, marketing)|12000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 47379|Belgium|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|146868.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Python;VBA;VB.NET;Visual Basic 6 4583|Russian Federation|Slightly satisfied|Information systems, information technology, or system administration|25476.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java;JavaScript;Matlab;PHP;Python;SQL;HTML;CSS;Bash/Shell 2578|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|138904.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 25836|Nigeria|Slightly satisfied|Computer science, computer engineering, or software engineering|13332.0|Daily or almost every day|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|More than 4 years ago|Java;Kotlin;HTML 14757|Poland|Moderately satisfied|Mathematics or statistics|22932.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL 60999|Mexico|Moderately satisfied|Computer science, computer engineering, or software engineering|22560.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 8384|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|29376.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;C#;Go;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 73938|New Zealand|Extremely satisfied|Computer science, computer engineering, or software engineering|40196.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Clojure;Java;JavaScript;Perl;PHP;Python;SQL;TypeScript;Delphi/Object Pascal;HTML;CSS 19156|Uruguay|Moderately satisfied|Computer science, computer engineering, or software engineering|60000.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 27072|Norway|Moderately dissatisfied|Computer science, computer engineering, or software engineering|84165.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;Python;Ruby;Scala;SQL;HTML;CSS;Bash/Shell 22567|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|74550.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS 76423|Taiwan|Slightly satisfied|Computer science, computer engineering, or software engineering|84743.0|I don't typically exercise|Male|East Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C++;C#;Groovy;Java;JavaScript;Python;HTML;Bash/Shell 47039|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|2000000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|55 - 64 years old|More than 4 years ago|Assembly;C;C++;C#;Java;JavaScript;Objective-C;PHP;Python;SQL;Swift;VBA;VB.NET;Delphi/Object Pascal;HTML;CSS;Bash/Shell 10743|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|88119.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Groovy;Java;Python;SQL;TypeScript;Kotlin;HTML;CSS;Bash/Shell 50829|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|1000000.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Python 75243|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|60000.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;Kotlin;HTML;CSS 93360|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|106000.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 40163|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|165000.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 57297|France|Moderately satisfied|Computer science, computer engineering, or software engineering|34269.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;Clojure;Haskell;Java;JavaScript;Python;HTML;CSS 30587|United Kingdom|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|37504.0|I don't typically exercise|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 34801|United States|Moderately satisfied|Information systems, information technology, or system administration|85000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;C#;Go;Java;JavaScript;Matlab;Objective-C;PHP;VBA;Kotlin;HTML;CSS;Bash/Shell 47469|Croatia|Moderately satisfied|Computer science, computer engineering, or software engineering|25656.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 75609|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|59980.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;Lua;Python 38237|Canada|Slightly dissatisfied|Computer science, computer engineering, or software engineering|80521.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C#;Clojure;Erlang;F#;Go;Haskell;JavaScript;Python;Ruby;Rust;VB.NET;Visual Basic 6 35052|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|107964.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|C;C++;Go;JavaScript;Objective-C;Python;SQL;HTML;CSS;Bash/Shell 61282|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|10236.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Matlab;PHP;Python;SQL;HTML;CSS;Bash/Shell 29848|Belgium|Moderately satisfied|Computer science, computer engineering, or software engineering|55686.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;Lua;SQL;HTML;CSS 27109|Canada|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|24156.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript 39791|Philippines|Slightly satisfied|Information systems, information technology, or system administration|6120.0|I don't typically exercise|Male|East Asian;South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;HTML;CSS 39629|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|58000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Java;PHP;Python;HTML;CSS 8559|Ireland|Extremely satisfied|Computer science, computer engineering, or software engineering|90288.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript;R;SQL;TypeScript;Kotlin;HTML;CSS;Bash/Shell 66591|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|94000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Java;JavaScript;Python;HTML;Bash/Shell 96319|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|67069.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java 76379|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|105000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C;C++;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 10062|Malta|Moderately satisfied|Computer science, computer engineering, or software engineering|39776.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 54223|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|90000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C;C++;Python;Bash/Shell 20856|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|103300.0|1 - 2 times per week|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;Groovy;Java;JavaScript;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 83561|India|Slightly satisfied|Computer science, computer engineering, or software engineering|11741.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;SQL;HTML;CSS 64160|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|63896.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;Python;Ruby;HTML;CSS;Bash/Shell 55491|France|Moderately satisfied|Computer science, computer engineering, or software engineering|51403.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Go;Java;JavaScript;Python;Scala;Bash/Shell 8446|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|105000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;F#;Java;JavaScript;SQL;HTML;CSS 29303|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|61752.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Go;PHP;SQL;HTML;CSS;Bash/Shell 86128|Australia|Slightly satisfied|Computer science, computer engineering, or software engineering|57581.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 20763|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|130000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Go;Java;JavaScript;TypeScript;HTML;CSS 99911|Ukraine|Slightly satisfied|Computer science, computer engineering, or software engineering|36000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;CSS 57656|India|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|13306.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;Python;R;TypeScript;HTML;CSS 6181|India|Slightly dissatisfied|Information systems, information technology, or system administration|5640.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;HTML;CSS 76715|Mexico|Slightly dissatisfied|Computer science, computer engineering, or software engineering|5796.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;C++;Objective-C;Swift 90037|United Kingdom|Slightly dissatisfied|A natural science (ex. biology, chemistry, physics)|683412.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C++;C#;JavaScript;PHP;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS 81185|Cuba|Moderately satisfied|Computer science, computer engineering, or software engineering|876.0|Daily or almost every day|Male|Black or of African descent;Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|Between 1 and 2 years ago|C++ 45373|India|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|27708.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;SQL 90276|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|122000.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Groovy;Java;JavaScript;Perl;Python;TypeScript;Bash/Shell 30624|Poland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|21876.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;Go 92258|Canada|Extremely satisfied|A health science (ex. nursing, pharmacy, radiology)|61196.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 52971|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|3757.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 62765|United States|Extremely satisfied|Web development or web design|50000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 88501|Poland|Slightly dissatisfied|Mathematics or statistics|30000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 93045|Bulgaria|Slightly dissatisfied|Computer science, computer engineering, or software engineering|26256.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;Ruby;TypeScript;Kotlin 84335|Bulgaria|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|12000.0|I don't typically exercise|Female|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|PHP;SQL;HTML;CSS 41006|Australia|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|74375.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|Java;JavaScript;SQL 31418|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|56365.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Rust;SQL;TypeScript;HTML;CSS;Bash/Shell 62709|Russian Federation|Extremely satisfied|Computer science, computer engineering, or software engineering|115000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C++;Objective-C;Swift 68114|Netherlands|Slightly satisfied|Computer science, computer engineering, or software engineering|79552.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;Python;Kotlin 95558|Russian Federation|Slightly dissatisfied|Computer science, computer engineering, or software engineering|12.0|I don't typically exercise|Female;Transgender|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 86398|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|15600.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C++;C#;Python;VBA;VB.NET 24186|United States|Moderately satisfied|A health science (ex. nursing, pharmacy, radiology)|120000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;Go;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 63928|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|68000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;Perl;Python;SQL;Swift;TypeScript;Kotlin;HTML;CSS;Bash/Shell 78437|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|95000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript 68457|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;C#;JavaScript;Perl;SQL;TypeScript;HTML;CSS;Bash/Shell 87207|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Assembly;C#;Matlab;Bash/Shell 89623|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;Objective-C;Python;Bash/Shell 15827|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|170000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Groovy;Java;JavaScript;Objective-C;Python;Ruby;SQL;Swift;HTML;CSS;Bash/Shell 76384|United Kingdom|Slightly satisfied|Mathematics or statistics|46498.0|1 - 2 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C# 31770|Germany|Moderately satisfied|Information systems, information technology, or system administration|61194.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;SQL 68677|Russian Federation|Moderately satisfied|Web development or web design|17088.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;JavaScript;Lua;Perl;PHP;SQL;HTML;CSS;Bash/Shell 98051|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|44400.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript 54992|United Kingdom|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|55006.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;SQL;VBA;VB.NET;HTML;CSS 76940|Brazil|Slightly dissatisfied|Computer science, computer engineering, or software engineering|811000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;JavaScript;Ruby;SQL;HTML;CSS 9042|Russian Federation|Moderately satisfied|Information systems, information technology, or system administration|37152.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;HTML;CSS 18947|Maldives|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|15588.0|3 - 4 times per week|Female|South Asian|Primary/elementary school|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;SQL;HTML;CSS 50503|Germany|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|43320.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;Java;Matlab;Python;Bash/Shell 37946|Portugal|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|18360.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;SQL;VBA;VB.NET;Visual Basic 6 40193|United States|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|80000.0|I don't typically exercise|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;Matlab;Python 21258|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|16000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;Java;JavaScript;Python 99474|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|70000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Perl;Python;HTML;CSS 42902|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|109200.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Java;JavaScript;PHP;Python;SQL;Bash/Shell 59582|Colombia|Slightly satisfied|Computer science, computer engineering, or software engineering|16872.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;Groovy;Java;JavaScript;Python;SQL;TypeScript;Cobol;HTML;CSS;Bash/Shell 99441|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|55562.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|55 - 64 years old|Less than a year ago|Assembly;C;C++;C#;HTML;Bash/Shell 12166|India|Moderately satisfied|Computer science, computer engineering, or software engineering|4692.0|3 - 4 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Between 1 and 2 years ago|Swift 13006|Italy|Slightly satisfied|Computer science, computer engineering, or software engineering|30597.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C++;Java;JavaScript;Lua;PHP;Python;SQL;HTML;CSS;Bash/Shell 42202|Argentina|Slightly satisfied|Information systems, information technology, or system administration|20340.0|I don't typically exercise|Female|Hispanic or Latino/Latina;White or of European descent|Professional degree (JD, MD, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Haskell;Java;JavaScript;Objective-C;Python;Swift;TypeScript;Kotlin;HTML;CSS;Bash/Shell 94706|Lebanon|Slightly dissatisfied|Computer science, computer engineering, or software engineering|21384.0|I don't typically exercise|Female|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Java;Matlab;R;Swift;Cobol;HTML;CSS 77558|Austria|Slightly satisfied|Computer science, computer engineering, or software engineering|35688.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;JavaScript;Python;Bash/Shell 86195|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|50000.0|Daily or almost every day|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;SQL;HTML;CSS 52440|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|44449.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;Matlab;Python;Ruby;HTML;CSS;Bash/Shell 95199|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|69000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Java;Bash/Shell 57989|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|63000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;HTML;CSS 26999|United States|Slightly dissatisfied|A humanities discipline (ex. literature, history, philosophy)|175000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Groovy;Java;HTML;Bash/Shell 12026|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|128000.0|I don't typically exercise|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;Python 63243|Poland|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|15180.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS 33018|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|54336.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Haskell;Java;JavaScript;Scala;SQL;TypeScript;HTML;CSS;Bash/Shell 74694|Colombia|Moderately dissatisfied|Computer science, computer engineering, or software engineering|29520.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;HTML 60299|Germany|Slightly dissatisfied|Web development or web design|22032.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 48153|France|Moderately dissatisfied|Computer science, computer engineering, or software engineering|36716.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Clojure;Java;JavaScript;Python;TypeScript;Bash/Shell 95880|India|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|5260.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C++;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 90296|Israel|Moderately satisfied|Computer science, computer engineering, or software engineering|129900.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|Clojure;Groovy;JavaScript;Python;Ruby;Bash/Shell 59039|Netherlands|Moderately satisfied|Information systems, information technology, or system administration|91791.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;SQL;HTML;CSS 12403|United States|Moderately satisfied|Information systems, information technology, or system administration|83200.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 46195|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|42348.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript 54437|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|54336.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;JavaScript;PHP;Python;TypeScript;HTML;CSS 10113|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|235000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Assembly;C;C++;JavaScript;Objective-C;Python;Swift;HTML;CSS 12713|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|41124.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|PHP;SQL;HTML;CSS 22558|Turkey|Extremely satisfied|Computer science, computer engineering, or software engineering|146865.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;C#;JavaScript;Objective-C;PHP;Python;VB.NET 11375|Dominican Republic|Moderately dissatisfied|Computer science, computer engineering, or software engineering|16860.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Some college/university study without earning a degree|Over 4 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;HTML 3337|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|84165.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|C#;SQL;Delphi/Object Pascal;HTML;CSS 58940|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|5088.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;SQL;VB.NET;HTML 62937|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|25000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;Perl;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 70203|Germany|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|58752.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 42068|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|275000.0|I don't typically exercise|Male|East Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Assembly;C;Java;Objective-C 46104|Czech Republic|Slightly satisfied|Computer science, computer engineering, or software engineering|27900.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 55152|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|170000.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java;Kotlin 17901|Belgium|Moderately dissatisfied|Computer science, computer engineering, or software engineering|38184.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 66005|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|131000.0|3 - 4 times per week|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;Python;TypeScript;Visual Basic 6;HTML;CSS;Bash/Shell 32349|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|91791.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;SQL;Bash/Shell 13253|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|88119.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;Java;Objective-C;Python;SQL;Bash/Shell 71877|Sweden|Moderately dissatisfied|Mathematics or statistics|56292.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;Haskell;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 62587|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|9424.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Between 2 and 4 years ago|Objective-C;Swift 77234|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|41000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;VB.NET;HTML;CSS 56304|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|38893.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 101567|Australia|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|111963.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;SQL;Bash/Shell 73781|United States|Extremely satisfied|Information systems, information technology, or system administration|90000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 59609|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;VB.NET;HTML;CSS 33066|France|Slightly satisfied|Computer science, computer engineering, or software engineering|39164.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;Go;Java;JavaScript;PHP;Scala;TypeScript;Ocaml;HTML;CSS;Bash/Shell 76128|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|104030.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Go;JavaScript;PHP;Python;R;SQL;HTML;CSS;Bash/Shell 5419|Turkey|Extremely satisfied|Mathematics or statistics|600000.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 80769|Slovenia|Slightly satisfied|Computer science, computer engineering, or software engineering|22032.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;Java;PHP;SQL;VBA;VB.NET;HTML;CSS 19051|United Kingdom|Moderately dissatisfied|Computer science, computer engineering, or software engineering|34726.0|3 - 4 times per week|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;Swift;HTML 21021|Greece|Moderately satisfied|Computer science, computer engineering, or software engineering|46992.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;SQL 48564|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|61580.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS 12707|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|54755.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Matlab;Python;Bash/Shell 57240|Germany|Slightly satisfied|A social science (ex. anthropology, psychology, political science)|36716.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 44654|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|34726.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;C#;Java;JavaScript;Matlab;Python;Bash/Shell 64092|Sweden|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|93420.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;Matlab;SQL;VB.NET;HTML;CSS 26973|United States|Extremely dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|68000.0|I don't typically exercise|Female|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|HTML;CSS 75591|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|64417.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;SQL;VBA;VB.NET;Visual Basic 6;Delphi/Object Pascal;HTML;CSS 9287|Australia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|87971.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|C++;C#;JavaScript;SQL;VB.NET;HTML;CSS;Bash/Shell 87545|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|135000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;C;Go;Java;JavaScript;Lua;Python;Ruby;Rust;Scala;SQL;HTML;CSS;Bash/Shell 98849|Sweden|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|74856.0|I don't typically exercise|Male|White or of European descent|Associate degree|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C++;C#;Python 50530|Russian Federation|Moderately satisfied|Computer science, computer engineering, or software engineering|36084.0|I don't typically exercise|Female|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;Python;HTML;CSS;Bash/Shell 11814|Portugal|Moderately satisfied|Computer science, computer engineering, or software engineering|30840.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;HTML 89307|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|73433.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Java;Scala;Kotlin 21804|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|More than 4 years ago|Java;JavaScript;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 9933|Pakistan|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|11928.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 87614|France|Extremely satisfied|Computer science, computer engineering, or software engineering|97910.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;Bash/Shell 14793|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 30224|United States|Slightly satisfied|Mathematics or statistics|132000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;Ruby;CSS 55276|Italy|Moderately dissatisfied|Computer science, computer engineering, or software engineering|33657.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;HTML;CSS 88901|Japan|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|37812.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;CoffeeScript;Go;Java;JavaScript;Objective-C;PHP;Python;Ruby;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 96731|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|4740.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;PHP;Python;SQL;Swift;Cobol;HTML;CSS 32179|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|160000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|C;C++;Java;JavaScript;Perl;PHP;Ruby;Rust;Scala;HTML;CSS;Bash/Shell 33803|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|250000.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Ruby;HTML;CSS 83190|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|95462.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Objective-C;Python;Ruby;Swift 65782|Russian Federation|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|61992.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;SQL 25565|India|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|19568.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Python;R;VBA 80703|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|14400.0|3 - 4 times per week|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 63405|Thailand|Moderately satisfied|Computer science, computer engineering, or software engineering|7524.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|Go;JavaScript;PHP;Python;Ruby;HTML 63114|Czech Republic|Moderately satisfied|Information systems, information technology, or system administration|29376.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Java 42749|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|65000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C;C++;C#;Java;Python;SQL;VBA;VB.NET 70448|United Kingdom|Extremely satisfied|Mathematics or statistics|69452.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|JavaScript;Python;SQL;TypeScript;HTML;CSS 96450|Poland|Neither satisfied nor dissatisfied|A natural science (ex. biology, chemistry, physics)|59988.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Go;JavaScript;Python;SQL;HTML;CSS 89392|United States|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|90000.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 87160|Israel|Moderately satisfied|Computer science, computer engineering, or software engineering|88224.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C++;C#;Java;JavaScript;SQL;TypeScript;Visual Basic 6;HTML;CSS;Bash/Shell 83898|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|18785.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Erlang;JavaScript;Python;R;HTML;CSS 74443|India|Slightly satisfied|Computer science, computer engineering, or software engineering|10175.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|JavaScript;TypeScript;HTML;CSS 3225|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|62418.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C#;Groovy;Java;Objective-C;Rust;Scala;SQL;TypeScript;VBA;Kotlin;HTML;CSS;Bash/Shell 69151|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|61194.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Go;Java;JavaScript;SQL;Kotlin;HTML;CSS;Bash/Shell 81460|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|13872.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;Java;JavaScript;HTML;CSS 49856|Norway|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|63762.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;TypeScript;HTML 73628|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|95000.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript 94405|United Kingdom|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|56951.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 44672|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|133000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;Java;JavaScript;Matlab;Python;HTML;CSS;Bash/Shell 13496|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|129000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C#;Objective-C;Swift;Bash/Shell 25950|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|46507.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Java;Python;TypeScript 59871|United Kingdom|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|55562.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 60380|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|185000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;CoffeeScript;Java;JavaScript;Perl;PHP;Python;SQL;TypeScript;VBA;HTML;CSS;Bash/Shell 67897|India|Moderately satisfied|Computer science, computer engineering, or software engineering|11268.0|I don't typically exercise|Male|South Asian|Primary/elementary school|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;PHP;SQL;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 72422|Ukraine|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|18000.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;Clojure;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 21772|Russian Federation|Moderately satisfied|Computer science, computer engineering, or software engineering|28656.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;SQL;HTML;CSS 41981|India|Moderately satisfied|Computer science, computer engineering, or software engineering|7984.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|SQL 80258|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|20351.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Java;JavaScript;R;Scala;SQL;TypeScript 27245|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|190000.0|1 - 2 times per week|Male|East Asian;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C;C++;Java;Python;Bash/Shell 64672|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|23808.0|3 - 4 times per week|Female|Hispanic or Latino/Latina|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java 98427|Belgium|Moderately satisfied|Computer science, computer engineering, or software engineering|33780.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C++;C#;Java;HTML;CSS 28588|Romania|Moderately satisfied|Information systems, information technology, or system administration|48955.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|SQL 67274|Malta|Moderately satisfied|Computer science, computer engineering, or software engineering|22032.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;Java;Python 81522|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|174000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Go;Java;JavaScript;HTML;CSS;Bash/Shell 89855|Germany|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|61680.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|45 - 54 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;Perl;PHP;SQL;HTML;CSS;Bash/Shell 61348|Germany|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|46992.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|R 43880|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|400044.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;Java;JavaScript;PHP;SQL;HTML;CSS 91547|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|86676.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS 52029|United States|Moderately satisfied|Information systems, information technology, or system administration|124500.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|JavaScript;Perl;SQL;HTML;CSS;Bash/Shell 67308|Colombia|Slightly satisfied|Information systems, information technology, or system administration|7176.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;SQL 4784|Lithuania|Moderately satisfied|Computer science, computer engineering, or software engineering|42504.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP 65690|Canada|Slightly dissatisfied|Computer science, computer engineering, or software engineering|48313.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C;Go;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 3878|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|122100.0|I don't typically exercise|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;HTML;CSS 91650|India|Moderately satisfied|Computer science, computer engineering, or software engineering|3500.0|Daily or almost every day|Male|East Asian|They never completed any formal education|3 - 4 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;Python;HTML;CSS 62947|Turkey|Moderately satisfied|Computer science, computer engineering, or software engineering|26544.0|I don't typically exercise|Male|Middle Eastern;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;HTML;CSS 39517|United Kingdom|Slightly dissatisfied|Web development or web design|52783.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS 82665|Turkey|Slightly dissatisfied|Computer science, computer engineering, or software engineering|38148.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|35 - 44 years old|Less than a year ago|C#;Go;JavaScript;Ruby 11342|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|33120.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Java;Kotlin 69446|Canada|Extremely dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|112730.0|1 - 2 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|Groovy;Java;Bash/Shell 97228|Latvia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|29376.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C#;JavaScript;HTML;CSS 71761|India|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|5636.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Python;HTML;CSS 64513|United Kingdom|Extremely satisfied|Mathematics or statistics|33615.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;SQL;TypeScript;HTML;CSS 51916|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|107000.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|55 - 64 years old|More than 4 years ago|C;C#;JavaScript;Julia;Objective-C;SQL;TypeScript;HTML 760|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|99468.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;Go;Groovy;Java;JavaScript;Objective-C;Python;Ruby;Swift;Kotlin;HTML;CSS;Bash/Shell 23513|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|66000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;Bash/Shell 24905|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|31764.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;C# 67756|Pakistan|Moderately satisfied|Computer science, computer engineering, or software engineering|9756.0|1 - 2 times per week|Female|Middle Eastern;South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;Java;JavaScript;Python;HTML;CSS 95633|United States|Moderately dissatisfied|A social science (ex. anthropology, psychology, political science)|95000.0|3 - 4 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Python;SQL;TypeScript;HTML;CSS 76889|Nigeria|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|5004.0|I don't typically exercise|Male|Black or of African descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 74425|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|76000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;JavaScript;Rust;Bash/Shell 66673|United States|Slightly satisfied|Information systems, information technology, or system administration|117000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Java;Perl;SQL;Bash/Shell 37862|Australia|Extremely satisfied|Computer science, computer engineering, or software engineering|112762.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Python;SQL;TypeScript;HTML;CSS 28600|United Kingdom|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|62507.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Python;Ruby;Scala;Kotlin 48883|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|35244.0|3 - 4 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|More than 4 years ago|Groovy;Java;JavaScript 13234|Hungary|Slightly satisfied|Computer science, computer engineering, or software engineering|40392.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;C++;Java;JavaScript;Lua;Perl;SQL 39646|United States|Slightly dissatisfied|A social science (ex. anthropology, psychology, political science)|1164000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;HTML;CSS;Bash/Shell 95524|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|102000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;Python;SQL;TypeScript;VB.NET;HTML;CSS;Bash/Shell 81448|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|125014.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Groovy;Java;Python;Scala;HTML;CSS;Bash/Shell 327|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|23440.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;VBA;VB.NET;Visual Basic 6;HTML 70748|Ireland|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|44060.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Haskell;Java;Matlab;Ruby;Scala;Bash/Shell 34422|Iran, Islamic Republic of...|Moderately dissatisfied|Information systems, information technology, or system administration|36000.0|I don't typically exercise|Male|Middle Eastern|They never completed any formal education|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java 53513|Italy|Moderately dissatisfied|Computer science, computer engineering, or software engineering|29373.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;VBA;HTML;CSS;Bash/Shell 19630|Italy|Moderately dissatisfied|Computer science, computer engineering, or software engineering|64866.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Groovy;Java;Python;SQL;Cobol;Bash/Shell 96390|South Africa|Slightly satisfied|Computer science, computer engineering, or software engineering|54384.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;TypeScript;HTML;CSS 48420|Czech Republic|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|27804.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Python;VBA;Bash/Shell 75954|Denmark|Moderately satisfied|Mathematics or statistics|49308.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Matlab;Python;R;Bash/Shell 37201|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|47000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 54106|Netherlands|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|68537.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;Scala;SQL;Swift;HTML;CSS 95701|United States|Slightly dissatisfied|I never declared a major|90000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;HTML;CSS;Bash/Shell 10317|Portugal|Slightly satisfied|Computer science, computer engineering, or software engineering|14688.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 39800|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|95000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Python;SQL;CSS 22566|Canada|Moderately dissatisfied|Computer science, computer engineering, or software engineering|96626.0|I don't typically exercise|Female|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 66207|United Kingdom|Moderately dissatisfied|Computer science, computer engineering, or software engineering|38893.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;HTML;CSS 66788|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|118068.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;Ruby;Kotlin 11559|Switzerland|Extremely satisfied|Computer science, computer engineering, or software engineering|83416.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 88541|Poland|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|63516.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Python;R;Scala 24620|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|76514.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Swift 54979|Qatar|Slightly dissatisfied|Computer science, computer engineering, or software engineering|120000.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 53442|India|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|18780.0|Daily or almost every day|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|PHP;Python;SQL;HTML;CSS;Bash/Shell 13237|Canada|Slightly dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|48313.0|Daily or almost every day|Female|Native American, Pacific Islander, or Indigenous Australian;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 46824|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|3756.0|I don't typically exercise|Male|South Asian|They never completed any formal education|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 90267|United States|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|2000000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|55 - 64 years old|Less than a year ago|C;Go;Perl;PHP;SQL;Bash/Shell 97711|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|79973.0|3 - 4 times per week|Male|East Asian;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Ruby;HTML;CSS 47043|Japan|Moderately dissatisfied|Information systems, information technology, or system administration|54023.0|Daily or almost every day|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|CoffeeScript;JavaScript;PHP;Ruby;HTML;CSS;Bash/Shell 78240|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|63642.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;Python;R;SQL;TypeScript;HTML;CSS 27054|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|135000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|CoffeeScript;Haskell;Java;JavaScript;Ruby;HTML;CSS;Bash/Shell 20656|United States|Slightly satisfied|A business discipline (ex. accounting, finance, marketing)|70000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS 85667|United Republic of Tanzania|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|37500.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS 4746|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|73433.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;Java;JavaScript;SQL;HTML 78606|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|20000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;Lua;Matlab;Python;Bash/Shell 37621|India|Slightly satisfied|Computer science, computer engineering, or software engineering|4692.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;Java;JavaScript;PHP;SQL;VB.NET;HTML;CSS 30340|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|1000000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;PHP;SQL;HTML 35729|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|9706.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Objective-C;Swift 95852|Ukraine|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|18000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;SQL 10997|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|130000.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;Groovy;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 78878|India|Moderately satisfied|Computer science, computer engineering, or software engineering|7200.0|I don't typically exercise|Male|East Asian|Primary/elementary school|Over 4 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 95197|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|68500.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 58025|Australia|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|123959.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;Objective-C;Ruby;Swift;Bash/Shell 6660|Romania|Extremely dissatisfied|Computer science, computer engineering, or software engineering|58752.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Swift;Kotlin 66063|Myanmar|Slightly dissatisfied|Computer science, computer engineering, or software engineering|6000.0|3 - 4 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Groovy;Java;JavaScript;HTML;CSS;Bash/Shell 96035|Denmark|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|52597.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Swift;Ocaml;HTML;CSS 96482|France|Moderately satisfied|Computer science, computer engineering, or software engineering|121164.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Java;JavaScript;Perl;Python;Ruby;Rust;Scala;SQL;Swift;Bash/Shell 38046|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|142000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Lua;Python;HTML;CSS 64294|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|150000.0|1 - 2 times per week|Female|South Asian;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;Python;SQL;TypeScript 98973|Germany|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|55075.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;HTML 14782|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|70000.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C++;CoffeeScript;Java;JavaScript;SQL;TypeScript;HTML;CSS 95338|United States|Moderately satisfied|Mathematics or statistics|75000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C;Python;R;SQL;HTML;CSS;Bash/Shell 33297|Netherlands|Slightly dissatisfied|Computer science, computer engineering, or software engineering|48955.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java 19466|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|114596.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Clojure;Ruby 9944|Brazil|Slightly satisfied|Computer science, computer engineering, or software engineering|11604.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;TypeScript;HTML;CSS 26164|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|50000.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 44463|Canada|Slightly dissatisfied|Information systems, information technology, or system administration|60391.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Ruby;SQL;HTML;CSS 69530|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|10175.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;HTML;CSS 92572|Austria|Extremely satisfied|Web development or web design|82000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C;C#;JavaScript;Objective-C;PHP;Swift;TypeScript;VB.NET;HTML 51971|Denmark|Moderately satisfied|Computer science, computer engineering, or software engineering|887580.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C++;C#;SQL;VB.NET 7075|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|45624.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C++;Java;JavaScript;Lua;Python;R;Bash/Shell 16088|Germany|Moderately satisfied|Mathematics or statistics|117492.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;Rust 64501|Russian Federation|Extremely satisfied|Computer science, computer engineering, or software engineering|31848.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Assembly;C++;Go;Java;JavaScript;Lua;PHP;Python;Scala;SQL;TypeScript;Bash/Shell 75367|United States|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|45000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;Go;Groovy;Ruby;Bash/Shell 32729|India|Moderately dissatisfied|Information systems, information technology, or system administration|26400.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;Python;SQL 60772|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|68040.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;Java;Python;Cobol 39437|Brazil|Extremely dissatisfied|Computer science, computer engineering, or software engineering|32127.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 7580|Netherlands|Slightly dissatisfied|A business discipline (ex. accounting, finance, marketing)|85671.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Objective-C;Python;Ruby;Swift 80738|Romania|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|34680.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;JavaScript;Python 81401|India|Extremely satisfied|Computer science, computer engineering, or software engineering|8448.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;TypeScript;HTML;CSS 14902|Australia|Extremely dissatisfied|Computer science, computer engineering, or software engineering|99967.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|Between 1 and 2 years ago|C#;JavaScript;R;SQL;TypeScript;HTML;CSS 90240|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|57200.0|Daily or almost every day|Male;Transgender|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|More than 4 years ago|C#;JavaScript;Python;SQL;VB.NET;HTML;CSS;Bash/Shell 53894|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|112400.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;Bash/Shell 49337|Canada|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|76495.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;HTML;CSS 84518|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|160000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Go;Groovy;Java;JavaScript 19477|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|23652.0|I don't typically exercise|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java 66518|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|66089.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|More than 4 years ago|JavaScript;Python;Ruby;Scala;Swift;TypeScript 36045|United States|Extremely satisfied|Information systems, information technology, or system administration|115000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 71740|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|6000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Java;Lua;PHP;SQL;HTML;CSS;Bash/Shell 33005|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|49032.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS 30951|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|150000.0|3 - 4 times per week|Male|Black or of African descent;East Asian;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;Erlang;Go;Haskell;Java;JavaScript;Rust;Scala;TypeScript;Bash/Shell 75510|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|21000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;C#;JavaScript;Python;SQL;VBA;HTML;CSS;Bash/Shell 35833|France|Moderately dissatisfied|Computer science, computer engineering, or software engineering|125124.0|3 - 4 times per week|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C++;Erlang;Go;Haskell;Java;JavaScript;Matlab;Perl;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 27692|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|76397.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;TypeScript 57718|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|91791.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 64887|Bangladesh|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|5160.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS 17525|Austria|Extremely satisfied|Computer science, computer engineering, or software engineering|122388.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;Swift;VBA;VB.NET;HTML;CSS 47020|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|135000.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Java;Objective-C;Swift;Kotlin 45879|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|29373.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;Go;Java;JavaScript;Objective-C;PHP;SQL;Swift;Bash/Shell 35576|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|115000.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|CoffeeScript;JavaScript;Python;Ruby;HTML;CSS;Bash/Shell 19380|Finland|Moderately satisfied|Computer science, computer engineering, or software engineering|44064.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Go;Java;JavaScript;PHP;R;SQL;Swift;HTML;CSS 10047|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|80000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Objective-C;SQL;Swift;TypeScript;HTML;CSS 9651|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|28000.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 29455|Germany|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|67313.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;R;SQL;HTML;CSS 22209|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|144000.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|Over 4 hours|45 - 54 years old|More than 4 years ago|JavaScript;SQL 84041|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|200000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;Clojure;Erlang;Java;JavaScript;Ruby;SQL;HTML;Bash/Shell 98497|United States|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|65000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;HTML;CSS 47708|Mexico|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|12888.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;CoffeeScript;JavaScript;Python;Ruby;SQL;HTML;CSS 72530|India|Extremely dissatisfied|Computer science, computer engineering, or software engineering|2820.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;JavaScript;PHP;SQL;HTML;CSS 10826|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|75000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 14597|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|154000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C++;C#;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 22936|United Kingdom|Moderately satisfied|Mathematics or statistics|27781.0|1 - 2 times per week|Male;Transgender|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;JavaScript;Matlab;R;HTML;CSS;Bash/Shell 12276|Iran, Islamic Republic of...|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|1200.0|1 - 2 times per week|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;C#;JavaScript;Python;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 59073|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|60000.0|1 - 2 times per week|Female|Black or of African descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Ruby;SQL;HTML;CSS 51487|France|Slightly satisfied|Computer science, computer engineering, or software engineering|41612.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 76565|Libyan Arab Jamahiriya|Extremely satisfied|Computer science, computer engineering, or software engineering|3900.0|I don't typically exercise|Male|Middle Eastern|They never completed any formal education|3 - 4 hours|45 - 54 years old|More than 4 years ago|C;C++;C#;JavaScript;SQL;VB.NET;Delphi/Object Pascal;HTML;CSS 90914|United States|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|90000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Go;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 85308|India|Extremely satisfied|Computer science, computer engineering, or software engineering|6576.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Java;Python 75575|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|58000.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Associate degree|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;Python;HTML;CSS 74877|Canada|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|74885.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|45 - 54 years old|More than 4 years ago|C++;C#;Java;JavaScript;Objective-C;PHP;Python;SQL;VBA;Bash/Shell 94611|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|94000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Assembly;Python 52323|France|Moderately dissatisfied|Computer science, computer engineering, or software engineering|30840.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Java;JavaScript;PHP;Python;SQL;VB.NET;HTML;CSS;Bash/Shell 22692|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|56460.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Groovy;Java;SQL;Bash/Shell 54589|India|Moderately satisfied|Computer science, computer engineering, or software engineering|18780.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Java;JavaScript;Matlab;Python;SQL;HTML;CSS 26327|France|Slightly satisfied|Information systems, information technology, or system administration|42836.0|1 - 2 times per week|Male|Black or of African descent;White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Groovy;Java;SQL;HTML;CSS 93266|Belgium|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|73433.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|55 - 64 years old|More than 4 years ago|C;C#;SQL;HTML;CSS 109|Azerbaijan|Slightly satisfied|A business discipline (ex. accounting, finance, marketing)|144.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|3 - 4 hours|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 1923|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|70000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 13094|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|51983.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Java;Python 397|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|2000000.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;Matlab;Python;Bash/Shell 64244|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|31000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Java;JavaScript;PHP;Python;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS 71846|Ukraine|Extremely satisfied|Computer science, computer engineering, or software engineering|45096.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C++;Go;Java;Objective-C;Python;Swift;Kotlin 41972|Belarus|Moderately satisfied|Information systems, information technology, or system administration|32664.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C++;C#;Java;JavaScript;SQL;HTML;CSS 44613|Italy|Moderately satisfied|Computer science, computer engineering, or software engineering|42836.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;Erlang;Groovy;Java;JavaScript;Objective-C;Perl;PHP;Python;Scala;Delphi/Object Pascal;Bash/Shell 72477|Ecuador|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|3600.0|I don't typically exercise|Female|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;Java;JavaScript;PHP;Python;R;SQL;HTML;CSS 28306|Thailand|Slightly satisfied|Information systems, information technology, or system administration|293736.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C++ 20960|Brazil|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|77979.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS 33696|Australia|Moderately dissatisfied|Computer science, computer engineering, or software engineering|119960.0|3 - 4 times per week|Male|Middle Eastern|Primary/elementary school|1 - 2 hours|35 - 44 years old|Less than a year ago|JavaScript;Objective-C;Swift;HTML;CSS 20381|United Kingdom|Extremely satisfied|Web development or web design|29170.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;CoffeeScript;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 69430|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|29376.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;Python;SQL;HTML;CSS 28143|Poland|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|24702.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;SQL;VBA;VB.NET;HTML;Bash/Shell 9309|Australia|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|83172.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;C#;Java;JavaScript;PHP;Python;SQL;TypeScript;VBA;HTML;CSS;Bash/Shell 67341|United States|Extremely satisfied|Web development or web design|103000.0|1 - 2 times per week|Male;Transgender|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;Visual Basic 6;HTML;CSS 46142|India|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|150288.0|Daily or almost every day|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;SQL;TypeScript;HTML;CSS 99337|United States|Moderately dissatisfied|A social science (ex. anthropology, psychology, political science)|58000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|45 - 54 years old|More than 4 years ago|C++;C#;Java;HTML;CSS 30203|France|Moderately dissatisfied|Web development or web design|33780.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;CoffeeScript;Java;JavaScript;Perl;PHP;Ruby;Rust;Swift;TypeScript;HTML;CSS;Bash/Shell 47879|India|Moderately satisfied|Computer science, computer engineering, or software engineering|18785.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;SQL;TypeScript;HTML;CSS 72708|Pakistan|Moderately satisfied|Computer science, computer engineering, or software engineering|32532.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;Python;SQL;TypeScript;Bash/Shell 3285|Singapore|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|56779.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;Python;SQL;TypeScript;HTML;CSS 14443|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|10140.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C# 10877|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|96626.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript 49168|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|150000.0|3 - 4 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Groovy;JavaScript;Python;HTML;CSS;Bash/Shell 37287|United Kingdom|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|852876.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|SQL 71744|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|38184.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 71432|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|110000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|45 - 54 years old|Between 2 and 4 years ago|Groovy;Java;SQL;VBA 1517|Peru|Slightly dissatisfied|Computer science, computer engineering, or software engineering|88000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;CoffeeScript;Erlang;Haskell;Java;JavaScript;Lua;Matlab;Perl;Python;R;Ruby;SQL;HTML;CSS;Bash/Shell 97131|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|110000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Ruby;SQL;HTML;CSS 25292|Bulgaria|Moderately satisfied|Mathematics or statistics|26400.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Python;SQL;HTML 90855|South Africa|Slightly dissatisfied|Information systems, information technology, or system administration|62304.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;JavaScript;PHP;R;Delphi/Object Pascal;HTML;CSS 34211|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|90000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|55 - 64 years old|More than 4 years ago|C++;C#;Java;JavaScript;Python;SQL;Swift;HTML;CSS;Bash/Shell 99837|Serbia|Moderately satisfied|Computer science, computer engineering, or software engineering|20556.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C++;JavaScript;Objective-C;PHP;Python;SQL;Swift;HTML;CSS;Bash/Shell 40262|Ethiopia|Extremely dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|6972.0|1 - 2 times per week|Male|Black or of African descent|Associate degree|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python;TypeScript 14284|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|70000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;Java;JavaScript;Matlab;Python;R;SQL;HTML;CSS;Bash/Shell 22957|Australia|Extremely satisfied|Computer science, computer engineering, or software engineering|111963.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;TypeScript 79645|Spain|Extremely satisfied|Computer science, computer engineering, or software engineering|367164.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;TypeScript;HTML;CSS;Bash/Shell 3646|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|JavaScript;SQL;VB.NET;HTML;CSS 61098|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|80776.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Assembly;C;C++;Java;JavaScript;Objective-C;SQL;Swift;HTML;CSS;Bash/Shell 13504|United States|Moderately dissatisfied|Information systems, information technology, or system administration|60000.0|Daily or almost every day|Female;Transgender|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;SQL;Delphi/Object Pascal;HTML;CSS 80749|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|80772.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;SQL;HTML 39006|France|Slightly satisfied|Computer science, computer engineering, or software engineering|122388.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;F#;TypeScript 86376|France|Moderately satisfied|Computer science, computer engineering, or software engineering|55075.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript 99104|Russian Federation|Slightly dissatisfied|Computer science, computer engineering, or software engineering|10620.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|18 - 24 years old|More than 4 years ago|C;C++;JavaScript;Matlab;Python;SQL;Visual Basic 6;HTML;CSS 15503|India|Extremely satisfied|Computer science, computer engineering, or software engineering|11268.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|JavaScript 27374|Canada|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|82132.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;Python;SQL;Bash/Shell 58214|Brazil|Moderately satisfied|Information systems, information technology, or system administration|1000000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;HTML;CSS 11804|United Kingdom|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|45838.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;JavaScript;Ruby;HTML;CSS;Bash/Shell 575|Ireland|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|63642.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;TypeScript;HTML;CSS 10770|Portugal|Extremely satisfied|Computer science, computer engineering, or software engineering|38552.0|I don't typically exercise|Male|White or of European descent|They never completed any formal education|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;Go;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 78807|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|80000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;HTML;CSS;Bash/Shell 4004|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|63516.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;Python;TypeScript;HTML;CSS 1599|China|Extremely dissatisfied|Computer science, computer engineering, or software engineering|60000.0|Daily or almost every day|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;C#;Java;JavaScript;PHP;SQL;HTML;CSS 45525|Brazil|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|29076.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;Bash/Shell 100475|Russian Federation|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|42456.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;HTML;CSS 69472|Portugal|Slightly satisfied|Computer science, computer engineering, or software engineering|41124.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C;C++;CoffeeScript;Erlang;JavaScript;PHP;Ruby;Rust;SQL;HTML;CSS 71422|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|17640.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;JavaScript;PHP;Python;HTML;CSS 2676|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;Python;Scala;SQL;HTML;CSS;Bash/Shell 7309|Australia|Neither satisfied nor dissatisfied|A natural science (ex. biology, chemistry, physics)|121560.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 94688|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|0.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;F#;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 1628|India|Slightly satisfied|Computer science, computer engineering, or software engineering|281784.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 28843|United States|Moderately satisfied|A health science (ex. nursing, pharmacy, radiology)|120000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;JavaScript;Python;SQL;TypeScript;VBA 25238|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|84000.0|Daily or almost every day|Male|Native American, Pacific Islander, or Indigenous Australian;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Python;R;SQL;HTML;CSS 80971|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|90000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 37329|Australia|Slightly satisfied|Computer science, computer engineering, or software engineering|59980.0|1 - 2 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;CoffeeScript;JavaScript;Ruby;HTML;CSS 21234|Australia|Moderately satisfied|Mathematics or statistics|63979.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C++;Java;JavaScript;Python;R;SQL;Swift;Kotlin;CSS 84373|United States|Slightly dissatisfied|A social science (ex. anthropology, psychology, political science)|1020000.0|1 - 2 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;TypeScript;HTML;CSS;Bash/Shell 84281|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|15132.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Python;TypeScript;HTML;CSS 50496|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|29000.0|Daily or almost every day|Female|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;Java;Matlab;Python;SQL 65661|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|120000.0|Daily or almost every day|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;Ruby;HTML;CSS 58900|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;HTML;CSS;Bash/Shell 63868|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|80000.0|I don't typically exercise|Male|South Asian|Associate degree|3 - 4 hours|25 - 34 years old|Less than a year ago|C++;Java;JavaScript;SQL;HTML;CSS 4324|Germany|Moderately dissatisfied|Information systems, information technology, or system administration|734328.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;PHP;HTML;CSS 84821|France|Slightly satisfied|A health science (ex. nursing, pharmacy, radiology)|36716.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C;Java;JavaScript;Objective-C;PHP;Ruby;SQL;Swift;VBA;VB.NET;Visual Basic 6;Kotlin;HTML;CSS;Bash/Shell 6165|Russian Federation|Moderately satisfied|Web development or web design|8850.0|Daily or almost every day|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 28879|Austria|Extremely dissatisfied|Computer science, computer engineering, or software engineering|79552.0|1 - 2 times per week|Male|Middle Eastern|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;Python;R;TypeScript;HTML;CSS 92117|France|Extremely satisfied|Web development or web design|14688.0|1 - 2 times per week|Male|Black or of African descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;Java;JavaScript;PHP;Python;Scala;SQL;HTML;CSS;Bash/Shell 14978|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|100000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;Java;JavaScript;Objective-C;Python;Ruby;SQL;Swift;HTML;CSS;Bash/Shell 41310|Italy|Moderately satisfied|Computer science, computer engineering, or software engineering|26436.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Objective-C;PHP;SQL;Swift;HTML;CSS 73845|Hungary|Moderately satisfied|Computer science, computer engineering, or software engineering|34296.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;Groovy;Java;JavaScript;Ruby;HTML;CSS;Bash/Shell 31973|Czech Republic|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|40536.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;Lua;Python;SQL;HTML;CSS;Bash/Shell 52154|Turkey|Slightly dissatisfied|Computer science, computer engineering, or software engineering|8004.0|I don't typically exercise|Male|Middle Eastern;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS 48208|Iran, Islamic Republic of...|Extremely satisfied|Computer science, computer engineering, or software engineering|0.0|I don't typically exercise|Male|Middle Eastern|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|18 - 24 years old|I've never had a job|Assembly;C;C++;Java;Python;SQL;HTML;CSS;Bash/Shell 61588|Italy|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|22032.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|55 - 64 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS 96446|Croatia|Moderately satisfied|Computer science, computer engineering, or software engineering|25656.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Python 11514|Australia|Extremely dissatisfied|A business discipline (ex. accounting, finance, marketing)|47984.0|3 - 4 times per week|Female|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|JavaScript;PHP;Ruby;SQL;HTML;CSS 22740|Bangladesh|Moderately satisfied|Computer science, computer engineering, or software engineering|1444.0|3 - 4 times per week|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;SQL;TypeScript;HTML 739|Iran, Islamic Republic of...|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|20000.0|1 - 2 times per week|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 51724|Czech Republic|Slightly satisfied|Computer science, computer engineering, or software engineering|17376.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Java 93728|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|110000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C;C++;C#;Java;JavaScript;SQL;Kotlin;Bash/Shell 53978|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|42000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Go;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 75843|South Korea|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|26352.0|I don't typically exercise|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Ruby;TypeScript;HTML;CSS 60446|India|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|23482.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 52330|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|50904.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 17298|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|52783.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C# 95882|India|Slightly satisfied|Computer science, computer engineering, or software engineering|3756.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;SQL;HTML;CSS 99565|Australia|Extremely dissatisfied|A natural science (ex. biology, chemistry, physics)|84497.0|1 - 2 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;Python;R;HTML;CSS 9849|Sri Lanka|Extremely satisfied|Computer science, computer engineering, or software engineering|11700.0|3 - 4 times per week|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|18 - 24 years old|I've never had a job|C++;C#;Java;JavaScript;PHP;SQL;HTML;CSS 2586|United States|Moderately satisfied|Mathematics or statistics|57000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;Perl;R;Bash/Shell 47087|Canada|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|32209.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|R;SQL 20326|Viet Nam|Slightly satisfied|Computer science, computer engineering, or software engineering|3600.0|I don't typically exercise|Male|East Asian|Some college/university study without earning a degree|3 - 4 hours|18 - 24 years old|Less than a year ago|C++;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 35251|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|62000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 27230|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|62507.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 10395|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|93500.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 4138|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|43482.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;C#;Python;SQL;HTML;CSS;Bash/Shell 56644|Canada|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|44609.0|1 - 2 times per week|Female|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL 30890|India|Extremely satisfied|Computer science, computer engineering, or software engineering|16437.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 19432|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|60000.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;Java;JavaScript;Perl;Python;SQL;HTML;CSS;Bash/Shell 3|United Kingdom|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|70841.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;Python;Bash/Shell 99139|Turkey|Moderately dissatisfied|Computer science, computer engineering, or software engineering|23844.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP 28919|Israel|Moderately satisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;Python;R;SQL;TypeScript 83780|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|14976.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;SQL;Bash/Shell 54688|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|690000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Ruby;HTML;CSS;Bash/Shell 24765|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|110000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;TypeScript 96527|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|70985.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Ruby;SQL 12130|United States|Slightly satisfied|A social science (ex. anthropology, psychology, political science)|30000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Python;R;HTML 11832|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|44449.0|1 - 2 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;SQL;HTML;CSS;Bash/Shell 57366|Germany|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|1000000.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Perl;SQL;HTML;CSS;Bash/Shell 70359|Other Country (Not Listed Above)|Moderately satisfied|Computer science, computer engineering, or software engineering|12480.0|I don't typically exercise|Female|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C++;Java;JavaScript;Matlab;PHP;Python;SQL;Visual Basic 6;HTML;CSS 32452|United Kingdom|Slightly dissatisfied|Web development or web design|33.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;HTML;CSS 81220|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|85000.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;Groovy;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 54378|Egypt|Slightly dissatisfied|Computer science, computer engineering, or software engineering|1800.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|More than 4 years ago|C;C++;C#;SQL;VBA;Visual Basic 6;HTML;CSS;Bash/Shell 12328|Norway|Moderately satisfied|Information systems, information technology, or system administration|53560.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 72867|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|96000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;Scala;TypeScript;Bash/Shell 81698|Algeria|Slightly dissatisfied|Computer science, computer engineering, or software engineering|4728.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;Matlab;PHP;Python;SQL;Delphi/Object Pascal;HTML;CSS 19984|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|79552.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS 54322|Czech Republic|Moderately satisfied|Computer science, computer engineering, or software engineering|28956.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Perl;PHP;Python;SQL;HTML;CSS;Bash/Shell 25522|United Kingdom|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|70841.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 65851|Australia|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|103965.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;VBA;HTML;CSS;Bash/Shell 3119|Ireland|Moderately satisfied|Computer science, computer engineering, or software engineering|88119.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Go;Haskell;Java;JavaScript;R;Scala;SQL;Bash/Shell 22065|United States|Extremely dissatisfied|I never declared a major|98000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;Bash/Shell 89450|Argentina|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|30000.0|1 - 2 times per week|Female|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;SQL;HTML;Bash/Shell 21867|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|41671.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;C# 98905|Japan|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|120000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|JavaScript;Ruby;HTML;CSS 93735|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|30000.0|3 - 4 times per week|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C++;JavaScript;Python;R;SQL;HTML;CSS;Bash/Shell 65710|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|100000.0|3 - 4 times per week|Male|Black or of African descent;East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 50835|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|70000.0|3 - 4 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|CoffeeScript;Clojure;Java;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 40989|Ukraine|Slightly satisfied|Computer science, computer engineering, or software engineering|48000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C++;Java;JavaScript;Objective-C;Python;TypeScript;Kotlin;HTML;CSS;Bash/Shell 89218|United States|Moderately dissatisfied|Information systems, information technology, or system administration|95000.0|I don't typically exercise|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Ruby;SQL 69039|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|17640.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;C#;Haskell;Java;JavaScript;Python;Scala;Kotlin;HTML;CSS;Bash/Shell 96869|United States|Moderately satisfied|I never declared a major|90000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 37945|Hungary|Slightly satisfied|Computer science, computer engineering, or software engineering|35724.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;Erlang;Java;JavaScript;Matlab;Objective-C;Python;SQL;Swift;Kotlin;HTML;CSS;Bash/Shell 3472|Ukraine|Slightly satisfied|Computer science, computer engineering, or software engineering|12108.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;SQL 60176|Serbia|Extremely satisfied|Computer science, computer engineering, or software engineering|8808.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;SQL 32041|Malaysia|Slightly satisfied|Mathematics or statistics|19116.0|I don't typically exercise|Female|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C;Java;JavaScript;Objective-C;Swift;HTML;CSS 25425|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|136000.0|Daily or almost every day|Female|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Go;Java;Python;Bash/Shell 74236|United States|Extremely dissatisfied|A humanities discipline (ex. literature, history, philosophy)|55000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;Objective-C;R;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 68601|United Kingdom|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|716748.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;Perl;Python;Bash/Shell 6077|Sweden|Extremely dissatisfied|A natural science (ex. biology, chemistry, physics)|52404.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;Python;SQL;Bash/Shell 101576|United States|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|80000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;PHP;SQL;TypeScript;VB.NET;HTML;CSS 85084|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|109500.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;HTML;CSS 38647|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|180000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C++;JavaScript;Lua;Python;TypeScript;Bash/Shell 71593|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|32000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C# 28195|United States|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|225000.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Python;SQL;HTML;Bash/Shell 45129|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|52872.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Python;SQL;TypeScript;Kotlin;HTML;CSS;Bash/Shell 100511|Ireland|Moderately satisfied|Computer science, computer engineering, or software engineering|85671.0|Daily or almost every day|Female|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;Hack;Haskell;Lua;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 23379|Croatia|Slightly satisfied|Computer science, computer engineering, or software engineering|30588.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 99897|United States|Moderately satisfied|Mathematics or statistics|150000.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|CoffeeScript;JavaScript;Python;R;SQL;HTML;Bash/Shell 38054|Belarus|Slightly dissatisfied|Computer science, computer engineering, or software engineering|9684.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 13361|Australia|Moderately dissatisfied|A business discipline (ex. accounting, finance, marketing)|134352.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Clojure;Groovy;Java;JavaScript;Matlab;Python;SQL;Bash/Shell 3552|India|Extremely satisfied|Computer science, computer engineering, or software engineering|9396.0|Daily or almost every day|Male|South Asian|Primary/elementary school|Over 4 hours|18 - 24 years old|Less than a year ago|JavaScript;PHP;SQL;Swift;TypeScript;HTML;CSS 74771|United States|Extremely satisfied|Web development or web design|108600.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS 14129|Spain|Extremely satisfied|Information systems, information technology, or system administration|97910.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;Scala 9178|Russian Federation|Slightly satisfied|Computer science, computer engineering, or software engineering|8496.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;C#;Java;Objective-C;Python;SQL;Swift 50265|Brazil|Extremely satisfied|Computer science, computer engineering, or software engineering|26196.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;C#;Python;Ruby;TypeScript;Bash/Shell 67284|Venezuela, Bolivarian Republic of...|Moderately satisfied|Information systems, information technology, or system administration|1000000.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 27361|Albania|Slightly dissatisfied|Computer science, computer engineering, or software engineering|35244.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;HTML;CSS 32211|Canada|Slightly satisfied|Computer science, computer engineering, or software engineering|64417.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Erlang;Java;Scala;Swift 92596|United States|Moderately satisfied|Mathematics or statistics|90000.0|Daily or almost every day|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python 68693|United States|Moderately satisfied|Mathematics or statistics|2600.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;Python;HTML;CSS 13475|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|56460.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C++;C#;CoffeeScript;Java;JavaScript;SQL;HTML;CSS 73635|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|104030.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;Java;Python;Scala;SQL 83171|Bangladesh|Slightly dissatisfied|Computer science, computer engineering, or software engineering|2892.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C;C++;Java;PHP;SQL;HTML;CSS 42916|Poland|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|21876.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Java;SQL 14854|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|118366.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Assembly;C;C++;C#;Groovy;Java;JavaScript;Lua;Python;TypeScript;HTML;CSS;Bash/Shell 69500|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|50179.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|JavaScript;TypeScript;HTML;CSS;Bash/Shell 90282|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|19236.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;C#;Java;JavaScript;TypeScript;HTML 78866|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|106000.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++ 61575|France|Moderately satisfied|Computer science, computer engineering, or software engineering|36716.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|55 - 64 years old|Between 2 and 4 years ago|PHP;SQL;HTML;CSS 36229|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|104678.0|1 - 2 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|Java;Python;Kotlin;HTML;CSS;Bash/Shell 73482|United States|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|125000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|45 - 54 years old|Less than a year ago|Java;JavaScript;SQL;VBA;HTML;CSS;Bash/Shell 100806|Iran, Islamic Republic of...|Moderately satisfied|Computer science, computer engineering, or software engineering|2328.0|Daily or almost every day|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|35 - 44 years old|Between 2 and 4 years ago|C#;SQL;Visual Basic 6;HTML;CSS 93854|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|88000.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|Go;Groovy;Java;JavaScript;Perl;Rust;SQL;TypeScript;Kotlin;HTML;CSS;Bash/Shell 1491|Australia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|36468.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;C#;Java;JavaScript;Python;HTML;CSS;Bash/Shell 78846|Belarus|Moderately dissatisfied|Computer science, computer engineering, or software engineering|34800.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java 46475|Germany|Extremely satisfied|Information systems, information technology, or system administration|67560.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|CoffeeScript;Java;JavaScript;Python;Ruby;SQL;CSS;Bash/Shell 16524|China|Moderately satisfied|Computer science, computer engineering, or software engineering|20568.0|1 - 2 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Python;R;SQL;TypeScript;HTML;CSS 23659|Canada|Extremely satisfied|Mathematics or statistics|64417.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|CoffeeScript;Go;JavaScript;Lua;PHP;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 55797|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|31948.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;JavaScript;SQL;VB.NET;Visual Basic 6;HTML;CSS 53683|United Kingdom|Moderately satisfied|Web development or web design|69452.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;Kotlin;HTML;CSS;Bash/Shell 67567|United States|Moderately satisfied|Information systems, information technology, or system administration|63000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;Cobol;HTML;CSS;Bash/Shell 65905|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|68000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Perl;Ruby;Rust;HTML;CSS;Bash/Shell 52846|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|41000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|More than 4 years ago|C++;C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS 74298|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|100000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 11565|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|60000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;Haskell;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 13432|China|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|31788.0|1 - 2 times per week|Female;Transgender;Non-binary, genderqueer, or gender non-conforming|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Groovy;Java;JavaScript;Python;HTML;CSS;Bash/Shell 16723|Russian Federation|Slightly dissatisfied|Mathematics or statistics|12732.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Java;JavaScript;SQL 2380|Serbia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|27276.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Java 51735|Poland|Moderately dissatisfied|Computer science, computer engineering, or software engineering|59988.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 80999|United States|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|82000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java;JavaScript;PHP;SQL;Bash/Shell 4046|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|119058.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Haskell;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 77052|United States|Moderately satisfied|Web development or web design|10000.0|1 - 2 times per week|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Java;PHP;SQL;Swift;HTML;CSS 33532|India|Slightly satisfied|Web development or web design|4512.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;PHP;SQL;VBA;VB.NET;HTML;CSS 43376|United Kingdom|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|150012.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;Python;Ruby;HTML;CSS 72696|Russian Federation|Moderately satisfied|Information systems, information technology, or system administration|21228.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;PHP;TypeScript;HTML;CSS 29028|Canada|Slightly satisfied|Computer science, computer engineering, or software engineering|66027.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;Visual Basic 6 39401|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|82500.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 94400|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|66674.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C++;C#;JavaScript;Lua;SQL;TypeScript;HTML;CSS;Bash/Shell 51679|United States|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|101000.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|PHP;Ruby;Scala;SQL;TypeScript;HTML;CSS 67118|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|73433.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Haskell;JavaScript;Python;Rust;Scala;SQL;HTML;CSS;Bash/Shell 2423|India|Moderately satisfied|Information systems, information technology, or system administration|2820.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|PHP;Python 92180|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|155000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|45 - 54 years old|Less than a year ago|Erlang;JavaScript;Python;Ruby;SQL;HTML;CSS;Bash/Shell 1381|Brazil|Slightly dissatisfied|Information systems, information technology, or system administration|37428.0|Daily or almost every day|Male|White or of European descent|They never completed any formal education|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Perl;PHP;SQL;TypeScript;VBA;VB.NET;Visual Basic 6;HTML;CSS 18603|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|75000.0|1 - 2 times per week|Male|South Asian|Associate degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;Objective-C;Swift;HTML;CSS 74152|Australia|Extremely satisfied|Computer science, computer engineering, or software engineering|15000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;Go;Java;JavaScript;Python;TypeScript;HTML;CSS;Bash/Shell 33569|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|190000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Java;JavaScript;Python;HTML;CSS 25229|Other Country (Not Listed Above)|Moderately satisfied|Computer science, computer engineering, or software engineering|30600.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|PHP;SQL;Delphi/Object Pascal;HTML 50720|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|125000.0|I don't typically exercise|Male|Black or of African descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Go;Lua;Perl;Python;SQL 51356|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|101383.0|1 - 2 times per week|Female|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;SQL;HTML;CSS;Bash/Shell 6774|Hong Kong (S.A.R.)|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|130896.0|I don't typically exercise|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|I've never had a job|Assembly;C#;Erlang;Java;JavaScript;Objective-C;PHP;Python;SQL;TypeScript;HTML;CSS 94763|United States|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|43000.0|1 - 2 times per week|Female|Black or of African descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;HTML;CSS 66432|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|19464.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript 100060|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|100000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C# 47630|United States|Moderately satisfied|Mathematics or statistics|262000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|45 - 54 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML 47544|United States|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|55000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;Python;SQL;VB.NET;HTML;CSS;Bash/Shell 59201|New Zealand|Moderately satisfied|Computer science, computer engineering, or software engineering|87701.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|Go;JavaScript;Lua;PHP;Python;SQL;HTML;CSS;Bash/Shell 48597|France|Moderately satisfied|Information systems, information technology, or system administration|38184.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C++;Java;JavaScript;SQL;TypeScript;Visual Basic 6;HTML;CSS 70671|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|140000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;JavaScript;Objective-C;Ruby;Swift;HTML;CSS;Bash/Shell 58427|Argentina|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|26400.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 70505|Finland|Moderately dissatisfied|A business discipline (ex. accounting, finance, marketing)|64620.0|I don't typically exercise|Male|White or of European descent|Associate degree|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;HTML;CSS 71718|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|180000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|55 - 64 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Python;Ruby;Scala;SQL;Bash/Shell 31961|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|84000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 69533|India|Moderately satisfied|Computer science, computer engineering, or software engineering|5640.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|JavaScript;PHP;Python;HTML;CSS 91590|Germany|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|85671.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;PHP;Python;HTML;CSS;Bash/Shell 32597|Japan|Moderately satisfied|Computer science, computer engineering, or software engineering|0.0|Daily or almost every day|Male|White or of European descent|Associate degree|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Ruby;HTML;CSS;Bash/Shell 73273|India|Moderately satisfied|Computer science, computer engineering, or software engineering|20000.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;PHP;Python;SQL;VB.NET;HTML;CSS 60219|Hong Kong (S.A.R.)|Slightly satisfied|Computer science, computer engineering, or software engineering|67351.0|I don't typically exercise|Male|East Asian;South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C;C++;JavaScript;Python;TypeScript;Ocaml;Bash/Shell 98153|Australia|Extremely dissatisfied|A business discipline (ex. accounting, finance, marketing)|51983.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Ruby;SQL;HTML;CSS 51967|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|185400.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;F# 44558|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|51408.0|I don't typically exercise|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;PHP;TypeScript;HTML;CSS;Bash/Shell 43523|Germany|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|40388.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|R 68343|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|63979.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|45 - 54 years old|Between 1 and 2 years ago|C;CoffeeScript;JavaScript;Perl;PHP;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 70062|United States|Extremely satisfied|Information systems, information technology, or system administration|70000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Python;R;SQL 79309|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|160000.0|I don't typically exercise|Male|Black or of African descent|Primary/elementary school|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;Python;SQL;TypeScript;HTML;CSS 71745|Indonesia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|6984.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C;C++;C#;Java;JavaScript;PHP;SQL;TypeScript;VB.NET;Visual Basic 6;Kotlin;Delphi/Object Pascal;HTML;CSS 62008|Austria|Extremely satisfied|Computer science, computer engineering, or software engineering|22032.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Java;JavaScript;Python;Swift;Bash/Shell 941|United States|Neither satisfied nor dissatisfied|I never declared a major|72000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;VB.NET;HTML;CSS;Bash/Shell 52581|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|1000000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Go;Java;JavaScript;Python;Rust;HTML;CSS;Bash/Shell 69528|Bangladesh|Moderately satisfied|Computer science, computer engineering, or software engineering|10824.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Python 9141|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|70000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;C#;F#;Java;Python 100803|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|70000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;Python;HTML;CSS 487|Australia|Slightly satisfied|Computer science, computer engineering, or software engineering|87971.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C++;C#;JavaScript;SQL;TypeScript;HTML;CSS 92012|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|110000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;Objective-C;SQL;HTML;CSS;Bash/Shell 67184|Spain|Extremely satisfied|Computer science, computer engineering, or software engineering|24478.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Primary/elementary school|Over 4 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;PHP;Python;Delphi/Object Pascal;HTML;CSS;Bash/Shell 40645|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|175384.0|I don't typically exercise|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|55 - 64 years old|Less than a year ago|C;C++;Objective-C;Python 7842|Poland|Slightly satisfied|I never declared a major|12348.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;JavaScript;Lua;TypeScript;HTML;CSS;Bash/Shell 54102|India|Extremely satisfied|Computer science, computer engineering, or software engineering|18785.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Go;Java;PHP;Python;TypeScript;HTML;CSS 12334|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|37572.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;Python 5549|Hungary|Moderately satisfied|Computer science, computer engineering, or software engineering|32160.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C#;Java;JavaScript;SQL;TypeScript;HTML;CSS 85263|Australia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|63979.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Between 1 and 2 years ago|C;C++;Java;Objective-C;SQL;Swift 94464|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|280000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;Java;JavaScript;Lua;Objective-C;Python;R;Ruby;Rust;SQL;HTML;CSS;Bash/Shell 53082|Japan|Extremely dissatisfied|Computer science, computer engineering, or software engineering|54293.0|1 - 2 times per week|Male|East Asian|They never completed any formal education|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 43419|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|20592.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;Python;SQL;HTML;CSS;Bash/Shell 60065|Russian Federation|Slightly satisfied|Computer science, computer engineering, or software engineering|50400.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;CSS;Bash/Shell 51539|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|45528.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|More than 4 years ago|Java;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 45478|Canada|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|70054.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Python;SQL;CSS 93300|India|Slightly satisfied|Computer science, computer engineering, or software engineering|6576.0|1 - 2 times per week|Female|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;SQL 24330|Sri Lanka|Moderately satisfied|Computer science, computer engineering, or software engineering|16200.0|I don't typically exercise|Male|South Asian|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;SQL;TypeScript;HTML;CSS 63727|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|1440000.0|3 - 4 times per week|Female|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Python;SQL;HTML;CSS;Bash/Shell 96429|Liechtenstein|Extremely satisfied|Information systems, information technology, or system administration|0.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;JavaScript;Python;SQL;Swift;TypeScript;HTML;CSS 28342|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|35768.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;C#;Haskell;Java;Scala;SQL;Swift;HTML;CSS 80964|Argentina|Extremely satisfied|Computer science, computer engineering, or software engineering|14400.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;Python;TypeScript;HTML;CSS 49057|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|50005.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;PHP;TypeScript;HTML;CSS 49447|United Kingdom|Slightly dissatisfied|A natural science (ex. biology, chemistry, physics)|53061.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Python;R;SQL;Bash/Shell 24085|Nigeria|Moderately dissatisfied|Mathematics or statistics|2664.0|I don't typically exercise|Male|Black or of African descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;PHP;TypeScript;HTML;CSS 59755|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|55075.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;Python;HTML;CSS 14849|United States|Extremely satisfied|I never declared a major|120000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;R;SQL;TypeScript;VB.NET;HTML;CSS 34164|Philippines|Extremely satisfied|Computer science, computer engineering, or software engineering|18192.0|1 - 2 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C++;C#;Java;JavaScript;PHP;SQL;HTML;CSS 71508|Sweden|Slightly dissatisfied|Computer science, computer engineering, or software engineering|89832.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;F#;Java;Bash/Shell 18933|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|96000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Go;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 30031|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|135441.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;C++;C#;Lua;Matlab;Python;Bash/Shell 68789|Japan|Slightly dissatisfied|Information systems, information technology, or system administration|39257.0|1 - 2 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;Go;Java;JavaScript;Matlab;PHP;Swift;VBA;HTML 22841|Poland|Extremely satisfied|Computer science, computer engineering, or software engineering|35292.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 54999|Portugal|Slightly satisfied|Mathematics or statistics|73433.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;JavaScript;SQL;HTML;CSS;Bash/Shell 34076|United States|Moderately dissatisfied|A humanities discipline (ex. literature, history, philosophy)|82000.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 71431|Ukraine|Moderately dissatisfied|Computer science, computer engineering, or software engineering|14400.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Groovy;Java;Scala 70262|Switzerland|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|625620.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|65 years or older|More than 4 years ago|C;JavaScript;Perl;PHP;Ruby;HTML;CSS;Bash/Shell 5280|France|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|42836.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;SQL;Delphi/Object Pascal;HTML;CSS 101502|France|Moderately satisfied|Computer science, computer engineering, or software engineering|55075.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;Kotlin;HTML;CSS 47205|United Kingdom|Moderately dissatisfied|I never declared a major|62507.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;Rust;SQL;HTML;CSS;Bash/Shell 41513|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|2000000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;HTML;CSS 41433|Germany|Extremely dissatisfied|Computer science, computer engineering, or software engineering|85671.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;SQL;TypeScript;VB.NET;HTML;Bash/Shell 87857|Turkey|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|22248.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;SQL;Delphi/Object Pascal;HTML;CSS 69492|Poland|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|70572.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;R;Ruby;SQL;HTML;CSS;Bash/Shell 85880|United States|Moderately satisfied|I never declared a major|145000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Haskell;Java;JavaScript;Python;Scala;SQL;Bash/Shell 19053|Philippines|Moderately satisfied|Information systems, information technology, or system administration|15360.0|3 - 4 times per week|Male|East Asian|They never completed any formal education|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;VB.NET 28210|India|Slightly satisfied|Computer science, computer engineering, or software engineering|3756.0|Daily or almost every day|Female;Male|South Asian|Primary/elementary school|1 - 2 hours|18 - 24 years old|Less than a year ago|Assembly;Java;JavaScript;PHP;Python;SQL;HTML;CSS 21359|Switzerland|Slightly satisfied|Computer science, computer engineering, or software engineering|65064.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;C#;Java;JavaScript;PHP;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 89756|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|160000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;Objective-C;Ruby;Swift;HTML;CSS;Bash/Shell 12505|South Korea|Slightly satisfied|Information systems, information technology, or system administration|80000.0|I don't typically exercise|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;Objective-C;PHP;Python;SQL;Swift;Bash/Shell 13283|Norway|Moderately dissatisfied|Information systems, information technology, or system administration|765138.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C#;Python;SQL;TypeScript;Bash/Shell 20770|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|100652.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Clojure;Java;Ruby;SQL;Ocaml;HTML;CSS;Bash/Shell 15281|Brazil|Extremely dissatisfied|Computer science, computer engineering, or software engineering|22452.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Python 20489|Bangladesh|Slightly satisfied|Computer science, computer engineering, or software engineering|21660.0|3 - 4 times per week|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Scala;SQL;TypeScript;HTML;CSS;Bash/Shell 2941|Canada|Slightly satisfied|Computer science, computer engineering, or software engineering|74885.0|I don't typically exercise|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|Java;JavaScript;HTML;CSS;Bash/Shell 5875|Nigeria|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|4164.0|3 - 4 times per week|Male|Black or of African descent|Professional degree (JD, MD, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS 30029|Brazil|Moderately satisfied|Web development or web design|11232.0|I don't typically exercise|Male|Black or of African descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;PHP;SQL;Kotlin;HTML;CSS 84753|China|Moderately satisfied|Computer science, computer engineering, or software engineering|82592.0|3 - 4 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Ruby;SQL;Swift;HTML;CSS 9193|Paraguay|Extremely dissatisfied|Computer science, computer engineering, or software engineering|200000.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;Objective-C;PHP;Python;SQL;Swift;HTML;CSS 60144|France|Moderately satisfied|Computer science, computer engineering, or software engineering|50179.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;JavaScript;Objective-C;Python;SQL;HTML;CSS;Bash/Shell 21376|Russian Federation|Slightly satisfied|Computer science, computer engineering, or software engineering|10620.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|PHP;Ruby;HTML;CSS 55750|Ireland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|85671.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;CoffeeScript;JavaScript;Ruby;SQL;TypeScript;HTML;CSS 52650|Russian Federation|Moderately satisfied|Information systems, information technology, or system administration|12732.0|3 - 4 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|18 - 24 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 7045|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|58340.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 74974|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|200000.0|3 - 4 times per week|Female|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C#;Java;Objective-C;PHP;Python;Ruby;SQL;Swift;VBA;VB.NET;Visual Basic 6 48918|Denmark|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|89148.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;Python;Delphi/Object Pascal 96692|Brazil|Slightly satisfied|Computer science, computer engineering, or software engineering|21336.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Ruby;SQL;HTML;CSS 23466|Germany|Moderately satisfied|Information systems, information technology, or system administration|16884.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C++;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 16315|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|45876.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C++;C#;Objective-C;Python;Ruby;SQL;Swift 64699|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|71000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;JavaScript;TypeScript;HTML;CSS 1225|United States|Moderately dissatisfied|A business discipline (ex. accounting, finance, marketing)|170000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 6917|France|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|58752.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|45 - 54 years old|Less than a year ago|Assembly;C;SQL;Delphi/Object Pascal;HTML;Bash/Shell 42719|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|89175.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|45 - 54 years old|More than 4 years ago|Java;JavaScript;SQL;HTML;CSS 44316|Norway|Moderately dissatisfied|Information systems, information technology, or system administration|77789.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|Groovy;JavaScript;Lua;Perl;HTML;CSS 41163|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|156000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Assembly;C;Java;Python;HTML;Bash/Shell 57059|Russian Federation|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|34176.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java 71567|France|Slightly dissatisfied|Computer science, computer engineering, or software engineering|51408.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;TypeScript;Kotlin;HTML;CSS;Bash/Shell 80244|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|82000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 40583|Brazil|Moderately dissatisfied|Computer science, computer engineering, or software engineering|22452.0|1 - 2 times per week|Male|Black or of African descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;HTML;CSS 63877|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|62000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;TypeScript;HTML 75721|United States|Moderately satisfied|Mathematics or statistics|120000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|45 - 54 years old|Between 1 and 2 years ago|JavaScript;SQL;Bash/Shell 9044|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|100000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Python;R;SQL;HTML;Bash/Shell 94033|Poland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|28236.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 21842|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|63979.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Python;Bash/Shell 25412|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|1800000.0|1 - 2 times per week|Female|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|JavaScript;Perl;PHP;Python;SQL;HTML;CSS;Bash/Shell 5637|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|145000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;PHP;SQL;VB.NET;HTML;CSS 81885|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|76514.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|45 - 54 years old|Between 2 and 4 years ago|Java;SQL;TypeScript;HTML;CSS 23811|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|36720.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Go;Java;JavaScript;Lua;Objective-C;Perl;PHP;Python;Rust;Swift 8491|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|155000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Clojure;Python;Ruby 22497|Russian Federation|Moderately satisfied|Computer science, computer engineering, or software engineering|14856.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Assembly;Groovy;Java;SQL;Bash/Shell 54105|United Kingdom|Moderately dissatisfied|Computer science, computer engineering, or software engineering|55562.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 34938|Brazil|Moderately dissatisfied|Web development or web design|33684.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 3527|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;SQL 33264|United States|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|88000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|45 - 54 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS 99086|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|100000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 73875|Pakistan|Extremely satisfied|Computer science, computer engineering, or software engineering|18000.0|1 - 2 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;TypeScript;Kotlin 52562|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;VB.NET;HTML;CSS 58428|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|135000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|55 - 64 years old|Between 2 and 4 years ago|Perl;Python 62328|Germany|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|17628.0|3 - 4 times per week|Male|Middle Eastern;White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;Java;JavaScript;Matlab;PHP;SQL 31791|Ireland|Moderately satisfied|Mathematics or statistics|64254.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 99681|United Kingdom|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|88899.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;Matlab;Python;HTML;CSS;Bash/Shell 49150|France|Moderately satisfied|Computer science, computer engineering, or software engineering|22320.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;Lua;PHP;Python;SQL;TypeScript;VBA;HTML;CSS;Bash/Shell 2590|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|137000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;Ruby;SQL;HTML;CSS 34691|Denmark|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|69036.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;Lua;Python;Bash/Shell 47689|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|56673.0|I don't typically exercise|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;PHP;Python;HTML;CSS;Bash/Shell 28311|France|Slightly dissatisfied|A business discipline (ex. accounting, finance, marketing)|48955.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;HTML;CSS 73456|Finland|Extremely satisfied|Computer science, computer engineering, or software engineering|63642.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Clojure;Java;JavaScript;Scala;SQL;HTML;CSS;Bash/Shell 86363|Italy|Slightly satisfied|Computer science, computer engineering, or software engineering|44060.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;PHP;Python;Ruby;HTML;CSS;Bash/Shell 41676|France|Moderately dissatisfied|Computer science, computer engineering, or software engineering|45732.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Python;Scala;TypeScript;HTML;CSS 30328|Australia|Slightly satisfied|Computer science, computer engineering, or software engineering|71976.0|3 - 4 times per week|Female|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;Java 49531|Belarus|Slightly satisfied|Computer science, computer engineering, or software engineering|8472.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|Python;SQL 1395|Brazil|Slightly satisfied|Information systems, information technology, or system administration|9360.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;Python;SQL;HTML;CSS 63102|Australia|Extremely satisfied|Computer science, computer engineering, or software engineering|127957.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Clojure;JavaScript;Objective-C;Python;SQL;Swift;HTML;CSS;Bash/Shell 64911|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|966768.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;Java;JavaScript;SQL;HTML;CSS 39116|China|Slightly dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|13092.0|1 - 2 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Python;HTML;CSS 90189|India|Slightly satisfied|Computer science, computer engineering, or software engineering|2256.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|JavaScript;HTML;CSS 44567|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|122388.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;SQL;VBA;VB.NET;HTML;CSS 17871|United States|Slightly satisfied|Information systems, information technology, or system administration|58000.0|1 - 2 times per week|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 97417|Belarus|Moderately dissatisfied|Computer science, computer engineering, or software engineering|30000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C++;C#;SQL 93613|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|38337.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;C#;CoffeeScript;Java;JavaScript;Matlab;PHP;Python;SQL;TypeScript;VB.NET;HTML;CSS;Bash/Shell 28193|United Kingdom|Neither satisfied nor dissatisfied|A natural science (ex. biology, chemistry, physics)|173650.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Less than a year ago|C;Java;Objective-C;Swift;Kotlin;HTML 57405|Spain|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|32979.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;Python;Bash/Shell 96255|Spain|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|24478.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS 56472|Finland|Moderately satisfied|Mathematics or statistics|71232.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;Groovy;Java;JavaScript;PHP;Python;SQL;TypeScript;HTML 83120|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|61194.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 99052|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|67313.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;SQL 66979|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|92000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;Clojure;F#;Go;JavaScript;SQL;TypeScript 31119|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|173650.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Objective-C;Swift 38899|Israel|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|64944.0|I don't typically exercise|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Objective-C;Python;SQL;Swift;HTML;CSS 80757|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|30559.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Groovy;Java;JavaScript;Scala;Swift;Kotlin;Ocaml;Bash/Shell 62003|United States|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|87000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;Java;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 89038|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|822444.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Objective-C;HTML;CSS 23672|Ecuador|Slightly satisfied|Computer science, computer engineering, or software engineering|42000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Groovy;Java;JavaScript;Objective-C;SQL;TypeScript;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 49372|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|48000.0|1 - 2 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;HTML;CSS 22513|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|17592.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 64426|Spain|Moderately satisfied|Information systems, information technology, or system administration|29373.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;SQL 77327|India|Moderately satisfied|Computer science, computer engineering, or software engineering|15888.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 68270|India|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|6951.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;TypeScript;HTML;CSS 19324|Canada|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|32209.0|I don't typically exercise|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;C#;Java;JavaScript;Julia;Matlab;PHP;Python;Bash/Shell 78291|Sweden|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|56591.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;Java;JavaScript;Ruby;SQL 19125|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|62507.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Go;Java;JavaScript;Python;HTML;CSS 2404|Australia|Slightly satisfied|Information systems, information technology, or system administration|63835.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;Perl;PHP;Python;SQL;HTML;CSS;Bash/Shell 84046|France|Extremely satisfied|Computer science, computer engineering, or software engineering|35988.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;PHP;HTML;CSS 89877|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|67000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|35 - 44 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 84796|India|Slightly satisfied|Computer science, computer engineering, or software engineering|5256.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Objective-C;Swift 10333|El Salvador|Slightly dissatisfied|Computer science, computer engineering, or software engineering|9432.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C#;Python;VB.NET;Visual Basic 6 35830|Mexico|Moderately dissatisfied|Web development or web design|13536.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;PHP;SQL;TypeScript;VB.NET;HTML;CSS 56268|Canada|Extremely dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|201303.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;Haskell;JavaScript;Matlab;Python;SQL;VB.NET;HTML;CSS;Bash/Shell 33451|United States|Extremely satisfied|Information systems, information technology, or system administration|92000.0|Daily or almost every day|Male|White or of European descent|Associate degree|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 81|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|73428.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C;C++;C#;Java;JavaScript;VB.NET;HTML;CSS;Bash/Shell 58242|Bangladesh|Slightly satisfied|Computer science, computer engineering, or software engineering|2604.0|I don't typically exercise|Female|East Asian|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS 16314|Nigeria|Moderately dissatisfied|Computer science, computer engineering, or software engineering|3096.0|I don't typically exercise|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;SQL;HTML;CSS 48723|Canada|Slightly dissatisfied|Computer science, computer engineering, or software engineering|96626.0|1 - 2 times per week|Female|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;Perl;HTML 19428|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|71500.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Objective-C;Python;SQL;Swift;TypeScript;Kotlin;HTML;CSS;Bash/Shell 2382|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|57400.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C;Java;Python;Ruby 75427|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|88000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 37441|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|106000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|Python;R;SQL;Bash/Shell 25755|Netherlands|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|61194.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Matlab;Python;Ruby;HTML;CSS 2367|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Java 81005|Russian Federation|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|24000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Python;TypeScript;HTML;CSS;Bash/Shell 6976|United States|Slightly dissatisfied|A social science (ex. anthropology, psychology, political science)|60060.0|1 - 2 times per week|Female|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;R;SQL;VBA;HTML;CSS 51524|France|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|46507.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;SQL;Bash/Shell 67784|Switzerland|Extremely dissatisfied|Computer science, computer engineering, or software engineering|62556.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;R 91089|Poland|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|44111.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|45 - 54 years old|More than 4 years ago|JavaScript;Lua;PHP;Python;SQL;HTML;CSS;Bash/Shell 98712|France|Moderately dissatisfied|Web development or web design|666744.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS 11126|India|Slightly satisfied|Computer science, computer engineering, or software engineering|10958.0|Daily or almost every day|Male|South Asian|Primary/elementary school|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;Python;TypeScript;HTML;CSS;Bash/Shell 41240|Singapore|Slightly satisfied|Computer science, computer engineering, or software engineering|54504.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;Objective-C;PHP;Python;SQL;HTML;CSS;Bash/Shell 71104|Switzerland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|112611.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;Java 16345|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|155000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Less than a year ago|C;C++;C#;Go;Groovy;Java;JavaScript;Lua;Objective-C;Perl;PHP;Python;SQL;TypeScript;VB.NET;HTML;CSS;Bash/Shell 48980|Canada|Slightly dissatisfied|Computer science, computer engineering, or software engineering|30598.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;C#;JavaScript;SQL;HTML;CSS 4495|Netherlands|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|105253.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C;C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS 101524|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|80000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Go;JavaScript;Python;SQL;TypeScript;Bash/Shell 96543|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 51342|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|40000.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Assembly;C;C++;C#;JavaScript;Lua;Objective-C;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 41205|Poland|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|32460.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;SQL;Bash/Shell 89555|Spain|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|35492.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;C# 9323|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|90000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS 94866|Italy|Moderately satisfied|Computer science, computer engineering, or software engineering|39164.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Go;Java 46524|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|225000.0|I don't typically exercise|Male|East Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|45 - 54 years old|Less than a year ago|C++;Java;Python;R;Scala;Bash/Shell 12942|India|Slightly satisfied|Computer science, computer engineering, or software engineering|28961.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python;SQL;HTML;CSS 28200|United Kingdom|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|58340.0|3 - 4 times per week|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;R 75631|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|112730.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 14693|Viet Nam|Slightly satisfied|Computer science, computer engineering, or software engineering|7200.0|I don't typically exercise|Male|Native American, Pacific Islander, or Indigenous Australian|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|PHP;Python;Ruby;HTML 84818|Belarus|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|6048.0|I don't typically exercise|Female|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;SQL;Kotlin 56038|Canada|Moderately dissatisfied|Computer science, computer engineering, or software engineering|58781.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;C++;C#;Java;JavaScript;SQL;VBA;HTML 11653|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|70000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Go;Python;Ruby;SQL;Kotlin;HTML;CSS;Bash/Shell 87536|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|345000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 1790|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|60000.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 39829|United States|Moderately dissatisfied|Mathematics or statistics|75000.0|I don't typically exercise|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|PHP;Python 8186|United States|Moderately dissatisfied|Mathematics or statistics|100000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Python;SQL;HTML;Bash/Shell 34981|Australia|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|53582.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|Java;SQL;Bash/Shell 570|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|34726.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;Scala;SQL;HTML;CSS 9385|Romania|Moderately dissatisfied|Mathematics or statistics|10284.0|I don't typically exercise|Male|White or of European descent|Associate degree|3 - 4 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;C#;Java;Matlab 21140|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|6012.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C#;Java;JavaScript;Ruby 63173|United States|Moderately satisfied|Mathematics or statistics|66000.0|3 - 4 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;C#;JavaScript;PHP;Python;R;Ruby;SQL;VBA;Visual Basic 6;HTML;CSS 74670|Russian Federation|Moderately satisfied|Information systems, information technology, or system administration|33972.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 2813|Spain|Moderately dissatisfied|A humanities discipline (ex. literature, history, philosophy)|35988.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|Between 1 and 2 years ago|JavaScript;PHP;Ruby;SQL;HTML;CSS 24634|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|80000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C;C#;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 30790|Poland|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|40584.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|PHP;Python;Ruby;HTML;CSS;Bash/Shell 19820|Costa Rica|Slightly satisfied|Computer science, computer engineering, or software engineering|45000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|More than 4 years ago|Java;JavaScript;SQL;HTML;CSS;Bash/Shell 6792|France|Moderately satisfied|Computer science, computer engineering, or software engineering|0.0|3 - 4 times per week|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Scala;SQL;CSS;Bash/Shell 50772|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|35244.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 21268|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|58340.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS 16814|Switzerland|Extremely satisfied|Computer science, computer engineering, or software engineering|93842.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;Java;JavaScript;Lua;Perl;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 78559|Brazil|Slightly dissatisfied|Mathematics or statistics|524016.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|55 - 64 years old|More than 4 years ago|Java;JavaScript;PHP;SQL;Cobol;HTML;CSS;Bash/Shell 13456|Australia|Slightly satisfied|Mathematics or statistics|111963.0|I don't typically exercise|Male|East Asian|Professional degree (JD, MD, etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|C;C++;R;SQL;Bash/Shell 82479|United States|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|64000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C;Java;JavaScript;PHP;Python;SQL;HTML;CSS 12687|United States|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|85000.0|1 - 2 times per week|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|R;SQL;HTML 95004|United States|Extremely satisfied|Information systems, information technology, or system administration|84000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;HTML 68560|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|50000.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;Go;Haskell;Java;Python;Ruby;HTML;CSS;Bash/Shell 73332|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|25003.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS 35379|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|82000.0|1 - 2 times per week|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C++;Java;JavaScript;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 490|Ireland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|48955.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Go;Groovy;JavaScript;Python;Ruby;SQL;HTML;CSS;Bash/Shell 87076|United Kingdom|Moderately satisfied|I never declared a major|44449.0|I don't typically exercise|Male|White or of European descent|They never completed any formal education|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 79639|India|Moderately satisfied|Web development or web design|5640.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;Java;JavaScript;PHP;HTML;CSS 15904|Nepal|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|1176.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;Matlab;PHP;SQL;HTML;CSS 51794|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|48616.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;SQL;Kotlin 63047|Australia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|59980.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;Groovy;PHP;SQL;VB.NET;HTML;CSS 42429|Germany|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|30597.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Python;R;Scala 32414|France|Extremely satisfied|Computer science, computer engineering, or software engineering|153000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;F#;JavaScript;PHP;SQL;TypeScript;HTML;CSS 4503|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|122388.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C# 7602|Netherlands|Slightly dissatisfied|Computer science, computer engineering, or software engineering|44064.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 72122|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|170000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Bash/Shell 3013|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|70000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;C#;Clojure;Java;JavaScript;PHP;Python;Ruby;SQL;HTML;CSS 62829|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|79973.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Groovy;JavaScript;Python;Ruby;Bash/Shell 5123|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|78000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Go;Groovy;Java;Python;Scala;Bash/Shell 88781|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|51408.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Haskell;Java;JavaScript;PHP;Python;Scala;SQL;Bash/Shell 63483|United States|Slightly dissatisfied|A humanities discipline (ex. literature, history, philosophy)|110.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|55 - 64 years old|Between 2 and 4 years ago|R;SQL;VBA;VB.NET;HTML 16053|India|Extremely dissatisfied|Computer science, computer engineering, or software engineering|9393.0|I don't typically exercise|Male|South Asian|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|C#;JavaScript;Python;HTML;CSS;Bash/Shell 69725|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|51403.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 10999|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Lua;TypeScript;HTML;CSS;Bash/Shell 83532|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|87140.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;C++;Java;Perl;SQL;Bash/Shell 76724|Switzerland|Moderately satisfied|Web development or web design|145977.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 85116|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|73433.0|1 - 2 times per week|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Scala 20951|United Kingdom|Slightly dissatisfied|I never declared a major|60423.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 60284|Sweden|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|1000000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|Less than a year ago|C++;Java;Python;HTML 22627|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|126000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 20435|India|Slightly satisfied|Computer science, computer engineering, or software engineering|15588.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Assembly;JavaScript;Python;SQL;HTML;CSS 72885|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|49000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;Python;Ruby;SQL;HTML;CSS 32001|Estonia|Moderately satisfied|Computer science, computer engineering, or software engineering|33780.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 62735|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|85000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 5375|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|35292.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;HTML;CSS;Bash/Shell 42856|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|0.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|PHP;R;SQL;HTML 48911|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|128000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;Java;JavaScript;Python;Rust;TypeScript;HTML;CSS;Bash/Shell 57001|Sweden|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|45960.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;Python;HTML;CSS;Bash/Shell 66260|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|125000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|Assembly;C;Go;Haskell;Rust;SQL;HTML;Bash/Shell 73890|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|145000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|55 - 64 years old|Between 1 and 2 years ago|SQL;Bash/Shell 76127|France|Extremely satisfied|Computer science, computer engineering, or software engineering|63642.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Clojure;Go;Python;SQL 19519|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|50000.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 60684|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|85000.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 87223|India|Moderately satisfied|Computer science, computer engineering, or software engineering|16152.0|3 - 4 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 70924|Russian Federation|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|16980.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;Python 14094|Ukraine|Slightly dissatisfied|Computer science, computer engineering, or software engineering|37200.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 66626|Pakistan|Slightly satisfied|Information systems, information technology, or system administration|36000.0|Daily or almost every day|Male|South Asian|Professional degree (JD, MD, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;Java 60140|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|130000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Go;Java;JavaScript;Scala;SQL;Bash/Shell 91030|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|1000000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|C;Go;Ruby;Bash/Shell 53954|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|55075.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Python 95445|Belgium|Extremely dissatisfied|Computer science, computer engineering, or software engineering|122388.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Java;JavaScript;Python;Swift 12183|Italy|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|63642.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;PHP;Rust;SQL;Bash/Shell 44304|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|138000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Bash/Shell 77250|Brazil|Slightly dissatisfied|Information systems, information technology, or system administration|13104.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS 79913|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|136000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;JavaScript;Objective-C;Perl;Python;Ruby;Rust;Swift;HTML;CSS;Bash/Shell 78332|India|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|187848.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Python;SQL;Bash/Shell 28716|United States|Slightly satisfied|A social science (ex. anthropology, psychology, political science)|180000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Groovy;Java;JavaScript;HTML;CSS;Bash/Shell 84879|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|85000.0|1 - 2 times per week|Female|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|45 - 54 years old|More than 4 years ago|JavaScript;SQL;VB.NET;HTML;CSS 28120|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|2160.0|1 - 2 times per week|Male|South Asian|Primary/elementary school|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Java 50021|Russian Federation|Slightly satisfied|Computer science, computer engineering, or software engineering|37800.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 100789|Bosnia and Herzegovina|Slightly dissatisfied|Information systems, information technology, or system administration|31705.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;Java;JavaScript;SQL;HTML;CSS 90390|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|100000.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Groovy;Java;JavaScript;PHP;Ruby;SQL;TypeScript;HTML;CSS 16471|United Kingdom|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|152794.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C++;Hack;Java;JavaScript;Python;HTML 24464|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|98000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 88527|Ecuador|Moderately satisfied|Computer science, computer engineering, or software engineering|21600.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;Matlab;Python;SQL;HTML;CSS;Bash/Shell 6695|United Kingdom|Moderately satisfied|Information systems, information technology, or system administration|23336.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|More than 4 years ago|JavaScript;Lua;PHP;SQL;Delphi/Object Pascal;HTML;CSS 90321|Finland|Extremely satisfied|Computer science, computer engineering, or software engineering|55075.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Java;JavaScript;PHP;Scala;HTML;CSS 29047|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|300000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;Java;JavaScript;PHP;SQL;VBA;VB.NET;HTML 97644|India|Extremely satisfied|Computer science, computer engineering, or software engineering|3756.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Java;JavaScript;Ruby;SQL;HTML;CSS 4160|United States|Neither satisfied nor dissatisfied|Mathematics or statistics|60000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|SQL;HTML;CSS 99606|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|140000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;SQL;CSS;Bash/Shell 55512|Portugal|Moderately satisfied|Computer science, computer engineering, or software engineering|15864.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C#;Java;JavaScript;Swift 50338|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|145000.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|45 - 54 years old|Between 2 and 4 years ago|Groovy;JavaScript;Python;Bash/Shell 81234|Portugal|Moderately dissatisfied|Web development or web design|22275.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;Lua;Matlab;Objective-C;PHP;SQL;HTML;CSS 40875|Germany|Moderately satisfied|Information systems, information technology, or system administration|383074.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 72137|India|Moderately satisfied|Computer science, computer engineering, or software engineering|8448.0|Daily or almost every day|Male|South Asian|Primary/elementary school|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;HTML;CSS 20875|India|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|11268.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 73453|Czech Republic|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|23172.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;HTML;CSS 73300|United States|Slightly satisfied|Information systems, information technology, or system administration|50000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 41867|Philippines|Moderately satisfied|Computer science, computer engineering, or software engineering|500.0|1 - 2 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Over 4 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;JavaScript;PHP;SQL;VB.NET;Visual Basic 6;HTML;CSS 43320|New Zealand|Slightly dissatisfied|Computer science, computer engineering, or software engineering|86000.0|Daily or almost every day|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Scala;SQL;HTML;CSS 20538|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|110000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Ruby;HTML;CSS;Bash/Shell 85535|United States|Moderately dissatisfied|Mathematics or statistics|80000.0|Daily or almost every day|Female;Transgender|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Objective-C;Python;SQL;Swift;HTML;CSS 29774|Spain|Slightly dissatisfied|Computer science, computer engineering, or software engineering|22030.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 46476|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|56376.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java 24181|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|107500.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|45 - 54 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 17184|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|95000.0|3 - 4 times per week|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Swift;Kotlin 4356|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|75000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 57826|United States|Moderately satisfied|Mathematics or statistics|86000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;CoffeeScript;JavaScript;R;TypeScript;HTML;CSS;Bash/Shell 2031|Serbia|Moderately satisfied|Computer science, computer engineering, or software engineering|5880.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|CoffeeScript;Go;JavaScript;HTML;CSS 534|France|Extremely satisfied|Computer science, computer engineering, or software engineering|39776.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Go;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 11106|India|Slightly satisfied|Computer science, computer engineering, or software engineering|266748.0|1 - 2 times per week|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Python;TypeScript;HTML;CSS 29410|France|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|58746.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;Lua;PHP;Python;HTML;CSS;Bash/Shell 71361|Poland|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|15876.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;JavaScript;TypeScript;Kotlin;Bash/Shell 16811|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|5256.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;PHP;SQL;HTML;CSS 46426|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|150000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Clojure;Go;Java;JavaScript;Objective-C;Python;Ruby;Swift;HTML;CSS;Bash/Shell 43088|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|63642.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;TypeScript;HTML;CSS 99172|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|125000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|F#;Haskell;Python;Rust;HTML;CSS 84987|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;CoffeeScript;Java;JavaScript;PHP;Python;SQL;HTML;CSS 75959|Czech Republic|Moderately satisfied|Computer science, computer engineering, or software engineering|57912.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Objective-C;Swift 50364|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|62500.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|CoffeeScript;Haskell;JavaScript;Perl;PHP;Python;R;SQL;HTML;CSS;Bash/Shell 23574|Germany|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|79552.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C++;Java;Matlab;Python 52222|France|Extremely satisfied|Computer science, computer engineering, or software engineering|53239.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;JavaScript;Python 64444|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|39648.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;HTML;CSS 78138|Australia|Moderately satisfied|Information systems, information technology, or system administration|145552.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;Ruby;HTML;CSS;Bash/Shell 48051|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|31253.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;TypeScript 61359|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|120000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;C#;Groovy;Java;JavaScript;Python;Ruby;TypeScript;HTML;CSS;Bash/Shell 2780|India|Moderately satisfied|Computer science, computer engineering, or software engineering|17220.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Ruby;TypeScript 63808|Australia|Moderately satisfied|Information systems, information technology, or system administration|79973.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|Between 2 and 4 years ago|Python;SQL 16265|Algeria|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|18000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Perl;PHP;Python;HTML;CSS 101560|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|85000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 12381|Mexico|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|22560.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 78828|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|96538.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;SQL;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 75343|United Kingdom|Extremely dissatisfied|Computer science, computer engineering, or software engineering|38199.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;Groovy;Java;JavaScript;Objective-C;PHP;SQL;HTML;CSS;Bash/Shell 20023|Russian Federation|Extremely dissatisfied|Computer science, computer engineering, or software engineering|25476.0|1 - 2 times per week|Male|Native American, Pacific Islander, or Indigenous Australian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;HTML;CSS 101179|Canada|Slightly satisfied|Information systems, information technology, or system administration|56365.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;Go;Groovy;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 55250|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|33684.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Python;Bash/Shell 30850|United Kingdom|Extremely satisfied|Mathematics or statistics|122930.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;JavaScript;Python;SQL;Bash/Shell 51819|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|50000.0|I don't typically exercise|Female|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;SQL;HTML;CSS;Bash/Shell 33471|Dominican Republic|Slightly satisfied|Mathematics or statistics|15000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Matlab;SQL;TypeScript;HTML;CSS 30604|India|Slightly dissatisfied|A business discipline (ex. accounting, finance, marketing)|9393.0|I don't typically exercise|Male|South Asian|Associate degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;Python;TypeScript;CSS 83499|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|23614.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;PHP;Python;TypeScript;HTML;CSS;Bash/Shell 83639|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|230000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|45 - 54 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 83783|Germany|Extremely satisfied|Mathematics or statistics|111373.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;VB.NET 79780|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;C++;Python;Bash/Shell 86720|Hungary|Moderately satisfied|Computer science, computer engineering, or software engineering|30960.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 48282|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|195000.0|Daily or almost every day|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Java;JavaScript;SQL;HTML;Bash/Shell 84910|India|Extremely satisfied|Computer science, computer engineering, or software engineering|5256.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;Python;HTML;CSS;Bash/Shell 100004|Colombia|Slightly satisfied|Computer science, computer engineering, or software engineering|4800.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;Java;SQL 75517|Poland|Slightly dissatisfied|Information systems, information technology, or system administration|19056.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Go;Lua;Python;SQL;HTML;CSS;Bash/Shell 98211|Ukraine|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|18792.0|1 - 2 times per week|Male|Middle Eastern|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Python;TypeScript;HTML;CSS;Bash/Shell 27604|United States|Slightly satisfied|Information systems, information technology, or system administration|80000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;HTML;CSS;Bash/Shell 23397|France|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|32808.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C++;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 46202|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|8448.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C++;Java;Kotlin 76568|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|169000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Go;Java;JavaScript;Python;HTML;CSS;Bash/Shell 48134|China|Slightly dissatisfied|Computer science, computer engineering, or software engineering|46752.0|3 - 4 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;C#;Go;Java;JavaScript;Lua;Rust;SQL;TypeScript;HTML;Bash/Shell 22334|Iran, Islamic Republic of...|Moderately satisfied|Computer science, computer engineering, or software engineering|16644.0|I don't typically exercise|Male|Middle Eastern|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Groovy;Java;PHP;SQL;HTML;CSS;Bash/Shell 15385|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|60000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|They never completed any formal education|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;JavaScript;PHP;SQL;TypeScript;HTML;CSS 82822|Australia|Extremely satisfied|Computer science, computer engineering, or software engineering|99967.0|I don't typically exercise|Male|White or of European descent|They never completed any formal education|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;Python;R;Scala;SQL 97738|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|97233.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;Perl;Python;Ruby;SQL;HTML;Bash/Shell 16896|Canada|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|64417.0|3 - 4 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Matlab;Python;R;SQL;TypeScript;HTML;CSS;Bash/Shell 93479|Philippines|Moderately dissatisfied|Information systems, information technology, or system administration|2364.0|3 - 4 times per week|Male|South Asian|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C#;Java;JavaScript;PHP;TypeScript;HTML;CSS 71306|India|Extremely dissatisfied|Computer science, computer engineering, or software engineering|7827.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;Matlab;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 93666|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|82000.0|1 - 2 times per week|Female;Transgender|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C++;JavaScript;Python;HTML;CSS;Bash/Shell 50748|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|20664.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;Python;Bash/Shell 36106|Ethiopia|Slightly satisfied|Computer science, computer engineering, or software engineering|8712.0|1 - 2 times per week|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 90850|United Kingdom|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|51394.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Go;Julia;Python;Bash/Shell 55558|France|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|44064.0|Daily or almost every day|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|3 - 4 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Python;SQL;HTML;CSS;Bash/Shell 62237|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|134627.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|C++;Go;Haskell;Java;JavaScript;Perl;Python;Ruby;Scala;SQL;CSS;Bash/Shell 97861|India|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|7512.0|1 - 2 times per week|Female|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;HTML;CSS 36530|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|40388.0|3 - 4 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;R;Scala 9678|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|58869.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Perl 19688|United Kingdom|Moderately satisfied|Mathematics or statistics|90288.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;VBA;VB.NET;HTML;CSS;Bash/Shell 15942|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|74500.0|3 - 4 times per week|Male|Native American, Pacific Islander, or Indigenous Australian;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 59483|Australia|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|67977.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Go;JavaScript;Python;TypeScript;HTML;CSS;Bash/Shell 61127|Denmark|Extremely satisfied|Computer science, computer engineering, or software engineering|69036.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Go;JavaScript;PHP;Rust;HTML;CSS;Bash/Shell 80668|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|75000.0|3 - 4 times per week|Male|Middle Eastern;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 69440|Malta|Moderately satisfied|Information systems, information technology, or system administration|55075.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML 63833|Russian Federation|Moderately satisfied|A health science (ex. nursing, pharmacy, radiology)|55200.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;Objective-C;PHP;Python;SQL;Swift;HTML;CSS;Bash/Shell 90696|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|1000000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|Between 1 and 2 years ago|C++;PHP;Delphi/Object Pascal 85099|Sri Lanka|Moderately satisfied|Information systems, information technology, or system administration|17124.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 99863|Sweden|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|43416.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 96909|Russian Federation|Moderately satisfied|Computer science, computer engineering, or software engineering|10620.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Java;PHP;Python;Rust;SQL;Bash/Shell 51449|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|76368.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;JavaScript;Python;Bash/Shell 62686|Ghana|Slightly dissatisfied|Computer science, computer engineering, or software engineering|10008.0|I don't typically exercise|Female|Black or of African descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Groovy;Java;JavaScript;Objective-C;Python;SQL;Swift;Kotlin;HTML;CSS 59537|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|2000000.0|3 - 4 times per week|Male|Native American, Pacific Islander, or Indigenous Australian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Python;R;SQL;VBA 22311|United States|Slightly dissatisfied|A humanities discipline (ex. literature, history, philosophy)|85000.0|3 - 4 times per week|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|JavaScript;Python;R;SQL;HTML;CSS 39522|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|56298.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;R;HTML 97303|United States|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|115000.0|I don't typically exercise|Male|East Asian;White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;SQL;Swift;HTML;CSS 45144|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|170000.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Assembly;C;C++;Python;Bash/Shell 10607|Italy|Slightly satisfied|Computer science, computer engineering, or software engineering|3060.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;Java;JavaScript;Matlab;PHP;HTML;CSS 3243|Malaysia|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|12132.0|3 - 4 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|Go;JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 92845|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|104678.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C#;Java;JavaScript;Perl;SQL;VB.NET;HTML;CSS 15321|United States|Extremely satisfied|I never declared a major|50000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Objective-C;Python;SQL;Swift;TypeScript;HTML;CSS 95388|Canada|Moderately dissatisfied|Computer science, computer engineering, or software engineering|66027.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;C;Go;Python;Ruby;SQL;Swift;HTML;CSS;Bash/Shell 29027|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Groovy;JavaScript;Lua;TypeScript;HTML;CSS 52183|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|19920.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS 60295|Poland|Moderately dissatisfied|A business discipline (ex. accounting, finance, marketing)|28236.0|1 - 2 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;HTML;CSS 93138|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|73433.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C++;C#;HTML;CSS 10267|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|89266.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 5998|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|41671.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 14244|Spain|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|33045.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;SQL 25786|Netherlands|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|30156.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Groovy;Java;JavaScript;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 27262|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;F#;JavaScript;SQL;HTML;CSS 22522|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|40000.0|I don't typically exercise|Transgender|White or of European descent|Associate degree|Less than 30 minutes|55 - 64 years old|More than 4 years ago|Delphi/Object Pascal 49890|Austria|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|20556.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;Java;Objective-C;PHP;Python;R;SQL;Swift;VBA;VB.NET;Visual Basic 6;Delphi/Object Pascal;HTML;CSS;Bash/Shell 14105|France|Moderately satisfied|Computer science, computer engineering, or software engineering|646212.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Objective-C;Swift 30500|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|30108.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Objective-C;Swift 28912|United Kingdom|Extremely satisfied|Mathematics or statistics|44449.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Python;R;SQL;VBA 38265|India|Moderately satisfied|Computer science, computer engineering, or software engineering|18785.0|Daily or almost every day|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python 17638|Canada|Extremely satisfied|Information systems, information technology, or system administration|48152.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 9686|Nepal|Slightly satisfied|Computer science, computer engineering, or software engineering|91644.0|I don't typically exercise|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS 101333|Japan|Slightly satisfied|Computer science, computer engineering, or software engineering|30252.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 41415|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|36720.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|More than 4 years ago|C#;JavaScript;PHP;Python;SQL;Swift;HTML;CSS 17445|United States|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|2000000.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;PHP;SQL;TypeScript;VBA;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 68783|Italy|Extremely satisfied|Computer science, computer engineering, or software engineering|12239.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|Assembly;C;C++;Java;JavaScript;Matlab;PHP;SQL;Visual Basic 6;Kotlin;Cobol;HTML;CSS;Bash/Shell 69496|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|44916.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;SQL 65777|China|Extremely satisfied|Computer science, computer engineering, or software engineering|31167.0|3 - 4 times per week|Male|South Asian|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 26886|Netherlands|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|46992.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;HTML;CSS 63693|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|140000.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|3 - 4 hours|35 - 44 years old|Between 1 and 2 years ago|JavaScript;Objective-C;PHP;SQL;Swift;HTML;CSS;Bash/Shell 81657|Philippines|Extremely dissatisfied|Information systems, information technology, or system administration|2880.0|3 - 4 times per week|Male|East Asian;South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;HTML;CSS 24645|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|122500.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Go;Python;Bash/Shell 25501|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|52339.0|1 - 2 times per week|Female|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 56974|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|55000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|3 - 4 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML 64248|France|Moderately satisfied|Computer science, computer engineering, or software engineering|64866.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS 2996|Pakistan|Slightly satisfied|Computer science, computer engineering, or software engineering|1632.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;C#;Objective-C;PHP;Python;SQL;VB.NET;Visual Basic 6;HTML;CSS 90854|Italy|Slightly satisfied|Computer science, computer engineering, or software engineering|411228.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript 20057|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|101200.0|Daily or almost every day|Female|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;R;SQL;TypeScript;HTML;CSS 97256|Belgium|Slightly dissatisfied|A health science (ex. nursing, pharmacy, radiology)|35244.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Perl;PHP;R;SQL;Delphi/Object Pascal;HTML;CSS;Bash/Shell 23532|India|Slightly satisfied|Computer science, computer engineering, or software engineering|2256.0|Daily or almost every day|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;Python;HTML;CSS 73523|Bosnia and Herzegovina|Moderately satisfied|Computer science, computer engineering, or software engineering|24972.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 13367|Colombia|Slightly satisfied|Computer science, computer engineering, or software engineering|14760.0|Daily or almost every day|Female|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;Objective-C;Python;SQL;Swift;TypeScript;HTML;CSS 10529|France|Moderately satisfied|Computer science, computer engineering, or software engineering|46507.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;JavaScript;Rust;SQL;HTML 39759|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|44287.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;HTML;CSS 66148|South Korea|Extremely satisfied|Computer science, computer engineering, or software engineering|62808.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;Python 51814|Spain|Slightly satisfied|Computer science, computer engineering, or software engineering|176244.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|Over 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 64181|United States|Moderately satisfied|Information systems, information technology, or system administration|85000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;HTML;CSS 730|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|63979.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;Visual Basic 6;HTML;CSS 23233|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|66767.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|R 18141|United States|Moderately satisfied|Web development or web design|94000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;PHP;SQL;HTML;CSS 45551|United Kingdom|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|750084.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;SQL;HTML;CSS 93449|United Kingdom|Slightly dissatisfied|Web development or web design|34726.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS 10026|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|90000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C++;C#;Java;JavaScript;Matlab;PHP;Python;SQL;HTML;CSS;Bash/Shell 74621|Australia|Extremely dissatisfied|Information systems, information technology, or system administration|1000000.0|I don't typically exercise|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C#;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 7708|Belgium|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|61680.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|45 - 54 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 7447|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|58746.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;Bash/Shell 79990|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|44300.0|3 - 4 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Assembly;C++;JavaScript;TypeScript;HTML;CSS;Bash/Shell 28161|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|64417.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;JavaScript;Python;Bash/Shell 10413|Sri Lanka|Moderately satisfied|Computer science, computer engineering, or software engineering|1560.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;VB.NET;HTML;CSS 95567|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|25008.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|CoffeeScript;JavaScript;TypeScript;HTML;CSS 100370|India|Moderately satisfied|Computer science, computer engineering, or software engineering|1884.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;Java;JavaScript;PHP;SQL;VB.NET;Visual Basic 6;HTML;CSS 54239|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|1000000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 3153|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|100000.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Python 10899|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|117000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|Assembly;C;C++;Go;Haskell;JavaScript;Python;SQL;HTML 18893|Indonesia|Slightly satisfied|Computer science, computer engineering, or software engineering|3576.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS 25177|Germany|Extremely dissatisfied|Information systems, information technology, or system administration|73433.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 73107|India|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|3757.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;Python;HTML;CSS 88965|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|14652.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Hack;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 58969|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|19447.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C++;Matlab;Perl;Python;R;Bash/Shell 27413|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|88000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 73404|Germany|Slightly satisfied|A business discipline (ex. accounting, finance, marketing)|97910.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|JavaScript;PHP;HTML;CSS;Bash/Shell 17508|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|76397.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;VBA;VB.NET;HTML;CSS 58546|Denmark|Extremely dissatisfied|A business discipline (ex. accounting, finance, marketing)|164366.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|55 - 64 years old|Between 2 and 4 years ago|C;C#;VBA;VB.NET;Visual Basic 6;HTML 27955|Czech Republic|Moderately satisfied|Computer science, computer engineering, or software engineering|23748.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;SQL;TypeScript;HTML;CSS 100426|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|90000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 99601|Pakistan|Extremely satisfied|Computer science, computer engineering, or software engineering|8676.0|3 - 4 times per week|Male|South Asian|Primary/elementary school|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;C#;Java;JavaScript;PHP;SQL;HTML;CSS 98246|Spain|Slightly satisfied|Computer science, computer engineering, or software engineering|381852.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Python 30279|Iceland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|116862.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;TypeScript;HTML;CSS;Bash/Shell 33525|Spain|Slightly dissatisfied|Computer science, computer engineering, or software engineering|44060.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 48188|United States|Moderately dissatisfied|A social science (ex. anthropology, psychology, political science)|55000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS 76866|Iran, Islamic Republic of...|Moderately satisfied|Computer science, computer engineering, or software engineering|26640.0|I don't typically exercise|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C#;Java 6252|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|38893.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;Matlab;Objective-C;PHP;SQL;Swift;HTML;CSS 95184|India|Moderately satisfied|Computer science, computer engineering, or software engineering|17220.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 34209|Germany|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|88119.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|55 - 64 years old|Between 2 and 4 years ago|Assembly;C;JavaScript;Perl;Cobol 8224|India|Moderately satisfied|Computer science, computer engineering, or software engineering|6262.0|Daily or almost every day|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 6928|South Africa|Extremely dissatisfied|A natural science (ex. biology, chemistry, physics)|19584.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Python 64192|Germany|Moderately dissatisfied|A social science (ex. anthropology, psychology, political science)|44064.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;Go;JavaScript;Python;Rust;HTML;CSS;Bash/Shell 41846|Czech Republic|Moderately satisfied|Computer science, computer engineering, or software engineering|45972.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Clojure;Go;Groovy;Java;JavaScript;PHP;Scala;HTML;CSS;Bash/Shell 50698|United Kingdom|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|62507.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;Python;SQL 71898|United States|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|148000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Clojure;Groovy;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 22169|United States|Moderately dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|115000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 30372|Canada|Slightly satisfied|Computer science, computer engineering, or software engineering|38652.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Go;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 17509|Australia|Slightly dissatisfied|Information systems, information technology, or system administration|43985.0|1 - 2 times per week|Male|South Asian|They never completed any formal education|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;PHP;HTML;CSS 76892|Singapore|Slightly satisfied|Computer science, computer engineering, or software engineering|90840.0|3 - 4 times per week|Male|South Asian|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java 4577|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|118280.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C#;SQL 32046|United States|Extremely satisfied|Information systems, information technology, or system administration|150000.0|3 - 4 times per week|Male|Middle Eastern;White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;Python;SQL;HTML;CSS;Bash/Shell 95347|Japan|Moderately satisfied|Computer science, computer engineering, or software engineering|59424.0|I don't typically exercise|Male|East Asian;South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;Objective-C;Python;Ruby;SQL;Swift;Kotlin 84660|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|127000.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;HTML;CSS 66907|Canada|Slightly dissatisfied|Computer science, computer engineering, or software engineering|88573.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|PHP;Python;Ruby;Bash/Shell 40805|Bangladesh|Moderately satisfied|Mathematics or statistics|6612.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Python;SQL;HTML;CSS 61661|Sweden|Moderately satisfied|Mathematics or statistics|73433.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C++;C#;JavaScript;Julia;Python;SQL;HTML;CSS;Bash/Shell 17582|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|72500.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C# 51534|Australia|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|60000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Python;SQL;HTML;CSS;Bash/Shell 32113|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|116268.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C++;Go;Java;Python;SQL;HTML;CSS;Bash/Shell 6716|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|66084.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Erlang;JavaScript;Ruby 387|Russian Federation|Extremely satisfied|Mathematics or statistics|20808.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;Python;SQL;HTML;CSS 24685|India|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|44328.0|I don't typically exercise|Male|South Asian|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript 90333|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|75000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;SQL;HTML;CSS 99735|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|78000.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Java;JavaScript;Python;SQL;Swift;HTML;CSS;Bash/Shell 64408|Belarus|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|9600.0|3 - 4 times per week|Female;Male;Transgender;Non-binary, genderqueer, or gender non-conforming|Black or of African descent;East Asian;Hispanic or Latino/Latina;Middle Eastern;Native American, Pacific Islander, or Indigenous Australian;South Asian;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|Java;Kotlin;Bash/Shell 55300|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|145000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;Objective-C;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 13674|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|75000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;SQL;HTML;CSS;Bash/Shell 86194|Poland|Slightly satisfied|Information systems, information technology, or system administration|17640.0|I don't typically exercise|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C++ 47647|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|51403.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS 6954|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|76000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;C#;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 65285|United States|Slightly dissatisfied|I never declared a major|80000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 61631|Italy|Moderately satisfied|Computer science, computer engineering, or software engineering|36716.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C++;C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 16673|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|57276.0|1 - 2 times per week|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Ruby;SQL;HTML;CSS 23474|China|Slightly dissatisfied|Computer science, computer engineering, or software engineering|19632.0|1 - 2 times per week|Male|East Asian|Primary/elementary school|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;Java;JavaScript;PHP;Python;SQL;Kotlin;HTML;CSS;Bash/Shell 17548|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|52783.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|R;SQL 77808|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|38650.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;Objective-C;SQL;Swift 16656|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|9393.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;Java;JavaScript;PHP;SQL;HTML;CSS 17905|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|50304.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Ruby 4279|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|180000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|55 - 64 years old|Between 1 and 2 years ago|C;C++;Java;Matlab;Python;R;Scala;Bash/Shell 31114|Malaysia|Extremely dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|10320.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;JavaScript;Objective-C;Ruby;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS 61657|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|62380.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;C# 15160|United States|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|56000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;Python;R;SQL;TypeScript;VBA;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 67365|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|94000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C#;Go;JavaScript;PHP;Python;Ruby;Rust;SQL;HTML;CSS;Bash/Shell 13682|Netherlands|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|77104.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Perl;Python;HTML;CSS 44164|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|100000.0|3 - 4 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C;C++;Python;SQL;Bash/Shell 61263|Iran, Islamic Republic of...|Moderately dissatisfied|Computer science, computer engineering, or software engineering|16644.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|Between 2 and 4 years ago|C++;C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS 95237|Russian Federation|Slightly satisfied|A business discipline (ex. accounting, finance, marketing)|12732.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;PHP;HTML;CSS 13689|Greece|Moderately dissatisfied|Computer science, computer engineering, or software engineering|24478.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 6831|France|Moderately satisfied|Computer science, computer engineering, or software engineering|66089.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C++;JavaScript;TypeScript 11878|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|95000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;F#;JavaScript;TypeScript;HTML;CSS 53400|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|308412.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Primary/elementary school|Over 4 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;Matlab;Objective-C;PHP;Python;R;SQL;Swift;HTML;CSS 4370|India|Slightly satisfied|Computer science, computer engineering, or software engineering|150288.0|3 - 4 times per week|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;Python;R;SQL 46785|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|48616.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Python;HTML;CSS 98025|Switzerland|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|118872.0|3 - 4 times per week|Male|East Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|45 - 54 years old|Between 1 and 2 years ago|C++;C#;JavaScript;PHP;Python;TypeScript 4673|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|140000.0|3 - 4 times per week|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;Java;JavaScript;Python;R;Ruby;SQL;HTML;CSS;Bash/Shell 32291|Singapore|Slightly satisfied|Computer science, computer engineering, or software engineering|34067.0|3 - 4 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Ruby;SQL;VBA;VB.NET;HTML 34562|Finland|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|32316.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java;SQL;HTML 35875|Belgium|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|55812.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;HTML;CSS;Bash/Shell 788|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|55000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;Lua;Python;HTML;CSS;Bash/Shell 25607|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|75000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Go;Java;JavaScript;Objective-C;PHP;Python;SQL;HTML;CSS;Bash/Shell 15348|France|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|58746.0|I don't typically exercise|Male|White or of European descent|They never completed any formal education|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Objective-C;Swift 94897|Spain|Extremely satisfied|Computer science, computer engineering, or software engineering|44060.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Python;TypeScript 55669|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|58746.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;SQL 69847|United States|Extremely satisfied|Information systems, information technology, or system administration|83000.0|Daily or almost every day|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;Bash/Shell 81418|Lebanon|Extremely satisfied|Computer science, computer engineering, or software engineering|13200.0|I don't typically exercise|Male|Middle Eastern|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS 72016|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|33280.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;Go;Java;JavaScript;PHP;SQL;CSS;Bash/Shell 95560|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|107000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Java;Scala 10622|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|115000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C#;Go;JavaScript;Python;SQL;TypeScript 80194|Germany|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|39648.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java;VBA;HTML;CSS 5771|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|100500.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|Java;SQL 96383|Other Country (Not Listed Above)|Neither satisfied nor dissatisfied|A natural science (ex. biology, chemistry, physics)|58340.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Python;R;SQL;HTML;CSS;Bash/Shell 9349|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|150000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|JavaScript;Python;HTML;CSS 30759|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|56365.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Go;Java;JavaScript;Objective-C;Python;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 82086|Uruguay|Slightly satisfied|Computer science, computer engineering, or software engineering|7992.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;PHP;HTML;CSS 62954|United States|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|95000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 52466|Germany|Extremely dissatisfied|Computer science, computer engineering, or software engineering|58746.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C;C++;Python 5917|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|96626.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C;C++;Java;Python;Bash/Shell 52129|United States|Slightly satisfied|Mathematics or statistics|140000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;SQL;Bash/Shell 94259|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|180000.0|1 - 2 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;TypeScript;HTML;CSS 36813|Colombia|Slightly dissatisfied|Information systems, information technology, or system administration|21300.0|3 - 4 times per week|Male|Black or of African descent;Hispanic or Latino/Latina|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;HTML;CSS;Bash/Shell 26385|New Zealand|Slightly satisfied|Computer science, computer engineering, or software engineering|41658.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;SQL;HTML;CSS 23720|France|Slightly satisfied|Web development or web design|10284.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;SQL;HTML;CSS;Bash/Shell 58233|Brazil|Extremely dissatisfied|Information systems, information technology, or system administration|65508.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;CSS 38718|Iran, Islamic Republic of...|Slightly dissatisfied|Computer science, computer engineering, or software engineering|11652.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Java;Python 70644|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|55981.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 80275|India|Slightly satisfied|Computer science, computer engineering, or software engineering|5640.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;JavaScript;Objective-C;PHP;Swift;HTML;CSS 30508|Pakistan|Extremely satisfied|Computer science, computer engineering, or software engineering|7200.0|I don't typically exercise|Male|East Asian|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|Java;PHP;Swift 14183|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|30000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java 55113|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|200016.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;Python;SQL;Kotlin;Bash/Shell 3756|Israel|Moderately satisfied|Computer science, computer engineering, or software engineering|94788.0|I don't typically exercise|Male|Middle Eastern;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Matlab;Perl;PHP;Python;Ruby;SQL;VB.NET;HTML;CSS;Bash/Shell 59679|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|102000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|JavaScript;Python 26958|Jordan|Moderately satisfied|Computer science, computer engineering, or software engineering|30468.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS 42011|Russian Federation|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|8846.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|More than 4 years ago|C;C++;JavaScript;Matlab;Python;Visual Basic 6;HTML;CSS;Bash/Shell 128|United States|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|14000.0|3 - 4 times per week|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS;Bash/Shell 16168|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|110000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 37058|Russian Federation|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|42456.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|PHP;Python;SQL;VBA 99799|China|Slightly dissatisfied|Mathematics or statistics|23375.0|I don't typically exercise|Male|East Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;Java;Delphi/Object Pascal 14939|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|83224.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;Java 28530|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|112000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 85452|Saudi Arabia|Moderately satisfied|Computer science, computer engineering, or software engineering|33600.0|3 - 4 times per week|Female|South Asian|Professional degree (JD, MD, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS 55769|France|Slightly satisfied|Computer science, computer engineering, or software engineering|48955.0|I don't typically exercise|Male|Black or of African descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;Matlab;Python;SQL;HTML;CSS;Bash/Shell 20898|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|55075.0|3 - 4 times per week|Male|White or of European descent|They never completed any formal education|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;TypeScript;HTML;CSS 574|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|106000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Ruby;SQL 18121|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|75000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;PHP;Python;R;SQL;TypeScript;HTML;CSS;Bash/Shell 1295|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|200000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C++;Java;JavaScript;Python;SQL;Bash/Shell 98884|United States|Moderately satisfied|Information systems, information technology, or system administration|125000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;Python 26723|Switzerland|Moderately satisfied|Computer science, computer engineering, or software engineering|125123.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C++;C#;Java;Swift;HTML;CSS;Bash/Shell 65376|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|55075.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|Between 1 and 2 years ago|Java;JavaScript;Ruby;SQL;Kotlin;HTML;Bash/Shell 318|Slovakia|Extremely satisfied|Computer science, computer engineering, or software engineering|46992.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|More than 4 years ago|CoffeeScript;JavaScript;TypeScript;HTML 30754|United Kingdom|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|24308.0|3 - 4 times per week|Male|White or of European descent|They never completed any formal education|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Java;Python;HTML;Bash/Shell 18398|Finland|Moderately satisfied|Computer science, computer engineering, or software engineering|76368.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;Python;HTML 33170|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|75000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|35 - 44 years old|More than 4 years ago|Python;HTML;Bash/Shell 95021|Egypt|Moderately satisfied|Computer science, computer engineering, or software engineering|1704.0|I don't typically exercise|Female|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Assembly;C;C++;C#;Go;Java;JavaScript;Matlab;PHP;R;Visual Basic 6;HTML;CSS 79134|United Kingdom|Moderately dissatisfied|Computer science, computer engineering, or software engineering|600060.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 82284|Switzerland|Neither satisfied nor dissatisfied|A business discipline (ex. accounting, finance, marketing)|93842.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Java;JavaScript;HTML 64121|Germany|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|78328.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Clojure;Java;JavaScript;Objective-C;Kotlin 47869|Denmark|Extremely satisfied|Computer science, computer engineering, or software engineering|73636.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Objective-C;Perl;Swift 68404|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|116500.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 78569|Canada|Moderately satisfied|Web development or web design|101457.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 92034|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|110000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;F#;Lua;Python;SQL;TypeScript;Kotlin;HTML;CSS 18974|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|960000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;JavaScript 41811|Netherlands|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|82000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Python;Scala;SQL;Bash/Shell 63462|United States|Moderately satisfied|Information systems, information technology, or system administration|50000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 37770|United Kingdom|Slightly dissatisfied|Mathematics or statistics|60423.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C;Java;Python;HTML;CSS;Bash/Shell 62917|Gambia|Moderately satisfied|Web development or web design|3780.0|1 - 2 times per week|Male|Black or of African descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;PHP;SQL;VBA;VB.NET;HTML;CSS 32893|United States|Moderately satisfied|I never declared a major|105000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 31671|Belgium|Moderately dissatisfied|Computer science, computer engineering, or software engineering|36720.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML 42230|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|80000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C;C++;Objective-C;Python;Swift 39027|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|1056000.0|3 - 4 times per week|Male|East Asian;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Matlab;Python;SQL;HTML;CSS;Bash/Shell 64419|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|140000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Groovy;JavaScript;Ruby;TypeScript;HTML;CSS;Bash/Shell 79331|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|67000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;Perl;PHP;Python;R;SQL;HTML;CSS;Bash/Shell 30361|Malaysia|Moderately satisfied|Computer science, computer engineering, or software engineering|10620.0|1 - 2 times per week|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Swift 68174|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|150000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C;Go;JavaScript;PHP;R;Ruby;SQL;HTML;CSS;Bash/Shell 51987|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;JavaScript 53132|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|70000.0|Daily or almost every day|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;Java;Python;SQL;Kotlin;Bash/Shell 27320|United States|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|115000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS 81059|Russian Federation|Slightly satisfied|Computer science, computer engineering, or software engineering|44064.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C++;Python;Bash/Shell 52068|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|134500.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;Bash/Shell 85808|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|156000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;Go;Haskell;Java;JavaScript;PHP;Python;R;Ruby;SQL;Swift;HTML;CSS;Bash/Shell 49935|Mexico|Extremely satisfied|Computer science, computer engineering, or software engineering|16116.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;SQL;HTML;CSS 68263|India|Slightly satisfied|Computer science, computer engineering, or software engineering|6653.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;JavaScript;PHP;Python;TypeScript;HTML;CSS 49638|France|Extremely satisfied|Computer science, computer engineering, or software engineering|24478.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|C# 22455|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|105000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;Objective-C;SQL;Swift;VB.NET;HTML;CSS 43358|Ireland|Moderately dissatisfied|Computer science, computer engineering, or software engineering|97910.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Erlang;Go;Java;Julia;Rust;Kotlin 26621|Canada|Extremely satisfied|Information systems, information technology, or system administration|96624.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C;C++;Java;JavaScript;Python;Bash/Shell 73754|Bangladesh|Moderately satisfied|Computer science, computer engineering, or software engineering|16164.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 40106|Brazil|Slightly satisfied|A social science (ex. anthropology, psychology, political science)|7488.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;Objective-C;HTML;CSS 99244|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|883428.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;C#;Java;JavaScript;TypeScript;HTML;CSS;Bash/Shell 8608|United Kingdom|Moderately satisfied|Mathematics or statistics|40282.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|More than 4 years ago|C#;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 86327|Colombia|Extremely dissatisfied|Computer science, computer engineering, or software engineering|48000.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 56948|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|45000.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C++;Java;JavaScript;Objective-C;PHP;Python;SQL;HTML;CSS;Bash/Shell 52348|Canada|Moderately dissatisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Java;JavaScript;Objective-C;PHP;CSS 10200|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|17640.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C#;JavaScript;Python;HTML;CSS 9409|Russian Federation|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|4248.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;Python;VBA;HTML;CSS 32808|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|1 - 2 times per week|Female|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|55 - 64 years old|Between 1 and 2 years ago|Java;SQL 81863|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|62001.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;Groovy;Java;JavaScript;Perl;Python;R;Scala;SQL;HTML;CSS;Bash/Shell 100143|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|5213.0|I don't typically exercise|Male|South Asian|Primary/elementary school|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;Matlab;PHP;SQL;HTML;CSS;Bash/Shell 70731|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|55000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 1368|Ukraine|Slightly satisfied|Mathematics or statistics|4680.0|1 - 2 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|18 - 24 years old|Less than a year ago|Python;SQL;Bash/Shell 43397|Canada|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|80521.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;R;VBA 99904|Russian Federation|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|31848.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript 34651|Germany|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|5880.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Groovy;Java;JavaScript;Python;SQL;HTML;CSS 57063|France|Moderately dissatisfied|A health science (ex. nursing, pharmacy, radiology)|36716.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;PHP;Python;HTML;CSS;Bash/Shell 20248|India|Slightly satisfied|Computer science, computer engineering, or software engineering|2818.0|3 - 4 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;TypeScript;HTML;CSS 80474|Turkey|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|48000.0|1 - 2 times per week|Male|Middle Eastern;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Objective-C;SQL;Kotlin;Bash/Shell 35332|United States|Extremely satisfied|Information systems, information technology, or system administration|65000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;VB.NET;Visual Basic 6;HTML;CSS 32312|United States|Extremely satisfied|Information systems, information technology, or system administration|110000.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Go;Bash/Shell 20981|Finland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|55812.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;Ruby;SQL;Delphi/Object Pascal;HTML;CSS;Bash/Shell 11137|Netherlands|Moderately dissatisfied|Computer science, computer engineering, or software engineering|56298.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;Python 8917|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|43416.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 88005|India|Moderately dissatisfied|Information systems, information technology, or system administration|114588.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Perl;Python;SQL;HTML;CSS;Bash/Shell 24332|Ireland|Moderately satisfied|Mathematics or statistics|61194.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Python;R;Scala;SQL 85515|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|49000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Go;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 84696|Czech Republic|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|55020.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C++;C#;F#;Java;JavaScript;SQL 73675|Canada|Extremely satisfied|Mathematics or statistics|104678.0|1 - 2 times per week|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;SQL;HTML;CSS 7614|United States|Slightly dissatisfied|A natural science (ex. biology, chemistry, physics)|90000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|JavaScript;Python 52271|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|1000000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|More than 4 years ago|Go;JavaScript;Lua;Perl;PHP;Python;SQL;HTML;CSS;Bash/Shell 34978|Russian Federation|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|63684.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|35 - 44 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;Go;JavaScript;Python;SQL;VBA;HTML;CSS;Bash/Shell 42027|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|83342.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 90666|Hong Kong (S.A.R.)|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|41136.0|1 - 2 times per week|Male|East Asian|They never completed any formal education|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Python;R 37537|Canada|Slightly satisfied|Computer science, computer engineering, or software engineering|112730.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|45 - 54 years old|Less than a year ago|C#;Python;VB.NET;Bash/Shell 92840|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|8808.0|I don't typically exercise|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;JavaScript;TypeScript;HTML;CSS 56635|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|47500.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Perl;Python;SQL;Bash/Shell 44897|United States|Moderately dissatisfied|Information systems, information technology, or system administration|65000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Groovy;Java;JavaScript;HTML;CSS 35542|India|Moderately satisfied|Computer science, computer engineering, or software engineering|5256.0|1 - 2 times per week|Non-binary, genderqueer, or gender non-conforming|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Objective-C;Swift 4186|India|Moderately satisfied|Computer science, computer engineering, or software engineering|8268.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Go;Java;JavaScript;PHP;Python;SQL;TypeScript;HTML;Bash/Shell 52890|Singapore|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|59052.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Groovy;JavaScript;Ruby;HTML;CSS;Bash/Shell 16757|United States|Slightly dissatisfied|A natural science (ex. biology, chemistry, physics)|91000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 79549|Bulgaria|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|14688.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C++;Java;JavaScript;PHP;Python;HTML;CSS 7530|United Kingdom|Slightly satisfied|Web development or web design|41671.0|I don't typically exercise|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;Ruby;SQL;HTML;CSS 95566|France|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|82000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;SQL 24723|Germany|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|13956.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|More than 4 years ago|C;C#;Go;Java;JavaScript;Rust;TypeScript;Kotlin 59669|Israel|Moderately satisfied|Computer science, computer engineering, or software engineering|112344.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;TypeScript 83530|Romania|Slightly dissatisfied|Computer science, computer engineering, or software engineering|16152.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;HTML;CSS 86270|Netherlands|Slightly dissatisfied|Web development or web design|117492.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Scala;Bash/Shell 24131|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|52627.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Haskell;Java;Python;Scala 82203|Slovakia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|29376.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS 99525|Norway|Slightly satisfied|Computer science, computer engineering, or software engineering|68862.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;CSS 88071|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|160000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C++;C#;JavaScript;Perl;Bash/Shell 33564|Mexico|Moderately satisfied|Computer science, computer engineering, or software engineering|74772.0|3 - 4 times per week|Female|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Python 53824|India|Moderately satisfied|Computer science, computer engineering, or software engineering|9396.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Haskell;JavaScript;Python 93400|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|78000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Rust;SQL;HTML;CSS;Bash/Shell 42596|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|33000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;C#;Java;JavaScript;Python;SQL;Swift;HTML;CSS;Bash/Shell 33851|Mexico|Moderately dissatisfied|Information systems, information technology, or system administration|35448.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Some college/university study without earning a degree|3 - 4 hours|55 - 64 years old|More than 4 years ago|Assembly;C;C++;Java;SQL;VBA;VB.NET;Visual Basic 6;Cobol 33801|Libyan Arab Jamahiriya|Slightly dissatisfied|Computer science, computer engineering, or software engineering|42635.0|1 - 2 times per week|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|Between 1 and 2 years ago|Go;Java;JavaScript;PHP;TypeScript;HTML;CSS 34032|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|160000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Between 1 and 2 years ago|C++;C#;Python;SQL;Bash/Shell 66419|Morocco|Moderately dissatisfied|Computer science, computer engineering, or software engineering|9744.0|3 - 4 times per week|Male|Middle Eastern|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;VB.NET;HTML;CSS 16543|Belgium|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|51648.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript 87954|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|84000.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Python 51798|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|75000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Go;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 80368|United States|Moderately satisfied|Web development or web design|70000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 34307|Greece|Slightly satisfied|Computer science, computer engineering, or software engineering|12239.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;Python;Scala 85481|United States|Slightly satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|147000.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C#;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 88959|Lebanon|Extremely satisfied|Computer science, computer engineering, or software engineering|16800.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;Haskell;Java;JavaScript;Kotlin;HTML;CSS;Bash/Shell 41742|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 32689|Brazil|Slightly dissatisfied|Computer science, computer engineering, or software engineering|13104.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 25353|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|110000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;SQL;TypeScript;HTML;CSS 27912|France|Extremely satisfied|Computer science, computer engineering, or software engineering|64866.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|Assembly;C;JavaScript;Perl;PHP;Python;SQL;VBA;Delphi/Object Pascal;Cobol;HTML;CSS;Bash/Shell 80795|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|24000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Swift;Kotlin 58766|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|134000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;Bash/Shell 27933|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|66000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;Python 86625|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|42000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;JavaScript;SQL;VBA;HTML;CSS 36922|Turkey|Moderately satisfied|Computer science, computer engineering, or software engineering|10488.0|I don't typically exercise|Male|Middle Eastern;White or of European descent|They never completed any formal education|30 - 59 minutes|18 - 24 years old|Less than a year ago|Java;Python 72952|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|6384.0|I don't typically exercise|Male|South Asian|Associate degree|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;HTML;CSS 31603|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|58752.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;JavaScript;PHP;SQL;TypeScript;Delphi/Object Pascal;HTML;CSS;Bash/Shell 60232|Russian Federation|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|26532.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;Python;Scala;Bash/Shell 91713|Canada|Slightly dissatisfied|Computer science, computer engineering, or software engineering|56365.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Go;Java;JavaScript;Lua;Python;SQL;HTML;CSS;Bash/Shell 53449|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|23891.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 58620|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|87127.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|C#;Groovy;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 61515|United States|Slightly satisfied|Mathematics or statistics|73000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Python;Swift;VBA;HTML;CSS 36826|Brazil|Extremely satisfied|Computer science, computer engineering, or software engineering|22452.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java 29257|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|75000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Python;R;SQL;Bash/Shell 94000|France|Slightly satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|39164.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;HTML;CSS 85999|Bosnia and Herzegovina|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|29376.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Objective-C;Swift 19953|India|Extremely satisfied|Computer science, computer engineering, or software engineering|18780.0|I don't typically exercise|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;Python;TypeScript;Kotlin;HTML;CSS;Bash/Shell 82345|Switzerland|Moderately satisfied|Information systems, information technology, or system administration|131379.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;Java;JavaScript;PHP;Scala;Delphi/Object Pascal;HTML;CSS;Bash/Shell 65380|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|90000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Go;JavaScript;Ruby;HTML;CSS;Bash/Shell 35226|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|51408.0|1 - 2 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C++;C#;Python;VBA 51531|Mexico|Moderately dissatisfied|Information systems, information technology, or system administration|16116.0|I don't typically exercise|Female|Black or of African descent;East Asian;Hispanic or Latino/Latina;Middle Eastern;Native American, Pacific Islander, or Indigenous Australian;South Asian;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;PHP;Ruby;SQL;TypeScript;HTML;CSS 28258|United Kingdom|Moderately satisfied|Mathematics or statistics|55562.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|45 - 54 years old|Between 1 and 2 years ago|JavaScript;Ruby;SQL;HTML;CSS 92128|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|101000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C++;Groovy;Java;JavaScript;HTML;CSS 8823|Austria|Extremely satisfied|Computer science, computer engineering, or software engineering|15276.0|3 - 4 times per week|Female|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Haskell;Java;JavaScript;Matlab;Python;R;SQL;HTML;CSS;Bash/Shell 94202|United States|Moderately satisfied|Web development or web design|32500.0|1 - 2 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Between 2 and 4 years ago|JavaScript;PHP;HTML;CSS 94144|Ukraine|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|48000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 25231|Kenya|Moderately satisfied|Mathematics or statistics|40824.0|I don't typically exercise|Male|Black or of African descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|More than 4 years ago|PHP 23670|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|70000.0|1 - 2 times per week|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;Go;Java;JavaScript;PHP;Python;SQL;Swift;TypeScript;HTML;CSS 27434|France|Moderately dissatisfied|Web development or web design|48955.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Java;Swift;Bash/Shell 66250|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|55075.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|PHP;SQL 97892|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|2000000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|55 - 64 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;Objective-C;SQL;Swift;TypeScript;VB.NET;HTML;CSS;Bash/Shell 88132|Russian Federation|Slightly dissatisfied|Mathematics or statistics|27600.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Objective-C;Swift 87288|United States|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|140000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|45 - 54 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 44962|United States|Slightly satisfied|Web development or web design|175000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|3 - 4 hours|35 - 44 years old|More than 4 years ago|JavaScript;HTML;CSS 24302|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|100000.0|1 - 2 times per week|Male|Black or of African descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;CoffeeScript;Go;Java;JavaScript;Lua;Objective-C;PHP;Python;Ruby;SQL;Swift;TypeScript;Kotlin;HTML;CSS;Bash/Shell 81708|Austria|Moderately dissatisfied|Computer science, computer engineering, or software engineering|142872.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|C;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 35755|Israel|Extremely satisfied|Computer science, computer engineering, or software engineering|154476.0|3 - 4 times per week|Male|Middle Eastern;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Groovy;Java;JavaScript;Python;SQL;HTML;Bash/Shell 36342|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|44060.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 97060|Brazil|Moderately satisfied|Information systems, information technology, or system administration|5616.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|JavaScript;PHP;SQL;TypeScript;VB.NET;HTML;CSS 49651|Cyprus|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|51408.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;HTML;Bash/Shell 3826|United Kingdom|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|145849.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Objective-C;HTML;CSS 97944|United Kingdom|Slightly satisfied|Information systems, information technology, or system administration|76397.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;Perl;SQL;HTML;CSS;Bash/Shell 75725|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|86716.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|C;JavaScript;Perl;PHP;SQL;CSS;Bash/Shell 12153|India|Moderately satisfied|Computer science, computer engineering, or software engineering|52442.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;Java;Lua;Matlab;PHP;Python;R;Scala;SQL;HTML;CSS;Bash/Shell 85983|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|100000.0|I don't typically exercise|Male|White or of European descent|Associate degree|Less than 30 minutes|45 - 54 years old|More than 4 years ago|C#;JavaScript;Matlab;SQL;TypeScript;HTML;CSS 35562|Italy|Moderately satisfied|Computer science, computer engineering, or software engineering|24972.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Java;JavaScript;Matlab;Objective-C;PHP;Python;SQL 80333|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|74000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Objective-C;Swift 42389|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|50448.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Go;Java;Matlab;PHP;Python;HTML;CSS;Bash/Shell 76912|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|123000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|JavaScript;SQL 23596|Russian Federation|Slightly satisfied|Information systems, information technology, or system administration|12204.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;HTML;CSS 56958|United States|Moderately satisfied|Web development or web design|70000.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|PHP;HTML;CSS 85820|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|79552.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|Between 2 and 4 years ago|C#;Groovy;Java;JavaScript;Python;SQL;TypeScript;Bash/Shell 91042|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|75000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Delphi/Object Pascal 13046|Spain|Moderately dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|16884.0|1 - 2 times per week|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;HTML;CSS;Bash/Shell 27017|Spain|Neither satisfied nor dissatisfied|Web development or web design|31821.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|18 - 24 years old|Less than a year ago|CoffeeScript;JavaScript;TypeScript;HTML;CSS 78483|Brazil|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|18715.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Python;R;SQL;Bash/Shell 42468|Nepal|Extremely dissatisfied|Information systems, information technology, or system administration|1000.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Assembly;C;Java;JavaScript;PHP;Python;SQL;HTML;CSS 74344|Switzerland|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|93840.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Swift;Kotlin 19990|Austria|Slightly satisfied|Computer science, computer engineering, or software engineering|42360.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;PHP;SQL;TypeScript;Kotlin;HTML;CSS 61052|United States|Moderately satisfied|Information systems, information technology, or system administration|151000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 71568|Colombia|Slightly satisfied|Computer science, computer engineering, or software engineering|25308.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;Ruby;SQL;TypeScript;Visual Basic 6;HTML;CSS 47023|United States|Moderately satisfied|Mathematics or statistics|115000.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|JavaScript;Perl;Python;SQL;HTML;CSS 82643|Russian Federation|Moderately satisfied|Information systems, information technology, or system administration|42000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Python;Ruby;Bash/Shell 9619|India|Moderately satisfied|Computer science, computer engineering, or software engineering|9960.0|Daily or almost every day|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Groovy;Java 40725|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|112000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP;Python;SQL;VBA;HTML;CSS;Bash/Shell 72808|United States|Moderately satisfied|Information systems, information technology, or system administration|85748.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;Clojure;JavaScript;SQL;Visual Basic 6 56542|France|Slightly dissatisfied|Computer science, computer engineering, or software engineering|55075.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;JavaScript;SQL;HTML;CSS;Bash/Shell 54482|Germany|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|38184.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|CoffeeScript;JavaScript;Ruby;HTML;CSS 86364|United States|Slightly satisfied|A social science (ex. anthropology, psychology, political science)|123500.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Go;JavaScript;Objective-C;Python;Swift;Bash/Shell 71560|Japan|Slightly satisfied|Computer science, computer engineering, or software engineering|72031.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;JavaScript;Matlab;Python;R;TypeScript;HTML;CSS 67168|Saudi Arabia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|19200.0|3 - 4 times per week|Male|Black or of African descent;East Asian;Hispanic or Latino/Latina;Middle Eastern;Native American, Pacific Islander, or Indigenous Australian;South Asian;White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Objective-C;Swift 85454|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|East Asian;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C++;C#;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 59967|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|50000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|18 - 24 years old|Between 2 and 4 years ago|Assembly;C++;C#;JavaScript;Python;Rust;SQL;TypeScript;HTML;CSS;Bash/Shell 100644|Portugal|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|14688.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;Python 8643|Sweden|Extremely satisfied|Computer science, computer engineering, or software engineering|1000000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript 52973|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|62000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Ruby;HTML;CSS 46440|South Africa|Extremely satisfied|Computer science, computer engineering, or software engineering|63512.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;Objective-C;TypeScript;HTML;CSS 52766|Australia|Moderately satisfied|Information systems, information technology, or system administration|51983.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 82119|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|61194.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C++ 23072|Hungary|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|21432.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Objective-C;Python;Swift;TypeScript;Kotlin;HTML;CSS;Bash/Shell 37129|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|76500.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;CSS 2041|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|130000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;JavaScript;Objective-C;Ruby;SQL;Swift;HTML;CSS 87531|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|97233.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;SQL;Kotlin;HTML;CSS 77409|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|70000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;Erlang;Go;Haskell;Java;JavaScript;Objective-C;PHP;Python;Ruby;SQL;Swift;TypeScript;Kotlin;HTML;CSS;Bash/Shell 74811|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|65000.0|I don't typically exercise|Female;Non-binary, genderqueer, or gender non-conforming|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 84361|Croatia|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|32364.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C++;Java;Python;Rust;Scala;Bash/Shell 89574|Bosnia and Herzegovina|Slightly dissatisfied|Computer science, computer engineering, or software engineering|7512.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C++;Java;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 2185|United States|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|71250.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 98951|United States|Extremely satisfied|I never declared a major|85000.0|I don't typically exercise|Female;Transgender|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;VB.NET;HTML;CSS;Bash/Shell 25172|United States|Moderately satisfied|Information systems, information technology, or system administration|98000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Go;JavaScript;Python;SQL;HTML;CSS 72753|Germany|Slightly dissatisfied|Mathematics or statistics|77104.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Matlab;Python;Bash/Shell 63125|Viet Nam|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|4800.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 36708|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|245000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 47885|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|135000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|Assembly;C++;C#;Objective-C;Perl;Bash/Shell 95952|Dominican Republic|Moderately satisfied|Computer science, computer engineering, or software engineering|22356.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|3 - 4 hours|25 - 34 years old|More than 4 years ago|C#;Java;JavaScript;Ruby;SQL;VB.NET 44360|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|7860.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C;C++;JavaScript;Matlab;Objective-C;Python;Ruby;Swift;HTML;CSS;Bash/Shell 73319|Switzerland|Extremely dissatisfied|Computer science, computer engineering, or software engineering|121995.0|I don't typically exercise|Female|Black or of African descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;Python;Scala;SQL;Bash/Shell 4346|India|Extremely dissatisfied|Computer science, computer engineering, or software engineering|5640.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;JavaScript;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 37351|United Kingdom|Moderately dissatisfied|Computer science, computer engineering, or software engineering|37504.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Assembly;C;C++;Java;JavaScript;Objective-C;PHP;Python;SQL;Swift;HTML;CSS;Bash/Shell 44823|United States|Moderately satisfied|Mathematics or statistics|120000.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Python;R;SQL;Bash/Shell 15005|Australia|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|159947.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Assembly;C;C++;C#;Erlang;Groovy;Java;JavaScript;R;SQL;TypeScript;VBA;HTML;CSS;Bash/Shell 98834|France|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|79552.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Scala;SQL 23981|United States|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|80000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|Assembly;C;C++;Java;JavaScript;Matlab;HTML 65730|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|87000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|CoffeeScript;JavaScript;PHP;HTML;CSS 35899|Ukraine|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|4680.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Ruby;SQL;HTML;CSS 74470|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|440592.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;Java;Python;R;SQL;HTML;CSS 59521|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|52627.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|JavaScript;HTML;CSS;Bash/Shell 51190|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|50004.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C++;Matlab;Python 75724|India|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|50094.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C++;Go;Java;Rust;Kotlin 58353|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|130000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Ruby;HTML;CSS 50731|Ukraine|Extremely dissatisfied|Computer science, computer engineering, or software engineering|25200.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Objective-C;Python;Swift;Bash/Shell 90041|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 99603|Lithuania|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|36720.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Go;JavaScript;Python;Bash/Shell 33013|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|110000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 42628|Hungary|Extremely satisfied|Computer science, computer engineering, or software engineering|43668.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;JavaScript;Python;HTML;CSS 20170|Kenya|Moderately satisfied|Computer science, computer engineering, or software engineering|8160.0|I don't typically exercise|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 77546|Sweden|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|51152.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Assembly;C;C++;Groovy;Perl;Python;SQL;Bash/Shell 80459|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|69452.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;Python;SQL;VBA;VB.NET;HTML;CSS;Bash/Shell 80088|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|27000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 20353|Spain|Slightly satisfied|Computer science, computer engineering, or software engineering|15298.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;SQL;HTML;CSS 56375|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|62000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;Python;SQL;TypeScript;HTML;CSS 42375|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|7140.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;Java;Matlab;Objective-C;PHP;SQL;Swift;VB.NET;Visual Basic 6;HTML;CSS ================================================ FILE: examples/sample-book/ext/splice/splice-resize.js ================================================ const bodyEl = document.body; bodyEl.style.background = 'red'; const growBtn = document.createElement('button'); growBtn.textContent = 'Grow'; document.currentScript.parentElement.appendChild(growBtn); growBtn.addEventListener('click', () => { const currentHeight = bodyEl.clientHeight; const newHeight = currentHeight + 100; bodyEl.style.height = `${newHeight}px`; window.parent.postMessage( { subject: 'lti.frameResize', height: newHeight, }, '*' ) }); ================================================ FILE: examples/sample-book/frontmatter.xml ================================================ Thomas W. Judson Department of Mathematics and Statistics Stephen F. Austin State University judsontw@sfasu.edu Isaac Newton Trinity College Sage Exercises for Abstract Algebra Robert A. Beezer Department of Mathematics and Computer Science University of Puget Sound beezer@pugetsound.edu Cover Design Covers 4 U Production Editor Vilma Mesa Annual Edition 2015 Some text to test bug report 19972015 Thomas W. Judson, Robert A. Beezer GFDL License Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the appendix entitled GNU Free Documentation License. All trademarks are the registered marks of their respective owners. An external link is includedA second footnote, as well. to test its footnote. abstract algebra PreTeXt samples

    This work has received assistance from numerous volunteer contributors.

    Thomas W. Judson did his undergraduate work in Illinois, his graduate work in Oregon and presently teaches in Texas.

    He likes to ride his bicycle in France, especially in the high Alps and Pyrenees on the roads of the Tour de France.

    About Robert A. Beezer

    Rob Beezer designed, wrote, and tested the Sage exercises as a contribution to this open source project.

    He also likes to ride his bicycle, and once rode with Tom Judson in the high Alps, in addition to some hiking there, up above the passes the cyclists ride.

    To students of algebra everywhere they are the reason

    And to those who teach them

    I would like to acknowledge the following reviewers for their helpful comments and suggestions.

    • David Anderson, University of Tennessee, Knoxville

    • Robert Beezer, University of Puget Sound

    • Myron Hood, California Polytechnic State University

    • Herbert Kasube, Bradley University

    • John Kurtzke, University of Portland

    • Inessa Levi, University of Louisville

    • Geoffrey Mason, University of California, Santa Cruz

    • Bruce Mericle, Mankato State University

    • Kimmo Rosenthal, Union College

    • Mark Teply, University of Wisconsin

    I would also like to thank Steve Quigley, Marnie Pommett, Cathie Griffin, Kelle Karshick, and the rest of the staff at PWS Publishing for their guidance throughout this project. It has been a pleasure to work with them.

    Robert Beezer encouraged me to make Abstract Algebra: Theory and Applications available as an open source textbook, a decision that I have never regretted. With his assistance, the book has been rewritten in PreTeXt (), making it possible to quickly output print, web, PDF versions and more from the same source. The open source version of this book has received support from the National Science Foundation (Award #DUE-1020957).

    This text is intended for a one or two-semester undergraduate course in abstract algebra. Traditionally, these courses have covered the theoretical aspects of groups, rings, and fields. However, with the development of computing in the last several decades, applications that involve abstract algebra and discrete mathematics have become increasingly important, and many science, engineering, and computer science students are now electing to minor in mathematics. Though theory still occupies a central role in the subject of abstract algebra and no student should go through such a course without a good notion of what a proof is, the importance of applications such as coding theory and cryptography has grown significantly.

    Until recently most abstract algebra texts included few if any applications. However, one of the major problems in teaching an abstract algebra course is that for many students it is their first encounter with an environment that requires them to do rigorous proofs. Such students often find it hard to see the use of learning to prove theorems and propositions; applied examples help the instructor provide motivation.

    This text contains more material than can possibly be covered in a single semester. Certainly there is adequate material for a two-semester course, and perhaps more; however, for a one-semester course it would be quite easy to omit selected chapters and still have a useful text. The order of presentation of topics is standard: groups, then rings, and finally fields. Emphasis can be placed either on theory or on applications. A typical one-semester course might cover groups and rings while briefly touching on field theory, using Chapters1 through 6, 9, 10, 11, 13 (the first part), 16, 17, 18 (the first part), 20, and 21. Parts of these chapters could be deleted and applications substituted according to the interests of the students and the instructor. A two-semester course emphasizing theory might cover Chapters1 through 6, 9, 10, 11, 13 through 18, 20, 21, 22 (the first part), and 23. On the other hand, if applications are to be emphasized, the course might cover Chapters 1 through 14, and 16 through 22. In an applied course, some of the more theoretical results could be assumed or omitted. A chapter dependency chart appears below. (A broken line indicates a partial dependency.) See the Table of Contents for more.

    This real text has been used as the basis of a sample book for testing . So it is slowly migrating away from what the real book looks like and should not be construed as representative. For example, we have reduced the book to four chapters.

    This real text has been used as the basis of a sample book for testing . So it is slowly migrating away from what the real book looks like and should not be construed as representative. For example, we have reduced the book to four chapters, broken into two parts, and . Indeed, that previous sentence was more an excuse to test some cross-references with parts in the structural case, such as this one to DeMoivre's Theorem, .

    Though there are no specific prerequisites for a course in abstract algebra, students who have had other higher-level courses in mathematics will generally be more prepared than those who have not, because they will possess a bit more mathematical sophistication. Occasionally, we shall assume some basic linear algebra; that is, we shall take for granted an elementary knowledge of matrices and determinants. This should present no great problem, since most students taking a course in abstract algebra have been introduced to matrices and determinants elsewhere in their career, if they have not already taken a sophomore or junior-level course in linear algebra.

    Exercise sections are the heart of any mathematics text. An exercise set appears at the end of each chapter. The nature of the exercises ranges over several categories; computational, conceptual, and theoretical problems are included. A section presenting hints and solutions to many of the exercises appears at the end of the text. Often in the solutions a proof is only sketched, and it is up to the student to provide the details. The exercises range in difficulty from very easy to very challenging. Many of the more substantial problems require careful thought, so the student should not be discouraged if the solution is not forthcoming after a few minutes of work.

    There are additional exercises or computer projects at the ends of many of the chapters. The computer projects usually require a knowledge of programming. All of these exercises and projects are more substantial in nature and allow the exploration of new results and theory.

    Sage () is a free, open source, software system for advanced mathematics, which is ideal for assisting with a study of abstract algebra. Sage can be used either on your own computer, a local server, or on SageMathCloud (). Robert Beezer has written a comprehensive introduction to Sage and a selection of relevant exercises that appear at the end of each chapter, including live Sage cells in the web version of the book.

    Thomas W. Judson Nacogdoches, Texas 2015
    Contributors to the 4<m>^\mathrm{th}</m> Edition

    Many individuals have made this book possible. We will try to thank a few of them here, and hope we have not forgotten anybody really important.

    Thomas Judson Department of Mathematics and Statistics Stephen F. Austin State University judsontw@sfasu.edu David Farmer American Institute of Mathematics farmer@aimath.org Robert Beezer Department of Mathematics and Computer Science University of Puget Sound Tacoma, Washington, USA beezer@pugetsound.edu Alex Jordan Department of Mathematics Portland Community College Portland, OR alex.jordan@pcc.edu Thomas Judson Department of Mathematics and Statistics Stephen F. Austin State University judsontw@sfasu.edu David Farmer American Institute of Mathematics farmer@aimath.org Robert Beezer Department of Mathematics and Computer Science University of Puget Sound Tacoma, Washington, USA beezer@pugetsound.edu Alex Jordan Department of Mathematics Portland Community College Portland, OR alex.jordan@pcc.edu Thomas Judson Department of Mathematics and Statistics Stephen F. Austin State University judsontw@sfasu.edu David Farmer American Institute of Mathematics farmer@aimath.org Robert Beezer Department of Mathematics and Computer Science University of Puget Sound Tacoma, Washington, USA beezer@pugetsound.edu Alex Jordan Department of Mathematics Portland Community College Portland, OR alex.jordan@pcc.edu Thomas Judson Department of Mathematics and Statistics Stephen F. Austin State University judsontw@sfasu.edu David Farmer American Institute of Mathematics farmer@aimath.org Robert Beezer Department of Mathematics and Computer Science University of Puget Sound Tacoma, Washington, USA beezer@pugetsound.edu Alex Jordan Department of Mathematics Portland Community College Portland, OR alex.jordan@pcc.edu Thomas Judson Department of Mathematics and Statistics Stephen F. Austin State University judsontw@sfasu.edu David Farmer American Institute of Mathematics farmer@aimath.org Robert Beezer Department of Mathematics and Computer Science University of Puget Sound Tacoma, Washington, USA beezer@pugetsound.edu Alex Jordan Department of Mathematics Portland Community College Portland, OR alex.jordan@pcc.edu

    That's it. Thanks everybody.

    ================================================ FILE: examples/sample-book/gen/datafile/beach-datafile.xml ================================================ ================================================ FILE: examples/sample-book/gen/datafile/file-picture-classes-jar.xml ================================================ import java.awt.Image; import java.awt.image.BufferedImage; /** * Interface to describe a digital picture. A digital picture can have an * associated file name. It can have a title. It has pixels * associated with it and you can get and set the pixels. You * can get an Image from a picture or a BufferedImage. You can load * it from a file name or image. You can show a picture. You can * explore a picture. You can create a new image for it. * * @author Barb Ericson ericson@cc.gatech.edu */ public interface DigitalPicture { public String getFileName(); // get the file name that the picture came from public String getTitle(); // get the title of the picture public void setTitle(String title); // set the title of the picture public int getWidth(); // get the width of the picture in pixels public int getHeight(); // get the height of the picture in pixels public Image getImage(); // get the image from the picture public BufferedImage getBufferedImage(); // get the buffered image public int getBasicPixel(int x, int y); // get the pixel information as an int public void setBasicPixel(int x, int y, int rgb); // set the pixel information public Pixel getPixel(int x, int y); // get the pixel information as an object public Pixel[] getPixels(); // get all pixels in row-major order public Pixel[][] getPixels2D(); // get 2-D array of pixels in row-major order public void load(Image image); // load the image into the picture public boolean load(String fileName); // load the picture from a file public void show(); // show the picture public boolean write(String fileName); // write out a file } import java.awt.Color; /** * Class that references a pixel in a picture. Pixel * stands for picture element where picture is * abbreviated pix. A pixel has a column (x) and * row (y) location in a picture. A pixel knows how * to get and set the red, green, blue, and alpha * values in the picture. A pixel also knows how to get * and set the color using a Color object. * * @author Barb Ericson ericson@cc.gatech.edu */ public class Pixel { ////////////////////////// fields /////////////////////////////////// /** the digital picture this pixel belongs to */ private DigitalPicture picture; /** the x (column) location of this pixel in the picture; (0,0) is top left */ private int x; /** the y (row) location of this pixel in the picture; (0,0) is top left */ private int y; ////////////////////// constructors ///////////////////////////////// /** * A constructor that takes the x and y location for the pixel and * the picture the pixel is coming from * @param picture the picture that the pixel is in * @param x the x location of the pixel in the picture * @param y the y location of the pixel in the picture */ public Pixel(DigitalPicture picture, int x, int y) { // set the picture this.picture = picture; // set the x location this.x = x; // set the y location this.y = y; } ///////////////////////// methods ////////////////////////////// /** * Method to get the x location of this pixel. * @return the x location of the pixel in the picture */ public int getX() { return x; } /** * Method to get the y location of this pixel. * @return the y location of the pixel in the picture */ public int getY() { return y; } /** * Method to get the row (y value) * @return the row (y value) of the pixel in the picture */ public int getRow() { return y; } /** * Method to get the column (x value) * @return the column (x value) of the pixel */ public int getCol() { return x; } /** * Method to get the amount of alpha (transparency) at this pixel. * It will be from 0-255. * @return the amount of alpha (transparency) */ public int getAlpha() { /* get the value at the location from the picture as a 32 bit int * with alpha, red, green, blue each taking 8 bits from left to right */ int value = picture.getBasicPixel(x,y); // get the alpha value (starts at 25 so shift right 24) // then and it with all 1's for the first 8 bits to keep // end up with from 0 to 255 int alpha = (value >> 24) & 0xff; return alpha; } /** * Method to get the amount of red at this pixel. It will be * from 0-255 with 0 being no red and 255 being as much red as * you can have. * @return the amount of red from 0 for none to 255 for max */ public int getRed() { /* get the value at the location from the picture as a 32 bit int * with alpha, red, green, blue each taking 8 bits from left to right */ int value = picture.getBasicPixel(x,y); // get the red value (starts at 17 so shift right 16) // then AND it with all 1's for the first 8 bits to // end up with a resulting value from 0 to 255 int red = (value >> 16) & 0xff; return red; } /** * Method to get the red value from a pixel represented as an int * @param value the color value as an int * @return the amount of red */ public static int getRed(int value) { int red = (value >> 16) & 0xff; return red; } /** * Method to get the amount of green at this pixel. It will be * from 0-255 with 0 being no green and 255 being as much green as * you can have. * @return the amount of green from 0 for none to 255 for max */ public int getGreen() { /* get the value at the location from the picture as a 32 bit int * with alpha, red, green, blue each taking 8 bits from left to right */ int value = picture.getBasicPixel(x,y); // get the green value (starts at 9 so shift right 8) int green = (value >> 8) & 0xff; return green; } /** * Method to get the green value from a pixel represented as an int * @param value the color value as an int * @return the amount of green */ public static int getGreen(int value) { int green = (value >> 8) & 0xff; return green; } /** * Method to get the amount of blue at this pixel. It will be * from 0-255 with 0 being no blue and 255 being as much blue as * you can have. * @return the amount of blue from 0 for none to 255 for max */ public int getBlue() { /* get the value at the location from the picture as a 32 bit int * with alpha, red, green, blue each taking 8 bits from left to right */ int value = picture.getBasicPixel(x,y); // get the blue value (starts at 0 so no shift required) int blue = value & 0xff; return blue; } /** * Method to get the blue value from a pixel represented as an int * @param value the color value as an int * @return the amount of blue */ public static int getBlue(int value) { int blue = value & 0xff; return blue; } /** * Method to get a color object that represents the color at this pixel. * @return a color object that represents the pixel color */ public Color getColor() { /* get the value at the location from the picture as a 32 bit int * with alpha, red, green, blue each taking 8 bits from left to right */ int value = picture.getBasicPixel(x,y); // get the red value (starts at 17 so shift right 16) // then AND it with all 1's for the first 8 bits to // end up with a resulting value from 0 to 255 int red = (value >> 16) & 0xff; // get the green value (starts at 9 so shift right 8) int green = (value >> 8) & 0xff; // get the blue value (starts at 0 so no shift required) int blue = value & 0xff; return new Color(red,green,blue); } /** * Method to set the pixel color to the passed in color object. * @param newColor the new color to use */ public void setColor(Color newColor) { // set the red, green, and blue values int red = newColor.getRed(); int green = newColor.getGreen(); int blue = newColor.getBlue(); // update the associated picture updatePicture(this.getAlpha(),red,green,blue); } /** * Method to update the picture based on the passed color * values for this pixel * @param alpha the alpha (transparency) at this pixel * @param red the red value for the color at this pixel * @param green the green value for the color at this pixel * @param blue the blue value for the color at this pixel */ public void updatePicture(int alpha, int red, int green, int blue) { // create a 32 bit int with alpha, red, green blue from left to right int value = (alpha << 24) + (red << 16) + (green << 8) + blue; // update the picture with the int value picture.setBasicPixel(x,y,value); } /** * Method to correct a color value to be within 0 to 255 * @param the value to use * @return a value within 0 to 255 */ private static int correctValue(int value) { if (value < 0) value = 0; if (value > 255) value = 255; return value; } /** * Method to set the red to a new red value * @param value the new value to use */ public void setRed(int value) { // set the red value to the corrected value int red = correctValue(value); // update the pixel value in the picture updatePicture(getAlpha(), red, getGreen(), getBlue()); } /** * Method to set the green to a new green value * @param value the value to use */ public void setGreen(int value) { // set the green value to the corrected value int green = correctValue(value); // update the pixel value in the picture updatePicture(getAlpha(), getRed(), green, getBlue()); } /** * Method to set the blue to a new blue value * @param value the new value to use */ public void setBlue(int value) { // set the blue value to the corrected value int blue = correctValue(value); // update the pixel value in the picture updatePicture(getAlpha(), getRed(), getGreen(), blue); } /** * Method to set the alpha (transparency) to a new alpha value * @param value the new value to use */ public void setAlpha(int value) { // make sure that the alpha is from 0 to 255 int alpha = correctValue(value); // update the associated picture updatePicture(alpha, getRed(), getGreen(), getBlue()); } /** * Method to get the distance between this pixel's color and the passed color * @param testColor the color to compare to * @return the distance between this pixel's color and the passed color */ public double colorDistance(Color testColor) { double redDistance = this.getRed() - testColor.getRed(); double greenDistance = this.getGreen() - testColor.getGreen(); double blueDistance = this.getBlue() - testColor.getBlue(); double distance = Math.sqrt(redDistance * redDistance + greenDistance * greenDistance + blueDistance * blueDistance); return distance; } /** * Method to compute the color distances between two color objects * @param color1 a color object * @param color2 a color object * @return the distance between the two colors */ public static double colorDistance(Color color1,Color color2) { double redDistance = color1.getRed() - color2.getRed(); double greenDistance = color1.getGreen() - color2.getGreen(); double blueDistance = color1.getBlue() - color2.getBlue(); double distance = Math.sqrt(redDistance * redDistance + greenDistance * greenDistance + blueDistance * blueDistance); return distance; } /** * Method to get the average of the colors of this pixel * @return the average of the red, green, and blue values */ public double getAverage() { double average = (getRed() + getGreen() + getBlue()) / 3.0; return average; } /** * Method to return a string with information about this pixel * @return a string with information about this pixel */ public String toString() { return "Pixel row=" + getRow() + " col=" + getCol() + " red=" + getRed() + " green=" + getGreen() + " blue=" + getBlue(); } } import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import java.awt.*; import java.io.*; import java.awt.geom.*; import java.io.ByteArrayOutputStream; //import javax.xml.bind.DatatypeConverter; import java.util.Base64; import java.util.Scanner; /** * A class that represents a simple picture. A simple picture may have * an associated file name and a title. A simple picture has pixels, * width, and height. A simple picture uses a BufferedImage to * hold the pixels. You can also explore a simple picture. * * @author Barb Ericson ericson@cc.gatech.edu */ public class SimplePicture implements DigitalPicture { /////////////////////// Fields ///////////////////////// /** * the file name associated with the simple picture */ private String fileName; /** * the path name for the file */ private String pathName; /** * the title of the simple picture */ private String title; /** * buffered image to hold pixels for the simple picture */ private BufferedImage bufferedImage; /** * extension for this file (jpg or bmp) */ private String extension; /////////////////////// Constructors ///////////////////////// /** * A Constructor that takes no arguments. It creates a picture with * a width of 200 and a height of 100 that is all white. * A no-argument constructor must be given in order for a class to * be able to be subclassed. By default all subclasses will implicitly * call this in their parent's no-argument constructor unless a * different call to super() is explicitly made as the first line * of code in a constructor. */ public SimplePicture() {this(200,100);} /** * A Constructor that takes a file name and uses the file to create * a picture * @param fileName the file name to use in creating the picture */ public SimplePicture(String fileName) { // load the picture into the buffered image load(fileName); } /** * A constructor that takes the width and height desired for a picture and * creates a buffered image of that size. This constructor doesn't * show the picture. The pixels will all be white. * @param width the desired width * @param height the desired height */ public SimplePicture(int width, int height) { bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); title = "None"; fileName = "None"; extension = "jpg"; setAllPixelsToAColor(Color.white); } /** * A constructor that takes the width and height desired for a picture and * creates a buffered image of that size. It also takes the * color to use for the background of the picture. * @param width the desired width * @param height the desired height * @param theColor the background color for the picture */ public SimplePicture(int width, int height, Color theColor) { this(width,height); setAllPixelsToAColor(theColor); } /** * A Constructor that takes a picture to copy information from * @param copyPicture the picture to copy from */ public SimplePicture(SimplePicture copyPicture) { if (copyPicture.fileName != null) { this.fileName = new String(copyPicture.fileName); this.extension = copyPicture.extension; } if (copyPicture.title != null) this.title = new String(copyPicture.title); if (copyPicture.bufferedImage != null) { this.bufferedImage = new BufferedImage(copyPicture.getWidth(), copyPicture.getHeight(), BufferedImage.TYPE_INT_RGB); this.copyPicture(copyPicture); } } /** * A constructor that takes a buffered image * @param image the buffered image */ public SimplePicture(BufferedImage image) { this.bufferedImage = image; title = "None"; fileName = "None"; extension = "jpg"; } ////////////////////////// Methods ////////////////////////////////// /** * Method to get the extension for this picture * @return the extension (jpg, bmp, giff, etc) */ public String getExtension() { return extension; } /** * Method that will copy all of the passed source picture into * the current picture object * @param sourcePicture the picture object to copy */ public void copyPicture(SimplePicture sourcePicture) { Pixel sourcePixel = null; Pixel targetPixel = null; // loop through the columns for (int sourceX = 0, targetX = 0; sourceX < sourcePicture.getWidth() && targetX < this.getWidth(); sourceX++, targetX++) { // loop through the rows for (int sourceY = 0, targetY = 0; sourceY < sourcePicture.getHeight() && targetY < this.getHeight(); sourceY++, targetY++) { sourcePixel = sourcePicture.getPixel(sourceX,sourceY); targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor(sourcePixel.getColor()); } } } /** * Method to set the color in the picture to the passed color * @param color the color to set to */ public void setAllPixelsToAColor(Color color) { // loop through all x for (int x = 0; x < this.getWidth(); x++) { // loop through all y for (int y = 0; y < this.getHeight(); y++) { getPixel(x,y).setColor(color); } } } /** * Method to get the buffered image * @return the buffered image */ public BufferedImage getBufferedImage() { return bufferedImage; } /** * Method to get a graphics object for this picture to use to draw on * @return a graphics object to use for drawing */ public Graphics getGraphics() { return bufferedImage.getGraphics(); } /** * Method to get a Graphics2D object for this picture which can * be used to do 2D drawing on the picture */ public Graphics2D createGraphics() { return bufferedImage.createGraphics(); } /** * Method to get the file name associated with the picture * @return the file name associated with the picture */ public String getFileName() { return fileName; } /** * Method to set the file name * @param name the full pathname of the file */ public void setFileName(String name) { fileName = name; } /** * Method to get the title of the picture * @return the title of the picture */ public String getTitle() { return title; } /** * Method to set the title for the picture * @param title the title to use for the picture */ public void setTitle(String title) { this.title = title; } /** * Method to get the width of the picture in pixels * @return the width of the picture in pixels */ public int getWidth() { return bufferedImage.getWidth(); } /** * Method to get the height of the picture in pixels * @return the height of the picture in pixels */ public int getHeight() { return bufferedImage.getHeight(); } /** * Method to get an image from the picture * @return the buffered image since it is an image */ public Image getImage() { return bufferedImage; } /** * Method to return the pixel value as an int for the given x and y location * @param x the x coordinate of the pixel * @param y the y coordinate of the pixel * @return the pixel value as an integer (alpha, red, green, blue) */ public int getBasicPixel(int x, int y) { return bufferedImage.getRGB(x,y); } /** * Method to set the value of a pixel in the picture from an int * @param x the x coordinate of the pixel * @param y the y coordinate of the pixel * @param rgb the new rgb value of the pixel (alpha, red, green, blue) */ public void setBasicPixel(int x, int y, int rgb) { bufferedImage.setRGB(x,y,rgb); } /** * Method to get a pixel object for the given x and y location * @param x the x location of the pixel in the picture * @param y the y location of the pixel in the picture * @return a Pixel object for this location */ public Pixel getPixel(int x, int y) { // create the pixel object for this picture and the given x and y location Pixel pixel = new Pixel(this,x,y); return pixel; } /** * Method to get a one-dimensional array of Pixels for this simple picture * @return a one-dimensional array of Pixel objects starting with y=0 * to y=height-1 and x=0 to x=width-1. */ public Pixel[] getPixels() { int width = getWidth(); int height = getHeight(); Pixel[] pixelArray = new Pixel[width * height]; // loop through height rows from top to bottom for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) pixelArray[row * width + col] = new Pixel(this,col,row); return pixelArray; } /** * Method to get a two-dimensional array of Pixels for this simple picture * @return a two-dimensional array of Pixel objects in row-major order. */ public Pixel[][] getPixels2D() { int width = getWidth(); int height = getHeight(); Pixel[][] pixelArray = new Pixel[height][width]; // loop through height rows from top to bottom for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) pixelArray[row][col] = new Pixel(this,col,row); return pixelArray; } /** * Method to load the buffered image with the passed image * @param image the image to use */ public void load(Image image) { // get a graphics context to use to draw on the buffered image Graphics2D graphics2d = bufferedImage.createGraphics(); // draw the image on the buffered image starting at 0,0 graphics2d.drawImage(image,0,0,null); // show the new image show(); } /** * Method to show the picture in a picture frame */ public void show() { try { ByteArrayOutputStream output = new ByteArrayOutputStream(); ImageIO.write(this.bufferedImage, "png", output); String result = Base64.getEncoder().encodeToString(output.toByteArray()); //BH: using Base64 instead of DatatypeConverter.printBase64Binary(output.toByteArray()); System.out.println("<img src=\'data:image/" + this.extension + ";base64," + result + "\'/>"); } catch (IOException e) { System.out.println("Errors occured in image conversion"); } } /** * Method to open a picture explorer on a copy (in memory) of this * simple picture */ /* public void explore() { // create a copy of the current picture and explore it new PictureExplorer(new SimplePicture(this)); } */ /** * Method to load the picture from the passed file name * @param fileName the file name to use to load the picture from * @throws IOException if the picture isn't found */ public void loadOrFail(String fileName) throws IOException { // set the current picture's file name this.fileName = fileName; // set the extension int posDot = fileName.lastIndexOf('.'); if (posDot >= 0) this.extension = fileName.substring(posDot + 1); // get file location String[] paths = fileName.split("/"); this.pathName = ""; if(paths.length != 1) { for(int i = 0; i < paths.length - 1; i++) { this.pathName = this.pathName + paths[i] + "/"; } } // if the current title is null use the file name if (title == null) title = fileName; File file = new File(this.fileName); if (!file.canRead()) { throw new IOException(this.fileName + " could not be opened. Check that you specified the path"); } this.bufferedImage = ImageIO.read(file); } /** * Method to read the contents of the picture from a filename * without throwing errors * @param fileName the name of the file to write the picture to * @return true if success else false */ public boolean load(String fileName) { try { this.loadOrFail(fileName); return true; } catch (Exception ex) { System.out.println("There was an error trying to open " + fileName); bufferedImage = new BufferedImage(600,200, BufferedImage.TYPE_INT_RGB); addMessage("Couldn't load " + fileName,5,100); return false; } } /** * Method to load the picture from the passed file name * this just calls load(fileName) and is for name compatibility * @param fileName the file name to use to load the picture from * @return true if success else false */ public boolean loadImage(String fileName) { return load(fileName); } /** * Method to draw a message as a string on the buffered image * @param message the message to draw on the buffered image * @param xPos the x coordinate of the leftmost point of the string * @param yPos the y coordinate of the bottom of the string */ public void addMessage(String message, int xPos, int yPos) { // get a graphics context to use to draw on the buffered image Graphics2D graphics2d = bufferedImage.createGraphics(); // set the color to white graphics2d.setPaint(Color.white); // set the font to Helvetica bold style and size 16 graphics2d.setFont(new Font("Helvetica",Font.BOLD,16)); // draw the message graphics2d.drawString(message,xPos,yPos); } /** * Method to draw a string at the given location on the picture * @param text the text to draw * @param xPos the left x for the text * @param yPos the top y for the text */ public void drawString(String text, int xPos, int yPos) { addMessage(text,xPos,yPos); } /** * Method to create a new picture by scaling the current * picture by the given x and y factors * @param xFactor the amount to scale in x * @param yFactor the amount to scale in y * @return the resulting picture */ public Picture scale(double xFactor, double yFactor) { // set up the scale transform AffineTransform scaleTransform = new AffineTransform(); scaleTransform.scale(xFactor,yFactor); // create a new picture object that is the right size Picture result = new Picture((int) (getHeight() * yFactor), (int) (getWidth() * xFactor)); // get the graphics 2d object to draw on the result Graphics graphics = result.getGraphics(); Graphics2D g2 = (Graphics2D) graphics; // draw the current image onto the result image scaled g2.drawImage(this.getImage(),scaleTransform,null); return result; } /** * Method to create a new picture of the passed width. * The aspect ratio of the width and height will stay * the same. * @param width the desired width * @return the resulting picture */ public Picture getPictureWithWidth(int width) { // set up the scale transform double xFactor = (double) width / this.getWidth(); Picture result = scale(xFactor,xFactor); return result; } /** * Method to create a new picture of the passed height. * The aspect ratio of the width and height will stay * the same. * @param height the desired height * @return the resulting picture */ public Picture getPictureWithHeight(int height) { // set up the scale transform double yFactor = (double) height / this.getHeight(); Picture result = scale(yFactor,yFactor); return result; } /** * Method to load a picture from a file name and show it in a picture frame * @param fileName the file name to load the picture from * @return true if success else false */ public boolean loadPictureAndShowIt(String fileName) { boolean result = true; // the default is that it worked // try to load the picture into the buffered image from the file name result = load(fileName); // show the picture in a picture frame show(); return result; } /** * Method to write the contents of the picture to a file with * the passed name * @param fileName the name of the file to write the picture to */ public void writeOrFail(String fileName) throws IOException { String extension = this.extension; // the default is current // create the file object File file = new File(this.pathName + fileName); //File fileLoc = file.getParentFile(); // directory name // if there is no parent directory use the current media dir //if (fileLoc == null) //{ //fileName = FileChooser.getMediaPath(fileName); //file = new File(fileName); //fileLoc = file.getParentFile(); //} // check that you can write to the directory //if (!fileLoc.canWrite()) { // throw new IOException(fileName + // " could not be opened. Check to see if you can write to the directory."); //} // get the extension int posDot = fileName.indexOf('.'); if (posDot >= 0) extension = fileName.substring(posDot + 1); // write the contents of the buffered image to the file ImageIO.write(bufferedImage, extension, file); } /** * Method to write the contents of the picture to a file with * the passed name without throwing errors * @param fileName the name of the file to write the picture to * @return true if success else false */ public boolean write(String fileName) { try { this.writeOrFail(fileName); return true; } catch (Exception ex) { System.out.println("There was an error trying to write " + fileName); ex.printStackTrace(); return false; } } /** * Method to get the coordinates of the enclosing rectangle after this * transformation is applied to the current picture * @return the enclosing rectangle */ public Rectangle2D getTransformEnclosingRect(AffineTransform trans) { int width = getWidth(); int height = getHeight(); double maxX = width - 1; double maxY = height - 1; double minX, minY; Point2D.Double p1 = new Point2D.Double(0,0); Point2D.Double p2 = new Point2D.Double(maxX,0); Point2D.Double p3 = new Point2D.Double(maxX,maxY); Point2D.Double p4 = new Point2D.Double(0,maxY); Point2D.Double result = new Point2D.Double(0,0); Rectangle2D.Double rect = null; // get the new points and min x and y and max x and y trans.deltaTransform(p1,result); minX = result.getX(); maxX = result.getX(); minY = result.getY(); maxY = result.getY(); trans.deltaTransform(p2,result); minX = Math.min(minX,result.getX()); maxX = Math.max(maxX,result.getX()); minY = Math.min(minY,result.getY()); maxY = Math.max(maxY,result.getY()); trans.deltaTransform(p3,result); minX = Math.min(minX,result.getX()); maxX = Math.max(maxX,result.getX()); minY = Math.min(minY,result.getY()); maxY = Math.max(maxY,result.getY()); trans.deltaTransform(p4,result); minX = Math.min(minX,result.getX()); maxX = Math.max(maxX,result.getX()); minY = Math.min(minY,result.getY()); maxY = Math.max(maxY,result.getY()); // create the bounding rectangle to return rect = new Rectangle2D.Double(minX,minY,maxX - minX + 1, maxY - minY + 1); return rect; } /** * Method to get the coordinates of the enclosing rectangle after this * transformation is applied to the current picture * @return the enclosing rectangle */ public Rectangle2D getTranslationEnclosingRect(AffineTransform trans) { return getTransformEnclosingRect(trans); } /** * Method to return a string with information about this picture * @return a string with information about the picture */ public String toString() { String output = "Simple Picture, filename " + fileName + " height " + getHeight() + " width " + getWidth(); return output; } } // end of SimplePicture class ================================================ FILE: examples/sample-book/gen/datafile/flower1-datafile.xml ================================================ ================================================ FILE: examples/sample-book/gen/datafile/flower2-datafile.xml ================================================ ================================================ FILE: examples/sample-book/gen/datafile/golden-gate.xml ================================================ ================================================ FILE: examples/sample-book/gen/datafile/golden-gate2.xml ================================================ ================================================ FILE: examples/sample-book/gen/datafile/luther-bell.xml ================================================ ================================================ FILE: examples/sample-book/gen/datafile/stack-overflow-survey.xml ================================================ Respondent|Country|JobSatisfaction|UndergradMajor|ConvertedSalary|Exercise|Gender|RaceEthnicity|EducationParents|HoursOutside|Age|LastNewJob|LanguageWorkedWith 51900|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|94455.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|35 - 44 years old|Between 1 and 2 years ago|C;C#;Java;JavaScript;Objective-C;PHP;Swift;HTML;CSS 95836|Argentina|Slightly satisfied|A business discipline (ex. accounting, finance, marketing)|45600.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;CoffeeScript;JavaScript;Ruby;HTML;CSS;Bash/Shell 51710|Germany|Slightly dissatisfied|A social science (ex. anthropology, psychology, political science)|807756.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;Python;TypeScript;HTML;Bash/Shell 44125|United States|Moderately dissatisfied|A social science (ex. anthropology, psychology, political science)|175000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|45 - 54 years old|Between 1 and 2 years ago|JavaScript;Python 35167|United Kingdom|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|90288.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Go;JavaScript;Ruby;HTML;CSS 31721|Japan|Slightly dissatisfied|Information systems, information technology, or system administration|77433.0|3 - 4 times per week|Male|East Asian|They never completed any formal education|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP 36729|Brazil|Moderately dissatisfied|Computer science, computer engineering, or software engineering|16848.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS 38620|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|73433.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Groovy;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 54695|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|82000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;Python;SQL 22810|Turkey|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|25428.0|I don't typically exercise|Male|Middle Eastern|Primary/elementary school|1 - 2 hours|35 - 44 years old|More than 4 years ago|C# 6289|Germany|Extremely satisfied|Information systems, information technology, or system administration|79552.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Java;JavaScript;HTML 48220|Turkey|Moderately dissatisfied|Computer science, computer engineering, or software engineering|12720.0|1 - 2 times per week|Male|Middle Eastern|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;PHP;SQL;HTML;CSS 72519|Belgium|Extremely satisfied|Information systems, information technology, or system administration|44064.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C#;Erlang;Haskell;Java;JavaScript;Matlab;Objective-C;PHP;Python;R;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS 99498|Estonia|Slightly satisfied|Computer science, computer engineering, or software engineering|32316.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Python;SQL;HTML;CSS 42989|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|57170.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;CoffeeScript;F#;JavaScript;SQL;VB.NET;HTML;CSS;Bash/Shell 75468|Ukraine|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|6684.0|Daily or almost every day|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;HTML;CSS 4814|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|50000.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;JavaScript;PHP;Python;SQL;Delphi/Object Pascal;HTML;CSS;Bash/Shell 62436|Argentina|Slightly dissatisfied|Computer science, computer engineering, or software engineering|27336.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Java;JavaScript;Python;HTML;Bash/Shell 54029|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|115000.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|Assembly;C;C++;C#;Java;Bash/Shell 9393|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|70000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|45 - 54 years old|More than 4 years ago|Python;SQL;VB.NET;Visual Basic 6 80650|Australia|Extremely satisfied|Computer science, computer engineering, or software engineering|73576.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Go;Groovy;Java;JavaScript;Python;Kotlin;Delphi/Object Pascal;HTML;CSS 1105|Switzerland|Extremely satisfied|Computer science, computer engineering, or software engineering|99056.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C++;Go;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 20184|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|67313.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 64870|France|Extremely satisfied|Mathematics or statistics|61194.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Matlab;Python;HTML;CSS 50097|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|78000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;HTML;CSS;Bash/Shell 45899|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|83000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|JavaScript;Objective-C;Python;Swift;HTML;CSS 1862|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|71597.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;Java;JavaScript;HTML 41764|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|146000.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Erlang;JavaScript;Ruby;HTML;CSS 566|Canada|Moderately dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|1000000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Go;JavaScript;PHP;SQL;HTML;CSS 86353|United Kingdom|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|34726.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Python;SQL;HTML;CSS 47618|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|57400.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 49562|Mexico|Slightly dissatisfied|Information systems, information technology, or system administration|22560.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;SQL;VB.NET;Visual Basic 6;HTML;CSS 98428|Philippines|Slightly dissatisfied|Computer science, computer engineering, or software engineering|119088.0|3 - 4 times per week|Male|East Asian;South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;Java;JavaScript;Python;TypeScript;HTML;CSS;Bash/Shell 97868|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|67313.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C# 35152|Netherlands|Moderately dissatisfied|Web development or web design|58752.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;HTML;CSS;Bash/Shell 20771|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|26513.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 25005|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|50000.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C#;CoffeeScript;Java;JavaScript;SQL;HTML;CSS 60393|Australia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|115162.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;C++;Python;Rust 43413|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|62486.0|1 - 2 times per week|Female|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Julia;Bash/Shell 4998|Argentina|Slightly dissatisfied|Computer science, computer engineering, or software engineering|23500.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS 20573|Qatar|Moderately satisfied|Computer science, computer engineering, or software engineering|75000.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 69177|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|36716.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C++ 40065|Sri Lanka|Slightly satisfied|Information systems, information technology, or system administration|12000.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;HTML;CSS 58855|United States|Extremely satisfied|Information systems, information technology, or system administration|60000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;TypeScript;HTML;CSS 51948|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|110000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;CoffeeScript;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 62327|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|44916.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C#;Java;JavaScript;SQL;VBA;HTML;CSS;Bash/Shell 84278|Russian Federation|Slightly satisfied|Information systems, information technology, or system administration|25476.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;Python;Bash/Shell 16749|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|143328.0|Daily or almost every day|Female;Non-binary, genderqueer, or gender non-conforming|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Haskell;Java;JavaScript;TypeScript;Ocaml;HTML;CSS;Bash/Shell 100350|The former Yugoslav Republic of Macedonia|Slightly satisfied|Computer science, computer engineering, or software engineering|7152.0|1 - 2 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|18 - 24 years old|Less than a year ago|Assembly;C++;C#;F#;Java;SQL;CSS 71690|Canada|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|72469.0|3 - 4 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Python;HTML;CSS;Bash/Shell 6329|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|72469.0|1 - 2 times per week|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Python;HTML;CSS 76220|United Kingdom|Extremely dissatisfied|Computer science, computer engineering, or software engineering|48616.0|1 - 2 times per week|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 21455|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|70000.0|1 - 2 times per week|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;CoffeeScript;Groovy;Java;JavaScript;Objective-C;Ruby;SQL;Swift;HTML;CSS;Bash/Shell 26541|Italy|Moderately satisfied|Computer science, computer engineering, or software engineering|440592.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;SQL;HTML;CSS 5282|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|70368.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 1859|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|82890.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 94909|Mexico|Extremely satisfied|Computer science, computer engineering, or software engineering|19980.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C#;Java;JavaScript;PHP;SQL;HTML;CSS 91689|Netherlands|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|44064.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 62081|Netherlands|Extremely satisfied|Mathematics or statistics|41124.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 15965|Germany|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|67313.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|3 - 4 hours|35 - 44 years old|Less than a year ago|JavaScript;Ruby;VBA 62544|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|12396.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;PHP;Python;Ruby;SQL;TypeScript;Visual Basic 6;HTML;CSS;Bash/Shell 92573|Japan|Slightly dissatisfied|Computer science, computer engineering, or software engineering|36015.0|Daily or almost every day|Female|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|18 - 24 years old|Less than a year ago|C#;Java;SQL 55775|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|35000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|I've never had a job|C#;Java;JavaScript;Python;HTML;CSS 60088|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|50005.0|3 - 4 times per week|Male|White or of European descent|They never completed any formal education|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 83226|Israel|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|94788.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|Java;JavaScript;TypeScript;HTML;CSS 85616|Sweden|Moderately dissatisfied|Computer science, computer engineering, or software engineering|68868.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Groovy;Java;Python 19271|Sri Lanka|Moderately satisfied|Information systems, information technology, or system administration|11076.0|1 - 2 times per week|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C;JavaScript;Objective-C;PHP;Swift;Kotlin;HTML;CSS 20776|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|120000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;PHP;Python;HTML;CSS;Bash/Shell 61323|India|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|150288.0|I don't typically exercise|Male|South Asian|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Objective-C;Swift;TypeScript;HTML;CSS 92023|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|72209.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;Python;Bash/Shell 29397|New Zealand|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|1000000.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;Perl;Python;SQL;VBA;HTML;Bash/Shell 22450|Germany|Slightly satisfied|Mathematics or statistics|44060.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;Java;JavaScript;Matlab;PHP;Python;R;HTML;CSS 32148|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|58410.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 79753|United Kingdom|Neither satisfied nor dissatisfied|Web development or web design|41671.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Objective-C;Python;Swift;TypeScript;HTML;CSS;Bash/Shell 96505|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|137000.0|1 - 2 times per week|Female|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;Python;HTML;CSS;Bash/Shell 3462|United Kingdom|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|83342.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;Groovy;Java;Python;Ruby;Bash/Shell 86789|Belgium|Extremely satisfied|Computer science, computer engineering, or software engineering|26436.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;Objective-C;PHP;SQL;HTML;Bash/Shell 77857|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|260000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 34236|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|55 - 64 years old|More than 4 years ago|C++;C#;Java;JavaScript;SQL;HTML;CSS 55287|United States|Slightly satisfied|Mathematics or statistics|145000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|35 - 44 years old|Between 1 and 2 years ago|Java;Python;Scala;SQL;Bash/Shell 89804|United States|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|114000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 42366|Bangladesh|Moderately satisfied|Computer science, computer engineering, or software engineering|9552.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Java;JavaScript;PHP;Python;SQL;VBA;VB.NET;HTML;CSS 4505|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|58752.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 34225|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|50005.0|Daily or almost every day|Male;Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 52702|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|57576.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|JavaScript;SQL;HTML;CSS 50169|United Kingdom|Moderately dissatisfied|Web development or web design|241692.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS 69694|United States|Slightly satisfied|I never declared a major|65000.0|I don't typically exercise|Male|White or of European descent|Associate degree|Less than 30 minutes|18 - 24 years old|Less than a year ago|C#;Go;Java;SQL;VB.NET;HTML;CSS;Bash/Shell 83115|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|66674.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;Swift;Kotlin;Bash/Shell 40830|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|45000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C++;C#;Java;JavaScript;Objective-C;SQL;Swift;HTML;CSS 71351|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|83000.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C;C++;C#;Visual Basic 6;Bash/Shell 19495|Belgium|Moderately satisfied|Computer science, computer engineering, or software engineering|30840.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 9180|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|67977.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;PHP;SQL;TypeScript;VB.NET;HTML;CSS 101526|Lithuania|Moderately dissatisfied|Computer science, computer engineering, or software engineering|44064.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python;SQL;CSS;Bash/Shell 34897|Serbia|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|11784.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Swift 28328|Belgium|Slightly satisfied|Computer science, computer engineering, or software engineering|1000000.0|1 - 2 times per week|Female|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Python;SQL;HTML;CSS 14652|Austria|Extremely satisfied|Computer science, computer engineering, or software engineering|85671.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;Swift;HTML;CSS 14638|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|112000.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;C#;Java;Python;SQL;Kotlin;HTML;CSS;Bash/Shell 31224|Australia|Moderately dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|53582.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 90398|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|59880.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;Java;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 73197|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|63642.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java 61385|United Kingdom|Moderately dissatisfied|Computer science, computer engineering, or software engineering|45838.0|I don't typically exercise|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;JavaScript;HTML;CSS;Bash/Shell 71885|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|79552.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Go;Java;JavaScript;Lua;Python;R;SQL;HTML;CSS;Bash/Shell 89480|Canada|Neither satisfied nor dissatisfied|A business discipline (ex. accounting, finance, marketing)|40261.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|CoffeeScript;JavaScript;Ruby;SQL;HTML;CSS 57133|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|75000.0|3 - 4 times per week|Female|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Go;JavaScript;HTML;CSS;Bash/Shell 50575|United Kingdom|Moderately satisfied|Information systems, information technology, or system administration|62507.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;SQL 9757|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|73619.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 7628|France|Extremely dissatisfied|Computer science, computer engineering, or software engineering|110149.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;HTML;CSS 83801|Netherlands|Slightly satisfied|Information systems, information technology, or system administration|61194.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C#;SQL 99551|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|70138.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Go;Java;JavaScript;Objective-C;Python;Swift;TypeScript;Kotlin 13809|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|61194.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Go;Java;JavaScript;Perl;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 45507|Denmark|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|77416.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 57858|Poland|Moderately dissatisfied|A humanities discipline (ex. literature, history, philosophy)|73428.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|CoffeeScript;JavaScript;Ruby;SQL;HTML;CSS 14173|Pakistan|Slightly dissatisfied|Computer science, computer engineering, or software engineering|12000.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;JavaScript;Matlab;Objective-C;PHP;SQL;Swift 87452|United Kingdom|Moderately satisfied|I never declared a major|566724.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;PHP;Python;VB.NET;Delphi/Object Pascal;HTML;CSS 8752|United States|Extremely satisfied|Web development or web design|70000.0|3 - 4 times per week|Male|Native American, Pacific Islander, or Indigenous Australian;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 60397|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|2000000.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;Go;Java;JavaScript;Python;Scala;SQL 27294|France|Moderately satisfied|Computer science, computer engineering, or software engineering|48955.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 21557|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|65000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|Python;HTML 90588|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|152000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C++;Groovy;Java;JavaScript;SQL;Bash/Shell 74127|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|120000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript;Python;Ruby;SQL;TypeScript;Kotlin;Ocaml;HTML;CSS;Bash/Shell 76121|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|74316.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 17443|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|80000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|PHP;SQL;HTML;Bash/Shell 17481|Netherlands|Slightly dissatisfied|Computer science, computer engineering, or software engineering|22030.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;JavaScript;Python;HTML;CSS 101129|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|30597.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Go;Java;JavaScript;R;Rust;Scala;SQL;TypeScript;Kotlin;HTML;CSS;Bash/Shell 73468|Germany|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|75880.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C;C++;C#;JavaScript;PHP;SQL;HTML;Bash/Shell 27037|Denmark|Moderately satisfied|Computer science, computer engineering, or software engineering|78900.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;TypeScript 46999|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;F#;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 59557|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|85000.0|3 - 4 times per week|Male|Black or of African descent|Other doctoral degree (Ph.D, Ed.D., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Java;Python;R;SQL;VBA 36288|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|48000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;Matlab;TypeScript;Kotlin;HTML;CSS;Bash/Shell 34997|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|48300.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 96751|United States|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|100000.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|Less than 30 minutes|45 - 54 years old|More than 4 years ago|Java;JavaScript;PHP;SQL;VBA;HTML;CSS 59125|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|50179.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 42688|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|40000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;Java;JavaScript;SQL;TypeScript;VB.NET;HTML;CSS 50437|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|77100.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;HTML;Bash/Shell 13782|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|123000.0|Daily or almost every day|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|Java;Kotlin 27915|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|108000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Go;JavaScript;SQL;HTML;CSS;Bash/Shell 69925|Canada|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|72469.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Ruby;HTML;CSS 96804|Brazil|Extremely satisfied|Information systems, information technology, or system administration|30504.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Go;Java;PHP 25904|United States|Extremely dissatisfied|Web development or web design|42000.0|Daily or almost every day|Female|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 31547|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|104000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;F#;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 25690|Finland|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|64620.0|Daily or almost every day|Male|White or of European descent|Primary/elementary school|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;SQL 34181|United States|Extremely satisfied|Information systems, information technology, or system administration|28000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 76968|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|97826.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;JavaScript;PHP;SQL;HTML;CSS 68780|Australia|Moderately satisfied|Mathematics or statistics|71976.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|More than 4 years ago|C;C++;Python 47710|United Kingdom|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|194466.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;SQL 74024|Russian Federation|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|24000.0|Daily or almost every day|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|PHP;Python;SQL;Bash/Shell 50677|China|Moderately dissatisfied|Computer science, computer engineering, or software engineering|37400.0|3 - 4 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Java;Lua;Rust;Bash/Shell 78292|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|21133.0|Daily or almost every day|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;TypeScript;CSS 56626|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|50005.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 9541|Iran, Islamic Republic of...|Moderately satisfied|Computer science, computer engineering, or software engineering|23304.0|1 - 2 times per week|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 17867|Pakistan|Moderately satisfied|Computer science, computer engineering, or software engineering|8136.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;Objective-C;Python;Swift 6115|India|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|14089.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 233|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|105000.0|Daily or almost every day|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;Python;HTML;CSS 58499|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|85000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 80960|Bangladesh|Extremely satisfied|Computer science, computer engineering, or software engineering|48000.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;Java;JavaScript;PHP;SQL;HTML;CSS 25948|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|105000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS 83560|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|48955.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 36407|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|68868.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;C++;Python;Bash/Shell 53292|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|126000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;PHP;Python;Bash/Shell 69311|Sweden|Moderately dissatisfied|Computer science, computer engineering, or software engineering|682692.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 62109|Georgia|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|29220.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;SQL;Kotlin;HTML;CSS;Bash/Shell 38148|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Ruby;HTML;CSS 48896|Spain|Slightly dissatisfied|Computer science, computer engineering, or software engineering|1000000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Bash/Shell 632|United States|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|75000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 78373|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|135000.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|45 - 54 years old|Between 2 and 4 years ago|C;C++;Go;Java;JavaScript;Julia;Lua;Perl;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 78062|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|130000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;R;SQL;HTML;CSS 43389|Romania|Moderately satisfied|Information systems, information technology, or system administration|17628.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Python;HTML;CSS 51075|South Africa|Moderately satisfied|Web development or web design|10872.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 58655|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|2000000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;HTML;CSS 45914|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|87800.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;Java;JavaScript;Python;HTML;CSS 54054|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|93000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C;C++ 96458|Lithuania|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|51408.0|1 - 2 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|C;C++;C#;Go;Groovy;Java;JavaScript;Lua;Perl;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 68501|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|400000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C++;Matlab;Python;R;HTML;Bash/Shell 27846|United Kingdom|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|500052.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|Python;Scala;SQL;Bash/Shell 71610|India|Slightly satisfied|Computer science, computer engineering, or software engineering|11268.0|3 - 4 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|C;C++;C#;Java;JavaScript;SQL;VB.NET;HTML;CSS;Bash/Shell 43064|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|90000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Erlang;JavaScript;PHP;SQL;Swift;HTML;CSS;Bash/Shell 79434|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;JavaScript;TypeScript;HTML;CSS 92105|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|100000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|JavaScript;Ruby;TypeScript 91341|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|916764.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;PHP;Python;Scala;SQL;TypeScript;HTML;CSS;Bash/Shell 71899|United States|Moderately satisfied|Information systems, information technology, or system administration|59000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;PHP;R;SQL;HTML;CSS;Bash/Shell 2243|India|Extremely satisfied|Computer science, computer engineering, or software engineering|11724.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|35 - 44 years old|Less than a year ago|Java;JavaScript;Python;Scala;Kotlin;HTML;CSS 42435|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|115000.0|I don't typically exercise|Male|East Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 43236|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|50000.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Ruby;HTML;CSS 99014|Portugal|Moderately dissatisfied|Computer science, computer engineering, or software engineering|39164.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;SQL 84028|India|Moderately satisfied|Computer science, computer engineering, or software engineering|15654.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;Python;HTML;CSS;Bash/Shell 63602|Spain|Moderately dissatisfied|Computer science, computer engineering, or software engineering|70350.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C# 65984|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|82000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 41064|United States|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|25000.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;VBA;HTML;CSS;Bash/Shell 19829|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|12000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;C++;C#;Java;JavaScript;Python;R;SQL;HTML;CSS 36969|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|36716.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Erlang;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 48326|United Kingdom|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|650076.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Matlab;Python;Bash/Shell 9434|Poland|Moderately dissatisfied|Computer science, computer engineering, or software engineering|24696.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 25721|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|24478.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;VB.NET;Visual Basic 6;HTML;CSS 12916|Belarus|Moderately satisfied|Computer science, computer engineering, or software engineering|49308.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Objective-C;Swift 81997|Brazil|Extremely satisfied|Information systems, information technology, or system administration|22452.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 97467|United States|Slightly dissatisfied|A social science (ex. anthropology, psychology, political science)|85000.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Ruby;HTML;CSS;Bash/Shell 91866|Bulgaria|Moderately satisfied|Computer science, computer engineering, or software engineering|9756.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|SQL;Delphi/Object Pascal 48114|South Africa|Moderately satisfied|Computer science, computer engineering, or software engineering|29664.0|I don't typically exercise|Male|Black or of African descent|Primary/elementary school|3 - 4 hours|35 - 44 years old|Between 1 and 2 years ago|C#;JavaScript;Perl;PHP;SQL;HTML;CSS 94729|Brazil|Extremely satisfied|Computer science, computer engineering, or software engineering|74856.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|PHP;Delphi/Object Pascal 70724|Brazil|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|6360.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;PHP;HTML;CSS 79053|Czech Republic|Extremely satisfied|Computer science, computer engineering, or software engineering|73428.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;Go;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 3034|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|60216.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C++;C#;Java;JavaScript;Matlab;Objective-C;PHP;SQL;Delphi/Object Pascal;HTML;CSS 40519|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|72000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|More than 4 years ago|Assembly;C;C#;VB.NET 26919|Denmark|Slightly dissatisfied|Computer science, computer engineering, or software engineering|87768.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Scala;TypeScript;HTML;CSS 90797|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|153000.0|1 - 2 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C;C++;C#;JavaScript;Matlab;Python;SQL;Bash/Shell 73676|India|Moderately satisfied|Computer science, computer engineering, or software engineering|3984.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Java;JavaScript;Swift;TypeScript;HTML;CSS 29857|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|55020.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 91701|France|Moderately satisfied|Computer science, computer engineering, or software engineering|47736.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|Java;Python;Scala;SQL;HTML 99652|Germany|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|20556.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;Java;Matlab;Python;SQL;VBA 7328|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|90000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 73680|Ireland|Moderately dissatisfied|Computer science, computer engineering, or software engineering|352476.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Haskell;JavaScript;PHP;Python;SQL;HTML;CSS 50527|India|Moderately satisfied|Computer science, computer engineering, or software engineering|4128.0|3 - 4 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Java;JavaScript;HTML;CSS 979|Russian Federation|Slightly satisfied|Mathematics or statistics|28800.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C++;Java;JavaScript;PHP;Python;SQL;Visual Basic 6;Delphi/Object Pascal;HTML;CSS;Bash/Shell 42592|Switzerland|Moderately satisfied|Computer science, computer engineering, or software engineering|118872.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|45 - 54 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Java;JavaScript;SQL;TypeScript;VBA;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 97920|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|54755.0|Daily or almost every day|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Python 20179|Hong Kong (S.A.R.)|Moderately satisfied|Computer science, computer engineering, or software engineering|76754.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;Python 20072|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|70000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;SQL;TypeScript;HTML;CSS 51748|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|102000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;SQL 80139|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|141960.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 60418|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|160000.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;HTML;CSS;Bash/Shell 27251|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|36115.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Go;JavaScript;PHP;Python;Rust;SQL;HTML;CSS;Bash/Shell 78798|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|79562.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|Assembly;Perl;Python;Ruby;SQL;HTML;CSS;Bash/Shell 32731|United States|Moderately satisfied|Mathematics or statistics|105000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 96407|Germany|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|96686.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Go;Groovy;Java;Python;Ruby;Scala;SQL;HTML;CSS;Bash/Shell 28910|Singapore|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|59052.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Java;Python 92718|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 28835|Mexico|Extremely satisfied|Computer science, computer engineering, or software engineering|103140.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Primary/elementary school|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;SQL;Delphi/Object Pascal 82654|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|144000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Matlab;HTML;CSS;Bash/Shell 74770|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|125000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;Groovy;JavaScript;PHP;Python;Ruby;SQL;TypeScript;VB.NET;HTML;Bash/Shell 21127|Germany|Slightly satisfied|Mathematics or statistics|29376.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Java;JavaScript;Python;R;SQL;TypeScript;HTML;CSS;Bash/Shell 60626|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|97233.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Ruby;SQL;HTML 11953|Turkey|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|25428.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|Between 2 and 4 years ago|C#;CoffeeScript;Groovy;Java;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS 52894|United States|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|110000.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;Python;Ruby;SQL;HTML;CSS;Bash/Shell 56008|United States|Slightly satisfied|A business discipline (ex. accounting, finance, marketing)|55000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 12951|India|Slightly satisfied|Computer science, computer engineering, or software engineering|25047.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Python 87993|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|39699.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Java;Python;SQL 45781|Netherlands|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|53851.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 68304|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|58752.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;SQL;HTML;CSS 36223|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|160000.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Go;Java;JavaScript;Objective-C;R;Ruby;Rust;Scala;HTML;CSS 13353|France|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|61194.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;Java;Bash/Shell 1422|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|140800.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Go;JavaScript;Python;Scala 27013|Mexico|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|20000.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;C#;JavaScript;SQL;HTML;CSS 81806|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|152794.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|35 - 44 years old|Between 2 and 4 years ago|Python 37503|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|86120.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;Python;Bash/Shell 64322|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|115000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Go;JavaScript;PHP;TypeScript;HTML;CSS;Bash/Shell 74894|Russian Federation|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|33972.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 16235|Argentina|Extremely satisfied|Computer science, computer engineering, or software engineering|38136.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Python;R;SQL;HTML;Bash/Shell 13398|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|Assembly;C;C++;CoffeeScript;Clojure;JavaScript;Lua;Python;Rust;HTML;CSS;Bash/Shell 75170|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|48313.0|1 - 2 times per week|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Go;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 27884|Poland|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|22056.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Perl;SQL 87973|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|140000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript 62138|United States|Moderately dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|70000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;Lua;PHP;Python 50736|Belarus|Extremely satisfied|Information systems, information technology, or system administration|27528.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript;Bash/Shell 95007|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|95000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;CoffeeScript;JavaScript;TypeScript;HTML;CSS 19505|United States|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|95000.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;HTML;CSS 49495|New Zealand|Moderately satisfied|Information systems, information technology, or system administration|1000000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;C#;Java;JavaScript;Objective-C;Swift;HTML;CSS 38099|United Kingdom|Moderately satisfied|Information systems, information technology, or system administration|41671.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|JavaScript;PHP;Python;HTML;CSS;Bash/Shell 48266|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|126000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;Python;TypeScript;HTML;CSS 91534|China|Moderately satisfied|Computer science, computer engineering, or software engineering|32725.0|1 - 2 times per week|Male|East Asian|Primary/elementary school|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;Groovy;Java;JavaScript;SQL;HTML;CSS 8104|Brazil|Extremely dissatisfied|Computer science, computer engineering, or software engineering|11232.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;Objective-C;SQL;TypeScript;HTML;CSS;Bash/Shell 47331|Serbia|Slightly satisfied|Computer science, computer engineering, or software engineering|70500.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|C++;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 15819|India|Moderately satisfied|Computer science, computer engineering, or software engineering|7827.0|I don't typically exercise|Male|South Asian|Primary/elementary school|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Python;TypeScript 15957|Czech Republic|Extremely satisfied|Computer science, computer engineering, or software engineering|20268.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C#;PHP;SQL;HTML;CSS 54501|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|140000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;TypeScript;HTML;CSS 8734|Lithuania|Extremely satisfied|Computer science, computer engineering, or software engineering|23796.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 43219|New Zealand|Moderately satisfied|Computer science, computer engineering, or software engineering|631452.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Go;JavaScript;Python;Rust;SQL;TypeScript;HTML;CSS;Bash/Shell 73138|India|Moderately satisfied|Computer science, computer engineering, or software engineering|6262.0|Daily or almost every day|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;Java;JavaScript;SQL;HTML;CSS 24294|United States|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|195000.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;Python;Scala;SQL 161|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Go;JavaScript;Python;R;SQL;HTML;CSS;Bash/Shell 100021|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|58500.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C;Java;JavaScript;PHP;Python;SQL;HTML;Bash/Shell 12271|Germany|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|63642.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|Erlang;Go;Java;JavaScript;Lua;PHP;Python;Ruby;Scala;Cobol;HTML;CSS;Bash/Shell 95493|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|36720.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;Python;Bash/Shell 88632|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|107152.0|I don't typically exercise|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 13279|Romania|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|33780.0|Daily or almost every day|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;HTML;CSS 76677|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|30708.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C++;Java;JavaScript;Matlab;Python;R;VBA;HTML;CSS 87157|Portugal|Moderately satisfied|Computer science, computer engineering, or software engineering|8808.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Clojure;Haskell;JavaScript;Python;HTML;CSS;Bash/Shell 24815|United Kingdom|Neither satisfied nor dissatisfied|A natural science (ex. biology, chemistry, physics)|69452.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Go;Scala;SQL 86897|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|41671.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|Less than a year ago|C#;F#;JavaScript;PHP;Python;SQL;HTML;CSS 21899|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|89000.0|1 - 2 times per week|Female|White or of European descent|Associate degree|30 - 59 minutes|35 - 44 years old|Less than a year ago|JavaScript;PHP;HTML;CSS 76693|Canada|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|64417.0|I don't typically exercise|Female|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Python;R;SQL;HTML;CSS;Bash/Shell 23199|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|108000.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C++;Objective-C;PHP;Python 97499|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|109000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Objective-C;Scala;SQL;HTML;CSS 71741|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|130000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Python;Scala;TypeScript 12770|United Kingdom|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|101400.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|45 - 54 years old|More than 4 years ago|Assembly;C;Perl;Python;Bash/Shell 1036|Pakistan|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|2172.0|Daily or almost every day|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Java;JavaScript;PHP;SQL;VB.NET;HTML;CSS 25907|United States|Slightly dissatisfied|A business discipline (ex. accounting, finance, marketing)|85000.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python;R;SQL;Delphi/Object Pascal 66091|United Kingdom|Extremely dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|26808.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Haskell;Python 66572|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|52933.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|More than 4 years ago|C++;C#;CoffeeScript;Go;Java;JavaScript;PHP;Python;SQL;HTML;CSS 28783|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|29376.0|I don't typically exercise|Female|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|HTML;CSS 25944|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|36115.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS 7957|France|Moderately satisfied|Computer science, computer engineering, or software engineering|22032.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|55 - 64 years old|Less than a year ago|C;C++;Java;JavaScript;Objective-C;PHP;Python;SQL;Visual Basic 6;HTML;CSS;Bash/Shell 78262|Switzerland|Moderately satisfied|Computer science, computer engineering, or software engineering|93842.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;Go;Perl;Python;SQL;Bash/Shell 35444|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|75000.0|1 - 2 times per week|Male|Black or of African descent;East Asian;Hispanic or Latino/Latina|Associate degree|3 - 4 hours|45 - 54 years old|More than 4 years ago|C#;Java;JavaScript;Perl;Visual Basic 6;HTML;Bash/Shell 62429|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|883428.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 97893|Indonesia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|111880.0|I don't typically exercise|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Scala;SQL;Kotlin;HTML;CSS 97450|India|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|5640.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|I've never had a job|Java;JavaScript;PHP;Python;SQL;HTML;CSS 94978|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|48313.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;PHP;Delphi/Object Pascal;HTML;CSS 48989|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|13619.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C;C++;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 54953|Italy|Slightly dissatisfied|Mathematics or statistics|381852.0|I don't typically exercise|Female|White or of European descent|Primary/elementary school|Less than 30 minutes|25 - 34 years old|Less than a year ago|Python;R;Scala;SQL 63438|Ukraine|Slightly satisfied|Computer science, computer engineering, or software engineering|24000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;JavaScript;Python;SQL;Bash/Shell 21169|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|38000.0|I don't typically exercise|Male|East Asian;South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C;JavaScript;Python;HTML 81659|Chile|Moderately dissatisfied|Information systems, information technology, or system administration|9912.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Over 4 hours|18 - 24 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;SQL;HTML;CSS 20022|United States|Slightly dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|92500.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;SQL;TypeScript 23928|New Zealand|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|74911.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;Groovy;Java;SQL;Bash/Shell 73270|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 58397|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|38893.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;Go;Haskell;Java;JavaScript;PHP;Python;Scala;SQL;HTML;CSS;Bash/Shell 41705|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|74856.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;Java;JavaScript;SQL;TypeScript;Kotlin;Delphi/Object Pascal;HTML;CSS 29213|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|40261.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 16141|Argentina|Slightly dissatisfied|Information systems, information technology, or system administration|50844.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 7888|Iran, Islamic Republic of...|Moderately dissatisfied|Computer science, computer engineering, or software engineering|21648.0|1 - 2 times per week|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Objective-C;Python;Swift 42002|Germany|Extremely satisfied|Information systems, information technology, or system administration|73428.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;JavaScript;Python;R;Ruby;Rust;Scala;SQL;Swift;HTML;CSS;Bash/Shell 19662|Taiwan|Slightly satisfied|Computer science, computer engineering, or software engineering|22368.0|I don't typically exercise|Male|East Asian|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python;Ruby 64228|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|49404.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|Go;Groovy;Java;JavaScript;Python;Scala;Kotlin;HTML;Bash/Shell 79523|Germany|Moderately satisfied|Mathematics or statistics|73433.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|JavaScript;PHP;Python;SQL;Bash/Shell 98224|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|77786.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C# 88422|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|106000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 75860|Austria|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|22032.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Matlab;R 88525|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|145000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;VB.NET;HTML;CSS 75420|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|130000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;TypeScript;HTML;CSS 71276|Sweden|Extremely satisfied|Computer science, computer engineering, or software engineering|224550.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Over 4 hours|25 - 34 years old|Between 2 and 4 years ago|C#;F#;SQL;VB.NET;Bash/Shell 65182|Belarus|Slightly dissatisfied|Computer science, computer engineering, or software engineering|11748.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C# 37265|Brazil|Extremely satisfied|Computer science, computer engineering, or software engineering|52404.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;Scala 2146|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|73000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;Ruby;SQL;VB.NET;HTML;CSS;Bash/Shell 82663|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|96000.0|Daily or almost every day|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;Java;JavaScript;Lua;Perl;PHP;Python;R;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 62307|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|120000.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;C#;SQL 62113|Colombia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|42000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 33973|United States|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|72000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Objective-C;Swift 76763|Czech Republic|Extremely satisfied|Computer science, computer engineering, or software engineering|40536.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;Python;SQL 25030|United States|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|128000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;Groovy;Java;JavaScript;Python;SQL;TypeScript;HTML;CSS 20403|South Africa|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|9888.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 40920|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|160000.0|I don't typically exercise|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;F#;JavaScript;SQL;CSS 94403|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|67560.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;Swift;HTML;CSS;Bash/Shell 2697|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|50769.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|More than 4 years ago|Java;Bash/Shell 69237|India|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|25047.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C# 100877|United States|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|135000.0|Daily or almost every day|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;JavaScript;Python 38373|Canada|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|72469.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|Go;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 30518|Thailand|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|39492.0|3 - 4 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;Python;TypeScript;HTML;CSS 14866|India|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|35379.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;TypeScript;HTML;CSS 83946|Egypt|Moderately satisfied|Computer science, computer engineering, or software engineering|1020.0|I don't typically exercise|Male|Middle Eastern|Associate degree|3 - 4 hours|18 - 24 years old|Less than a year ago|Assembly;C++;C#;Groovy;Java;JavaScript;R;SQL;HTML;CSS 15325|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;SQL;Kotlin 83054|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|35292.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Scala;SQL;HTML;CSS;Bash/Shell 32758|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|20664.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;SQL 57764|United States|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|125000.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;Ruby;Rust;Bash/Shell 85168|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|93000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 16206|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|70000.0|1 - 2 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Java;JavaScript;TypeScript;HTML;CSS 54436|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|82612.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;HTML;CSS 40563|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Java;JavaScript;Ruby;HTML;CSS;Bash/Shell 46381|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|59988.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS 66863|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|95000.0|3 - 4 times per week|Female|Black or of African descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|PHP;Python 1668|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|61194.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Scala;SQL 9106|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|73433.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 97921|Azerbaijan|Slightly satisfied|Computer science, computer engineering, or software engineering|44064.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|Java;SQL 41555|Italy|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|183582.0|3 - 4 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|65 years or older|More than 4 years ago|Assembly;C++;C#;Python;SQL;VBA;VB.NET;Visual Basic 6;Cobol;HTML 56808|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|39164.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;C#;JavaScript;HTML;CSS;Bash/Shell 10539|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|156000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|45 - 54 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Kotlin;HTML;CSS;Bash/Shell 45687|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|94000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|CoffeeScript;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 8628|Germany|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|17628.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C# 42827|United Kingdom|Moderately satisfied|Mathematics or statistics|48616.0|Daily or almost every day|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|R;SQL;VBA 64556|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|52089.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Objective-C;SQL;Swift;Bash/Shell 15629|United Kingdom|Slightly satisfied|Web development or web design|34726.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Go;Groovy;Java;JavaScript;PHP;Python;SQL;HTML;CSS 28282|Italy|Slightly satisfied|Computer science, computer engineering, or software engineering|30597.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;TypeScript;HTML;CSS 16317|Bosnia and Herzegovina|Slightly dissatisfied|Computer science, computer engineering, or software engineering|15024.0|3 - 4 times per week|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|JavaScript;SQL;TypeScript;HTML;CSS 78299|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|80000.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Clojure;JavaScript;SQL;CSS;Bash/Shell 7335|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|125014.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 66330|Romania|Extremely satisfied|Computer science, computer engineering, or software engineering|29376.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 37599|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|36720.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Go;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 565|Latvia|Moderately satisfied|Computer science, computer engineering, or software engineering|31664.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;TypeScript;HTML;CSS 45923|Israel|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|112344.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|C#;Java 46902|South Africa|Moderately satisfied|Computer science, computer engineering, or software engineering|23916.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 42928|Netherlands|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|36716.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C++;C#;Python 26295|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|14089.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;PHP;SQL;Visual Basic 6;HTML;CSS 77641|United States|Moderately satisfied|Mathematics or statistics|95000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|JavaScript;Python;SQL 31097|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|35559.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C++;Java;JavaScript;PHP;SQL 10322|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|110000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 35045|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;VB.NET;HTML;CSS 51528|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|23482.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;SQL 29004|Slovakia|Moderately satisfied|Computer science, computer engineering, or software engineering|35244.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;HTML;Bash/Shell 83837|India|Moderately satisfied|Computer science, computer engineering, or software engineering|13463.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;Matlab 73897|United States|Moderately satisfied|Information systems, information technology, or system administration|60000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|Assembly;C++;C#;Java;JavaScript;Matlab;Python;Ruby;Scala;SQL;HTML;CSS;Bash/Shell 63371|Estonia|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|29376.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;JavaScript;PHP;Python;R;Swift;HTML;CSS 60107|Poland|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|31764.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;F#;Haskell;Java;JavaScript;Python;SQL;TypeScript;Kotlin;HTML;CSS 49408|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|30559.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;C#;SQL;Cobol;Bash/Shell 80854|United States|Moderately dissatisfied|I never declared a major|120000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|55 - 64 years old|Less than a year ago|Java;JavaScript;Objective-C;Ruby;Swift 63075|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|165000.0|3 - 4 times per week|Male|East Asian;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|CoffeeScript;Groovy;Java;JavaScript;Python;SQL;Kotlin;HTML;CSS;Bash/Shell 83339|Iran, Islamic Republic of...|Moderately satisfied|Web development or web design|22860.0|1 - 2 times per week|Non-binary, genderqueer, or gender non-conforming|Middle Eastern|Associate degree|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;SQL;Delphi/Object Pascal;HTML;CSS 86784|Hungary|Moderately satisfied|Computer science, computer engineering, or software engineering|28584.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Objective-C;SQL;TypeScript;HTML;CSS 51733|Canada|Extremely satisfied|Mathematics or statistics|79555.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Java;JavaScript;Perl;SQL;HTML;CSS 55963|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|80000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C;C#;JavaScript;Objective-C;Perl;PHP;Python;R;SQL;HTML;Bash/Shell 13843|Russian Federation|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|16140.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Matlab;VBA;VB.NET;Visual Basic 6;Bash/Shell 47935|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|73433.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;Python;Rust;SQL 13722|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|60948.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C++;C#;JavaScript;SQL;HTML;CSS 88204|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|21300.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;Java;JavaScript;Python;SQL;VB.NET;HTML;CSS 60859|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|538968.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;JavaScript;SQL;TypeScript;HTML;CSS 37586|France|Moderately satisfied|Computer science, computer engineering, or software engineering|73433.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;F#;Java;JavaScript;SQL;HTML;CSS 38441|Colombia|Extremely dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|13500.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;JavaScript;PHP;SQL;HTML;CSS 56436|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|483384.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS 46408|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|45000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C++;C#;JavaScript;Ruby;SQL;HTML;CSS 33179|Spain|Extremely satisfied|Computer science, computer engineering, or software engineering|48955.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C#;Go;JavaScript;R;SQL;TypeScript;HTML;CSS;Bash/Shell 86764|Italy|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|23496.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java 70560|Ireland|Extremely satisfied|Web development or web design|1000000.0|3 - 4 times per week|Male|White or of European descent|They never completed any formal education|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Ruby;SQL;Swift;HTML;CSS 72249|Greece|Moderately dissatisfied|Web development or web design|14688.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 63834|United States|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|720000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|Between 1 and 2 years ago|JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 5935|New Zealand|Moderately satisfied|Computer science, computer engineering, or software engineering|69430.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java;JavaScript;PHP;Python;SQL;VB.NET;HTML;CSS;Bash/Shell 63942|United States|Extremely satisfied|Mathematics or statistics|105000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 93367|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|140000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Some college/university study without earning a degree|Over 4 hours|35 - 44 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Swift;Kotlin;HTML;CSS 55870|Sweden|Slightly dissatisfied|Web development or web design|65868.0|Daily or almost every day|Male|White or of European descent|They never completed any formal education|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Objective-C;PHP;Ruby;HTML;CSS;Bash/Shell 15420|United Kingdom|Extremely dissatisfied|Information systems, information technology, or system administration|41671.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Go;JavaScript;PHP;Python;SQL;TypeScript;Kotlin;HTML;CSS;Bash/Shell 26635|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|I don't typically exercise|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;Python;R;SQL 92152|India|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|31309.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript 85207|Sweden|Moderately satisfied|Information systems, information technology, or system administration|76353.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C++;C#;Java;JavaScript;Objective-C;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 76533|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|95015.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Scala;SQL;Kotlin;HTML;Bash/Shell 29345|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|46533.0|Daily or almost every day|Male|Native American, Pacific Islander, or Indigenous Australian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;Python;Kotlin 18706|Iran, Islamic Republic of...|Moderately dissatisfied|Computer science, computer engineering, or software engineering|13320.0|1 - 2 times per week|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;HTML;CSS 76852|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|0.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Objective-C;PHP;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 74072|United Kingdom|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|51672.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 24638|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|80000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;Perl;Python;SQL;HTML;CSS;Bash/Shell 74593|United States|Moderately dissatisfied|I never declared a major|1800000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;HTML;CSS 3595|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|48616.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;VB.NET;HTML;CSS;Bash/Shell 90796|India|Slightly satisfied|Computer science, computer engineering, or software engineering|6012.0|Daily or almost every day|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Between 2 and 4 years ago|JavaScript;PHP;HTML;CSS 14145|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|102500.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;Kotlin;HTML;CSS 78475|Australia|Moderately satisfied|Information systems, information technology, or system administration|43985.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;SQL;VB.NET;CSS 53176|Australia|Moderately satisfied|Information systems, information technology, or system administration|87971.0|I don't typically exercise|Male|Middle Eastern;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 56840|Sweden|Extremely satisfied|Computer science, computer engineering, or software engineering|70368.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Erlang;Ruby;Scala 45343|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|111123.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|JavaScript;Python;SQL;VBA;Delphi/Object Pascal 29200|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|49200.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;JavaScript;Python;HTML;CSS;Bash/Shell 63063|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|156000.0|I don't typically exercise|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS;Bash/Shell 100663|United States|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|96000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;Go;Groovy;Java;JavaScript;Objective-C;Python;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 54808|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|100000.0|Daily or almost every day|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS;Bash/Shell 1997|Germany|Moderately satisfied|Information systems, information technology, or system administration|60216.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;JavaScript;PHP;SQL;HTML;CSS 30642|Sweden|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|104799.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;Python;R;Scala;SQL;Bash/Shell 21906|Russian Federation|Slightly dissatisfied|Computer science, computer engineering, or software engineering|17616.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;JavaScript;PHP;SQL;HTML;CSS 60364|Canada|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|36235.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;PHP;SQL;Delphi/Object Pascal;HTML;CSS;Bash/Shell 90384|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|91791.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Groovy;Java;Python;SQL;Kotlin;Bash/Shell 34114|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|97680.0|I don't typically exercise|Female|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL 25671|United Kingdom|Slightly satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|66674.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;VBA;Bash/Shell 70751|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;Java;JavaScript;PHP;Python;HTML;CSS;Bash/Shell 13064|Spain|Slightly dissatisfied|Computer science, computer engineering, or software engineering|55075.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;PHP;Python;HTML;CSS;Bash/Shell 42614|India|Extremely dissatisfied|Computer science, computer engineering, or software engineering|9393.0|1 - 2 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;Groovy;Java;Kotlin 8260|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|130000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;C#;JavaScript;Matlab;Ruby;SQL;HTML;CSS;Bash/Shell 81737|Iran, Islamic Republic of...|Moderately satisfied|Computer science, computer engineering, or software engineering|14988.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;C# 73407|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|83800.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 89963|Norway|Slightly dissatisfied|Computer science, computer engineering, or software engineering|79064.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Groovy;Haskell;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 15481|France|Slightly satisfied|Computer science, computer engineering, or software engineering|42836.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;SQL;HTML 69980|United States|Moderately satisfied|Information systems, information technology, or system administration|74000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;SQL;Bash/Shell 24271|Belgium|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|925248.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;TypeScript;HTML;CSS 13675|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|70000.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Haskell;JavaScript;Python;SQL;TypeScript;Kotlin;Ocaml;HTML;CSS;Bash/Shell 22188|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|39164.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;HTML;CSS 48286|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|500052.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;C#;Java;JavaScript;Matlab;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 89668|Austria|Slightly satisfied|Computer science, computer engineering, or software engineering|39648.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;JavaScript;Lua;PHP;SQL;TypeScript;HTML;CSS 58671|Finland|Moderately satisfied|Computer science, computer engineering, or software engineering|66089.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 84019|Canada|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|95015.0|1 - 2 times per week|Male|White or of European descent|They never completed any formal education|30 - 59 minutes|25 - 34 years old|Less than a year ago|Clojure;Java;JavaScript;PHP;Ruby;Scala;SQL;TypeScript;HTML;CSS;Bash/Shell 29406|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|83224.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;C# 54802|France|Moderately satisfied|Computer science, computer engineering, or software engineering|807756.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C#;Java;JavaScript;PHP;SQL;VB.NET;HTML;CSS;Bash/Shell 8375|Bangladesh|Slightly satisfied|Computer science, computer engineering, or software engineering|30000.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;CoffeeScript;Java;JavaScript;Matlab;Perl;PHP;Python;Ruby;SQL;Swift;TypeScript;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 101245|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|79552.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|Python;Ruby;Rust;Bash/Shell 42802|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|140000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Go;Groovy;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 29567|South Africa|Slightly satisfied|Computer science, computer engineering, or software engineering|48.0|Daily or almost every day|Male|South Asian|Primary/elementary school|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C#;JavaScript;SQL;TypeScript;HTML;CSS 86256|United States|Extremely satisfied|I never declared a major|125000.0|Daily or almost every day|Male|Hispanic or Latino/Latina;Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Ruby;HTML;CSS 24541|Australia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|111963.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C++;C#;JavaScript;Lua;SQL;TypeScript;HTML;CSS 7596|Finland|Extremely satisfied|Computer science, computer engineering, or software engineering|69761.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;Python;TypeScript 28442|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|108000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|CoffeeScript;JavaScript;PHP;Python;SQL;HTML;CSS 70216|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Java;JavaScript;Ruby;Swift;HTML;CSS 74451|India|Extremely dissatisfied|Computer science, computer engineering, or software engineering|15811.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Matlab;PHP;Python;SQL 3805|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|48955.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;Java;JavaScript;Objective-C;Python;R;Swift;Visual Basic 6;HTML;CSS;Bash/Shell 61154|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|110000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C;Matlab;Python 8347|Switzerland|Slightly dissatisfied|A natural science (ex. biology, chemistry, physics)|250248.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;Python;SQL;HTML;Bash/Shell 68949|France|Moderately satisfied|Computer science, computer engineering, or software engineering|51408.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;JavaScript;PHP;Ruby;HTML;CSS 10018|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|10400.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Java;JavaScript 95677|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|102000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C++;C#;Java;JavaScript;SQL;VBA;HTML;CSS;Bash/Shell 36277|France|Moderately satisfied|Computer science, computer engineering, or software engineering|56298.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Python 2255|Dominican Republic|Slightly satisfied|Computer science, computer engineering, or software engineering|24000.0|3 - 4 times per week|Male|Black or of African descent;Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 66935|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|75000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;SQL;TypeScript;HTML;CSS 12339|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|47904.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C;C++;Matlab;Python;HTML;CSS;Bash/Shell 28876|United Kingdom|Moderately dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|20836.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 13489|Brazil|Moderately dissatisfied|Computer science, computer engineering, or software engineering|6552.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C#;JavaScript;Python;R;Ruby;HTML;CSS 9968|Greece|Moderately dissatisfied|Computer science, computer engineering, or software engineering|23496.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;C++;Java;JavaScript 75116|Czech Republic|Extremely satisfied|Information systems, information technology, or system administration|69024.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;PHP;Python;SQL;HTML;CSS;Bash/Shell 17069|Sweden|Moderately satisfied|Mathematics or statistics|52404.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Matlab;Objective-C;Python;SQL;VBA 87128|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|29376.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;PHP;HTML;CSS;Bash/Shell 86670|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|40584.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;C#;Java;JavaScript;Matlab;PHP;SQL;TypeScript;HTML;CSS 75820|Spain|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|30597.0|Daily or almost every day|Female|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|R 43725|India|Moderately satisfied|Computer science, computer engineering, or software engineering|12524.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Python;Ruby;SQL;HTML;CSS 60465|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|1500.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C#;Java;JavaScript;Perl;PHP;Python;SQL;HTML;CSS;Bash/Shell 64424|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|41916.0|I don't typically exercise|Female|East Asian;Hispanic or Latino/Latina;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;HTML;CSS;Bash/Shell 99135|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|91800.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java 65264|Romania|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|58752.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|3 - 4 hours|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS 95790|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|82000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;SQL;TypeScript;HTML;CSS 20664|United Kingdom|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|56395.0|3 - 4 times per week|Male|Middle Eastern;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 49222|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|83342.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 71095|Greece|Moderately satisfied|Computer science, computer engineering, or software engineering|33192.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Scala;SQL;HTML;CSS 3088|Turkey|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|50868.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|JavaScript;R;HTML;CSS 6575|United States|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|60000.0|Daily or almost every day|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 25531|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|60000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;JavaScript;Python;HTML;CSS 32882|Poland|Extremely satisfied|Computer science, computer engineering, or software engineering|35292.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;TypeScript;CSS 23924|Poland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|14704.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 68845|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|86000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Perl;Rust;SQL;TypeScript;HTML;CSS;Bash/Shell 88454|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|127000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|C;C++;C#;Clojure;Go;Groovy;Java;JavaScript;SQL;TypeScript;VB.NET;Visual Basic 6;HTML;Bash/Shell 13767|Germany|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|14688.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;C#;Matlab;Bash/Shell 19973|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|100652.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|45 - 54 years old|More than 4 years ago|C;C++;JavaScript;Perl;Python;SQL;HTML;CSS;Bash/Shell 75213|Switzerland|Slightly satisfied|Computer science, computer engineering, or software engineering|106356.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;Java;JavaScript;PHP;R;SQL;VB.NET;HTML 74530|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|135000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;Go;Python;Ruby;HTML;CSS 64951|United States|Extremely satisfied|Mathematics or statistics|140000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|65 years or older|More than 4 years ago|C;C++;C#;Java;VB.NET;Delphi/Object Pascal;HTML;CSS 49683|United Kingdom|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|108345.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;SQL;VB.NET;HTML;CSS 69835|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|85000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;Python;Ruby;Scala;SQL;HTML;CSS;Bash/Shell 16223|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|15000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 21043|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|132000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C++;C#;Java;JavaScript;Objective-C;SQL;Swift;VB.NET;HTML;CSS 93935|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|62412.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C;C++;C#;Java;JavaScript;Lua 76975|Bangladesh|Moderately satisfied|Computer science, computer engineering, or software engineering|17328.0|I don't typically exercise|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;PHP;Python;SQL;HTML;CSS 27005|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|163000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 41122|United States|Moderately satisfied|Mathematics or statistics|65000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|PHP;Python;HTML;CSS;Bash/Shell 93236|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|75880.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;Java 64376|Australia|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|63979.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C++;C#;Java;JavaScript;Lua;Objective-C;PHP;SQL;TypeScript;VBA;VB.NET;HTML;CSS 22857|Greece|Extremely satisfied|Computer science, computer engineering, or software engineering|73428.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C++;C#;Groovy;Java;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 13870|Brazil|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|33684.0|I don't typically exercise|Male|Hispanic or Latino/Latina|They never completed any formal education|Over 4 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;TypeScript;HTML;CSS 89681|Netherlands|Extremely satisfied|Information systems, information technology, or system administration|66084.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;Objective-C;Perl;PHP;SQL;Swift;VBA;HTML;CSS;Bash/Shell 65773|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|55562.0|1 - 2 times per week|Male|Middle Eastern|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;Java;JavaScript;Matlab;PHP;Python;SQL;VBA;VB.NET;Visual Basic 6;Delphi/Object Pascal;HTML;CSS;Bash/Shell 24093|Malaysia|Slightly satisfied|Information systems, information technology, or system administration|29640.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;HTML;CSS 14962|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|20292.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;R;SQL;HTML;CSS;Bash/Shell 75196|Netherlands|Slightly satisfied|Computer science, computer engineering, or software engineering|65352.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;CoffeeScript;Erlang;Groovy;Java;JavaScript;Matlab;Objective-C;PHP;Python;Ruby;SQL;Swift;HTML;CSS;Bash/Shell 76278|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|44916.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;Python;SQL;Swift;HTML;CSS;Bash/Shell 60180|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|78750.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;SQL;CSS;Bash/Shell 69084|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|70985.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;SQL;HTML;CSS 41201|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|58746.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;HTML;CSS 41836|India|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|109581.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Python;R 91450|Israel|Moderately satisfied|Computer science, computer engineering, or software engineering|93960.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Python 45100|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|54000.0|3 - 4 times per week|Male|Black or of African descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 35653|Croatia|Moderately satisfied|Mathematics or statistics|29373.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|Haskell;Python 24202|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|85000.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;SQL;HTML;CSS 75819|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|74000.0|Daily or almost every day|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Ruby;TypeScript;HTML;CSS;Bash/Shell 20880|Iceland|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|62856.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C;C#;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 754|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|80000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C;C++;C#;Python;VB.NET 57449|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|21168.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;TypeScript;HTML;CSS;Bash/Shell 59294|Switzerland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|109483.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Python;Bash/Shell 11006|France|Extremely satisfied|Computer science, computer engineering, or software engineering|31821.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 90683|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|170000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;Java;JavaScript;Lua;Matlab;Python;Ruby 65610|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|59970.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;SQL 6002|Poland|Moderately satisfied|Information systems, information technology, or system administration|49404.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 48952|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|24478.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;SQL;HTML;CSS 19805|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|146000.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C;Go;Java;Perl;Python;SQL;Bash/Shell 30961|Iran, Islamic Republic of...|Extremely satisfied|Computer science, computer engineering, or software engineering|27636.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C++;Python;Bash/Shell 63771|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|55981.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 49234|Jordan|Slightly satisfied|Computer science, computer engineering, or software engineering|15600.0|I don't typically exercise|Male|Middle Eastern;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Objective-C;Swift 89142|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|55000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;Lua;Python;Ruby;Rust;SQL;TypeScript;HTML;CSS;Bash/Shell 2659|Serbia|Moderately dissatisfied|Computer science, computer engineering, or software engineering|44064.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;Objective-C 97902|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|8076.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;C#;Java;JavaScript;Python;Scala;HTML;CSS;Bash/Shell 37626|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|75000.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Java;SQL;Swift;VBA;VB.NET;Visual Basic 6;HTML;CSS 70039|Finland|Moderately satisfied|Computer science, computer engineering, or software engineering|44064.0|1 - 2 times per week|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|Less than a year ago|C++;C#;Java;JavaScript;Matlab;Python;Scala;SQL;HTML;CSS;Bash/Shell 33939|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|68537.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 64138|Bulgaria|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|37500.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C#;Java;JavaScript;PHP;Python;VBA;VB.NET;Visual Basic 6;HTML;CSS 30442|Germany|Extremely satisfied|Information systems, information technology, or system administration|134627.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 86149|United States|Moderately satisfied|Information systems, information technology, or system administration|78200.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 84599|Italy|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|36716.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 19005|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|140000.0|I don't typically exercise|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;TypeScript;Kotlin;HTML;CSS;Bash/Shell 42046|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|165000.0|1 - 2 times per week|Male|East Asian|Some college/university study without earning a degree|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;Python;TypeScript;HTML;CSS 81760|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|95000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|C;Java;JavaScript;Perl;PHP;SQL;HTML;CSS;Bash/Shell 82502|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|58752.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Assembly;C;C++;Hack;Java;JavaScript;Objective-C;PHP;Rust;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 29036|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|36000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Assembly;C;C++;Matlab;Python;SQL;HTML;CSS 35735|Russian Federation|Moderately satisfied|Computer science, computer engineering, or software engineering|74304.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Go;Groovy;Java;JavaScript;Lua;Scala;SQL;TypeScript;HTML;CSS;Bash/Shell 53616|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|42300.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Java;Python;HTML;CSS 40332|India|Extremely satisfied|Computer science, computer engineering, or software engineering|23482.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;Go;Java;JavaScript;Matlab;PHP;Python;R;SQL;HTML;CSS;Bash/Shell 63937|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|90000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;Objective-C;Ruby;Swift;Kotlin;Bash/Shell 53663|Canada|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|32209.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|45 - 54 years old|Between 2 and 4 years ago|Java;SQL;Visual Basic 6 94766|United States|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|200000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|Assembly;C;C++;Python;Bash/Shell 57422|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|66027.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Go;Java;JavaScript;Objective-C;PHP;Python;SQL;Swift;Kotlin;HTML;CSS 95987|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|1000000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Groovy;Java;JavaScript;Objective-C;SQL;Swift;TypeScript;Kotlin;HTML;CSS 53434|France|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|56543.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;Haskell;Python;SQL;Bash/Shell 28845|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|84000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 18841|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|53851.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;HTML;CSS 73618|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|2000000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Python;SQL;Swift;TypeScript;HTML;CSS 11924|Venezuela, Bolivarian Republic of...|Extremely satisfied|Information systems, information technology, or system administration|600.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 76150|Sweden|Extremely satisfied|Computer science, computer engineering, or software engineering|49404.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C# 63262|Germany|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|72209.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Objective-C;TypeScript;HTML;CSS 1759|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|154000.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;Perl;Ruby;SQL;HTML;CSS;Bash/Shell 84550|United States|Moderately satisfied|I never declared a major|100000.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Perl;PHP;Python;HTML;CSS;Bash/Shell 35747|Canada|Slightly satisfied|Computer science, computer engineering, or software engineering|104678.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;PHP;Python;SQL;TypeScript;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 43292|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|100000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;Java;JavaScript;Objective-C;Python;Swift;HTML;CSS;Bash/Shell 6987|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|59880.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;Lua;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 21801|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|121000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 75652|Philippines|Extremely satisfied|Computer science, computer engineering, or software engineering|14652.0|I don't typically exercise|Male|East Asian;South Asian|Associate degree|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;SQL;VBA;VB.NET;Visual Basic 6;Delphi/Object Pascal 47300|Canada|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|72469.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Lua;Python;Bash/Shell 98155|Italy|Moderately dissatisfied|Computer science, computer engineering, or software engineering|22284.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C;C++;Haskell;Java;JavaScript;PHP;Python;SQL;Visual Basic 6;HTML;CSS;Bash/Shell 81920|Armenia|Moderately satisfied|Computer science, computer engineering, or software engineering|23628.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;SQL;HTML;CSS 51944|Russian Federation|Slightly satisfied|Mathematics or statistics|14856.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;Python;SQL;Bash/Shell 14261|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|125014.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 51422|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|103000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Python 7868|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript;Python;R;Scala;TypeScript 19604|United States|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|108252.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Kotlin;HTML;CSS;Bash/Shell 91500|United States|Extremely satisfied|Information systems, information technology, or system administration|88500.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Go;Java;JavaScript;Ruby;SQL;VB.NET;HTML;CSS;Bash/Shell 8570|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|58000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Lua;SQL;HTML;CSS 62203|Ireland|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|61194.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|JavaScript;Python;SQL;HTML;CSS 77965|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|120000.0|I don't typically exercise|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Perl;Python;SQL;HTML;CSS;Bash/Shell 54241|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|53892.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Python;Swift;Kotlin;HTML;CSS;Bash/Shell 51899|Russian Federation|Moderately satisfied|Computer science, computer engineering, or software engineering|20808.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;Scala;SQL 42384|Indonesia|Extremely satisfied|Computer science, computer engineering, or software engineering|107400.0|I don't typically exercise|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;PHP;Python;SQL;VB.NET;Visual Basic 6;Kotlin;HTML;CSS 63202|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|6204.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;Python 35898|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|80000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;Groovy;Java;JavaScript;Objective-C;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 84867|Pakistan|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|11820.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL 71735|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|38820.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;HTML;CSS 54691|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|25047.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript 83990|Brazil|Neither satisfied nor dissatisfied|A business discipline (ex. accounting, finance, marketing)|10476.0|Daily or almost every day|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;HTML;CSS 98776|India|Moderately satisfied|Computer science, computer engineering, or software engineering|28178.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;JavaScript;Python;R 1742|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|160000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;JavaScript;Objective-C;SQL;Swift;HTML;CSS;Bash/Shell 662|Bulgaria|Extremely dissatisfied|A business discipline (ex. accounting, finance, marketing)|12000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 47379|Belgium|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|146868.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Python;VBA;VB.NET;Visual Basic 6 4583|Russian Federation|Slightly satisfied|Information systems, information technology, or system administration|25476.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java;JavaScript;Matlab;PHP;Python;SQL;HTML;CSS;Bash/Shell 2578|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|138904.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 25836|Nigeria|Slightly satisfied|Computer science, computer engineering, or software engineering|13332.0|Daily or almost every day|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|More than 4 years ago|Java;Kotlin;HTML 14757|Poland|Moderately satisfied|Mathematics or statistics|22932.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL 60999|Mexico|Moderately satisfied|Computer science, computer engineering, or software engineering|22560.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 8384|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|29376.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;C#;Go;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 73938|New Zealand|Extremely satisfied|Computer science, computer engineering, or software engineering|40196.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Clojure;Java;JavaScript;Perl;PHP;Python;SQL;TypeScript;Delphi/Object Pascal;HTML;CSS 19156|Uruguay|Moderately satisfied|Computer science, computer engineering, or software engineering|60000.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 27072|Norway|Moderately dissatisfied|Computer science, computer engineering, or software engineering|84165.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;Python;Ruby;Scala;SQL;HTML;CSS;Bash/Shell 22567|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|74550.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS 76423|Taiwan|Slightly satisfied|Computer science, computer engineering, or software engineering|84743.0|I don't typically exercise|Male|East Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C++;C#;Groovy;Java;JavaScript;Python;HTML;Bash/Shell 47039|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|2000000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|55 - 64 years old|More than 4 years ago|Assembly;C;C++;C#;Java;JavaScript;Objective-C;PHP;Python;SQL;Swift;VBA;VB.NET;Delphi/Object Pascal;HTML;CSS;Bash/Shell 10743|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|88119.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Groovy;Java;Python;SQL;TypeScript;Kotlin;HTML;CSS;Bash/Shell 50829|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|1000000.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Python 75243|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|60000.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;Kotlin;HTML;CSS 93360|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|106000.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 40163|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|165000.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 57297|France|Moderately satisfied|Computer science, computer engineering, or software engineering|34269.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;Clojure;Haskell;Java;JavaScript;Python;HTML;CSS 30587|United Kingdom|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|37504.0|I don't typically exercise|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 34801|United States|Moderately satisfied|Information systems, information technology, or system administration|85000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;C#;Go;Java;JavaScript;Matlab;Objective-C;PHP;VBA;Kotlin;HTML;CSS;Bash/Shell 47469|Croatia|Moderately satisfied|Computer science, computer engineering, or software engineering|25656.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 75609|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|59980.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;Lua;Python 38237|Canada|Slightly dissatisfied|Computer science, computer engineering, or software engineering|80521.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C#;Clojure;Erlang;F#;Go;Haskell;JavaScript;Python;Ruby;Rust;VB.NET;Visual Basic 6 35052|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|107964.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|C;C++;Go;JavaScript;Objective-C;Python;SQL;HTML;CSS;Bash/Shell 61282|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|10236.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Matlab;PHP;Python;SQL;HTML;CSS;Bash/Shell 29848|Belgium|Moderately satisfied|Computer science, computer engineering, or software engineering|55686.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;Lua;SQL;HTML;CSS 27109|Canada|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|24156.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript 39791|Philippines|Slightly satisfied|Information systems, information technology, or system administration|6120.0|I don't typically exercise|Male|East Asian;South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;HTML;CSS 39629|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|58000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Java;PHP;Python;HTML;CSS 8559|Ireland|Extremely satisfied|Computer science, computer engineering, or software engineering|90288.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Groovy;Java;JavaScript;R;SQL;TypeScript;Kotlin;HTML;CSS;Bash/Shell 66591|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|94000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Java;JavaScript;Python;HTML;Bash/Shell 96319|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|67069.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java 76379|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|105000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C;C++;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 10062|Malta|Moderately satisfied|Computer science, computer engineering, or software engineering|39776.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 54223|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|90000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C;C++;Python;Bash/Shell 20856|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|103300.0|1 - 2 times per week|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;Groovy;Java;JavaScript;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 83561|India|Slightly satisfied|Computer science, computer engineering, or software engineering|11741.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;SQL;HTML;CSS 64160|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|63896.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;Python;Ruby;HTML;CSS;Bash/Shell 55491|France|Moderately satisfied|Computer science, computer engineering, or software engineering|51403.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Go;Java;JavaScript;Python;Scala;Bash/Shell 8446|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|105000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;F#;Java;JavaScript;SQL;HTML;CSS 29303|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|61752.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Go;PHP;SQL;HTML;CSS;Bash/Shell 86128|Australia|Slightly satisfied|Computer science, computer engineering, or software engineering|57581.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 20763|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|130000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Go;Java;JavaScript;TypeScript;HTML;CSS 99911|Ukraine|Slightly satisfied|Computer science, computer engineering, or software engineering|36000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;CSS 57656|India|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|13306.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;Python;R;TypeScript;HTML;CSS 6181|India|Slightly dissatisfied|Information systems, information technology, or system administration|5640.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;HTML;CSS 76715|Mexico|Slightly dissatisfied|Computer science, computer engineering, or software engineering|5796.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;C++;Objective-C;Swift 90037|United Kingdom|Slightly dissatisfied|A natural science (ex. biology, chemistry, physics)|683412.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C++;C#;JavaScript;PHP;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS 81185|Cuba|Moderately satisfied|Computer science, computer engineering, or software engineering|876.0|Daily or almost every day|Male|Black or of African descent;Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|Between 1 and 2 years ago|C++ 45373|India|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|27708.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;SQL 90276|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|122000.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Groovy;Java;JavaScript;Perl;Python;TypeScript;Bash/Shell 30624|Poland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|21876.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;Go 92258|Canada|Extremely satisfied|A health science (ex. nursing, pharmacy, radiology)|61196.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 52971|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|3757.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 62765|United States|Extremely satisfied|Web development or web design|50000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 88501|Poland|Slightly dissatisfied|Mathematics or statistics|30000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 93045|Bulgaria|Slightly dissatisfied|Computer science, computer engineering, or software engineering|26256.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;Ruby;TypeScript;Kotlin 84335|Bulgaria|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|12000.0|I don't typically exercise|Female|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|PHP;SQL;HTML;CSS 41006|Australia|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|74375.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|Java;JavaScript;SQL 31418|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|56365.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Rust;SQL;TypeScript;HTML;CSS;Bash/Shell 62709|Russian Federation|Extremely satisfied|Computer science, computer engineering, or software engineering|115000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C++;Objective-C;Swift 68114|Netherlands|Slightly satisfied|Computer science, computer engineering, or software engineering|79552.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;Python;Kotlin 95558|Russian Federation|Slightly dissatisfied|Computer science, computer engineering, or software engineering|12.0|I don't typically exercise|Female;Transgender|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 86398|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|15600.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C++;C#;Python;VBA;VB.NET 24186|United States|Moderately satisfied|A health science (ex. nursing, pharmacy, radiology)|120000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;Go;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 63928|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|68000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;Perl;Python;SQL;Swift;TypeScript;Kotlin;HTML;CSS;Bash/Shell 78437|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|95000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript 68457|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;C#;JavaScript;Perl;SQL;TypeScript;HTML;CSS;Bash/Shell 87207|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Assembly;C#;Matlab;Bash/Shell 89623|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;Objective-C;Python;Bash/Shell 15827|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|170000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Groovy;Java;JavaScript;Objective-C;Python;Ruby;SQL;Swift;HTML;CSS;Bash/Shell 76384|United Kingdom|Slightly satisfied|Mathematics or statistics|46498.0|1 - 2 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C# 31770|Germany|Moderately satisfied|Information systems, information technology, or system administration|61194.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;SQL 68677|Russian Federation|Moderately satisfied|Web development or web design|17088.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;JavaScript;Lua;Perl;PHP;SQL;HTML;CSS;Bash/Shell 98051|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|44400.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript 54992|United Kingdom|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|55006.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;SQL;VBA;VB.NET;HTML;CSS 76940|Brazil|Slightly dissatisfied|Computer science, computer engineering, or software engineering|811000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;JavaScript;Ruby;SQL;HTML;CSS 9042|Russian Federation|Moderately satisfied|Information systems, information technology, or system administration|37152.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;HTML;CSS 18947|Maldives|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|15588.0|3 - 4 times per week|Female|South Asian|Primary/elementary school|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;SQL;HTML;CSS 50503|Germany|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|43320.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;Java;Matlab;Python;Bash/Shell 37946|Portugal|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|18360.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;SQL;VBA;VB.NET;Visual Basic 6 40193|United States|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|80000.0|I don't typically exercise|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;Matlab;Python 21258|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|16000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;Java;JavaScript;Python 99474|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|70000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Perl;Python;HTML;CSS 42902|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|109200.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Java;JavaScript;PHP;Python;SQL;Bash/Shell 59582|Colombia|Slightly satisfied|Computer science, computer engineering, or software engineering|16872.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;Groovy;Java;JavaScript;Python;SQL;TypeScript;Cobol;HTML;CSS;Bash/Shell 99441|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|55562.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|55 - 64 years old|Less than a year ago|Assembly;C;C++;C#;HTML;Bash/Shell 12166|India|Moderately satisfied|Computer science, computer engineering, or software engineering|4692.0|3 - 4 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Between 1 and 2 years ago|Swift 13006|Italy|Slightly satisfied|Computer science, computer engineering, or software engineering|30597.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C++;Java;JavaScript;Lua;PHP;Python;SQL;HTML;CSS;Bash/Shell 42202|Argentina|Slightly satisfied|Information systems, information technology, or system administration|20340.0|I don't typically exercise|Female|Hispanic or Latino/Latina;White or of European descent|Professional degree (JD, MD, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Haskell;Java;JavaScript;Objective-C;Python;Swift;TypeScript;Kotlin;HTML;CSS;Bash/Shell 94706|Lebanon|Slightly dissatisfied|Computer science, computer engineering, or software engineering|21384.0|I don't typically exercise|Female|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Java;Matlab;R;Swift;Cobol;HTML;CSS 77558|Austria|Slightly satisfied|Computer science, computer engineering, or software engineering|35688.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;JavaScript;Python;Bash/Shell 86195|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|50000.0|Daily or almost every day|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;SQL;HTML;CSS 52440|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|44449.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;Matlab;Python;Ruby;HTML;CSS;Bash/Shell 95199|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|69000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Java;Bash/Shell 57989|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|63000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;HTML;CSS 26999|United States|Slightly dissatisfied|A humanities discipline (ex. literature, history, philosophy)|175000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Groovy;Java;HTML;Bash/Shell 12026|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|128000.0|I don't typically exercise|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;Python 63243|Poland|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|15180.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS 33018|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|54336.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Haskell;Java;JavaScript;Scala;SQL;TypeScript;HTML;CSS;Bash/Shell 74694|Colombia|Moderately dissatisfied|Computer science, computer engineering, or software engineering|29520.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;HTML 60299|Germany|Slightly dissatisfied|Web development or web design|22032.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 48153|France|Moderately dissatisfied|Computer science, computer engineering, or software engineering|36716.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Clojure;Java;JavaScript;Python;TypeScript;Bash/Shell 95880|India|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|5260.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C++;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 90296|Israel|Moderately satisfied|Computer science, computer engineering, or software engineering|129900.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|Clojure;Groovy;JavaScript;Python;Ruby;Bash/Shell 59039|Netherlands|Moderately satisfied|Information systems, information technology, or system administration|91791.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;SQL;HTML;CSS 12403|United States|Moderately satisfied|Information systems, information technology, or system administration|83200.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 46195|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|42348.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript 54437|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|54336.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;JavaScript;PHP;Python;TypeScript;HTML;CSS 10113|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|235000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Assembly;C;C++;JavaScript;Objective-C;Python;Swift;HTML;CSS 12713|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|41124.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|PHP;SQL;HTML;CSS 22558|Turkey|Extremely satisfied|Computer science, computer engineering, or software engineering|146865.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;C#;JavaScript;Objective-C;PHP;Python;VB.NET 11375|Dominican Republic|Moderately dissatisfied|Computer science, computer engineering, or software engineering|16860.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Some college/university study without earning a degree|Over 4 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;HTML 3337|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|84165.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|C#;SQL;Delphi/Object Pascal;HTML;CSS 58940|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|5088.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;SQL;VB.NET;HTML 62937|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|25000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;Perl;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 70203|Germany|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|58752.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 42068|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|275000.0|I don't typically exercise|Male|East Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Assembly;C;Java;Objective-C 46104|Czech Republic|Slightly satisfied|Computer science, computer engineering, or software engineering|27900.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 55152|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|170000.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java;Kotlin 17901|Belgium|Moderately dissatisfied|Computer science, computer engineering, or software engineering|38184.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 66005|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|131000.0|3 - 4 times per week|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;Python;TypeScript;Visual Basic 6;HTML;CSS;Bash/Shell 32349|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|91791.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;SQL;Bash/Shell 13253|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|88119.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;Java;Objective-C;Python;SQL;Bash/Shell 71877|Sweden|Moderately dissatisfied|Mathematics or statistics|56292.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;Haskell;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 62587|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|9424.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Between 2 and 4 years ago|Objective-C;Swift 77234|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|41000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;VB.NET;HTML;CSS 56304|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|38893.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 101567|Australia|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|111963.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;SQL;Bash/Shell 73781|United States|Extremely satisfied|Information systems, information technology, or system administration|90000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 59609|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;VB.NET;HTML;CSS 33066|France|Slightly satisfied|Computer science, computer engineering, or software engineering|39164.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;Go;Java;JavaScript;PHP;Scala;TypeScript;Ocaml;HTML;CSS;Bash/Shell 76128|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|104030.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Go;JavaScript;PHP;Python;R;SQL;HTML;CSS;Bash/Shell 5419|Turkey|Extremely satisfied|Mathematics or statistics|600000.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 80769|Slovenia|Slightly satisfied|Computer science, computer engineering, or software engineering|22032.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;Java;PHP;SQL;VBA;VB.NET;HTML;CSS 19051|United Kingdom|Moderately dissatisfied|Computer science, computer engineering, or software engineering|34726.0|3 - 4 times per week|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;Swift;HTML 21021|Greece|Moderately satisfied|Computer science, computer engineering, or software engineering|46992.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;SQL 48564|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|61580.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS 12707|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|54755.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Matlab;Python;Bash/Shell 57240|Germany|Slightly satisfied|A social science (ex. anthropology, psychology, political science)|36716.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 44654|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|34726.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;C#;Java;JavaScript;Matlab;Python;Bash/Shell 64092|Sweden|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|93420.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;Matlab;SQL;VB.NET;HTML;CSS 26973|United States|Extremely dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|68000.0|I don't typically exercise|Female|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|HTML;CSS 75591|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|64417.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;SQL;VBA;VB.NET;Visual Basic 6;Delphi/Object Pascal;HTML;CSS 9287|Australia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|87971.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|C++;C#;JavaScript;SQL;VB.NET;HTML;CSS;Bash/Shell 87545|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|135000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;C;Go;Java;JavaScript;Lua;Python;Ruby;Rust;Scala;SQL;HTML;CSS;Bash/Shell 98849|Sweden|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|74856.0|I don't typically exercise|Male|White or of European descent|Associate degree|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C++;C#;Python 50530|Russian Federation|Moderately satisfied|Computer science, computer engineering, or software engineering|36084.0|I don't typically exercise|Female|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;Python;HTML;CSS;Bash/Shell 11814|Portugal|Moderately satisfied|Computer science, computer engineering, or software engineering|30840.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;HTML 89307|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|73433.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Java;Scala;Kotlin 21804|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|More than 4 years ago|Java;JavaScript;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 9933|Pakistan|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|11928.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 87614|France|Extremely satisfied|Computer science, computer engineering, or software engineering|97910.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;Bash/Shell 14793|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 30224|United States|Slightly satisfied|Mathematics or statistics|132000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;Ruby;CSS 55276|Italy|Moderately dissatisfied|Computer science, computer engineering, or software engineering|33657.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;HTML;CSS 88901|Japan|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|37812.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;CoffeeScript;Go;Java;JavaScript;Objective-C;PHP;Python;Ruby;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 96731|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|4740.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;PHP;Python;SQL;Swift;Cobol;HTML;CSS 32179|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|160000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|C;C++;Java;JavaScript;Perl;PHP;Ruby;Rust;Scala;HTML;CSS;Bash/Shell 33803|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|250000.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Ruby;HTML;CSS 83190|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|95462.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Objective-C;Python;Ruby;Swift 65782|Russian Federation|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|61992.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;SQL 25565|India|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|19568.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Python;R;VBA 80703|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|14400.0|3 - 4 times per week|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 63405|Thailand|Moderately satisfied|Computer science, computer engineering, or software engineering|7524.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|Go;JavaScript;PHP;Python;Ruby;HTML 63114|Czech Republic|Moderately satisfied|Information systems, information technology, or system administration|29376.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Java 42749|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|65000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C;C++;C#;Java;Python;SQL;VBA;VB.NET 70448|United Kingdom|Extremely satisfied|Mathematics or statistics|69452.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|JavaScript;Python;SQL;TypeScript;HTML;CSS 96450|Poland|Neither satisfied nor dissatisfied|A natural science (ex. biology, chemistry, physics)|59988.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Go;JavaScript;Python;SQL;HTML;CSS 89392|United States|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|90000.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 87160|Israel|Moderately satisfied|Computer science, computer engineering, or software engineering|88224.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C++;C#;Java;JavaScript;SQL;TypeScript;Visual Basic 6;HTML;CSS;Bash/Shell 83898|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|18785.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Erlang;JavaScript;Python;R;HTML;CSS 74443|India|Slightly satisfied|Computer science, computer engineering, or software engineering|10175.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|JavaScript;TypeScript;HTML;CSS 3225|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|62418.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C#;Groovy;Java;Objective-C;Rust;Scala;SQL;TypeScript;VBA;Kotlin;HTML;CSS;Bash/Shell 69151|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|61194.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Go;Java;JavaScript;SQL;Kotlin;HTML;CSS;Bash/Shell 81460|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|13872.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;Java;JavaScript;HTML;CSS 49856|Norway|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|63762.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;TypeScript;HTML 73628|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|95000.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript 94405|United Kingdom|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|56951.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 44672|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|133000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;Java;JavaScript;Matlab;Python;HTML;CSS;Bash/Shell 13496|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|129000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C#;Objective-C;Swift;Bash/Shell 25950|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|46507.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Java;Python;TypeScript 59871|United Kingdom|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|55562.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 60380|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|185000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;CoffeeScript;Java;JavaScript;Perl;PHP;Python;SQL;TypeScript;VBA;HTML;CSS;Bash/Shell 67897|India|Moderately satisfied|Computer science, computer engineering, or software engineering|11268.0|I don't typically exercise|Male|South Asian|Primary/elementary school|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;PHP;SQL;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 72422|Ukraine|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|18000.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;Clojure;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 21772|Russian Federation|Moderately satisfied|Computer science, computer engineering, or software engineering|28656.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;SQL;HTML;CSS 41981|India|Moderately satisfied|Computer science, computer engineering, or software engineering|7984.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|SQL 80258|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|20351.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Java;JavaScript;R;Scala;SQL;TypeScript 27245|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|190000.0|1 - 2 times per week|Male|East Asian;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C;C++;Java;Python;Bash/Shell 64672|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|23808.0|3 - 4 times per week|Female|Hispanic or Latino/Latina|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java 98427|Belgium|Moderately satisfied|Computer science, computer engineering, or software engineering|33780.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C++;C#;Java;HTML;CSS 28588|Romania|Moderately satisfied|Information systems, information technology, or system administration|48955.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|SQL 67274|Malta|Moderately satisfied|Computer science, computer engineering, or software engineering|22032.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;Java;Python 81522|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|174000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Go;Java;JavaScript;HTML;CSS;Bash/Shell 89855|Germany|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|61680.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|45 - 54 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;Perl;PHP;SQL;HTML;CSS;Bash/Shell 61348|Germany|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|46992.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|R 43880|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|400044.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;Java;JavaScript;PHP;SQL;HTML;CSS 91547|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|86676.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS 52029|United States|Moderately satisfied|Information systems, information technology, or system administration|124500.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|JavaScript;Perl;SQL;HTML;CSS;Bash/Shell 67308|Colombia|Slightly satisfied|Information systems, information technology, or system administration|7176.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;SQL 4784|Lithuania|Moderately satisfied|Computer science, computer engineering, or software engineering|42504.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP 65690|Canada|Slightly dissatisfied|Computer science, computer engineering, or software engineering|48313.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C;Go;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 3878|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|122100.0|I don't typically exercise|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;HTML;CSS 91650|India|Moderately satisfied|Computer science, computer engineering, or software engineering|3500.0|Daily or almost every day|Male|East Asian|They never completed any formal education|3 - 4 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;Python;HTML;CSS 62947|Turkey|Moderately satisfied|Computer science, computer engineering, or software engineering|26544.0|I don't typically exercise|Male|Middle Eastern;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;HTML;CSS 39517|United Kingdom|Slightly dissatisfied|Web development or web design|52783.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS 82665|Turkey|Slightly dissatisfied|Computer science, computer engineering, or software engineering|38148.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|35 - 44 years old|Less than a year ago|C#;Go;JavaScript;Ruby 11342|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|33120.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Java;Kotlin 69446|Canada|Extremely dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|112730.0|1 - 2 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|Groovy;Java;Bash/Shell 97228|Latvia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|29376.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C#;JavaScript;HTML;CSS 71761|India|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|5636.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Python;HTML;CSS 64513|United Kingdom|Extremely satisfied|Mathematics or statistics|33615.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;SQL;TypeScript;HTML;CSS 51916|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|107000.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|55 - 64 years old|More than 4 years ago|C;C#;JavaScript;Julia;Objective-C;SQL;TypeScript;HTML 760|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|99468.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;Go;Groovy;Java;JavaScript;Objective-C;Python;Ruby;Swift;Kotlin;HTML;CSS;Bash/Shell 23513|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|66000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;Bash/Shell 24905|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|31764.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;C# 67756|Pakistan|Moderately satisfied|Computer science, computer engineering, or software engineering|9756.0|1 - 2 times per week|Female|Middle Eastern;South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;Java;JavaScript;Python;HTML;CSS 95633|United States|Moderately dissatisfied|A social science (ex. anthropology, psychology, political science)|95000.0|3 - 4 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Python;SQL;TypeScript;HTML;CSS 76889|Nigeria|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|5004.0|I don't typically exercise|Male|Black or of African descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 74425|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|76000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;JavaScript;Rust;Bash/Shell 66673|United States|Slightly satisfied|Information systems, information technology, or system administration|117000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Java;Perl;SQL;Bash/Shell 37862|Australia|Extremely satisfied|Computer science, computer engineering, or software engineering|112762.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Python;SQL;TypeScript;HTML;CSS 28600|United Kingdom|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|62507.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Python;Ruby;Scala;Kotlin 48883|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|35244.0|3 - 4 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|More than 4 years ago|Groovy;Java;JavaScript 13234|Hungary|Slightly satisfied|Computer science, computer engineering, or software engineering|40392.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;C++;Java;JavaScript;Lua;Perl;SQL 39646|United States|Slightly dissatisfied|A social science (ex. anthropology, psychology, political science)|1164000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;HTML;CSS;Bash/Shell 95524|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|102000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;Python;SQL;TypeScript;VB.NET;HTML;CSS;Bash/Shell 81448|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|125014.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Groovy;Java;Python;Scala;HTML;CSS;Bash/Shell 327|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|23440.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;VBA;VB.NET;Visual Basic 6;HTML 70748|Ireland|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|44060.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Haskell;Java;Matlab;Ruby;Scala;Bash/Shell 34422|Iran, Islamic Republic of...|Moderately dissatisfied|Information systems, information technology, or system administration|36000.0|I don't typically exercise|Male|Middle Eastern|They never completed any formal education|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java 53513|Italy|Moderately dissatisfied|Computer science, computer engineering, or software engineering|29373.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;VBA;HTML;CSS;Bash/Shell 19630|Italy|Moderately dissatisfied|Computer science, computer engineering, or software engineering|64866.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Groovy;Java;Python;SQL;Cobol;Bash/Shell 96390|South Africa|Slightly satisfied|Computer science, computer engineering, or software engineering|54384.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;TypeScript;HTML;CSS 48420|Czech Republic|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|27804.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Python;VBA;Bash/Shell 75954|Denmark|Moderately satisfied|Mathematics or statistics|49308.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Matlab;Python;R;Bash/Shell 37201|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|47000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 54106|Netherlands|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|68537.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;Scala;SQL;Swift;HTML;CSS 95701|United States|Slightly dissatisfied|I never declared a major|90000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;HTML;CSS;Bash/Shell 10317|Portugal|Slightly satisfied|Computer science, computer engineering, or software engineering|14688.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 39800|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|95000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Python;SQL;CSS 22566|Canada|Moderately dissatisfied|Computer science, computer engineering, or software engineering|96626.0|I don't typically exercise|Female|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 66207|United Kingdom|Moderately dissatisfied|Computer science, computer engineering, or software engineering|38893.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;HTML;CSS 66788|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|118068.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;Ruby;Kotlin 11559|Switzerland|Extremely satisfied|Computer science, computer engineering, or software engineering|83416.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 88541|Poland|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|63516.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Python;R;Scala 24620|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|76514.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Swift 54979|Qatar|Slightly dissatisfied|Computer science, computer engineering, or software engineering|120000.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 53442|India|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|18780.0|Daily or almost every day|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|PHP;Python;SQL;HTML;CSS;Bash/Shell 13237|Canada|Slightly dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|48313.0|Daily or almost every day|Female|Native American, Pacific Islander, or Indigenous Australian;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 46824|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|3756.0|I don't typically exercise|Male|South Asian|They never completed any formal education|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 90267|United States|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|2000000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|55 - 64 years old|Less than a year ago|C;Go;Perl;PHP;SQL;Bash/Shell 97711|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|79973.0|3 - 4 times per week|Male|East Asian;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Ruby;HTML;CSS 47043|Japan|Moderately dissatisfied|Information systems, information technology, or system administration|54023.0|Daily or almost every day|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|CoffeeScript;JavaScript;PHP;Ruby;HTML;CSS;Bash/Shell 78240|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|63642.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;Python;R;SQL;TypeScript;HTML;CSS 27054|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|135000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|CoffeeScript;Haskell;Java;JavaScript;Ruby;HTML;CSS;Bash/Shell 20656|United States|Slightly satisfied|A business discipline (ex. accounting, finance, marketing)|70000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS 85667|United Republic of Tanzania|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|37500.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS 4746|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|73433.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;Java;JavaScript;SQL;HTML 78606|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|20000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;Lua;Matlab;Python;Bash/Shell 37621|India|Slightly satisfied|Computer science, computer engineering, or software engineering|4692.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;Java;JavaScript;PHP;SQL;VB.NET;HTML;CSS 30340|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|1000000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;PHP;SQL;HTML 35729|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|9706.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Objective-C;Swift 95852|Ukraine|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|18000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;SQL 10997|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|130000.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;Groovy;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 78878|India|Moderately satisfied|Computer science, computer engineering, or software engineering|7200.0|I don't typically exercise|Male|East Asian|Primary/elementary school|Over 4 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 95197|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|68500.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 58025|Australia|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|123959.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;Objective-C;Ruby;Swift;Bash/Shell 6660|Romania|Extremely dissatisfied|Computer science, computer engineering, or software engineering|58752.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Swift;Kotlin 66063|Myanmar|Slightly dissatisfied|Computer science, computer engineering, or software engineering|6000.0|3 - 4 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Groovy;Java;JavaScript;HTML;CSS;Bash/Shell 96035|Denmark|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|52597.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Swift;Ocaml;HTML;CSS 96482|France|Moderately satisfied|Computer science, computer engineering, or software engineering|121164.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Java;JavaScript;Perl;Python;Ruby;Rust;Scala;SQL;Swift;Bash/Shell 38046|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|142000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Lua;Python;HTML;CSS 64294|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|150000.0|1 - 2 times per week|Female|South Asian;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;Python;SQL;TypeScript 98973|Germany|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|55075.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;HTML 14782|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|70000.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C++;CoffeeScript;Java;JavaScript;SQL;TypeScript;HTML;CSS 95338|United States|Moderately satisfied|Mathematics or statistics|75000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C;Python;R;SQL;HTML;CSS;Bash/Shell 33297|Netherlands|Slightly dissatisfied|Computer science, computer engineering, or software engineering|48955.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java 19466|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|114596.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Clojure;Ruby 9944|Brazil|Slightly satisfied|Computer science, computer engineering, or software engineering|11604.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;TypeScript;HTML;CSS 26164|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|50000.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 44463|Canada|Slightly dissatisfied|Information systems, information technology, or system administration|60391.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Ruby;SQL;HTML;CSS 69530|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|10175.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;HTML;CSS 92572|Austria|Extremely satisfied|Web development or web design|82000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C;C#;JavaScript;Objective-C;PHP;Swift;TypeScript;VB.NET;HTML 51971|Denmark|Moderately satisfied|Computer science, computer engineering, or software engineering|887580.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C++;C#;SQL;VB.NET 7075|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|45624.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C++;Java;JavaScript;Lua;Python;R;Bash/Shell 16088|Germany|Moderately satisfied|Mathematics or statistics|117492.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;Rust 64501|Russian Federation|Extremely satisfied|Computer science, computer engineering, or software engineering|31848.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Assembly;C++;Go;Java;JavaScript;Lua;PHP;Python;Scala;SQL;TypeScript;Bash/Shell 75367|United States|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|45000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;Go;Groovy;Ruby;Bash/Shell 32729|India|Moderately dissatisfied|Information systems, information technology, or system administration|26400.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;Python;SQL 60772|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|68040.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;Java;Python;Cobol 39437|Brazil|Extremely dissatisfied|Computer science, computer engineering, or software engineering|32127.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 7580|Netherlands|Slightly dissatisfied|A business discipline (ex. accounting, finance, marketing)|85671.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Objective-C;Python;Ruby;Swift 80738|Romania|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|34680.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;JavaScript;Python 81401|India|Extremely satisfied|Computer science, computer engineering, or software engineering|8448.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;TypeScript;HTML;CSS 14902|Australia|Extremely dissatisfied|Computer science, computer engineering, or software engineering|99967.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|Between 1 and 2 years ago|C#;JavaScript;R;SQL;TypeScript;HTML;CSS 90240|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|57200.0|Daily or almost every day|Male;Transgender|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|More than 4 years ago|C#;JavaScript;Python;SQL;VB.NET;HTML;CSS;Bash/Shell 53894|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|112400.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;Bash/Shell 49337|Canada|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|76495.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;HTML;CSS 84518|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|160000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Go;Groovy;Java;JavaScript 19477|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|23652.0|I don't typically exercise|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java 66518|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|66089.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|More than 4 years ago|JavaScript;Python;Ruby;Scala;Swift;TypeScript 36045|United States|Extremely satisfied|Information systems, information technology, or system administration|115000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 71740|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|6000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Java;Lua;PHP;SQL;HTML;CSS;Bash/Shell 33005|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|49032.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS 30951|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|150000.0|3 - 4 times per week|Male|Black or of African descent;East Asian;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;Erlang;Go;Haskell;Java;JavaScript;Rust;Scala;TypeScript;Bash/Shell 75510|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|21000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;C#;JavaScript;Python;SQL;VBA;HTML;CSS;Bash/Shell 35833|France|Moderately dissatisfied|Computer science, computer engineering, or software engineering|125124.0|3 - 4 times per week|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C++;Erlang;Go;Haskell;Java;JavaScript;Matlab;Perl;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 27692|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|76397.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;TypeScript 57718|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|91791.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 64887|Bangladesh|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|5160.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS 17525|Austria|Extremely satisfied|Computer science, computer engineering, or software engineering|122388.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;Swift;VBA;VB.NET;HTML;CSS 47020|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|135000.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Java;Objective-C;Swift;Kotlin 45879|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|29373.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;Go;Java;JavaScript;Objective-C;PHP;SQL;Swift;Bash/Shell 35576|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|115000.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|CoffeeScript;JavaScript;Python;Ruby;HTML;CSS;Bash/Shell 19380|Finland|Moderately satisfied|Computer science, computer engineering, or software engineering|44064.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Go;Java;JavaScript;PHP;R;SQL;Swift;HTML;CSS 10047|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|80000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Objective-C;SQL;Swift;TypeScript;HTML;CSS 9651|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|28000.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 29455|Germany|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|67313.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;R;SQL;HTML;CSS 22209|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|144000.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|Over 4 hours|45 - 54 years old|More than 4 years ago|JavaScript;SQL 84041|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|200000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;Clojure;Erlang;Java;JavaScript;Ruby;SQL;HTML;Bash/Shell 98497|United States|Extremely satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|65000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;HTML;CSS 47708|Mexico|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|12888.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;CoffeeScript;JavaScript;Python;Ruby;SQL;HTML;CSS 72530|India|Extremely dissatisfied|Computer science, computer engineering, or software engineering|2820.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;JavaScript;PHP;SQL;HTML;CSS 10826|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|75000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 14597|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|154000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C++;C#;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 22936|United Kingdom|Moderately satisfied|Mathematics or statistics|27781.0|1 - 2 times per week|Male;Transgender|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;JavaScript;Matlab;R;HTML;CSS;Bash/Shell 12276|Iran, Islamic Republic of...|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|1200.0|1 - 2 times per week|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;C#;JavaScript;Python;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 59073|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|60000.0|1 - 2 times per week|Female|Black or of African descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Ruby;SQL;HTML;CSS 51487|France|Slightly satisfied|Computer science, computer engineering, or software engineering|41612.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 76565|Libyan Arab Jamahiriya|Extremely satisfied|Computer science, computer engineering, or software engineering|3900.0|I don't typically exercise|Male|Middle Eastern|They never completed any formal education|3 - 4 hours|45 - 54 years old|More than 4 years ago|C;C++;C#;JavaScript;SQL;VB.NET;Delphi/Object Pascal;HTML;CSS 90914|United States|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|90000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Go;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 85308|India|Extremely satisfied|Computer science, computer engineering, or software engineering|6576.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Java;Python 75575|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|58000.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Associate degree|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;Python;HTML;CSS 74877|Canada|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|74885.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|45 - 54 years old|More than 4 years ago|C++;C#;Java;JavaScript;Objective-C;PHP;Python;SQL;VBA;Bash/Shell 94611|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|94000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Assembly;Python 52323|France|Moderately dissatisfied|Computer science, computer engineering, or software engineering|30840.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Java;JavaScript;PHP;Python;SQL;VB.NET;HTML;CSS;Bash/Shell 22692|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|56460.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Groovy;Java;SQL;Bash/Shell 54589|India|Moderately satisfied|Computer science, computer engineering, or software engineering|18780.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Java;JavaScript;Matlab;Python;SQL;HTML;CSS 26327|France|Slightly satisfied|Information systems, information technology, or system administration|42836.0|1 - 2 times per week|Male|Black or of African descent;White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Groovy;Java;SQL;HTML;CSS 93266|Belgium|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|73433.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|55 - 64 years old|More than 4 years ago|C;C#;SQL;HTML;CSS 109|Azerbaijan|Slightly satisfied|A business discipline (ex. accounting, finance, marketing)|144.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|3 - 4 hours|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 1923|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|70000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 13094|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|51983.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Java;Python 397|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|2000000.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;Matlab;Python;Bash/Shell 64244|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|31000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Java;JavaScript;PHP;Python;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS 71846|Ukraine|Extremely satisfied|Computer science, computer engineering, or software engineering|45096.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C++;Go;Java;Objective-C;Python;Swift;Kotlin 41972|Belarus|Moderately satisfied|Information systems, information technology, or system administration|32664.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C++;C#;Java;JavaScript;SQL;HTML;CSS 44613|Italy|Moderately satisfied|Computer science, computer engineering, or software engineering|42836.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;Erlang;Groovy;Java;JavaScript;Objective-C;Perl;PHP;Python;Scala;Delphi/Object Pascal;Bash/Shell 72477|Ecuador|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|3600.0|I don't typically exercise|Female|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;Java;JavaScript;PHP;Python;R;SQL;HTML;CSS 28306|Thailand|Slightly satisfied|Information systems, information technology, or system administration|293736.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C++ 20960|Brazil|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|77979.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS 33696|Australia|Moderately dissatisfied|Computer science, computer engineering, or software engineering|119960.0|3 - 4 times per week|Male|Middle Eastern|Primary/elementary school|1 - 2 hours|35 - 44 years old|Less than a year ago|JavaScript;Objective-C;Swift;HTML;CSS 20381|United Kingdom|Extremely satisfied|Web development or web design|29170.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;CoffeeScript;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 69430|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|29376.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;Python;SQL;HTML;CSS 28143|Poland|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|24702.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;SQL;VBA;VB.NET;HTML;Bash/Shell 9309|Australia|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|83172.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;C#;Java;JavaScript;PHP;Python;SQL;TypeScript;VBA;HTML;CSS;Bash/Shell 67341|United States|Extremely satisfied|Web development or web design|103000.0|1 - 2 times per week|Male;Transgender|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;Visual Basic 6;HTML;CSS 46142|India|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|150288.0|Daily or almost every day|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;SQL;TypeScript;HTML;CSS 99337|United States|Moderately dissatisfied|A social science (ex. anthropology, psychology, political science)|58000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|45 - 54 years old|More than 4 years ago|C++;C#;Java;HTML;CSS 30203|France|Moderately dissatisfied|Web development or web design|33780.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;CoffeeScript;Java;JavaScript;Perl;PHP;Ruby;Rust;Swift;TypeScript;HTML;CSS;Bash/Shell 47879|India|Moderately satisfied|Computer science, computer engineering, or software engineering|18785.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;SQL;TypeScript;HTML;CSS 72708|Pakistan|Moderately satisfied|Computer science, computer engineering, or software engineering|32532.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;Python;SQL;TypeScript;Bash/Shell 3285|Singapore|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|56779.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;Python;SQL;TypeScript;HTML;CSS 14443|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|10140.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C# 10877|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|96626.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript 49168|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|150000.0|3 - 4 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Groovy;JavaScript;Python;HTML;CSS;Bash/Shell 37287|United Kingdom|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|852876.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|SQL 71744|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|38184.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 71432|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|110000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|45 - 54 years old|Between 2 and 4 years ago|Groovy;Java;SQL;VBA 1517|Peru|Slightly dissatisfied|Computer science, computer engineering, or software engineering|88000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;CoffeeScript;Erlang;Haskell;Java;JavaScript;Lua;Matlab;Perl;Python;R;Ruby;SQL;HTML;CSS;Bash/Shell 97131|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|110000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Ruby;SQL;HTML;CSS 25292|Bulgaria|Moderately satisfied|Mathematics or statistics|26400.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Python;SQL;HTML 90855|South Africa|Slightly dissatisfied|Information systems, information technology, or system administration|62304.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;JavaScript;PHP;R;Delphi/Object Pascal;HTML;CSS 34211|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|90000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|55 - 64 years old|More than 4 years ago|C++;C#;Java;JavaScript;Python;SQL;Swift;HTML;CSS;Bash/Shell 99837|Serbia|Moderately satisfied|Computer science, computer engineering, or software engineering|20556.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C++;JavaScript;Objective-C;PHP;Python;SQL;Swift;HTML;CSS;Bash/Shell 40262|Ethiopia|Extremely dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|6972.0|1 - 2 times per week|Male|Black or of African descent|Associate degree|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python;TypeScript 14284|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|70000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;Java;JavaScript;Matlab;Python;R;SQL;HTML;CSS;Bash/Shell 22957|Australia|Extremely satisfied|Computer science, computer engineering, or software engineering|111963.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;TypeScript 79645|Spain|Extremely satisfied|Computer science, computer engineering, or software engineering|367164.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;TypeScript;HTML;CSS;Bash/Shell 3646|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|JavaScript;SQL;VB.NET;HTML;CSS 61098|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|80776.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Assembly;C;C++;Java;JavaScript;Objective-C;SQL;Swift;HTML;CSS;Bash/Shell 13504|United States|Moderately dissatisfied|Information systems, information technology, or system administration|60000.0|Daily or almost every day|Female;Transgender|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;SQL;Delphi/Object Pascal;HTML;CSS 80749|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|80772.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;SQL;HTML 39006|France|Slightly satisfied|Computer science, computer engineering, or software engineering|122388.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;F#;TypeScript 86376|France|Moderately satisfied|Computer science, computer engineering, or software engineering|55075.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript 99104|Russian Federation|Slightly dissatisfied|Computer science, computer engineering, or software engineering|10620.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|18 - 24 years old|More than 4 years ago|C;C++;JavaScript;Matlab;Python;SQL;Visual Basic 6;HTML;CSS 15503|India|Extremely satisfied|Computer science, computer engineering, or software engineering|11268.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|JavaScript 27374|Canada|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|82132.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;Python;SQL;Bash/Shell 58214|Brazil|Moderately satisfied|Information systems, information technology, or system administration|1000000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;HTML;CSS 11804|United Kingdom|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|45838.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;JavaScript;Ruby;HTML;CSS;Bash/Shell 575|Ireland|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|63642.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;TypeScript;HTML;CSS 10770|Portugal|Extremely satisfied|Computer science, computer engineering, or software engineering|38552.0|I don't typically exercise|Male|White or of European descent|They never completed any formal education|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;Go;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 78807|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|80000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;HTML;CSS;Bash/Shell 4004|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|63516.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;Python;TypeScript;HTML;CSS 1599|China|Extremely dissatisfied|Computer science, computer engineering, or software engineering|60000.0|Daily or almost every day|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;C#;Java;JavaScript;PHP;SQL;HTML;CSS 45525|Brazil|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|29076.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;Bash/Shell 100475|Russian Federation|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|42456.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;HTML;CSS 69472|Portugal|Slightly satisfied|Computer science, computer engineering, or software engineering|41124.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C;C++;CoffeeScript;Erlang;JavaScript;PHP;Ruby;Rust;SQL;HTML;CSS 71422|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|17640.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;JavaScript;PHP;Python;HTML;CSS 2676|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|150000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;Python;Scala;SQL;HTML;CSS;Bash/Shell 7309|Australia|Neither satisfied nor dissatisfied|A natural science (ex. biology, chemistry, physics)|121560.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 94688|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|0.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;F#;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 1628|India|Slightly satisfied|Computer science, computer engineering, or software engineering|281784.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 28843|United States|Moderately satisfied|A health science (ex. nursing, pharmacy, radiology)|120000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;JavaScript;Python;SQL;TypeScript;VBA 25238|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|84000.0|Daily or almost every day|Male|Native American, Pacific Islander, or Indigenous Australian;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Python;R;SQL;HTML;CSS 80971|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|90000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 37329|Australia|Slightly satisfied|Computer science, computer engineering, or software engineering|59980.0|1 - 2 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;CoffeeScript;JavaScript;Ruby;HTML;CSS 21234|Australia|Moderately satisfied|Mathematics or statistics|63979.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C++;Java;JavaScript;Python;R;SQL;Swift;Kotlin;CSS 84373|United States|Slightly dissatisfied|A social science (ex. anthropology, psychology, political science)|1020000.0|1 - 2 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;TypeScript;HTML;CSS;Bash/Shell 84281|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|15132.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Python;TypeScript;HTML;CSS 50496|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|29000.0|Daily or almost every day|Female|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;Java;Matlab;Python;SQL 65661|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|120000.0|Daily or almost every day|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;Ruby;HTML;CSS 58900|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;HTML;CSS;Bash/Shell 63868|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|80000.0|I don't typically exercise|Male|South Asian|Associate degree|3 - 4 hours|25 - 34 years old|Less than a year ago|C++;Java;JavaScript;SQL;HTML;CSS 4324|Germany|Moderately dissatisfied|Information systems, information technology, or system administration|734328.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;PHP;HTML;CSS 84821|France|Slightly satisfied|A health science (ex. nursing, pharmacy, radiology)|36716.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C;Java;JavaScript;Objective-C;PHP;Ruby;SQL;Swift;VBA;VB.NET;Visual Basic 6;Kotlin;HTML;CSS;Bash/Shell 6165|Russian Federation|Moderately satisfied|Web development or web design|8850.0|Daily or almost every day|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 28879|Austria|Extremely dissatisfied|Computer science, computer engineering, or software engineering|79552.0|1 - 2 times per week|Male|Middle Eastern|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;Python;R;TypeScript;HTML;CSS 92117|France|Extremely satisfied|Web development or web design|14688.0|1 - 2 times per week|Male|Black or of African descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;Java;JavaScript;PHP;Python;Scala;SQL;HTML;CSS;Bash/Shell 14978|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|100000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;Java;JavaScript;Objective-C;Python;Ruby;SQL;Swift;HTML;CSS;Bash/Shell 41310|Italy|Moderately satisfied|Computer science, computer engineering, or software engineering|26436.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Objective-C;PHP;SQL;Swift;HTML;CSS 73845|Hungary|Moderately satisfied|Computer science, computer engineering, or software engineering|34296.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;Groovy;Java;JavaScript;Ruby;HTML;CSS;Bash/Shell 31973|Czech Republic|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|40536.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;Lua;Python;SQL;HTML;CSS;Bash/Shell 52154|Turkey|Slightly dissatisfied|Computer science, computer engineering, or software engineering|8004.0|I don't typically exercise|Male|Middle Eastern;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS 48208|Iran, Islamic Republic of...|Extremely satisfied|Computer science, computer engineering, or software engineering|0.0|I don't typically exercise|Male|Middle Eastern|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|18 - 24 years old|I've never had a job|Assembly;C;C++;Java;Python;SQL;HTML;CSS;Bash/Shell 61588|Italy|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|22032.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|55 - 64 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS 96446|Croatia|Moderately satisfied|Computer science, computer engineering, or software engineering|25656.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Python 11514|Australia|Extremely dissatisfied|A business discipline (ex. accounting, finance, marketing)|47984.0|3 - 4 times per week|Female|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|JavaScript;PHP;Ruby;SQL;HTML;CSS 22740|Bangladesh|Moderately satisfied|Computer science, computer engineering, or software engineering|1444.0|3 - 4 times per week|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;SQL;TypeScript;HTML 739|Iran, Islamic Republic of...|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|20000.0|1 - 2 times per week|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 51724|Czech Republic|Slightly satisfied|Computer science, computer engineering, or software engineering|17376.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Java 93728|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|110000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C;C++;C#;Java;JavaScript;SQL;Kotlin;Bash/Shell 53978|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|42000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Go;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 75843|South Korea|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|26352.0|I don't typically exercise|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Ruby;TypeScript;HTML;CSS 60446|India|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|23482.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 52330|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|50904.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 17298|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|52783.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C# 95882|India|Slightly satisfied|Computer science, computer engineering, or software engineering|3756.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;SQL;HTML;CSS 99565|Australia|Extremely dissatisfied|A natural science (ex. biology, chemistry, physics)|84497.0|1 - 2 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;Python;R;HTML;CSS 9849|Sri Lanka|Extremely satisfied|Computer science, computer engineering, or software engineering|11700.0|3 - 4 times per week|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|18 - 24 years old|I've never had a job|C++;C#;Java;JavaScript;PHP;SQL;HTML;CSS 2586|United States|Moderately satisfied|Mathematics or statistics|57000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;Perl;R;Bash/Shell 47087|Canada|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|32209.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|R;SQL 20326|Viet Nam|Slightly satisfied|Computer science, computer engineering, or software engineering|3600.0|I don't typically exercise|Male|East Asian|Some college/university study without earning a degree|3 - 4 hours|18 - 24 years old|Less than a year ago|C++;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 35251|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|62000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 27230|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|62507.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 10395|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|93500.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 4138|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|43482.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;C#;Python;SQL;HTML;CSS;Bash/Shell 56644|Canada|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|44609.0|1 - 2 times per week|Female|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL 30890|India|Extremely satisfied|Computer science, computer engineering, or software engineering|16437.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 19432|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|60000.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C#;Java;JavaScript;Perl;Python;SQL;HTML;CSS;Bash/Shell 3|United Kingdom|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|70841.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;Python;Bash/Shell 99139|Turkey|Moderately dissatisfied|Computer science, computer engineering, or software engineering|23844.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP 28919|Israel|Moderately satisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;Python;R;SQL;TypeScript 83780|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|14976.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;SQL;Bash/Shell 54688|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|690000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Ruby;HTML;CSS;Bash/Shell 24765|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|110000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;TypeScript 96527|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|70985.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Ruby;SQL 12130|United States|Slightly satisfied|A social science (ex. anthropology, psychology, political science)|30000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Python;R;HTML 11832|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|44449.0|1 - 2 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;SQL;HTML;CSS;Bash/Shell 57366|Germany|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|1000000.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Perl;SQL;HTML;CSS;Bash/Shell 70359|Other Country (Not Listed Above)|Moderately satisfied|Computer science, computer engineering, or software engineering|12480.0|I don't typically exercise|Female|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C++;Java;JavaScript;Matlab;PHP;Python;SQL;Visual Basic 6;HTML;CSS 32452|United Kingdom|Slightly dissatisfied|Web development or web design|33.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;HTML;CSS 81220|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|85000.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;Groovy;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 54378|Egypt|Slightly dissatisfied|Computer science, computer engineering, or software engineering|1800.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|More than 4 years ago|C;C++;C#;SQL;VBA;Visual Basic 6;HTML;CSS;Bash/Shell 12328|Norway|Moderately satisfied|Information systems, information technology, or system administration|53560.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 72867|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|96000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;Scala;TypeScript;Bash/Shell 81698|Algeria|Slightly dissatisfied|Computer science, computer engineering, or software engineering|4728.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;Matlab;PHP;Python;SQL;Delphi/Object Pascal;HTML;CSS 19984|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|79552.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS 54322|Czech Republic|Moderately satisfied|Computer science, computer engineering, or software engineering|28956.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Perl;PHP;Python;SQL;HTML;CSS;Bash/Shell 25522|United Kingdom|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|70841.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 65851|Australia|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|103965.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;VBA;HTML;CSS;Bash/Shell 3119|Ireland|Moderately satisfied|Computer science, computer engineering, or software engineering|88119.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Go;Haskell;Java;JavaScript;R;Scala;SQL;Bash/Shell 22065|United States|Extremely dissatisfied|I never declared a major|98000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;Bash/Shell 89450|Argentina|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|30000.0|1 - 2 times per week|Female|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;SQL;HTML;Bash/Shell 21867|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|41671.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;C# 98905|Japan|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|120000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|JavaScript;Ruby;HTML;CSS 93735|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|30000.0|3 - 4 times per week|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C++;JavaScript;Python;R;SQL;HTML;CSS;Bash/Shell 65710|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|100000.0|3 - 4 times per week|Male|Black or of African descent;East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 50835|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|70000.0|3 - 4 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|CoffeeScript;Clojure;Java;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 40989|Ukraine|Slightly satisfied|Computer science, computer engineering, or software engineering|48000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C++;Java;JavaScript;Objective-C;Python;TypeScript;Kotlin;HTML;CSS;Bash/Shell 89218|United States|Moderately dissatisfied|Information systems, information technology, or system administration|95000.0|I don't typically exercise|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Ruby;SQL 69039|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|17640.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;C#;Haskell;Java;JavaScript;Python;Scala;Kotlin;HTML;CSS;Bash/Shell 96869|United States|Moderately satisfied|I never declared a major|90000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 37945|Hungary|Slightly satisfied|Computer science, computer engineering, or software engineering|35724.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;Erlang;Java;JavaScript;Matlab;Objective-C;Python;SQL;Swift;Kotlin;HTML;CSS;Bash/Shell 3472|Ukraine|Slightly satisfied|Computer science, computer engineering, or software engineering|12108.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;SQL 60176|Serbia|Extremely satisfied|Computer science, computer engineering, or software engineering|8808.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;SQL 32041|Malaysia|Slightly satisfied|Mathematics or statistics|19116.0|I don't typically exercise|Female|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C;Java;JavaScript;Objective-C;Swift;HTML;CSS 25425|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|136000.0|Daily or almost every day|Female|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Go;Java;Python;Bash/Shell 74236|United States|Extremely dissatisfied|A humanities discipline (ex. literature, history, philosophy)|55000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;Objective-C;R;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 68601|United Kingdom|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|716748.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;Perl;Python;Bash/Shell 6077|Sweden|Extremely dissatisfied|A natural science (ex. biology, chemistry, physics)|52404.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;Python;SQL;Bash/Shell 101576|United States|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|80000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;PHP;SQL;TypeScript;VB.NET;HTML;CSS 85084|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|109500.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;HTML;CSS 38647|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|180000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C++;JavaScript;Lua;Python;TypeScript;Bash/Shell 71593|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|32000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C# 28195|United States|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|225000.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Python;SQL;HTML;Bash/Shell 45129|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|52872.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Python;SQL;TypeScript;Kotlin;HTML;CSS;Bash/Shell 100511|Ireland|Moderately satisfied|Computer science, computer engineering, or software engineering|85671.0|Daily or almost every day|Female|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;Hack;Haskell;Lua;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 23379|Croatia|Slightly satisfied|Computer science, computer engineering, or software engineering|30588.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 99897|United States|Moderately satisfied|Mathematics or statistics|150000.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|CoffeeScript;JavaScript;Python;R;SQL;HTML;Bash/Shell 38054|Belarus|Slightly dissatisfied|Computer science, computer engineering, or software engineering|9684.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 13361|Australia|Moderately dissatisfied|A business discipline (ex. accounting, finance, marketing)|134352.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Clojure;Groovy;Java;JavaScript;Matlab;Python;SQL;Bash/Shell 3552|India|Extremely satisfied|Computer science, computer engineering, or software engineering|9396.0|Daily or almost every day|Male|South Asian|Primary/elementary school|Over 4 hours|18 - 24 years old|Less than a year ago|JavaScript;PHP;SQL;Swift;TypeScript;HTML;CSS 74771|United States|Extremely satisfied|Web development or web design|108600.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS 14129|Spain|Extremely satisfied|Information systems, information technology, or system administration|97910.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;Scala 9178|Russian Federation|Slightly satisfied|Computer science, computer engineering, or software engineering|8496.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;C#;Java;Objective-C;Python;SQL;Swift 50265|Brazil|Extremely satisfied|Computer science, computer engineering, or software engineering|26196.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;C#;Python;Ruby;TypeScript;Bash/Shell 67284|Venezuela, Bolivarian Republic of...|Moderately satisfied|Information systems, information technology, or system administration|1000000.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 27361|Albania|Slightly dissatisfied|Computer science, computer engineering, or software engineering|35244.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;HTML;CSS 32211|Canada|Slightly satisfied|Computer science, computer engineering, or software engineering|64417.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Erlang;Java;Scala;Swift 92596|United States|Moderately satisfied|Mathematics or statistics|90000.0|Daily or almost every day|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python 68693|United States|Moderately satisfied|Mathematics or statistics|2600.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;Python;HTML;CSS 13475|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|56460.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C++;C#;CoffeeScript;Java;JavaScript;SQL;HTML;CSS 73635|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|104030.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;Java;Python;Scala;SQL 83171|Bangladesh|Slightly dissatisfied|Computer science, computer engineering, or software engineering|2892.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C;C++;Java;PHP;SQL;HTML;CSS 42916|Poland|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|21876.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Java;SQL 14854|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|118366.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Assembly;C;C++;C#;Groovy;Java;JavaScript;Lua;Python;TypeScript;HTML;CSS;Bash/Shell 69500|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|50179.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|JavaScript;TypeScript;HTML;CSS;Bash/Shell 90282|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|19236.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;C#;Java;JavaScript;TypeScript;HTML 78866|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|106000.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++ 61575|France|Moderately satisfied|Computer science, computer engineering, or software engineering|36716.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|55 - 64 years old|Between 2 and 4 years ago|PHP;SQL;HTML;CSS 36229|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|104678.0|1 - 2 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|Java;Python;Kotlin;HTML;CSS;Bash/Shell 73482|United States|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|125000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|45 - 54 years old|Less than a year ago|Java;JavaScript;SQL;VBA;HTML;CSS;Bash/Shell 100806|Iran, Islamic Republic of...|Moderately satisfied|Computer science, computer engineering, or software engineering|2328.0|Daily or almost every day|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|35 - 44 years old|Between 2 and 4 years ago|C#;SQL;Visual Basic 6;HTML;CSS 93854|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|88000.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|Go;Groovy;Java;JavaScript;Perl;Rust;SQL;TypeScript;Kotlin;HTML;CSS;Bash/Shell 1491|Australia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|36468.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;C#;Java;JavaScript;Python;HTML;CSS;Bash/Shell 78846|Belarus|Moderately dissatisfied|Computer science, computer engineering, or software engineering|34800.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java 46475|Germany|Extremely satisfied|Information systems, information technology, or system administration|67560.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|CoffeeScript;Java;JavaScript;Python;Ruby;SQL;CSS;Bash/Shell 16524|China|Moderately satisfied|Computer science, computer engineering, or software engineering|20568.0|1 - 2 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Python;R;SQL;TypeScript;HTML;CSS 23659|Canada|Extremely satisfied|Mathematics or statistics|64417.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|CoffeeScript;Go;JavaScript;Lua;PHP;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 55797|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|31948.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;JavaScript;SQL;VB.NET;Visual Basic 6;HTML;CSS 53683|United Kingdom|Moderately satisfied|Web development or web design|69452.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;Kotlin;HTML;CSS;Bash/Shell 67567|United States|Moderately satisfied|Information systems, information technology, or system administration|63000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;Cobol;HTML;CSS;Bash/Shell 65905|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|68000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Perl;Ruby;Rust;HTML;CSS;Bash/Shell 52846|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|41000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|More than 4 years ago|C++;C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS 74298|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|100000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 11565|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|60000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;Haskell;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 13432|China|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|31788.0|1 - 2 times per week|Female;Transgender;Non-binary, genderqueer, or gender non-conforming|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Groovy;Java;JavaScript;Python;HTML;CSS;Bash/Shell 16723|Russian Federation|Slightly dissatisfied|Mathematics or statistics|12732.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Java;JavaScript;SQL 2380|Serbia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|27276.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Java 51735|Poland|Moderately dissatisfied|Computer science, computer engineering, or software engineering|59988.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 80999|United States|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|82000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java;JavaScript;PHP;SQL;Bash/Shell 4046|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|119058.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Haskell;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 77052|United States|Moderately satisfied|Web development or web design|10000.0|1 - 2 times per week|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Java;PHP;SQL;Swift;HTML;CSS 33532|India|Slightly satisfied|Web development or web design|4512.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;PHP;SQL;VBA;VB.NET;HTML;CSS 43376|United Kingdom|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|150012.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;Python;Ruby;HTML;CSS 72696|Russian Federation|Moderately satisfied|Information systems, information technology, or system administration|21228.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;PHP;TypeScript;HTML;CSS 29028|Canada|Slightly satisfied|Computer science, computer engineering, or software engineering|66027.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;Visual Basic 6 39401|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|82500.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 94400|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|66674.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C++;C#;JavaScript;Lua;SQL;TypeScript;HTML;CSS;Bash/Shell 51679|United States|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|101000.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|PHP;Ruby;Scala;SQL;TypeScript;HTML;CSS 67118|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|73433.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Haskell;JavaScript;Python;Rust;Scala;SQL;HTML;CSS;Bash/Shell 2423|India|Moderately satisfied|Information systems, information technology, or system administration|2820.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|PHP;Python 92180|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|155000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|45 - 54 years old|Less than a year ago|Erlang;JavaScript;Python;Ruby;SQL;HTML;CSS;Bash/Shell 1381|Brazil|Slightly dissatisfied|Information systems, information technology, or system administration|37428.0|Daily or almost every day|Male|White or of European descent|They never completed any formal education|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Perl;PHP;SQL;TypeScript;VBA;VB.NET;Visual Basic 6;HTML;CSS 18603|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|75000.0|1 - 2 times per week|Male|South Asian|Associate degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;Objective-C;Swift;HTML;CSS 74152|Australia|Extremely satisfied|Computer science, computer engineering, or software engineering|15000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;Go;Java;JavaScript;Python;TypeScript;HTML;CSS;Bash/Shell 33569|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|190000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Java;JavaScript;Python;HTML;CSS 25229|Other Country (Not Listed Above)|Moderately satisfied|Computer science, computer engineering, or software engineering|30600.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|PHP;SQL;Delphi/Object Pascal;HTML 50720|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|125000.0|I don't typically exercise|Male|Black or of African descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Go;Lua;Perl;Python;SQL 51356|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|101383.0|1 - 2 times per week|Female|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;SQL;HTML;CSS;Bash/Shell 6774|Hong Kong (S.A.R.)|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|130896.0|I don't typically exercise|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|I've never had a job|Assembly;C#;Erlang;Java;JavaScript;Objective-C;PHP;Python;SQL;TypeScript;HTML;CSS 94763|United States|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|43000.0|1 - 2 times per week|Female|Black or of African descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;HTML;CSS 66432|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|19464.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript 100060|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|100000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C# 47630|United States|Moderately satisfied|Mathematics or statistics|262000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|45 - 54 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML 47544|United States|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|55000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;Python;SQL;VB.NET;HTML;CSS;Bash/Shell 59201|New Zealand|Moderately satisfied|Computer science, computer engineering, or software engineering|87701.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|Go;JavaScript;Lua;PHP;Python;SQL;HTML;CSS;Bash/Shell 48597|France|Moderately satisfied|Information systems, information technology, or system administration|38184.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C++;Java;JavaScript;SQL;TypeScript;Visual Basic 6;HTML;CSS 70671|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|140000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;JavaScript;Objective-C;Ruby;Swift;HTML;CSS;Bash/Shell 58427|Argentina|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|26400.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 70505|Finland|Moderately dissatisfied|A business discipline (ex. accounting, finance, marketing)|64620.0|I don't typically exercise|Male|White or of European descent|Associate degree|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;HTML;CSS 71718|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|180000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|55 - 64 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Python;Ruby;Scala;SQL;Bash/Shell 31961|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|84000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 69533|India|Moderately satisfied|Computer science, computer engineering, or software engineering|5640.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|JavaScript;PHP;Python;HTML;CSS 91590|Germany|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|85671.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;PHP;Python;HTML;CSS;Bash/Shell 32597|Japan|Moderately satisfied|Computer science, computer engineering, or software engineering|0.0|Daily or almost every day|Male|White or of European descent|Associate degree|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Ruby;HTML;CSS;Bash/Shell 73273|India|Moderately satisfied|Computer science, computer engineering, or software engineering|20000.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;PHP;Python;SQL;VB.NET;HTML;CSS 60219|Hong Kong (S.A.R.)|Slightly satisfied|Computer science, computer engineering, or software engineering|67351.0|I don't typically exercise|Male|East Asian;South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C;C++;JavaScript;Python;TypeScript;Ocaml;Bash/Shell 98153|Australia|Extremely dissatisfied|A business discipline (ex. accounting, finance, marketing)|51983.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Ruby;SQL;HTML;CSS 51967|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|185400.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;F# 44558|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|51408.0|I don't typically exercise|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;PHP;TypeScript;HTML;CSS;Bash/Shell 43523|Germany|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|40388.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|R 68343|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|63979.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|45 - 54 years old|Between 1 and 2 years ago|C;CoffeeScript;JavaScript;Perl;PHP;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 70062|United States|Extremely satisfied|Information systems, information technology, or system administration|70000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Python;R;SQL 79309|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|160000.0|I don't typically exercise|Male|Black or of African descent|Primary/elementary school|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;Python;SQL;TypeScript;HTML;CSS 71745|Indonesia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|6984.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C;C++;C#;Java;JavaScript;PHP;SQL;TypeScript;VB.NET;Visual Basic 6;Kotlin;Delphi/Object Pascal;HTML;CSS 62008|Austria|Extremely satisfied|Computer science, computer engineering, or software engineering|22032.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Java;JavaScript;Python;Swift;Bash/Shell 941|United States|Neither satisfied nor dissatisfied|I never declared a major|72000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;VB.NET;HTML;CSS;Bash/Shell 52581|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|1000000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Go;Java;JavaScript;Python;Rust;HTML;CSS;Bash/Shell 69528|Bangladesh|Moderately satisfied|Computer science, computer engineering, or software engineering|10824.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Python 9141|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|70000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;C#;F#;Java;Python 100803|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|70000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;Python;HTML;CSS 487|Australia|Slightly satisfied|Computer science, computer engineering, or software engineering|87971.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C++;C#;JavaScript;SQL;TypeScript;HTML;CSS 92012|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|110000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;Objective-C;SQL;HTML;CSS;Bash/Shell 67184|Spain|Extremely satisfied|Computer science, computer engineering, or software engineering|24478.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Primary/elementary school|Over 4 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;PHP;Python;Delphi/Object Pascal;HTML;CSS;Bash/Shell 40645|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|175384.0|I don't typically exercise|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|55 - 64 years old|Less than a year ago|C;C++;Objective-C;Python 7842|Poland|Slightly satisfied|I never declared a major|12348.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;JavaScript;Lua;TypeScript;HTML;CSS;Bash/Shell 54102|India|Extremely satisfied|Computer science, computer engineering, or software engineering|18785.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Go;Java;PHP;Python;TypeScript;HTML;CSS 12334|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|37572.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;Python 5549|Hungary|Moderately satisfied|Computer science, computer engineering, or software engineering|32160.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C#;Java;JavaScript;SQL;TypeScript;HTML;CSS 85263|Australia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|63979.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Between 1 and 2 years ago|C;C++;Java;Objective-C;SQL;Swift 94464|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|280000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;Java;JavaScript;Lua;Objective-C;Python;R;Ruby;Rust;SQL;HTML;CSS;Bash/Shell 53082|Japan|Extremely dissatisfied|Computer science, computer engineering, or software engineering|54293.0|1 - 2 times per week|Male|East Asian|They never completed any formal education|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 43419|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|20592.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;Python;SQL;HTML;CSS;Bash/Shell 60065|Russian Federation|Slightly satisfied|Computer science, computer engineering, or software engineering|50400.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;CSS;Bash/Shell 51539|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|45528.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|More than 4 years ago|Java;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 45478|Canada|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|70054.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Python;SQL;CSS 93300|India|Slightly satisfied|Computer science, computer engineering, or software engineering|6576.0|1 - 2 times per week|Female|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;SQL 24330|Sri Lanka|Moderately satisfied|Computer science, computer engineering, or software engineering|16200.0|I don't typically exercise|Male|South Asian|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;SQL;TypeScript;HTML;CSS 63727|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|1440000.0|3 - 4 times per week|Female|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Python;SQL;HTML;CSS;Bash/Shell 96429|Liechtenstein|Extremely satisfied|Information systems, information technology, or system administration|0.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;JavaScript;Python;SQL;Swift;TypeScript;HTML;CSS 28342|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|35768.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;C#;Haskell;Java;Scala;SQL;Swift;HTML;CSS 80964|Argentina|Extremely satisfied|Computer science, computer engineering, or software engineering|14400.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;Python;TypeScript;HTML;CSS 49057|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|50005.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;PHP;TypeScript;HTML;CSS 49447|United Kingdom|Slightly dissatisfied|A natural science (ex. biology, chemistry, physics)|53061.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Python;R;SQL;Bash/Shell 24085|Nigeria|Moderately dissatisfied|Mathematics or statistics|2664.0|I don't typically exercise|Male|Black or of African descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;PHP;TypeScript;HTML;CSS 59755|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|55075.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;Python;HTML;CSS 14849|United States|Extremely satisfied|I never declared a major|120000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;R;SQL;TypeScript;VB.NET;HTML;CSS 34164|Philippines|Extremely satisfied|Computer science, computer engineering, or software engineering|18192.0|1 - 2 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C++;C#;Java;JavaScript;PHP;SQL;HTML;CSS 71508|Sweden|Slightly dissatisfied|Computer science, computer engineering, or software engineering|89832.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;F#;Java;Bash/Shell 18933|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|96000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Go;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 30031|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|135441.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;C++;C#;Lua;Matlab;Python;Bash/Shell 68789|Japan|Slightly dissatisfied|Information systems, information technology, or system administration|39257.0|1 - 2 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;Go;Java;JavaScript;Matlab;PHP;Swift;VBA;HTML 22841|Poland|Extremely satisfied|Computer science, computer engineering, or software engineering|35292.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 54999|Portugal|Slightly satisfied|Mathematics or statistics|73433.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;JavaScript;SQL;HTML;CSS;Bash/Shell 34076|United States|Moderately dissatisfied|A humanities discipline (ex. literature, history, philosophy)|82000.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 71431|Ukraine|Moderately dissatisfied|Computer science, computer engineering, or software engineering|14400.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Groovy;Java;Scala 70262|Switzerland|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|625620.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|65 years or older|More than 4 years ago|C;JavaScript;Perl;PHP;Ruby;HTML;CSS;Bash/Shell 5280|France|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|42836.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;SQL;Delphi/Object Pascal;HTML;CSS 101502|France|Moderately satisfied|Computer science, computer engineering, or software engineering|55075.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;Kotlin;HTML;CSS 47205|United Kingdom|Moderately dissatisfied|I never declared a major|62507.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;Rust;SQL;HTML;CSS;Bash/Shell 41513|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|2000000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;HTML;CSS 41433|Germany|Extremely dissatisfied|Computer science, computer engineering, or software engineering|85671.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;SQL;TypeScript;VB.NET;HTML;Bash/Shell 87857|Turkey|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|22248.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;SQL;Delphi/Object Pascal;HTML;CSS 69492|Poland|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|70572.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;R;Ruby;SQL;HTML;CSS;Bash/Shell 85880|United States|Moderately satisfied|I never declared a major|145000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Haskell;Java;JavaScript;Python;Scala;SQL;Bash/Shell 19053|Philippines|Moderately satisfied|Information systems, information technology, or system administration|15360.0|3 - 4 times per week|Male|East Asian|They never completed any formal education|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;VB.NET 28210|India|Slightly satisfied|Computer science, computer engineering, or software engineering|3756.0|Daily or almost every day|Female;Male|South Asian|Primary/elementary school|1 - 2 hours|18 - 24 years old|Less than a year ago|Assembly;Java;JavaScript;PHP;Python;SQL;HTML;CSS 21359|Switzerland|Slightly satisfied|Computer science, computer engineering, or software engineering|65064.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;C#;Java;JavaScript;PHP;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 89756|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|160000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;Objective-C;Ruby;Swift;HTML;CSS;Bash/Shell 12505|South Korea|Slightly satisfied|Information systems, information technology, or system administration|80000.0|I don't typically exercise|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;Objective-C;PHP;Python;SQL;Swift;Bash/Shell 13283|Norway|Moderately dissatisfied|Information systems, information technology, or system administration|765138.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C#;Python;SQL;TypeScript;Bash/Shell 20770|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|100652.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Clojure;Java;Ruby;SQL;Ocaml;HTML;CSS;Bash/Shell 15281|Brazil|Extremely dissatisfied|Computer science, computer engineering, or software engineering|22452.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Python 20489|Bangladesh|Slightly satisfied|Computer science, computer engineering, or software engineering|21660.0|3 - 4 times per week|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Scala;SQL;TypeScript;HTML;CSS;Bash/Shell 2941|Canada|Slightly satisfied|Computer science, computer engineering, or software engineering|74885.0|I don't typically exercise|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|Java;JavaScript;HTML;CSS;Bash/Shell 5875|Nigeria|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|4164.0|3 - 4 times per week|Male|Black or of African descent|Professional degree (JD, MD, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS 30029|Brazil|Moderately satisfied|Web development or web design|11232.0|I don't typically exercise|Male|Black or of African descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;PHP;SQL;Kotlin;HTML;CSS 84753|China|Moderately satisfied|Computer science, computer engineering, or software engineering|82592.0|3 - 4 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;Ruby;SQL;Swift;HTML;CSS 9193|Paraguay|Extremely dissatisfied|Computer science, computer engineering, or software engineering|200000.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;Objective-C;PHP;Python;SQL;Swift;HTML;CSS 60144|France|Moderately satisfied|Computer science, computer engineering, or software engineering|50179.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;JavaScript;Objective-C;Python;SQL;HTML;CSS;Bash/Shell 21376|Russian Federation|Slightly satisfied|Computer science, computer engineering, or software engineering|10620.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|PHP;Ruby;HTML;CSS 55750|Ireland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|85671.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;CoffeeScript;JavaScript;Ruby;SQL;TypeScript;HTML;CSS 52650|Russian Federation|Moderately satisfied|Information systems, information technology, or system administration|12732.0|3 - 4 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|18 - 24 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 7045|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|58340.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 74974|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|200000.0|3 - 4 times per week|Female|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C#;Java;Objective-C;PHP;Python;Ruby;SQL;Swift;VBA;VB.NET;Visual Basic 6 48918|Denmark|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|89148.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;Python;Delphi/Object Pascal 96692|Brazil|Slightly satisfied|Computer science, computer engineering, or software engineering|21336.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Ruby;SQL;HTML;CSS 23466|Germany|Moderately satisfied|Information systems, information technology, or system administration|16884.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C++;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 16315|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|45876.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C++;C#;Objective-C;Python;Ruby;SQL;Swift 64699|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|71000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;JavaScript;TypeScript;HTML;CSS 1225|United States|Moderately dissatisfied|A business discipline (ex. accounting, finance, marketing)|170000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 6917|France|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|58752.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|45 - 54 years old|Less than a year ago|Assembly;C;SQL;Delphi/Object Pascal;HTML;Bash/Shell 42719|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|89175.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|45 - 54 years old|More than 4 years ago|Java;JavaScript;SQL;HTML;CSS 44316|Norway|Moderately dissatisfied|Information systems, information technology, or system administration|77789.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|Groovy;JavaScript;Lua;Perl;HTML;CSS 41163|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|156000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Assembly;C;Java;Python;HTML;Bash/Shell 57059|Russian Federation|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|34176.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Java 71567|France|Slightly dissatisfied|Computer science, computer engineering, or software engineering|51408.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;TypeScript;Kotlin;HTML;CSS;Bash/Shell 80244|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|82000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 40583|Brazil|Moderately dissatisfied|Computer science, computer engineering, or software engineering|22452.0|1 - 2 times per week|Male|Black or of African descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;HTML;CSS 63877|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|62000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;TypeScript;HTML 75721|United States|Moderately satisfied|Mathematics or statistics|120000.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|45 - 54 years old|Between 1 and 2 years ago|JavaScript;SQL;Bash/Shell 9044|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|100000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Python;R;SQL;HTML;Bash/Shell 94033|Poland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|28236.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 21842|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|63979.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Python;Bash/Shell 25412|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|1800000.0|1 - 2 times per week|Female|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|JavaScript;Perl;PHP;Python;SQL;HTML;CSS;Bash/Shell 5637|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|145000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;PHP;SQL;VB.NET;HTML;CSS 81885|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|76514.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|45 - 54 years old|Between 2 and 4 years ago|Java;SQL;TypeScript;HTML;CSS 23811|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|36720.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Go;Java;JavaScript;Lua;Objective-C;Perl;PHP;Python;Rust;Swift 8491|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|155000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Clojure;Python;Ruby 22497|Russian Federation|Moderately satisfied|Computer science, computer engineering, or software engineering|14856.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Assembly;Groovy;Java;SQL;Bash/Shell 54105|United Kingdom|Moderately dissatisfied|Computer science, computer engineering, or software engineering|55562.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 34938|Brazil|Moderately dissatisfied|Web development or web design|33684.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 3527|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|90000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;SQL 33264|United States|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|88000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|45 - 54 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS 99086|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|100000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 73875|Pakistan|Extremely satisfied|Computer science, computer engineering, or software engineering|18000.0|1 - 2 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;TypeScript;Kotlin 52562|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;VB.NET;HTML;CSS 58428|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|135000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|55 - 64 years old|Between 2 and 4 years ago|Perl;Python 62328|Germany|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|17628.0|3 - 4 times per week|Male|Middle Eastern;White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;Java;JavaScript;Matlab;PHP;SQL 31791|Ireland|Moderately satisfied|Mathematics or statistics|64254.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 99681|United Kingdom|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|88899.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;Matlab;Python;HTML;CSS;Bash/Shell 49150|France|Moderately satisfied|Computer science, computer engineering, or software engineering|22320.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;Lua;PHP;Python;SQL;TypeScript;VBA;HTML;CSS;Bash/Shell 2590|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|137000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;Ruby;SQL;HTML;CSS 34691|Denmark|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|69036.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;Lua;Python;Bash/Shell 47689|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|56673.0|I don't typically exercise|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;PHP;Python;HTML;CSS;Bash/Shell 28311|France|Slightly dissatisfied|A business discipline (ex. accounting, finance, marketing)|48955.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;HTML;CSS 73456|Finland|Extremely satisfied|Computer science, computer engineering, or software engineering|63642.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Clojure;Java;JavaScript;Scala;SQL;HTML;CSS;Bash/Shell 86363|Italy|Slightly satisfied|Computer science, computer engineering, or software engineering|44060.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;PHP;Python;Ruby;HTML;CSS;Bash/Shell 41676|France|Moderately dissatisfied|Computer science, computer engineering, or software engineering|45732.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Python;Scala;TypeScript;HTML;CSS 30328|Australia|Slightly satisfied|Computer science, computer engineering, or software engineering|71976.0|3 - 4 times per week|Female|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;Java 49531|Belarus|Slightly satisfied|Computer science, computer engineering, or software engineering|8472.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|More than 4 years ago|Python;SQL 1395|Brazil|Slightly satisfied|Information systems, information technology, or system administration|9360.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Java;JavaScript;Python;SQL;HTML;CSS 63102|Australia|Extremely satisfied|Computer science, computer engineering, or software engineering|127957.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Clojure;JavaScript;Objective-C;Python;SQL;Swift;HTML;CSS;Bash/Shell 64911|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|966768.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;Java;JavaScript;SQL;HTML;CSS 39116|China|Slightly dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|13092.0|1 - 2 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Python;HTML;CSS 90189|India|Slightly satisfied|Computer science, computer engineering, or software engineering|2256.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|JavaScript;HTML;CSS 44567|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|122388.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;SQL;VBA;VB.NET;HTML;CSS 17871|United States|Slightly satisfied|Information systems, information technology, or system administration|58000.0|1 - 2 times per week|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 97417|Belarus|Moderately dissatisfied|Computer science, computer engineering, or software engineering|30000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C++;C#;SQL 93613|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|38337.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;C#;CoffeeScript;Java;JavaScript;Matlab;PHP;Python;SQL;TypeScript;VB.NET;HTML;CSS;Bash/Shell 28193|United Kingdom|Neither satisfied nor dissatisfied|A natural science (ex. biology, chemistry, physics)|173650.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Less than a year ago|C;Java;Objective-C;Swift;Kotlin;HTML 57405|Spain|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|32979.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;Python;Bash/Shell 96255|Spain|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|24478.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS 56472|Finland|Moderately satisfied|Mathematics or statistics|71232.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;Groovy;Java;JavaScript;PHP;Python;SQL;TypeScript;HTML 83120|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|61194.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 99052|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|67313.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;SQL 66979|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|92000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;Clojure;F#;Go;JavaScript;SQL;TypeScript 31119|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|173650.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Objective-C;Swift 38899|Israel|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|64944.0|I don't typically exercise|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Objective-C;Python;SQL;Swift;HTML;CSS 80757|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|30559.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Groovy;Java;JavaScript;Scala;Swift;Kotlin;Ocaml;Bash/Shell 62003|United States|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|87000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;Java;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 89038|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|822444.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Objective-C;HTML;CSS 23672|Ecuador|Slightly satisfied|Computer science, computer engineering, or software engineering|42000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Groovy;Java;JavaScript;Objective-C;SQL;TypeScript;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 49372|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|48000.0|1 - 2 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;HTML;CSS 22513|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|17592.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 64426|Spain|Moderately satisfied|Information systems, information technology, or system administration|29373.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;SQL 77327|India|Moderately satisfied|Computer science, computer engineering, or software engineering|15888.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 68270|India|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|6951.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;TypeScript;HTML;CSS 19324|Canada|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|32209.0|I don't typically exercise|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;C;C++;C#;Java;JavaScript;Julia;Matlab;PHP;Python;Bash/Shell 78291|Sweden|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|56591.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;Java;JavaScript;Ruby;SQL 19125|United Kingdom|Slightly dissatisfied|Computer science, computer engineering, or software engineering|62507.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Go;Java;JavaScript;Python;HTML;CSS 2404|Australia|Slightly satisfied|Information systems, information technology, or system administration|63835.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;Perl;PHP;Python;SQL;HTML;CSS;Bash/Shell 84046|France|Extremely satisfied|Computer science, computer engineering, or software engineering|35988.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;PHP;HTML;CSS 89877|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|67000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|35 - 44 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 84796|India|Slightly satisfied|Computer science, computer engineering, or software engineering|5256.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Objective-C;Swift 10333|El Salvador|Slightly dissatisfied|Computer science, computer engineering, or software engineering|9432.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C#;Python;VB.NET;Visual Basic 6 35830|Mexico|Moderately dissatisfied|Web development or web design|13536.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;PHP;SQL;TypeScript;VB.NET;HTML;CSS 56268|Canada|Extremely dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|201303.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;Haskell;JavaScript;Matlab;Python;SQL;VB.NET;HTML;CSS;Bash/Shell 33451|United States|Extremely satisfied|Information systems, information technology, or system administration|92000.0|Daily or almost every day|Male|White or of European descent|Associate degree|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 81|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|73428.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|C;C++;C#;Java;JavaScript;VB.NET;HTML;CSS;Bash/Shell 58242|Bangladesh|Slightly satisfied|Computer science, computer engineering, or software engineering|2604.0|I don't typically exercise|Female|East Asian|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS 16314|Nigeria|Moderately dissatisfied|Computer science, computer engineering, or software engineering|3096.0|I don't typically exercise|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;SQL;HTML;CSS 48723|Canada|Slightly dissatisfied|Computer science, computer engineering, or software engineering|96626.0|1 - 2 times per week|Female|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;Perl;HTML 19428|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|71500.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;Objective-C;Python;SQL;Swift;TypeScript;Kotlin;HTML;CSS;Bash/Shell 2382|Austria|Moderately satisfied|Computer science, computer engineering, or software engineering|57400.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C;Java;Python;Ruby 75427|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|88000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS;Bash/Shell 37441|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|106000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|Python;R;SQL;Bash/Shell 25755|Netherlands|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|61194.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Matlab;Python;Ruby;HTML;CSS 2367|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Java 81005|Russian Federation|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|24000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Python;TypeScript;HTML;CSS;Bash/Shell 6976|United States|Slightly dissatisfied|A social science (ex. anthropology, psychology, political science)|60060.0|1 - 2 times per week|Female|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;R;SQL;VBA;HTML;CSS 51524|France|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|46507.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;SQL;Bash/Shell 67784|Switzerland|Extremely dissatisfied|Computer science, computer engineering, or software engineering|62556.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;R 91089|Poland|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|44111.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|45 - 54 years old|More than 4 years ago|JavaScript;Lua;PHP;Python;SQL;HTML;CSS;Bash/Shell 98712|France|Moderately dissatisfied|Web development or web design|666744.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS 11126|India|Slightly satisfied|Computer science, computer engineering, or software engineering|10958.0|Daily or almost every day|Male|South Asian|Primary/elementary school|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;Python;TypeScript;HTML;CSS;Bash/Shell 41240|Singapore|Slightly satisfied|Computer science, computer engineering, or software engineering|54504.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;Objective-C;PHP;Python;SQL;HTML;CSS;Bash/Shell 71104|Switzerland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|112611.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;Java 16345|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|155000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Less than a year ago|C;C++;C#;Go;Groovy;Java;JavaScript;Lua;Objective-C;Perl;PHP;Python;SQL;TypeScript;VB.NET;HTML;CSS;Bash/Shell 48980|Canada|Slightly dissatisfied|Computer science, computer engineering, or software engineering|30598.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;C#;JavaScript;SQL;HTML;CSS 4495|Netherlands|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|105253.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C;C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS 101524|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|80000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Go;JavaScript;Python;SQL;TypeScript;Bash/Shell 96543|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 51342|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|40000.0|Daily or almost every day|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Assembly;C;C++;C#;JavaScript;Lua;Objective-C;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 41205|Poland|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|32460.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;SQL;Bash/Shell 89555|Spain|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|35492.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;C# 9323|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|90000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS 94866|Italy|Moderately satisfied|Computer science, computer engineering, or software engineering|39164.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Go;Java 46524|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|225000.0|I don't typically exercise|Male|East Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|45 - 54 years old|Less than a year ago|C++;Java;Python;R;Scala;Bash/Shell 12942|India|Slightly satisfied|Computer science, computer engineering, or software engineering|28961.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python;SQL;HTML;CSS 28200|United Kingdom|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|58340.0|3 - 4 times per week|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;R 75631|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|112730.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 14693|Viet Nam|Slightly satisfied|Computer science, computer engineering, or software engineering|7200.0|I don't typically exercise|Male|Native American, Pacific Islander, or Indigenous Australian|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|PHP;Python;Ruby;HTML 84818|Belarus|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|6048.0|I don't typically exercise|Female|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|Java;SQL;Kotlin 56038|Canada|Moderately dissatisfied|Computer science, computer engineering, or software engineering|58781.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C;C++;C#;Java;JavaScript;SQL;VBA;HTML 11653|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|70000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Go;Python;Ruby;SQL;Kotlin;HTML;CSS;Bash/Shell 87536|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|345000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 1790|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|60000.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 39829|United States|Moderately dissatisfied|Mathematics or statistics|75000.0|I don't typically exercise|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|PHP;Python 8186|United States|Moderately dissatisfied|Mathematics or statistics|100000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;Python;SQL;HTML;Bash/Shell 34981|Australia|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|53582.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|Java;SQL;Bash/Shell 570|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|34726.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;Scala;SQL;HTML;CSS 9385|Romania|Moderately dissatisfied|Mathematics or statistics|10284.0|I don't typically exercise|Male|White or of European descent|Associate degree|3 - 4 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;C#;Java;Matlab 21140|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|6012.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C#;Java;JavaScript;Ruby 63173|United States|Moderately satisfied|Mathematics or statistics|66000.0|3 - 4 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;C#;JavaScript;PHP;Python;R;Ruby;SQL;VBA;Visual Basic 6;HTML;CSS 74670|Russian Federation|Moderately satisfied|Information systems, information technology, or system administration|33972.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 2813|Spain|Moderately dissatisfied|A humanities discipline (ex. literature, history, philosophy)|35988.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|Between 1 and 2 years ago|JavaScript;PHP;Ruby;SQL;HTML;CSS 24634|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|80000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C;C#;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 30790|Poland|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|40584.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|PHP;Python;Ruby;HTML;CSS;Bash/Shell 19820|Costa Rica|Slightly satisfied|Computer science, computer engineering, or software engineering|45000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|More than 4 years ago|Java;JavaScript;SQL;HTML;CSS;Bash/Shell 6792|France|Moderately satisfied|Computer science, computer engineering, or software engineering|0.0|3 - 4 times per week|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Scala;SQL;CSS;Bash/Shell 50772|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|35244.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 21268|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|58340.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;Python;SQL;HTML;CSS 16814|Switzerland|Extremely satisfied|Computer science, computer engineering, or software engineering|93842.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;Java;JavaScript;Lua;Perl;PHP;Ruby;SQL;HTML;CSS;Bash/Shell 78559|Brazil|Slightly dissatisfied|Mathematics or statistics|524016.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|55 - 64 years old|More than 4 years ago|Java;JavaScript;PHP;SQL;Cobol;HTML;CSS;Bash/Shell 13456|Australia|Slightly satisfied|Mathematics or statistics|111963.0|I don't typically exercise|Male|East Asian|Professional degree (JD, MD, etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|C;C++;R;SQL;Bash/Shell 82479|United States|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|64000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C;Java;JavaScript;PHP;Python;SQL;HTML;CSS 12687|United States|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|85000.0|1 - 2 times per week|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|R;SQL;HTML 95004|United States|Extremely satisfied|Information systems, information technology, or system administration|84000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;HTML 68560|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|50000.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;Go;Haskell;Java;Python;Ruby;HTML;CSS;Bash/Shell 73332|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|25003.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS 35379|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|82000.0|1 - 2 times per week|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C++;Java;JavaScript;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 490|Ireland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|48955.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Go;Groovy;JavaScript;Python;Ruby;SQL;HTML;CSS;Bash/Shell 87076|United Kingdom|Moderately satisfied|I never declared a major|44449.0|I don't typically exercise|Male|White or of European descent|They never completed any formal education|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 79639|India|Moderately satisfied|Web development or web design|5640.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;Java;JavaScript;PHP;HTML;CSS 15904|Nepal|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|1176.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;Matlab;PHP;SQL;HTML;CSS 51794|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|48616.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;SQL;Kotlin 63047|Australia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|59980.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;Groovy;PHP;SQL;VB.NET;HTML;CSS 42429|Germany|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|30597.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Python;R;Scala 32414|France|Extremely satisfied|Computer science, computer engineering, or software engineering|153000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;F#;JavaScript;PHP;SQL;TypeScript;HTML;CSS 4503|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|122388.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C# 7602|Netherlands|Slightly dissatisfied|Computer science, computer engineering, or software engineering|44064.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 72122|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|170000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Bash/Shell 3013|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|70000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;C#;Clojure;Java;JavaScript;PHP;Python;Ruby;SQL;HTML;CSS 62829|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|79973.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Groovy;JavaScript;Python;Ruby;Bash/Shell 5123|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|78000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Go;Groovy;Java;Python;Scala;Bash/Shell 88781|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|51408.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Haskell;Java;JavaScript;PHP;Python;Scala;SQL;Bash/Shell 63483|United States|Slightly dissatisfied|A humanities discipline (ex. literature, history, philosophy)|110.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|55 - 64 years old|Between 2 and 4 years ago|R;SQL;VBA;VB.NET;HTML 16053|India|Extremely dissatisfied|Computer science, computer engineering, or software engineering|9393.0|I don't typically exercise|Male|South Asian|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|C#;JavaScript;Python;HTML;CSS;Bash/Shell 69725|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|51403.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 10999|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Lua;TypeScript;HTML;CSS;Bash/Shell 83532|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|87140.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;C++;Java;Perl;SQL;Bash/Shell 76724|Switzerland|Moderately satisfied|Web development or web design|145977.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 85116|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|73433.0|1 - 2 times per week|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Scala 20951|United Kingdom|Slightly dissatisfied|I never declared a major|60423.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 60284|Sweden|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|1000000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|Less than a year ago|C++;Java;Python;HTML 22627|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|126000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 20435|India|Slightly satisfied|Computer science, computer engineering, or software engineering|15588.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Assembly;JavaScript;Python;SQL;HTML;CSS 72885|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|49000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;Python;Ruby;SQL;HTML;CSS 32001|Estonia|Moderately satisfied|Computer science, computer engineering, or software engineering|33780.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Python;HTML;CSS;Bash/Shell 62735|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|85000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 5375|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|35292.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;HTML;CSS;Bash/Shell 42856|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|0.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|3 - 4 hours|35 - 44 years old|More than 4 years ago|PHP;R;SQL;HTML 48911|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|128000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|Assembly;Java;JavaScript;Python;Rust;TypeScript;HTML;CSS;Bash/Shell 57001|Sweden|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|45960.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;Python;HTML;CSS;Bash/Shell 66260|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|125000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|Assembly;C;Go;Haskell;Rust;SQL;HTML;Bash/Shell 73890|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|145000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|55 - 64 years old|Between 1 and 2 years ago|SQL;Bash/Shell 76127|France|Extremely satisfied|Computer science, computer engineering, or software engineering|63642.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Clojure;Go;Python;SQL 19519|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|50000.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 60684|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|85000.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 87223|India|Moderately satisfied|Computer science, computer engineering, or software engineering|16152.0|3 - 4 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 70924|Russian Federation|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|16980.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;Python 14094|Ukraine|Slightly dissatisfied|Computer science, computer engineering, or software engineering|37200.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 66626|Pakistan|Slightly satisfied|Information systems, information technology, or system administration|36000.0|Daily or almost every day|Male|South Asian|Professional degree (JD, MD, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;Java 60140|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|130000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Go;Java;JavaScript;Scala;SQL;Bash/Shell 91030|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|1000000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|C;Go;Ruby;Bash/Shell 53954|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|55075.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Python 95445|Belgium|Extremely dissatisfied|Computer science, computer engineering, or software engineering|122388.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Java;JavaScript;Python;Swift 12183|Italy|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|63642.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;PHP;Rust;SQL;Bash/Shell 44304|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|138000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Bash/Shell 77250|Brazil|Slightly dissatisfied|Information systems, information technology, or system administration|13104.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS 79913|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|136000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;JavaScript;Objective-C;Perl;Python;Ruby;Rust;Swift;HTML;CSS;Bash/Shell 78332|India|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|187848.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Python;SQL;Bash/Shell 28716|United States|Slightly satisfied|A social science (ex. anthropology, psychology, political science)|180000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Groovy;Java;JavaScript;HTML;CSS;Bash/Shell 84879|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|85000.0|1 - 2 times per week|Female|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|45 - 54 years old|More than 4 years ago|JavaScript;SQL;VB.NET;HTML;CSS 28120|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|2160.0|1 - 2 times per week|Male|South Asian|Primary/elementary school|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Java 50021|Russian Federation|Slightly satisfied|Computer science, computer engineering, or software engineering|37800.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 100789|Bosnia and Herzegovina|Slightly dissatisfied|Information systems, information technology, or system administration|31705.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;Java;JavaScript;SQL;HTML;CSS 90390|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|100000.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Groovy;Java;JavaScript;PHP;Ruby;SQL;TypeScript;HTML;CSS 16471|United Kingdom|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|152794.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C++;Hack;Java;JavaScript;Python;HTML 24464|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|98000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 88527|Ecuador|Moderately satisfied|Computer science, computer engineering, or software engineering|21600.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;Matlab;Python;SQL;HTML;CSS;Bash/Shell 6695|United Kingdom|Moderately satisfied|Information systems, information technology, or system administration|23336.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|More than 4 years ago|JavaScript;Lua;PHP;SQL;Delphi/Object Pascal;HTML;CSS 90321|Finland|Extremely satisfied|Computer science, computer engineering, or software engineering|55075.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Java;JavaScript;PHP;Scala;HTML;CSS 29047|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|300000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C#;Java;JavaScript;PHP;SQL;VBA;VB.NET;HTML 97644|India|Extremely satisfied|Computer science, computer engineering, or software engineering|3756.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Java;JavaScript;Ruby;SQL;HTML;CSS 4160|United States|Neither satisfied nor dissatisfied|Mathematics or statistics|60000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|SQL;HTML;CSS 99606|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|140000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;SQL;CSS;Bash/Shell 55512|Portugal|Moderately satisfied|Computer science, computer engineering, or software engineering|15864.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C#;Java;JavaScript;Swift 50338|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|145000.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|45 - 54 years old|Between 2 and 4 years ago|Groovy;JavaScript;Python;Bash/Shell 81234|Portugal|Moderately dissatisfied|Web development or web design|22275.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;Lua;Matlab;Objective-C;PHP;SQL;HTML;CSS 40875|Germany|Moderately satisfied|Information systems, information technology, or system administration|383074.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 72137|India|Moderately satisfied|Computer science, computer engineering, or software engineering|8448.0|Daily or almost every day|Male|South Asian|Primary/elementary school|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;HTML;CSS 20875|India|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|11268.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 73453|Czech Republic|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|23172.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;HTML;CSS 73300|United States|Slightly satisfied|Information systems, information technology, or system administration|50000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 41867|Philippines|Moderately satisfied|Computer science, computer engineering, or software engineering|500.0|1 - 2 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Over 4 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;JavaScript;PHP;SQL;VB.NET;Visual Basic 6;HTML;CSS 43320|New Zealand|Slightly dissatisfied|Computer science, computer engineering, or software engineering|86000.0|Daily or almost every day|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Scala;SQL;HTML;CSS 20538|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|110000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Ruby;HTML;CSS;Bash/Shell 85535|United States|Moderately dissatisfied|Mathematics or statistics|80000.0|Daily or almost every day|Female;Transgender|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Objective-C;Python;SQL;Swift;HTML;CSS 29774|Spain|Slightly dissatisfied|Computer science, computer engineering, or software engineering|22030.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 46476|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|56376.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java 24181|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|107500.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|45 - 54 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 17184|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|95000.0|3 - 4 times per week|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Swift;Kotlin 4356|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|75000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 57826|United States|Moderately satisfied|Mathematics or statistics|86000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;CoffeeScript;JavaScript;R;TypeScript;HTML;CSS;Bash/Shell 2031|Serbia|Moderately satisfied|Computer science, computer engineering, or software engineering|5880.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|CoffeeScript;Go;JavaScript;HTML;CSS 534|France|Extremely satisfied|Computer science, computer engineering, or software engineering|39776.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Go;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 11106|India|Slightly satisfied|Computer science, computer engineering, or software engineering|266748.0|1 - 2 times per week|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Python;TypeScript;HTML;CSS 29410|France|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|58746.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;Lua;PHP;Python;HTML;CSS;Bash/Shell 71361|Poland|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|15876.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;JavaScript;TypeScript;Kotlin;Bash/Shell 16811|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|5256.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;PHP;SQL;HTML;CSS 46426|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|150000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;Clojure;Go;Java;JavaScript;Objective-C;Python;Ruby;Swift;HTML;CSS;Bash/Shell 43088|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|63642.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;TypeScript;HTML;CSS 99172|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|125000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|F#;Haskell;Python;Rust;HTML;CSS 84987|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;CoffeeScript;Java;JavaScript;PHP;Python;SQL;HTML;CSS 75959|Czech Republic|Moderately satisfied|Computer science, computer engineering, or software engineering|57912.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Objective-C;Swift 50364|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|62500.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Less than a year ago|CoffeeScript;Haskell;JavaScript;Perl;PHP;Python;R;SQL;HTML;CSS;Bash/Shell 23574|Germany|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|79552.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C++;Java;Matlab;Python 52222|France|Extremely satisfied|Computer science, computer engineering, or software engineering|53239.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;JavaScript;Python 64444|Netherlands|Extremely satisfied|Computer science, computer engineering, or software engineering|39648.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;HTML;CSS 78138|Australia|Moderately satisfied|Information systems, information technology, or system administration|145552.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;Ruby;HTML;CSS;Bash/Shell 48051|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|31253.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;TypeScript 61359|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|120000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;C#;Groovy;Java;JavaScript;Python;Ruby;TypeScript;HTML;CSS;Bash/Shell 2780|India|Moderately satisfied|Computer science, computer engineering, or software engineering|17220.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Ruby;TypeScript 63808|Australia|Moderately satisfied|Information systems, information technology, or system administration|79973.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|Between 2 and 4 years ago|Python;SQL 16265|Algeria|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|18000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Perl;PHP;Python;HTML;CSS 101560|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|85000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 12381|Mexico|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|22560.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 78828|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|96538.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;SQL;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 75343|United Kingdom|Extremely dissatisfied|Computer science, computer engineering, or software engineering|38199.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;Groovy;Java;JavaScript;Objective-C;PHP;SQL;HTML;CSS;Bash/Shell 20023|Russian Federation|Extremely dissatisfied|Computer science, computer engineering, or software engineering|25476.0|1 - 2 times per week|Male|Native American, Pacific Islander, or Indigenous Australian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;HTML;CSS 101179|Canada|Slightly satisfied|Information systems, information technology, or system administration|56365.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;Go;Groovy;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 55250|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|33684.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|Python;Bash/Shell 30850|United Kingdom|Extremely satisfied|Mathematics or statistics|122930.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;JavaScript;Python;SQL;Bash/Shell 51819|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|50000.0|I don't typically exercise|Female|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;SQL;HTML;CSS;Bash/Shell 33471|Dominican Republic|Slightly satisfied|Mathematics or statistics|15000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Matlab;SQL;TypeScript;HTML;CSS 30604|India|Slightly dissatisfied|A business discipline (ex. accounting, finance, marketing)|9393.0|I don't typically exercise|Male|South Asian|Associate degree|30 - 59 minutes|18 - 24 years old|Less than a year ago|JavaScript;Python;TypeScript;CSS 83499|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|23614.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;PHP;Python;TypeScript;HTML;CSS;Bash/Shell 83639|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|230000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|45 - 54 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 83783|Germany|Extremely satisfied|Mathematics or statistics|111373.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;VB.NET 79780|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;C++;Python;Bash/Shell 86720|Hungary|Moderately satisfied|Computer science, computer engineering, or software engineering|30960.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 48282|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|195000.0|Daily or almost every day|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Java;JavaScript;SQL;HTML;Bash/Shell 84910|India|Extremely satisfied|Computer science, computer engineering, or software engineering|5256.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;Python;HTML;CSS;Bash/Shell 100004|Colombia|Slightly satisfied|Computer science, computer engineering, or software engineering|4800.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;Java;SQL 75517|Poland|Slightly dissatisfied|Information systems, information technology, or system administration|19056.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Go;Lua;Python;SQL;HTML;CSS;Bash/Shell 98211|Ukraine|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|18792.0|1 - 2 times per week|Male|Middle Eastern|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Python;TypeScript;HTML;CSS;Bash/Shell 27604|United States|Slightly satisfied|Information systems, information technology, or system administration|80000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Assembly;C;C++;Java;JavaScript;HTML;CSS;Bash/Shell 23397|France|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|32808.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C++;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 46202|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|8448.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C++;Java;Kotlin 76568|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|169000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Go;Java;JavaScript;Python;HTML;CSS;Bash/Shell 48134|China|Slightly dissatisfied|Computer science, computer engineering, or software engineering|46752.0|3 - 4 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;C#;Go;Java;JavaScript;Lua;Rust;SQL;TypeScript;HTML;Bash/Shell 22334|Iran, Islamic Republic of...|Moderately satisfied|Computer science, computer engineering, or software engineering|16644.0|I don't typically exercise|Male|Middle Eastern|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Groovy;Java;PHP;SQL;HTML;CSS;Bash/Shell 15385|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|60000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|They never completed any formal education|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;JavaScript;PHP;SQL;TypeScript;HTML;CSS 82822|Australia|Extremely satisfied|Computer science, computer engineering, or software engineering|99967.0|I don't typically exercise|Male|White or of European descent|They never completed any formal education|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;Python;R;Scala;SQL 97738|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|97233.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;Perl;Python;Ruby;SQL;HTML;Bash/Shell 16896|Canada|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|64417.0|3 - 4 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Matlab;Python;R;SQL;TypeScript;HTML;CSS;Bash/Shell 93479|Philippines|Moderately dissatisfied|Information systems, information technology, or system administration|2364.0|3 - 4 times per week|Male|South Asian|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C#;Java;JavaScript;PHP;TypeScript;HTML;CSS 71306|India|Extremely dissatisfied|Computer science, computer engineering, or software engineering|7827.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;Matlab;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 93666|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|82000.0|1 - 2 times per week|Female;Transgender|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C++;JavaScript;Python;HTML;CSS;Bash/Shell 50748|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|20664.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;Python;Bash/Shell 36106|Ethiopia|Slightly satisfied|Computer science, computer engineering, or software engineering|8712.0|1 - 2 times per week|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 90850|United Kingdom|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|51394.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Go;Julia;Python;Bash/Shell 55558|France|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|44064.0|Daily or almost every day|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|3 - 4 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Python;SQL;HTML;CSS;Bash/Shell 62237|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|134627.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|C++;Go;Haskell;Java;JavaScript;Perl;Python;Ruby;Scala;SQL;CSS;Bash/Shell 97861|India|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|7512.0|1 - 2 times per week|Female|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;HTML;CSS 36530|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|40388.0|3 - 4 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;R;Scala 9678|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|58869.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Perl 19688|United Kingdom|Moderately satisfied|Mathematics or statistics|90288.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;TypeScript;VBA;VB.NET;HTML;CSS;Bash/Shell 15942|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|74500.0|3 - 4 times per week|Male|Native American, Pacific Islander, or Indigenous Australian;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 59483|Australia|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|67977.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Go;JavaScript;Python;TypeScript;HTML;CSS;Bash/Shell 61127|Denmark|Extremely satisfied|Computer science, computer engineering, or software engineering|69036.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Go;JavaScript;PHP;Rust;HTML;CSS;Bash/Shell 80668|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|75000.0|3 - 4 times per week|Male|Middle Eastern;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 69440|Malta|Moderately satisfied|Information systems, information technology, or system administration|55075.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;HTML 63833|Russian Federation|Moderately satisfied|A health science (ex. nursing, pharmacy, radiology)|55200.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;Objective-C;PHP;Python;SQL;Swift;HTML;CSS;Bash/Shell 90696|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|1000000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|Between 1 and 2 years ago|C++;PHP;Delphi/Object Pascal 85099|Sri Lanka|Moderately satisfied|Information systems, information technology, or system administration|17124.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 99863|Sweden|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|43416.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 96909|Russian Federation|Moderately satisfied|Computer science, computer engineering, or software engineering|10620.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Java;PHP;Python;Rust;SQL;Bash/Shell 51449|Germany|Extremely satisfied|Computer science, computer engineering, or software engineering|76368.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C++;JavaScript;Python;Bash/Shell 62686|Ghana|Slightly dissatisfied|Computer science, computer engineering, or software engineering|10008.0|I don't typically exercise|Female|Black or of African descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Groovy;Java;JavaScript;Objective-C;Python;SQL;Swift;Kotlin;HTML;CSS 59537|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|2000000.0|3 - 4 times per week|Male|Native American, Pacific Islander, or Indigenous Australian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Python;R;SQL;VBA 22311|United States|Slightly dissatisfied|A humanities discipline (ex. literature, history, philosophy)|85000.0|3 - 4 times per week|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|JavaScript;Python;R;SQL;HTML;CSS 39522|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|56298.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;R;HTML 97303|United States|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|115000.0|I don't typically exercise|Male|East Asian;White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;SQL;Swift;HTML;CSS 45144|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|170000.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Assembly;C;C++;Python;Bash/Shell 10607|Italy|Slightly satisfied|Computer science, computer engineering, or software engineering|3060.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;Java;JavaScript;Matlab;PHP;HTML;CSS 3243|Malaysia|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|12132.0|3 - 4 times per week|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|Go;JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 92845|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|104678.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C#;Java;JavaScript;Perl;SQL;VB.NET;HTML;CSS 15321|United States|Extremely satisfied|I never declared a major|50000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Objective-C;Python;SQL;Swift;TypeScript;HTML;CSS 95388|Canada|Moderately dissatisfied|Computer science, computer engineering, or software engineering|66027.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Assembly;C;Go;Python;Ruby;SQL;Swift;HTML;CSS;Bash/Shell 29027|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Groovy;JavaScript;Lua;TypeScript;HTML;CSS 52183|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|19920.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS 60295|Poland|Moderately dissatisfied|A business discipline (ex. accounting, finance, marketing)|28236.0|1 - 2 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;HTML;CSS 93138|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|73433.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C++;C#;HTML;CSS 10267|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|89266.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 5998|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|41671.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 14244|Spain|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|33045.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;SQL 25786|Netherlands|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|30156.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Groovy;Java;JavaScript;PHP;Python;Ruby;SQL;HTML;CSS;Bash/Shell 27262|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;F#;JavaScript;SQL;HTML;CSS 22522|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|40000.0|I don't typically exercise|Transgender|White or of European descent|Associate degree|Less than 30 minutes|55 - 64 years old|More than 4 years ago|Delphi/Object Pascal 49890|Austria|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|20556.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;Java;Objective-C;PHP;Python;R;SQL;Swift;VBA;VB.NET;Visual Basic 6;Delphi/Object Pascal;HTML;CSS;Bash/Shell 14105|France|Moderately satisfied|Computer science, computer engineering, or software engineering|646212.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Objective-C;Swift 30500|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|30108.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Objective-C;Swift 28912|United Kingdom|Extremely satisfied|Mathematics or statistics|44449.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Python;R;SQL;VBA 38265|India|Moderately satisfied|Computer science, computer engineering, or software engineering|18785.0|Daily or almost every day|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Python 17638|Canada|Extremely satisfied|Information systems, information technology, or system administration|48152.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 9686|Nepal|Slightly satisfied|Computer science, computer engineering, or software engineering|91644.0|I don't typically exercise|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS 101333|Japan|Slightly satisfied|Computer science, computer engineering, or software engineering|30252.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 41415|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|36720.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|More than 4 years ago|C#;JavaScript;PHP;Python;SQL;Swift;HTML;CSS 17445|United States|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|2000000.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;PHP;SQL;TypeScript;VBA;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 68783|Italy|Extremely satisfied|Computer science, computer engineering, or software engineering|12239.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|Assembly;C;C++;Java;JavaScript;Matlab;PHP;SQL;Visual Basic 6;Kotlin;Cobol;HTML;CSS;Bash/Shell 69496|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|44916.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;SQL 65777|China|Extremely satisfied|Computer science, computer engineering, or software engineering|31167.0|3 - 4 times per week|Male|South Asian|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 26886|Netherlands|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|46992.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;HTML;CSS 63693|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|140000.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|3 - 4 hours|35 - 44 years old|Between 1 and 2 years ago|JavaScript;Objective-C;PHP;SQL;Swift;HTML;CSS;Bash/Shell 81657|Philippines|Extremely dissatisfied|Information systems, information technology, or system administration|2880.0|3 - 4 times per week|Male|East Asian;South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;HTML;CSS 24645|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|122500.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Go;Python;Bash/Shell 25501|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|52339.0|1 - 2 times per week|Female|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 56974|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|55000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|3 - 4 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML 64248|France|Moderately satisfied|Computer science, computer engineering, or software engineering|64866.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS 2996|Pakistan|Slightly satisfied|Computer science, computer engineering, or software engineering|1632.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;C#;Objective-C;PHP;Python;SQL;VB.NET;Visual Basic 6;HTML;CSS 90854|Italy|Slightly satisfied|Computer science, computer engineering, or software engineering|411228.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript 20057|United States|Extremely satisfied|A business discipline (ex. accounting, finance, marketing)|101200.0|Daily or almost every day|Female|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;R;SQL;TypeScript;HTML;CSS 97256|Belgium|Slightly dissatisfied|A health science (ex. nursing, pharmacy, radiology)|35244.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Perl;PHP;R;SQL;Delphi/Object Pascal;HTML;CSS;Bash/Shell 23532|India|Slightly satisfied|Computer science, computer engineering, or software engineering|2256.0|Daily or almost every day|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;Python;HTML;CSS 73523|Bosnia and Herzegovina|Moderately satisfied|Computer science, computer engineering, or software engineering|24972.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Less than a year ago|Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 13367|Colombia|Slightly satisfied|Computer science, computer engineering, or software engineering|14760.0|Daily or almost every day|Female|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;Objective-C;Python;SQL;Swift;TypeScript;HTML;CSS 10529|France|Moderately satisfied|Computer science, computer engineering, or software engineering|46507.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;JavaScript;Rust;SQL;HTML 39759|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|44287.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;HTML;CSS 66148|South Korea|Extremely satisfied|Computer science, computer engineering, or software engineering|62808.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;Python 51814|Spain|Slightly satisfied|Computer science, computer engineering, or software engineering|176244.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|Over 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 64181|United States|Moderately satisfied|Information systems, information technology, or system administration|85000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;SQL;HTML;CSS 730|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|63979.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;Visual Basic 6;HTML;CSS 23233|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|66767.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|R 18141|United States|Moderately satisfied|Web development or web design|94000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;JavaScript;PHP;SQL;HTML;CSS 45551|United Kingdom|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|750084.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Python;SQL;HTML;CSS 93449|United Kingdom|Slightly dissatisfied|Web development or web design|34726.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS 10026|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|90000.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C++;C#;Java;JavaScript;Matlab;PHP;Python;SQL;HTML;CSS;Bash/Shell 74621|Australia|Extremely dissatisfied|Information systems, information technology, or system administration|1000000.0|I don't typically exercise|Male|East Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C#;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 7708|Belgium|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|61680.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|45 - 54 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 7447|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|58746.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;Bash/Shell 79990|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|44300.0|3 - 4 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Assembly;C++;JavaScript;TypeScript;HTML;CSS;Bash/Shell 28161|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|64417.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;JavaScript;Python;Bash/Shell 10413|Sri Lanka|Moderately satisfied|Computer science, computer engineering, or software engineering|1560.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;VB.NET;HTML;CSS 95567|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|25008.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|CoffeeScript;JavaScript;TypeScript;HTML;CSS 100370|India|Moderately satisfied|Computer science, computer engineering, or software engineering|1884.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;C#;Java;JavaScript;PHP;SQL;VB.NET;Visual Basic 6;HTML;CSS 54239|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|1000000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 3153|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|100000.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Python 10899|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|117000.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|Assembly;C;C++;Go;Haskell;JavaScript;Python;SQL;HTML 18893|Indonesia|Slightly satisfied|Computer science, computer engineering, or software engineering|3576.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS 25177|Germany|Extremely dissatisfied|Information systems, information technology, or system administration|73433.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 73107|India|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|3757.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;Python;HTML;CSS 88965|India|Slightly dissatisfied|Computer science, computer engineering, or software engineering|14652.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Hack;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 58969|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|19447.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C++;Matlab;Perl;Python;R;Bash/Shell 27413|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|88000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 73404|Germany|Slightly satisfied|A business discipline (ex. accounting, finance, marketing)|97910.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|JavaScript;PHP;HTML;CSS;Bash/Shell 17508|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|76397.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;VBA;VB.NET;HTML;CSS 58546|Denmark|Extremely dissatisfied|A business discipline (ex. accounting, finance, marketing)|164366.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|55 - 64 years old|Between 2 and 4 years ago|C;C#;VBA;VB.NET;Visual Basic 6;HTML 27955|Czech Republic|Moderately satisfied|Computer science, computer engineering, or software engineering|23748.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;SQL;TypeScript;HTML;CSS 100426|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|90000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 99601|Pakistan|Extremely satisfied|Computer science, computer engineering, or software engineering|8676.0|3 - 4 times per week|Male|South Asian|Primary/elementary school|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;C#;Java;JavaScript;PHP;SQL;HTML;CSS 98246|Spain|Slightly satisfied|Computer science, computer engineering, or software engineering|381852.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Python 30279|Iceland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|116862.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;TypeScript;HTML;CSS;Bash/Shell 33525|Spain|Slightly dissatisfied|Computer science, computer engineering, or software engineering|44060.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 48188|United States|Moderately dissatisfied|A social science (ex. anthropology, psychology, political science)|55000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS 76866|Iran, Islamic Republic of...|Moderately satisfied|Computer science, computer engineering, or software engineering|26640.0|I don't typically exercise|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C#;Java 6252|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|38893.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;Matlab;Objective-C;PHP;SQL;Swift;HTML;CSS 95184|India|Moderately satisfied|Computer science, computer engineering, or software engineering|17220.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 34209|Germany|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|88119.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|55 - 64 years old|Between 2 and 4 years ago|Assembly;C;JavaScript;Perl;Cobol 8224|India|Moderately satisfied|Computer science, computer engineering, or software engineering|6262.0|Daily or almost every day|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 6928|South Africa|Extremely dissatisfied|A natural science (ex. biology, chemistry, physics)|19584.0|I don't typically exercise|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Python 64192|Germany|Moderately dissatisfied|A social science (ex. anthropology, psychology, political science)|44064.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;C;C++;Go;JavaScript;Python;Rust;HTML;CSS;Bash/Shell 41846|Czech Republic|Moderately satisfied|Computer science, computer engineering, or software engineering|45972.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Clojure;Go;Groovy;Java;JavaScript;PHP;Scala;HTML;CSS;Bash/Shell 50698|United Kingdom|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|62507.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;Python;SQL 71898|United States|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|148000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Clojure;Groovy;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 22169|United States|Moderately dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|115000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 30372|Canada|Slightly satisfied|Computer science, computer engineering, or software engineering|38652.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Go;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 17509|Australia|Slightly dissatisfied|Information systems, information technology, or system administration|43985.0|1 - 2 times per week|Male|South Asian|They never completed any formal education|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;PHP;HTML;CSS 76892|Singapore|Slightly satisfied|Computer science, computer engineering, or software engineering|90840.0|3 - 4 times per week|Male|South Asian|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java 4577|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|118280.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|C#;SQL 32046|United States|Extremely satisfied|Information systems, information technology, or system administration|150000.0|3 - 4 times per week|Male|Middle Eastern;White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;Python;SQL;HTML;CSS;Bash/Shell 95347|Japan|Moderately satisfied|Computer science, computer engineering, or software engineering|59424.0|I don't typically exercise|Male|East Asian;South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;Objective-C;Python;Ruby;SQL;Swift;Kotlin 84660|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|127000.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;HTML;CSS 66907|Canada|Slightly dissatisfied|Computer science, computer engineering, or software engineering|88573.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|PHP;Python;Ruby;Bash/Shell 40805|Bangladesh|Moderately satisfied|Mathematics or statistics|6612.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Python;SQL;HTML;CSS 61661|Sweden|Moderately satisfied|Mathematics or statistics|73433.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C++;C#;JavaScript;Julia;Python;SQL;HTML;CSS;Bash/Shell 17582|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|72500.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C# 51534|Australia|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|60000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Python;SQL;HTML;CSS;Bash/Shell 32113|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|116268.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C++;Go;Java;Python;SQL;HTML;CSS;Bash/Shell 6716|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|66084.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Erlang;JavaScript;Ruby 387|Russian Federation|Extremely satisfied|Mathematics or statistics|20808.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|JavaScript;Python;SQL;HTML;CSS 24685|India|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|44328.0|I don't typically exercise|Male|South Asian|Associate degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript 90333|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|75000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;SQL;HTML;CSS 99735|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|78000.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Java;JavaScript;Python;SQL;Swift;HTML;CSS;Bash/Shell 64408|Belarus|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|9600.0|3 - 4 times per week|Female;Male;Transgender;Non-binary, genderqueer, or gender non-conforming|Black or of African descent;East Asian;Hispanic or Latino/Latina;Middle Eastern;Native American, Pacific Islander, or Indigenous Australian;South Asian;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Between 1 and 2 years ago|Java;Kotlin;Bash/Shell 55300|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|145000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Java;JavaScript;Objective-C;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 13674|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|75000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;SQL;HTML;CSS;Bash/Shell 86194|Poland|Slightly satisfied|Information systems, information technology, or system administration|17640.0|I don't typically exercise|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C++ 47647|Germany|Moderately dissatisfied|Computer science, computer engineering, or software engineering|51403.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML;CSS 6954|United States|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|76000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;C#;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 65285|United States|Slightly dissatisfied|I never declared a major|80000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 61631|Italy|Moderately satisfied|Computer science, computer engineering, or software engineering|36716.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C++;C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 16673|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|57276.0|1 - 2 times per week|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Ruby;SQL;HTML;CSS 23474|China|Slightly dissatisfied|Computer science, computer engineering, or software engineering|19632.0|1 - 2 times per week|Male|East Asian|Primary/elementary school|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;Java;JavaScript;PHP;Python;SQL;Kotlin;HTML;CSS;Bash/Shell 17548|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|52783.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|R;SQL 77808|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|38650.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Java;Objective-C;SQL;Swift 16656|India|Moderately dissatisfied|Computer science, computer engineering, or software engineering|9393.0|3 - 4 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;Java;JavaScript;PHP;SQL;HTML;CSS 17905|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|50304.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Ruby 4279|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|180000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|55 - 64 years old|Between 1 and 2 years ago|C;C++;Java;Matlab;Python;R;Scala;Bash/Shell 31114|Malaysia|Extremely dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|10320.0|I don't typically exercise|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C++;JavaScript;Objective-C;Ruby;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS 61657|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|62380.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;C# 15160|United States|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|56000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C#;JavaScript;PHP;Python;R;SQL;TypeScript;VBA;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 67365|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|94000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C#;Go;JavaScript;PHP;Python;Ruby;Rust;SQL;HTML;CSS;Bash/Shell 13682|Netherlands|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|77104.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Perl;Python;HTML;CSS 44164|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|100000.0|3 - 4 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C;C++;Python;SQL;Bash/Shell 61263|Iran, Islamic Republic of...|Moderately dissatisfied|Computer science, computer engineering, or software engineering|16644.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|Between 2 and 4 years ago|C++;C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS 95237|Russian Federation|Slightly satisfied|A business discipline (ex. accounting, finance, marketing)|12732.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;PHP;HTML;CSS 13689|Greece|Moderately dissatisfied|Computer science, computer engineering, or software engineering|24478.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 6831|France|Moderately satisfied|Computer science, computer engineering, or software engineering|66089.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C++;JavaScript;TypeScript 11878|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|95000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;F#;JavaScript;TypeScript;HTML;CSS 53400|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|308412.0|1 - 2 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Primary/elementary school|Over 4 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;Matlab;Objective-C;PHP;Python;R;SQL;Swift;HTML;CSS 4370|India|Slightly satisfied|Computer science, computer engineering, or software engineering|150288.0|3 - 4 times per week|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;Python;R;SQL 46785|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|48616.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Python;HTML;CSS 98025|Switzerland|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|118872.0|3 - 4 times per week|Male|East Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|45 - 54 years old|Between 1 and 2 years ago|C++;C#;JavaScript;PHP;Python;TypeScript 4673|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|140000.0|3 - 4 times per week|Non-binary, genderqueer, or gender non-conforming|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;Java;JavaScript;Python;R;Ruby;SQL;HTML;CSS;Bash/Shell 32291|Singapore|Slightly satisfied|Computer science, computer engineering, or software engineering|34067.0|3 - 4 times per week|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Ruby;SQL;VBA;VB.NET;HTML 34562|Finland|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|32316.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java;SQL;HTML 35875|Belgium|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|55812.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;HTML;CSS;Bash/Shell 788|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|55000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;Lua;Python;HTML;CSS;Bash/Shell 25607|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|75000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Go;Java;JavaScript;Objective-C;PHP;Python;SQL;HTML;CSS;Bash/Shell 15348|France|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|58746.0|I don't typically exercise|Male|White or of European descent|They never completed any formal education|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Objective-C;Swift 94897|Spain|Extremely satisfied|Computer science, computer engineering, or software engineering|44060.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Python;TypeScript 55669|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|58746.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;SQL 69847|United States|Extremely satisfied|Information systems, information technology, or system administration|83000.0|Daily or almost every day|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;Bash/Shell 81418|Lebanon|Extremely satisfied|Computer science, computer engineering, or software engineering|13200.0|I don't typically exercise|Male|Middle Eastern|Other doctoral degree (Ph.D, Ed.D., etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS 72016|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|33280.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;Go;Java;JavaScript;PHP;SQL;CSS;Bash/Shell 95560|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|107000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|Java;Scala 10622|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|115000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C#;Go;JavaScript;Python;SQL;TypeScript 80194|Germany|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|39648.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java;VBA;HTML;CSS 5771|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|100500.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|Java;SQL 96383|Other Country (Not Listed Above)|Neither satisfied nor dissatisfied|A natural science (ex. biology, chemistry, physics)|58340.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Python;R;SQL;HTML;CSS;Bash/Shell 9349|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|150000.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|JavaScript;Python;HTML;CSS 30759|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|56365.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Go;Java;JavaScript;Objective-C;Python;SQL;Swift;TypeScript;HTML;CSS;Bash/Shell 82086|Uruguay|Slightly satisfied|Computer science, computer engineering, or software engineering|7992.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;PHP;HTML;CSS 62954|United States|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|95000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 52466|Germany|Extremely dissatisfied|Computer science, computer engineering, or software engineering|58746.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|18 - 24 years old|Less than a year ago|C;C++;Python 5917|Canada|Extremely satisfied|Computer science, computer engineering, or software engineering|96626.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|C;C++;Java;Python;Bash/Shell 52129|United States|Slightly satisfied|Mathematics or statistics|140000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;SQL;Bash/Shell 94259|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|180000.0|1 - 2 times per week|Male|East Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;TypeScript;HTML;CSS 36813|Colombia|Slightly dissatisfied|Information systems, information technology, or system administration|21300.0|3 - 4 times per week|Male|Black or of African descent;Hispanic or Latino/Latina|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;HTML;CSS;Bash/Shell 26385|New Zealand|Slightly satisfied|Computer science, computer engineering, or software engineering|41658.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;PHP;SQL;HTML;CSS 23720|France|Slightly satisfied|Web development or web design|10284.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java;JavaScript;SQL;HTML;CSS;Bash/Shell 58233|Brazil|Extremely dissatisfied|Information systems, information technology, or system administration|65508.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;CSS 38718|Iran, Islamic Republic of...|Slightly dissatisfied|Computer science, computer engineering, or software engineering|11652.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Java;Python 70644|Australia|Moderately satisfied|Computer science, computer engineering, or software engineering|55981.0|I don't typically exercise|Male|Middle Eastern|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 80275|India|Slightly satisfied|Computer science, computer engineering, or software engineering|5640.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Assembly;JavaScript;Objective-C;PHP;Swift;HTML;CSS 30508|Pakistan|Extremely satisfied|Computer science, computer engineering, or software engineering|7200.0|I don't typically exercise|Male|East Asian|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|Java;PHP;Swift 14183|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|30000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Java 55113|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|200016.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;Python;SQL;Kotlin;Bash/Shell 3756|Israel|Moderately satisfied|Computer science, computer engineering, or software engineering|94788.0|I don't typically exercise|Male|Middle Eastern;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Matlab;Perl;PHP;Python;Ruby;SQL;VB.NET;HTML;CSS;Bash/Shell 59679|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|102000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|JavaScript;Python 26958|Jordan|Moderately satisfied|Computer science, computer engineering, or software engineering|30468.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;HTML;CSS 42011|Russian Federation|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|8846.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|More than 4 years ago|C;C++;JavaScript;Matlab;Python;Visual Basic 6;HTML;CSS;Bash/Shell 128|United States|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|14000.0|3 - 4 times per week|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS;Bash/Shell 16168|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|110000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 37058|Russian Federation|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|42456.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|PHP;Python;SQL;VBA 99799|China|Slightly dissatisfied|Mathematics or statistics|23375.0|I don't typically exercise|Male|East Asian|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;Java;Delphi/Object Pascal 14939|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|83224.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;Java 28530|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|112000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;VB.NET;HTML;CSS 85452|Saudi Arabia|Moderately satisfied|Computer science, computer engineering, or software engineering|33600.0|3 - 4 times per week|Female|South Asian|Professional degree (JD, MD, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;HTML;CSS 55769|France|Slightly satisfied|Computer science, computer engineering, or software engineering|48955.0|I don't typically exercise|Male|Black or of African descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;Matlab;Python;SQL;HTML;CSS;Bash/Shell 20898|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|55075.0|3 - 4 times per week|Male|White or of European descent|They never completed any formal education|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;TypeScript;HTML;CSS 574|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|106000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Ruby;SQL 18121|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|75000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;PHP;Python;R;SQL;TypeScript;HTML;CSS;Bash/Shell 1295|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|200000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C++;Java;JavaScript;Python;SQL;Bash/Shell 98884|United States|Moderately satisfied|Information systems, information technology, or system administration|125000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;Python 26723|Switzerland|Moderately satisfied|Computer science, computer engineering, or software engineering|125123.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C++;C#;Java;Swift;HTML;CSS;Bash/Shell 65376|Germany|Slightly satisfied|Computer science, computer engineering, or software engineering|55075.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|Between 1 and 2 years ago|Java;JavaScript;Ruby;SQL;Kotlin;HTML;Bash/Shell 318|Slovakia|Extremely satisfied|Computer science, computer engineering, or software engineering|46992.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|More than 4 years ago|CoffeeScript;JavaScript;TypeScript;HTML 30754|United Kingdom|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|24308.0|3 - 4 times per week|Male|White or of European descent|They never completed any formal education|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Java;Python;HTML;Bash/Shell 18398|Finland|Moderately satisfied|Computer science, computer engineering, or software engineering|76368.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;Python;HTML 33170|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|75000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|35 - 44 years old|More than 4 years ago|Python;HTML;Bash/Shell 95021|Egypt|Moderately satisfied|Computer science, computer engineering, or software engineering|1704.0|I don't typically exercise|Female|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|Assembly;C;C++;C#;Go;Java;JavaScript;Matlab;PHP;R;Visual Basic 6;HTML;CSS 79134|United Kingdom|Moderately dissatisfied|Computer science, computer engineering, or software engineering|600060.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 82284|Switzerland|Neither satisfied nor dissatisfied|A business discipline (ex. accounting, finance, marketing)|93842.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Java;JavaScript;HTML 64121|Germany|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|78328.0|3 - 4 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Clojure;Java;JavaScript;Objective-C;Kotlin 47869|Denmark|Extremely satisfied|Computer science, computer engineering, or software engineering|73636.0|Daily or almost every day|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Objective-C;Perl;Swift 68404|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|116500.0|3 - 4 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 78569|Canada|Moderately satisfied|Web development or web design|101457.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C#;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 92034|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|110000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;F#;Lua;Python;SQL;TypeScript;Kotlin;HTML;CSS 18974|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|960000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;JavaScript 41811|Netherlands|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|82000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Python;Scala;SQL;Bash/Shell 63462|United States|Moderately satisfied|Information systems, information technology, or system administration|50000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;HTML;CSS;Bash/Shell 37770|United Kingdom|Slightly dissatisfied|Mathematics or statistics|60423.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|C;Java;Python;HTML;CSS;Bash/Shell 62917|Gambia|Moderately satisfied|Web development or web design|3780.0|1 - 2 times per week|Male|Black or of African descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Java;JavaScript;PHP;SQL;VBA;VB.NET;HTML;CSS 32893|United States|Moderately satisfied|I never declared a major|105000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|CoffeeScript;JavaScript;Ruby;SQL;HTML;CSS;Bash/Shell 31671|Belgium|Moderately dissatisfied|Computer science, computer engineering, or software engineering|36720.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;TypeScript;HTML 42230|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|80000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C;C++;Objective-C;Python;Swift 39027|United States|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|1056000.0|3 - 4 times per week|Male|East Asian;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Matlab;Python;SQL;HTML;CSS;Bash/Shell 64419|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|140000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Groovy;JavaScript;Ruby;TypeScript;HTML;CSS;Bash/Shell 79331|United States|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|67000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|JavaScript;Perl;PHP;Python;R;SQL;HTML;CSS;Bash/Shell 30361|Malaysia|Moderately satisfied|Computer science, computer engineering, or software engineering|10620.0|1 - 2 times per week|Male|South Asian|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;Swift 68174|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|150000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C;Go;JavaScript;PHP;R;Ruby;SQL;HTML;CSS;Bash/Shell 51987|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|90000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C++;JavaScript 53132|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|70000.0|Daily or almost every day|Female|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;Java;Python;SQL;Kotlin;Bash/Shell 27320|United States|Extremely satisfied|A humanities discipline (ex. literature, history, philosophy)|115000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS 81059|Russian Federation|Slightly satisfied|Computer science, computer engineering, or software engineering|44064.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C;C++;Python;Bash/Shell 52068|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|134500.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;Bash/Shell 85808|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|156000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|CoffeeScript;Go;Haskell;Java;JavaScript;PHP;Python;R;Ruby;SQL;Swift;HTML;CSS;Bash/Shell 49935|Mexico|Extremely satisfied|Computer science, computer engineering, or software engineering|16116.0|Daily or almost every day|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;SQL;HTML;CSS 68263|India|Slightly satisfied|Computer science, computer engineering, or software engineering|6653.0|I don't typically exercise|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;JavaScript;PHP;Python;TypeScript;HTML;CSS 49638|France|Extremely satisfied|Computer science, computer engineering, or software engineering|24478.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|C# 22455|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|105000.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;Objective-C;SQL;Swift;VB.NET;HTML;CSS 43358|Ireland|Moderately dissatisfied|Computer science, computer engineering, or software engineering|97910.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Erlang;Go;Java;Julia;Rust;Kotlin 26621|Canada|Extremely satisfied|Information systems, information technology, or system administration|96624.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|45 - 54 years old|More than 4 years ago|C;C++;Java;JavaScript;Python;Bash/Shell 73754|Bangladesh|Moderately satisfied|Computer science, computer engineering, or software engineering|16164.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 40106|Brazil|Slightly satisfied|A social science (ex. anthropology, psychology, political science)|7488.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;Objective-C;HTML;CSS 99244|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|883428.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;C#;Java;JavaScript;TypeScript;HTML;CSS;Bash/Shell 8608|United Kingdom|Moderately satisfied|Mathematics or statistics|40282.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|More than 4 years ago|C#;Java;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 86327|Colombia|Extremely dissatisfied|Computer science, computer engineering, or software engineering|48000.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 56948|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|45000.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C++;Java;JavaScript;Objective-C;PHP;Python;SQL;HTML;CSS;Bash/Shell 52348|Canada|Moderately dissatisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|Java;JavaScript;Objective-C;PHP;CSS 10200|Poland|Moderately satisfied|Computer science, computer engineering, or software engineering|17640.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C;C#;JavaScript;Python;HTML;CSS 9409|Russian Federation|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|4248.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;Python;VBA;HTML;CSS 32808|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|115000.0|1 - 2 times per week|Female|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|55 - 64 years old|Between 1 and 2 years ago|Java;SQL 81863|Canada|Moderately satisfied|Computer science, computer engineering, or software engineering|62001.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;Groovy;Java;JavaScript;Perl;Python;R;Scala;SQL;HTML;CSS;Bash/Shell 100143|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|5213.0|I don't typically exercise|Male|South Asian|Primary/elementary school|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Java;JavaScript;Matlab;PHP;SQL;HTML;CSS;Bash/Shell 70731|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|55000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 1368|Ukraine|Slightly satisfied|Mathematics or statistics|4680.0|1 - 2 times per week|Male|White or of European descent|Associate degree|1 - 2 hours|18 - 24 years old|Less than a year ago|Python;SQL;Bash/Shell 43397|Canada|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|80521.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;R;VBA 99904|Russian Federation|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|31848.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Groovy;Java;JavaScript 34651|Germany|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|5880.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Groovy;Java;JavaScript;Python;SQL;HTML;CSS 57063|France|Moderately dissatisfied|A health science (ex. nursing, pharmacy, radiology)|36716.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;PHP;Python;HTML;CSS;Bash/Shell 20248|India|Slightly satisfied|Computer science, computer engineering, or software engineering|2818.0|3 - 4 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;TypeScript;HTML;CSS 80474|Turkey|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|48000.0|1 - 2 times per week|Male|Middle Eastern;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Objective-C;SQL;Kotlin;Bash/Shell 35332|United States|Extremely satisfied|Information systems, information technology, or system administration|65000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;SQL;VB.NET;Visual Basic 6;HTML;CSS 32312|United States|Extremely satisfied|Information systems, information technology, or system administration|110000.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|Go;Bash/Shell 20981|Finland|Slightly dissatisfied|Computer science, computer engineering, or software engineering|55812.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Java;JavaScript;Ruby;SQL;Delphi/Object Pascal;HTML;CSS;Bash/Shell 11137|Netherlands|Moderately dissatisfied|Computer science, computer engineering, or software engineering|56298.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C++;Python 8917|Sweden|Moderately satisfied|Computer science, computer engineering, or software engineering|43416.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 88005|India|Moderately dissatisfied|Information systems, information technology, or system administration|114588.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;Perl;Python;SQL;HTML;CSS;Bash/Shell 24332|Ireland|Moderately satisfied|Mathematics or statistics|61194.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|JavaScript;Python;R;Scala;SQL 85515|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|49000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;Go;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 84696|Czech Republic|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|55020.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Between 2 and 4 years ago|Assembly;C++;C#;F#;Java;JavaScript;SQL 73675|Canada|Extremely satisfied|Mathematics or statistics|104678.0|1 - 2 times per week|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;Java;JavaScript;SQL;HTML;CSS 7614|United States|Slightly dissatisfied|A natural science (ex. biology, chemistry, physics)|90000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|JavaScript;Python 52271|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|1000000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|More than 4 years ago|Go;JavaScript;Lua;Perl;PHP;Python;SQL;HTML;CSS;Bash/Shell 34978|Russian Federation|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|63684.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|35 - 44 years old|Between 2 and 4 years ago|Assembly;C;C++;C#;Go;JavaScript;Python;SQL;VBA;HTML;CSS;Bash/Shell 42027|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|83342.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|C#;JavaScript;SQL;HTML;CSS 90666|Hong Kong (S.A.R.)|Moderately dissatisfied|A natural science (ex. biology, chemistry, physics)|41136.0|1 - 2 times per week|Male|East Asian|They never completed any formal education|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Python;R 37537|Canada|Slightly satisfied|Computer science, computer engineering, or software engineering|112730.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|45 - 54 years old|Less than a year ago|C#;Python;VB.NET;Bash/Shell 92840|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|8808.0|I don't typically exercise|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C++;C#;JavaScript;TypeScript;HTML;CSS 56635|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|47500.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Perl;Python;SQL;Bash/Shell 44897|United States|Moderately dissatisfied|Information systems, information technology, or system administration|65000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Groovy;Java;JavaScript;HTML;CSS 35542|India|Moderately satisfied|Computer science, computer engineering, or software engineering|5256.0|1 - 2 times per week|Non-binary, genderqueer, or gender non-conforming|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Objective-C;Swift 4186|India|Moderately satisfied|Computer science, computer engineering, or software engineering|8268.0|I don't typically exercise|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C#;Go;Java;JavaScript;PHP;Python;SQL;TypeScript;HTML;Bash/Shell 52890|Singapore|Extremely satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|59052.0|1 - 2 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Groovy;JavaScript;Ruby;HTML;CSS;Bash/Shell 16757|United States|Slightly dissatisfied|A natural science (ex. biology, chemistry, physics)|91000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 79549|Bulgaria|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|14688.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C++;Java;JavaScript;PHP;Python;HTML;CSS 7530|United Kingdom|Slightly satisfied|Web development or web design|41671.0|I don't typically exercise|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;Ruby;SQL;HTML;CSS 95566|France|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|82000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;SQL 24723|Germany|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|13956.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|More than 4 years ago|C;C#;Go;Java;JavaScript;Rust;TypeScript;Kotlin 59669|Israel|Moderately satisfied|Computer science, computer engineering, or software engineering|112344.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;TypeScript 83530|Romania|Slightly dissatisfied|Computer science, computer engineering, or software engineering|16152.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;SQL;HTML;CSS 86270|Netherlands|Slightly dissatisfied|Web development or web design|117492.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;Scala;Bash/Shell 24131|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|52627.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;C++;C#;Haskell;Java;Python;Scala 82203|Slovakia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|29376.0|I don't typically exercise|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS 99525|Norway|Slightly satisfied|Computer science, computer engineering, or software engineering|68862.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;CSS 88071|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|160000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|C;C++;C#;JavaScript;Perl;Bash/Shell 33564|Mexico|Moderately satisfied|Computer science, computer engineering, or software engineering|74772.0|3 - 4 times per week|Female|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Python 53824|India|Moderately satisfied|Computer science, computer engineering, or software engineering|9396.0|Daily or almost every day|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Haskell;JavaScript;Python 93400|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|78000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C#;JavaScript;Rust;SQL;HTML;CSS;Bash/Shell 42596|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|33000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C++;C#;Java;JavaScript;Python;SQL;Swift;HTML;CSS;Bash/Shell 33851|Mexico|Moderately dissatisfied|Information systems, information technology, or system administration|35448.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Some college/university study without earning a degree|3 - 4 hours|55 - 64 years old|More than 4 years ago|Assembly;C;C++;Java;SQL;VBA;VB.NET;Visual Basic 6;Cobol 33801|Libyan Arab Jamahiriya|Slightly dissatisfied|Computer science, computer engineering, or software engineering|42635.0|1 - 2 times per week|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|Over 4 hours|25 - 34 years old|Between 1 and 2 years ago|Go;Java;JavaScript;PHP;TypeScript;HTML;CSS 34032|United States|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|160000.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Between 1 and 2 years ago|C++;C#;Python;SQL;Bash/Shell 66419|Morocco|Moderately dissatisfied|Computer science, computer engineering, or software engineering|9744.0|3 - 4 times per week|Male|Middle Eastern|Some college/university study without earning a degree|3 - 4 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;PHP;SQL;VB.NET;HTML;CSS 16543|Belgium|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|51648.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript 87954|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|84000.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;C#;Python 51798|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|75000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Go;JavaScript;PHP;SQL;HTML;CSS;Bash/Shell 80368|United States|Moderately satisfied|Web development or web design|70000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 34307|Greece|Slightly satisfied|Computer science, computer engineering, or software engineering|12239.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|Less than a year ago|Java;Python;Scala 85481|United States|Slightly satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|147000.0|I don't typically exercise|Female|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|C;C#;JavaScript;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 88959|Lebanon|Extremely satisfied|Computer science, computer engineering, or software engineering|16800.0|I don't typically exercise|Male|Middle Eastern|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|C;C++;Haskell;Java;JavaScript;Kotlin;HTML;CSS;Bash/Shell 41742|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|62507.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 32689|Brazil|Slightly dissatisfied|Computer science, computer engineering, or software engineering|13104.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;Python;Ruby;SQL;TypeScript;HTML;CSS;Bash/Shell 25353|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|110000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Python;SQL;TypeScript;HTML;CSS 27912|France|Extremely satisfied|Computer science, computer engineering, or software engineering|64866.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|Assembly;C;JavaScript;Perl;PHP;Python;SQL;VBA;Delphi/Object Pascal;Cobol;HTML;CSS;Bash/Shell 80795|Ukraine|Moderately satisfied|Computer science, computer engineering, or software engineering|24000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Swift;Kotlin 58766|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|134000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;Bash/Shell 27933|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|66000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Less than a year ago|C;Python 86625|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|42000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;JavaScript;SQL;VBA;HTML;CSS 36922|Turkey|Moderately satisfied|Computer science, computer engineering, or software engineering|10488.0|I don't typically exercise|Male|Middle Eastern;White or of European descent|They never completed any formal education|30 - 59 minutes|18 - 24 years old|Less than a year ago|Java;Python 72952|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|6384.0|I don't typically exercise|Male|South Asian|Associate degree|3 - 4 hours|25 - 34 years old|Less than a year ago|JavaScript;PHP;HTML;CSS 31603|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|58752.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|C++;JavaScript;PHP;SQL;TypeScript;Delphi/Object Pascal;HTML;CSS;Bash/Shell 60232|Russian Federation|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|26532.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C++;Python;Scala;Bash/Shell 91713|Canada|Slightly dissatisfied|Computer science, computer engineering, or software engineering|56365.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Go;Java;JavaScript;Lua;Python;SQL;HTML;CSS;Bash/Shell 53449|United Kingdom|Moderately satisfied|Computer science, computer engineering, or software engineering|23891.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 58620|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|87127.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|C#;Groovy;Java;JavaScript;SQL;HTML;CSS;Bash/Shell 61515|United States|Slightly satisfied|Mathematics or statistics|73000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;Python;Swift;VBA;HTML;CSS 36826|Brazil|Extremely satisfied|Computer science, computer engineering, or software engineering|22452.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|Java 29257|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|75000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Python;R;SQL;Bash/Shell 94000|France|Slightly satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|39164.0|1 - 2 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;HTML;CSS 85999|Bosnia and Herzegovina|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|29376.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Objective-C;Swift 19953|India|Extremely satisfied|Computer science, computer engineering, or software engineering|18780.0|I don't typically exercise|Male|East Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|More than 4 years ago|Java;JavaScript;Python;TypeScript;Kotlin;HTML;CSS;Bash/Shell 82345|Switzerland|Moderately satisfied|Information systems, information technology, or system administration|131379.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;Java;JavaScript;PHP;Scala;Delphi/Object Pascal;HTML;CSS;Bash/Shell 65380|United States|Slightly satisfied|Computer science, computer engineering, or software engineering|90000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|More than 4 years ago|Go;JavaScript;Ruby;HTML;CSS;Bash/Shell 35226|Netherlands|Moderately satisfied|Computer science, computer engineering, or software engineering|51408.0|1 - 2 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|C++;C#;Python;VBA 51531|Mexico|Moderately dissatisfied|Information systems, information technology, or system administration|16116.0|I don't typically exercise|Female|Black or of African descent;East Asian;Hispanic or Latino/Latina;Middle Eastern;Native American, Pacific Islander, or Indigenous Australian;South Asian;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|25 - 34 years old|More than 4 years ago|C#;JavaScript;PHP;Ruby;SQL;TypeScript;HTML;CSS 28258|United Kingdom|Moderately satisfied|Mathematics or statistics|55562.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|45 - 54 years old|Between 1 and 2 years ago|JavaScript;Ruby;SQL;HTML;CSS 92128|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|101000.0|1 - 2 times per week|Male|White or of European descent|Associate degree|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C++;Groovy;Java;JavaScript;HTML;CSS 8823|Austria|Extremely satisfied|Computer science, computer engineering, or software engineering|15276.0|3 - 4 times per week|Female|White or of European descent|Some college/university study without earning a degree|1 - 2 hours|18 - 24 years old|Less than a year ago|C;C++;Haskell;Java;JavaScript;Matlab;Python;R;SQL;HTML;CSS;Bash/Shell 94202|United States|Moderately satisfied|Web development or web design|32500.0|1 - 2 times per week|Female|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|18 - 24 years old|Between 2 and 4 years ago|JavaScript;PHP;HTML;CSS 94144|Ukraine|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|48000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 25231|Kenya|Moderately satisfied|Mathematics or statistics|40824.0|I don't typically exercise|Male|Black or of African descent|Some college/university study without earning a degree|1 - 2 hours|35 - 44 years old|More than 4 years ago|PHP 23670|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|70000.0|1 - 2 times per week|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;Go;Java;JavaScript;PHP;Python;SQL;Swift;TypeScript;HTML;CSS 27434|France|Moderately dissatisfied|Web development or web design|48955.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Between 2 and 4 years ago|Java;Swift;Bash/Shell 66250|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|55075.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|PHP;SQL 97892|United States|Extremely dissatisfied|Computer science, computer engineering, or software engineering|2000000.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|55 - 64 years old|Between 1 and 2 years ago|C;C++;C#;Java;JavaScript;Objective-C;SQL;Swift;TypeScript;VB.NET;HTML;CSS;Bash/Shell 88132|Russian Federation|Slightly dissatisfied|Mathematics or statistics|27600.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Objective-C;Swift 87288|United States|Slightly satisfied|A humanities discipline (ex. literature, history, philosophy)|140000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina;White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|45 - 54 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 44962|United States|Slightly satisfied|Web development or web design|175000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|3 - 4 hours|35 - 44 years old|More than 4 years ago|JavaScript;HTML;CSS 24302|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|100000.0|1 - 2 times per week|Male|Black or of African descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;CoffeeScript;Go;Java;JavaScript;Lua;Objective-C;PHP;Python;Ruby;SQL;Swift;TypeScript;Kotlin;HTML;CSS;Bash/Shell 81708|Austria|Moderately dissatisfied|Computer science, computer engineering, or software engineering|142872.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|Less than a year ago|C;JavaScript;Python;Scala;SQL;HTML;CSS;Bash/Shell 35755|Israel|Extremely satisfied|Computer science, computer engineering, or software engineering|154476.0|3 - 4 times per week|Male|Middle Eastern;White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|Less than a year ago|Groovy;Java;JavaScript;Python;SQL;HTML;Bash/Shell 36342|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|44060.0|I don't typically exercise|Male|White or of European descent|Associate degree|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 97060|Brazil|Moderately satisfied|Information systems, information technology, or system administration|5616.0|I don't typically exercise|Male|Hispanic or Latino/Latina;White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|3 - 4 hours|18 - 24 years old|Less than a year ago|JavaScript;PHP;SQL;TypeScript;VB.NET;HTML;CSS 49651|Cyprus|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|51408.0|I don't typically exercise|Male|White or of European descent|Professional degree (JD, MD, etc.)|Less than 30 minutes|35 - 44 years old|Between 1 and 2 years ago|JavaScript;PHP;SQL;HTML;Bash/Shell 3826|United Kingdom|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|145849.0|I don't typically exercise|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Objective-C;HTML;CSS 97944|United Kingdom|Slightly satisfied|Information systems, information technology, or system administration|76397.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;Perl;SQL;HTML;CSS;Bash/Shell 75725|Norway|Moderately satisfied|Computer science, computer engineering, or software engineering|86716.0|1 - 2 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|Between 1 and 2 years ago|C;JavaScript;Perl;PHP;SQL;CSS;Bash/Shell 12153|India|Moderately satisfied|Computer science, computer engineering, or software engineering|52442.0|3 - 4 times per week|Male|South Asian|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C;C++;Java;Lua;Matlab;PHP;Python;R;Scala;SQL;HTML;CSS;Bash/Shell 85983|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|100000.0|I don't typically exercise|Male|White or of European descent|Associate degree|Less than 30 minutes|45 - 54 years old|More than 4 years ago|C#;JavaScript;Matlab;SQL;TypeScript;HTML;CSS 35562|Italy|Moderately satisfied|Computer science, computer engineering, or software engineering|24972.0|3 - 4 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C;C++;C#;Java;JavaScript;Matlab;Objective-C;PHP;Python;SQL 80333|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|74000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Objective-C;Swift 42389|Romania|Moderately satisfied|Computer science, computer engineering, or software engineering|50448.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;C#;Go;Java;Matlab;PHP;Python;HTML;CSS;Bash/Shell 76912|United States|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|123000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|JavaScript;SQL 23596|Russian Federation|Slightly satisfied|Information systems, information technology, or system administration|12204.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;HTML;CSS 56958|United States|Moderately satisfied|Web development or web design|70000.0|Daily or almost every day|Male|White or of European descent|Some college/university study without earning a degree|Less than 30 minutes|25 - 34 years old|Less than a year ago|PHP;HTML;CSS 85820|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|79552.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|Between 2 and 4 years ago|C#;Groovy;Java;JavaScript;Python;SQL;TypeScript;Bash/Shell 91042|United States|Extremely satisfied|Computer science, computer engineering, or software engineering|75000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Delphi/Object Pascal 13046|Spain|Moderately dissatisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|16884.0|1 - 2 times per week|Male|Middle Eastern|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|JavaScript;HTML;CSS;Bash/Shell 27017|Spain|Neither satisfied nor dissatisfied|Web development or web design|31821.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|18 - 24 years old|Less than a year ago|CoffeeScript;JavaScript;TypeScript;HTML;CSS 78483|Brazil|Moderately satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|18715.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 1 and 2 years ago|Python;R;SQL;Bash/Shell 42468|Nepal|Extremely dissatisfied|Information systems, information technology, or system administration|1000.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Assembly;C;Java;JavaScript;PHP;Python;SQL;HTML;CSS 74344|Switzerland|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|93840.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Objective-C;Swift;Kotlin 19990|Austria|Slightly satisfied|Computer science, computer engineering, or software engineering|42360.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|Java;JavaScript;PHP;SQL;TypeScript;Kotlin;HTML;CSS 61052|United States|Moderately satisfied|Information systems, information technology, or system administration|151000.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Primary/elementary school|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;SQL;HTML;CSS 71568|Colombia|Slightly satisfied|Computer science, computer engineering, or software engineering|25308.0|3 - 4 times per week|Male|Hispanic or Latino/Latina|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C#;JavaScript;Ruby;SQL;TypeScript;Visual Basic 6;HTML;CSS 47023|United States|Moderately satisfied|Mathematics or statistics|115000.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|JavaScript;Perl;Python;SQL;HTML;CSS 82643|Russian Federation|Moderately satisfied|Information systems, information technology, or system administration|42000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Python;Ruby;Bash/Shell 9619|India|Moderately satisfied|Computer science, computer engineering, or software engineering|9960.0|Daily or almost every day|Male|South Asian|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Groovy;Java 40725|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|112000.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Between 2 and 4 years ago|JavaScript;PHP;Python;SQL;VBA;HTML;CSS;Bash/Shell 72808|United States|Moderately satisfied|Information systems, information technology, or system administration|85748.0|1 - 2 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|C#;Clojure;JavaScript;SQL;Visual Basic 6 56542|France|Slightly dissatisfied|Computer science, computer engineering, or software engineering|55075.0|1 - 2 times per week|Male|White or of European descent|Professional degree (JD, MD, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|C;C++;C#;JavaScript;SQL;HTML;CSS;Bash/Shell 54482|Germany|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|38184.0|3 - 4 times per week|Male|White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Less than a year ago|CoffeeScript;JavaScript;Ruby;HTML;CSS 86364|United States|Slightly satisfied|A social science (ex. anthropology, psychology, political science)|123500.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|Go;JavaScript;Objective-C;Python;Swift;Bash/Shell 71560|Japan|Slightly satisfied|Computer science, computer engineering, or software engineering|72031.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;JavaScript;Matlab;Python;R;TypeScript;HTML;CSS 67168|Saudi Arabia|Slightly dissatisfied|Computer science, computer engineering, or software engineering|19200.0|3 - 4 times per week|Male|Black or of African descent;East Asian;Hispanic or Latino/Latina;Middle Eastern;Native American, Pacific Islander, or Indigenous Australian;South Asian;White or of European descent|Primary/elementary school|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Objective-C;Swift 85454|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|East Asian;White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C;C++;C#;Java;JavaScript;Python;SQL;HTML;CSS;Bash/Shell 59967|United States|Slightly dissatisfied|Computer science, computer engineering, or software engineering|50000.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|18 - 24 years old|Between 2 and 4 years ago|Assembly;C++;C#;JavaScript;Python;Rust;SQL;TypeScript;HTML;CSS;Bash/Shell 100644|Portugal|Slightly satisfied|A natural science (ex. biology, chemistry, physics)|14688.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C++;Python 8643|Sweden|Extremely satisfied|Computer science, computer engineering, or software engineering|1000000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;TypeScript 52973|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|62000.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Java;JavaScript;Ruby;HTML;CSS 46440|South Africa|Extremely satisfied|Computer science, computer engineering, or software engineering|63512.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|18 - 24 years old|Between 2 and 4 years ago|C;C++;C#;Java;JavaScript;Objective-C;TypeScript;HTML;CSS 52766|Australia|Moderately satisfied|Information systems, information technology, or system administration|51983.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 82119|Germany|Slightly dissatisfied|Computer science, computer engineering, or software engineering|61194.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C++ 23072|Hungary|Moderately dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|21432.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;Java;JavaScript;Objective-C;Python;Swift;TypeScript;Kotlin;HTML;CSS;Bash/Shell 37129|United States|Moderately satisfied|A social science (ex. anthropology, psychology, political science)|76500.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|Java;JavaScript;CSS 2041|United States|Extremely satisfied|A social science (ex. anthropology, psychology, political science)|130000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|C;JavaScript;Objective-C;Ruby;SQL;Swift;HTML;CSS 87531|United Kingdom|Moderately satisfied|A natural science (ex. biology, chemistry, physics)|97233.0|3 - 4 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|Java;JavaScript;PHP;SQL;Kotlin;HTML;CSS 77409|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|70000.0|Daily or almost every day|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|1 - 2 hours|18 - 24 years old|Between 1 and 2 years ago|Assembly;C;C++;Erlang;Go;Haskell;Java;JavaScript;Objective-C;PHP;Python;Ruby;SQL;Swift;TypeScript;Kotlin;HTML;CSS;Bash/Shell 74811|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|65000.0|I don't typically exercise|Female;Non-binary, genderqueer, or gender non-conforming|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C#;JavaScript;SQL;TypeScript;HTML;CSS 84361|Croatia|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|32364.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C++;Java;Python;Rust;Scala;Bash/Shell 89574|Bosnia and Herzegovina|Slightly dissatisfied|Computer science, computer engineering, or software engineering|7512.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 1 and 2 years ago|C;C++;Java;JavaScript;PHP;Python;SQL;TypeScript;HTML;CSS;Bash/Shell 2185|United States|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|71250.0|1 - 2 times per week|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|More than 4 years ago|JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 98951|United States|Extremely satisfied|I never declared a major|85000.0|I don't typically exercise|Female;Transgender|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|JavaScript;PHP;Python;SQL;VB.NET;HTML;CSS;Bash/Shell 25172|United States|Moderately satisfied|Information systems, information technology, or system administration|98000.0|I don't typically exercise|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C++;Go;JavaScript;Python;SQL;HTML;CSS 72753|Germany|Slightly dissatisfied|Mathematics or statistics|77104.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Matlab;Python;Bash/Shell 63125|Viet Nam|Neither satisfied nor dissatisfied|Information systems, information technology, or system administration|4800.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|3 - 4 hours|18 - 24 years old|Between 1 and 2 years ago|JavaScript;HTML;CSS 36708|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|245000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|C#;JavaScript;SQL;HTML;CSS 47885|United States|Moderately satisfied|Computer science, computer engineering, or software engineering|135000.0|3 - 4 times per week|Male|White or of European descent|Some college/university study without earning a degree|30 - 59 minutes|18 - 24 years old|Between 2 and 4 years ago|Assembly;C++;C#;Objective-C;Perl;Bash/Shell 95952|Dominican Republic|Moderately satisfied|Computer science, computer engineering, or software engineering|22356.0|1 - 2 times per week|Male|Hispanic or Latino/Latina|Professional degree (JD, MD, etc.)|3 - 4 hours|25 - 34 years old|More than 4 years ago|C#;Java;JavaScript;Ruby;SQL;VB.NET 44360|Brazil|Moderately satisfied|Computer science, computer engineering, or software engineering|7860.0|I don't typically exercise|Male|Hispanic or Latino/Latina|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C;C++;JavaScript;Matlab;Objective-C;Python;Ruby;Swift;HTML;CSS;Bash/Shell 73319|Switzerland|Extremely dissatisfied|Computer science, computer engineering, or software engineering|121995.0|I don't typically exercise|Female|Black or of African descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Java;Python;Scala;SQL;Bash/Shell 4346|India|Extremely dissatisfied|Computer science, computer engineering, or software engineering|5640.0|1 - 2 times per week|Male|South Asian|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Between 1 and 2 years ago|Assembly;C;C++;JavaScript;SQL;VBA;VB.NET;Visual Basic 6;HTML;CSS;Bash/Shell 37351|United Kingdom|Moderately dissatisfied|Computer science, computer engineering, or software engineering|37504.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|30 - 59 minutes|45 - 54 years old|More than 4 years ago|Assembly;C;C++;Java;JavaScript;Objective-C;PHP;Python;SQL;Swift;HTML;CSS;Bash/Shell 44823|United States|Moderately satisfied|Mathematics or statistics|120000.0|3 - 4 times per week|Female|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|Python;R;SQL;Bash/Shell 15005|Australia|Neither satisfied nor dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|159947.0|I don't typically exercise|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|45 - 54 years old|More than 4 years ago|Assembly;C;C++;C#;Erlang;Groovy;Java;JavaScript;R;SQL;TypeScript;VBA;HTML;CSS;Bash/Shell 98834|France|Slightly satisfied|Another engineering discipline (ex. civil, electrical, mechanical)|79552.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|C#;Java;JavaScript;Scala;SQL 23981|United States|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|80000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|45 - 54 years old|Between 2 and 4 years ago|Assembly;C;C++;Java;JavaScript;Matlab;HTML 65730|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|87000.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|CoffeeScript;JavaScript;PHP;HTML;CSS 35899|Ukraine|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|4680.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|JavaScript;Ruby;SQL;HTML;CSS 74470|Spain|Moderately satisfied|Computer science, computer engineering, or software engineering|440592.0|1 - 2 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Less than a year ago|C++;Java;Python;R;SQL;HTML;CSS 59521|Germany|Moderately satisfied|Computer science, computer engineering, or software engineering|52627.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|18 - 24 years old|Between 2 and 4 years ago|JavaScript;HTML;CSS;Bash/Shell 51190|United Kingdom|Extremely satisfied|Computer science, computer engineering, or software engineering|50004.0|Daily or almost every day|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|Less than 30 minutes|25 - 34 years old|Less than a year ago|C++;Matlab;Python 75724|India|Slightly dissatisfied|Another engineering discipline (ex. civil, electrical, mechanical)|50094.0|1 - 2 times per week|Male|South Asian|Bachelor’s degree (BA, BS, B.Eng., etc.)|Less than 30 minutes|35 - 44 years old|Less than a year ago|C++;Go;Java;Rust;Kotlin 58353|United States|Moderately satisfied|A humanities discipline (ex. literature, history, philosophy)|130000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|35 - 44 years old|Between 2 and 4 years ago|JavaScript;Ruby;HTML;CSS 50731|Ukraine|Extremely dissatisfied|Computer science, computer engineering, or software engineering|25200.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|25 - 34 years old|Between 2 and 4 years ago|Objective-C;Python;Swift;Bash/Shell 90041|United States|Moderately dissatisfied|Computer science, computer engineering, or software engineering|120000.0|1 - 2 times per week|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|1 - 2 hours|25 - 34 years old|Between 2 and 4 years ago|Go;JavaScript;PHP;Python;SQL;HTML;CSS;Bash/Shell 99603|Lithuania|Moderately satisfied|A business discipline (ex. accounting, finance, marketing)|36720.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|Go;JavaScript;Python;Bash/Shell 33013|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|110000.0|3 - 4 times per week|Male|White or of European descent|Associate degree|30 - 59 minutes|25 - 34 years old|Less than a year ago|JavaScript;TypeScript;HTML;CSS 42628|Hungary|Extremely satisfied|Computer science, computer engineering, or software engineering|43668.0|I don't typically exercise|Male|White or of European descent|Associate degree|1 - 2 hours|35 - 44 years old|Between 1 and 2 years ago|C;JavaScript;Python;HTML;CSS 20170|Kenya|Moderately satisfied|Computer science, computer engineering, or software engineering|8160.0|I don't typically exercise|Male|Black or of African descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|3 - 4 hours|25 - 34 years old|Between 1 and 2 years ago|Java;JavaScript;PHP;SQL;TypeScript;HTML;CSS;Bash/Shell 77546|Sweden|Extremely satisfied|A natural science (ex. biology, chemistry, physics)|51152.0|1 - 2 times per week|Male|White or of European descent|Other doctoral degree (Ph.D, Ed.D., etc.)|1 - 2 hours|35 - 44 years old|More than 4 years ago|Assembly;C;C++;Groovy;Perl;Python;SQL;Bash/Shell 80459|United Kingdom|Slightly satisfied|Computer science, computer engineering, or software engineering|69452.0|3 - 4 times per week|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|Less than 30 minutes|35 - 44 years old|More than 4 years ago|C#;JavaScript;Python;SQL;VBA;VB.NET;HTML;CSS;Bash/Shell 80088|Poland|Slightly satisfied|Computer science, computer engineering, or software engineering|27000.0|I don't typically exercise|Male|White or of European descent|Master’s degree (MA, MS, M.Eng., MBA, etc.)|30 - 59 minutes|25 - 34 years old|Between 2 and 4 years ago|Groovy;Java;JavaScript;SQL;TypeScript;HTML;CSS;Bash/Shell 20353|Spain|Slightly satisfied|Computer science, computer engineering, or software engineering|15298.0|I don't typically exercise|Male|White or of European descent|Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)|30 - 59 minutes|18 - 24 years old|Less than a year ago|C#;Java;JavaScript;SQL;HTML;CSS 56375|United States|Moderately satisfied|Fine arts or performing arts (ex. graphic design, music, studio art)|62000.0|Daily or almost every day|Male|White or of European descent|Bachelor’s degree (BA, BS, B.Eng., etc.)|1 - 2 hours|25 - 34 years old|Less than a year ago|C#;JavaScript;Python;SQL;TypeScript;HTML;CSS 42375|India|Neither satisfied nor dissatisfied|Computer science, computer engineering, or software engineering|7140.0|I don't typically exercise|Male|South Asian|Some college/university study without earning a degree|30 - 59 minutes|25 - 34 years old|Between 1 and 2 years ago|C;Java;Matlab;Objective-C;PHP;SQL;Swift;VB.NET;Visual Basic 6;HTML;CSS ================================================ FILE: examples/sample-book/gen/dynamic_subs/dynamic_substitutions.xml ================================================ 7 49 -2 x-6 -3 -6 6 -2 -1 x^{5}-10 -\left(5 x^{4}\right) -\left(20 x^{3}\right) -10 5 4 4 \left(-x-3\right)^{3}+5 4 x^{3}+5 -x-3 ================================================ FILE: examples/sample-book/gen/qrcode/OpenDSA-integration-bs-url.xml ================================================ https://pretextbook.org/examples/noparts/decorative/html/OpenDSA-integration-bs.htmlhttps://pretextbook.org/examples/noparts/decorative/html/splice-integration.html#OpenDSA-integration-bs ================================================ FILE: examples/sample-book/gen/qrcode/OpenDSA-integration-dijkstra-url.xml ================================================ https://pretextbook.org/examples/noparts/decorative/html/OpenDSA-integration-dijkstra.htmlhttps://pretextbook.org/examples/noparts/decorative/html/splice-integration.html#OpenDSA-integration-dijkstra ================================================ FILE: examples/sample-book/gen/qrcode/OpenDSA-list-insertion-exercise-url.xml ================================================ https://pretextbook.org/examples/noparts/decorative/html/OpenDSA-list-insertion-exercise.htmlhttps://pretextbook.org/examples/noparts/decorative/html/splice-integration.html#OpenDSA-list-insertion-exercise ================================================ FILE: examples/sample-book/gen/qrcode/OpenDSA-list-insertion-url.xml ================================================ https://pretextbook.org/examples/noparts/decorative/html/OpenDSA-list-insertion.htmlhttps://pretextbook.org/examples/noparts/decorative/html/splice-integration.html#OpenDSA-list-insertion ================================================ FILE: examples/sample-book/gen/qrcode/doenet-velocity-url.xml ================================================ https://pretextbook.org/examples/noparts/decorative/html/doenet-velocity.htmlhttps://pretextbook.org/examples/noparts/decorative/html/splice-integration.html#doenet-velocityhttps://pretextbook.org/examples/noparts/decorative/html/doenet-velocity-if.html ================================================ FILE: examples/sample-book/gen/qrcode/interactive-doenetml-example-url.xml ================================================ https://pretextbook.org/examples/noparts/decorative/html/interactive-doenetml-example.htmlhttps://pretextbook.org/examples/noparts/decorative/html/doenet.html#interactive-doenetml-examplehttps://pretextbook.org/examples/noparts/decorative/html/interactive-doenetml-example-if.html ================================================ FILE: examples/sample-book/gen/qrcode/interactive-horstmann-codecheck-url.xml ================================================ https://pretextbook.org/examples/noparts/decorative/html/interactive-horstmann-codecheck.htmlhttps://pretextbook.org/examples/noparts/decorative/html/splice-integration.html#interactive-horstmann-codecheck ================================================ FILE: examples/sample-book/gen/qrcode/opendsa-slideshow-pop-url.xml ================================================ https://pretextbook.org/examples/noparts/decorative/html/opendsa-slideshow-pop.htmlhttps://pretextbook.org/examples/noparts/decorative/html/splice-integration.html#opendsa-slideshow-pop ================================================ FILE: examples/sample-book/gen/qrcode/show-eval-visualization-url.xml ================================================ https://pretextbook.org/examples/noparts/decorative/html/show-eval-visualization.htmlhttps://pretextbook.org/examples/noparts/decorative/html/splice-integration.html#show-eval-visualizationhttps://pretextbook.org/examples/noparts/decorative/html/show-eval-visualization-if.html ================================================ FILE: examples/sample-book/gen/qrcode/splice-resize-example-url.xml ================================================ https://pretextbook.org/examples/noparts/decorative/html/splice-resize-example.htmlhttps://pretextbook.org/examples/noparts/decorative/html/splice-integration.html#splice-resize-examplehttps://pretextbook.org/examples/noparts/decorative/html/splice-resize-example-if.html ================================================ FILE: examples/sample-book/gen/qrcode/youtube-list-vars-eight-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/noparts/decorative/html/atomic-video.html#youtube-list-vars-eight ================================================ FILE: examples/sample-book/gen/qrcode/youtube-list-vars-eleven-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/noparts/decorative/html/atomic-video.html#youtube-list-vars-eleven ================================================ FILE: examples/sample-book/gen/qrcode/youtube-list-vars-five-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/noparts/decorative/html/atomic-video.html#youtube-list-vars-five ================================================ FILE: examples/sample-book/gen/qrcode/youtube-list-vars-four-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/noparts/decorative/html/atomic-video.html#youtube-list-vars-four ================================================ FILE: examples/sample-book/gen/qrcode/youtube-list-vars-nine-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/noparts/decorative/html/atomic-video.html#youtube-list-vars-nine ================================================ FILE: examples/sample-book/gen/qrcode/youtube-list-vars-one-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/noparts/decorative/html/atomic-video.html#youtube-list-vars-one ================================================ FILE: examples/sample-book/gen/qrcode/youtube-list-vars-seven-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/noparts/decorative/html/atomic-video.html#youtube-list-vars-seven ================================================ FILE: examples/sample-book/gen/qrcode/youtube-list-vars-six-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/noparts/decorative/html/atomic-video.html#youtube-list-vars-six ================================================ FILE: examples/sample-book/gen/qrcode/youtube-list-vars-ten-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/noparts/decorative/html/atomic-video.html#youtube-list-vars-ten ================================================ FILE: examples/sample-book/gen/qrcode/youtube-list-vars-three-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/noparts/decorative/html/atomic-video.html#youtube-list-vars-three ================================================ FILE: examples/sample-book/gen/qrcode/youtube-list-vars-two-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/noparts/decorative/html/atomic-video.html#youtube-list-vars-two ================================================ FILE: examples/sample-book/gen/qrcode/youtube-list-vars-url.xml ================================================ https://www.youtube.com/watch?v=X1-UNHUajfkhttps://pretextbook.org/examples/noparts/decorative/html/videos-in-runestone.html#youtube-list-vars ================================================ FILE: examples/sample-book/gen/trace/c-hello-world-code-lens.js ================================================ if (allTraceData === undefined) { var allTraceData = {}; } (function() { // IIFE to avoid variable collision let codelensID = "rs-c-hello-world-code-lens"; //fallback let partnerCodelens = document.currentScript.parentElement.querySelector(".pytutorVisualizer"); if (partnerCodelens) { codelensID = partnerCodelens.id; } allTraceData[codelensID] = {"code": "#include \n\nint main(void)\n{\n puts(\"Hello, World!\");\n}\n", "trace": [{"event": "step_line", "func_name": "main", "globals": {}, "heap": {}, "line": 5, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 4, "ordered_varnames": [], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "return", "func_name": "main", "globals": {}, "heap": {}, "line": 6, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": [], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": "Hello, World!\n"}], "startingInstruction": 0}; })(); ================================================ FILE: examples/sample-book/gen/trace/exploration-with-always-static-program.js ================================================ if (allTraceData === undefined) { var allTraceData = {}; } (function() { // IIFE to avoid variable collision let codelensID = "rs-exploration-with-always-static-program"; //fallback let partnerCodelens = document.currentScript.parentElement.querySelector(".pytutorVisualizer"); if (partnerCodelens) { codelensID = partnerCodelens.id; } allTraceData[codelensID] = {"code": "for i in range(10):\n print(i)\n", "trace": [{"line": 1, "event": "step_line", "func_name": "", "globals": {}, "ordered_globals": [], "stack_to_render": [], "heap": {}, "stdout": ""}, {"line": 2, "event": "step_line", "func_name": "", "globals": {"i": 0}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": ""}, {"line": 1, "event": "step_line", "func_name": "", "globals": {"i": 0}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n"}, {"line": 2, "event": "step_line", "func_name": "", "globals": {"i": 1}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n"}, {"line": 1, "event": "step_line", "func_name": "", "globals": {"i": 1}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n"}, {"line": 2, "event": "step_line", "func_name": "", "globals": {"i": 2}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n"}, {"line": 1, "event": "step_line", "func_name": "", "globals": {"i": 2}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n"}, {"line": 2, "event": "step_line", "func_name": "", "globals": {"i": 3}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n"}, {"line": 1, "event": "step_line", "func_name": "", "globals": {"i": 3}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n"}, {"line": 2, "event": "step_line", "func_name": "", "globals": {"i": 4}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n"}, {"line": 1, "event": "step_line", "func_name": "", "globals": {"i": 4}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n4\n"}, {"line": 2, "event": "step_line", "func_name": "", "globals": {"i": 5}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n4\n"}, {"line": 1, "event": "step_line", "func_name": "", "globals": {"i": 5}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n4\n5\n"}, {"line": 2, "event": "step_line", "func_name": "", "globals": {"i": 6}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n4\n5\n"}, {"line": 1, "event": "step_line", "func_name": "", "globals": {"i": 6}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n4\n5\n6\n"}, {"line": 2, "event": "step_line", "func_name": "", "globals": {"i": 7}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n4\n5\n6\n"}, {"line": 1, "event": "step_line", "func_name": "", "globals": {"i": 7}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n4\n5\n6\n7\n"}, {"line": 2, "event": "step_line", "func_name": "", "globals": {"i": 8}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n4\n5\n6\n7\n"}, {"line": 1, "event": "step_line", "func_name": "", "globals": {"i": 8}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n4\n5\n6\n7\n8\n"}, {"line": 2, "event": "step_line", "func_name": "", "globals": {"i": 9}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n4\n5\n6\n7\n8\n"}, {"line": 1, "event": "step_line", "func_name": "", "globals": {"i": 9}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n"}, {"line": 1, "event": "return", "func_name": "", "globals": {"i": 9}, "ordered_globals": ["i"], "stack_to_render": [], "heap": {}, "stdout": "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n"}], "startingInstruction": 0}; })(); ================================================ FILE: examples/sample-book/gen/trace/java-hello-world-code-lens.js ================================================ if (allTraceData === undefined) { var allTraceData = {}; } (function() { // IIFE to avoid variable collision let codelensID = "rs-java-hello-world-code-lens"; //fallback let partnerCodelens = document.currentScript.parentElement.querySelector(".pytutorVisualizer"); if (partnerCodelens) { codelensID = partnerCodelens.id; } allTraceData[codelensID] = {"code": "public class HelloWorld {\n public static void main(String[] args) {\n System.out.println(\"Hello, World!\");\n }\n}\n", "stdin": "", "trace": [{"stdout": "", "event": "call", "line": 3, "stack_to_render": [{"func_name": "main:3", "encoded_locals": {}, "ordered_varnames": [], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "1", "frame_id": 1}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {}}, {"stdout": "", "event": "step_line", "line": 3, "stack_to_render": [{"func_name": "main:3", "encoded_locals": {}, "ordered_varnames": [], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "2", "frame_id": 2}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {}}, {"stdout": "Hello, World!\n", "event": "step_line", "line": 4, "stack_to_render": [{"func_name": "main:4", "encoded_locals": {}, "ordered_varnames": [], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "5", "frame_id": 5}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {}}, {"stdout": "Hello, World!\n", "event": "return", "line": 4, "stack_to_render": [{"func_name": "main:4", "encoded_locals": {"__return__": ["VOID"]}, "ordered_varnames": ["__return__"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "6", "frame_id": 6}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {}}], "userlog": "Debugger VM maxMemory: 444M\n", "startingInstruction": 0}; })(); ================================================ FILE: examples/sample-book/gen/trace/program-codelens-cpp-questions.js ================================================ if (allTraceData === undefined) { var allTraceData = {}; } (function() { // IIFE to avoid variable collision let codelensID = "rs-program-codelens-cpp-questions"; //fallback let partnerCodelens = document.currentScript.parentElement.querySelector(".pytutorVisualizer"); if (partnerCodelens) { codelensID = partnerCodelens.id; } allTraceData[codelensID] = {"code": "int foo() {\n int x = 2;\n int y = ++x;\n return y;\n}\nint main() {\n int x = foo();\n while (x < 20) {\n x *= 2;\n }\n}\n", "trace": [{"event": "step_line", "func_name": "main", "globals": {}, "heap": {}, "line": 6, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": [], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {}, "heap": {}, "line": 7, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {"x": ["C_DATA", "0xFFF000BDC", "int", ""]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["x"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "call", "func_name": "foo()", "globals": {}, "heap": {}, "line": 2, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {"x": ["C_DATA", "0xFFF000BDC", "int", ""]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": false, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["x"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}, {"encoded_locals": {"x": ["C_DATA", "0xFFF000BB8", "int", ""], "y": ["C_DATA", "0xFFF000BBC", "int", ""]}, "frame_id": "0xFFF000BC0", "func_name": "foo()", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 2, "ordered_varnames": ["x", "y"], "parent_frame_id_list": [], "unique_hash": "foo()_0xFFF000BC0"}], "stdout": ""}, {"event": "step_line", "func_name": "foo()", "globals": {}, "heap": {}, "line": 3, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {"x": ["C_DATA", "0xFFF000BDC", "int", ""]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": false, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["x"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}, {"encoded_locals": {"x": ["C_DATA", "0xFFF000BB8", "int", 2], "y": ["C_DATA", "0xFFF000BBC", "int", ""]}, "frame_id": "0xFFF000BC0", "func_name": "foo()", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 3, "ordered_varnames": ["x", "y"], "parent_frame_id_list": [], "unique_hash": "foo()_0xFFF000BC0"}], "stdout": "", "question": {"text": "What value will be assigned to y?", "correctText": "3", "feedback": "++ has precedence over ="}}, {"event": "step_line", "func_name": "foo()", "globals": {}, "heap": {}, "line": 4, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {"x": ["C_DATA", "0xFFF000BDC", "int", ""]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": false, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["x"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}, {"encoded_locals": {"x": ["C_DATA", "0xFFF000BB8", "int", 3], "y": ["C_DATA", "0xFFF000BBC", "int", 3]}, "frame_id": "0xFFF000BC0", "func_name": "foo()", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 4, "ordered_varnames": ["x", "y"], "parent_frame_id_list": [], "unique_hash": "foo()_0xFFF000BC0"}], "stdout": ""}, {"event": "return", "func_name": "foo()", "globals": {}, "heap": {}, "line": 5, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {"x": ["C_DATA", "0xFFF000BDC", "int", ""]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": false, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["x"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}, {"encoded_locals": {}, "frame_id": "0xFFF000BC0", "func_name": "foo()", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": [], "parent_frame_id_list": [], "unique_hash": "foo()_0xFFF000BC0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {}, "heap": {}, "line": 8, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {"x": ["C_DATA", "0xFFF000BDC", "int", 3]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["x"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {}, "heap": {}, "line": 9, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {"x": ["C_DATA", "0xFFF000BDC", "int", 3]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 9, "ordered_varnames": ["x"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": "", "question": {"text": "What value will be assigned to x?", "correct": "current_frame.x", "feedback": "We are doubling it"}}, {"event": "step_line", "func_name": "main", "globals": {}, "heap": {}, "line": 8, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {"x": ["C_DATA", "0xFFF000BDC", "int", 6]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 8, "ordered_varnames": ["x"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {}, "heap": {}, "line": 9, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {"x": ["C_DATA", "0xFFF000BDC", "int", 6]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 8, "ordered_varnames": ["x"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": "", "question": {"text": "What value will be assigned to x?", "correct": "current_frame.x", "feedback": "We are doubling it"}}, {"event": "step_line", "func_name": "main", "globals": {}, "heap": {}, "line": 8, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {"x": ["C_DATA", "0xFFF000BDC", "int", 12]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 8, "ordered_varnames": ["x"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {}, "heap": {}, "line": 9, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {"x": ["C_DATA", "0xFFF000BDC", "int", 12]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 8, "ordered_varnames": ["x"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": "", "question": {"text": "What value will be assigned to x?", "correct": "current_frame.x", "feedback": "We are doubling it"}}, {"event": "step_line", "func_name": "main", "globals": {}, "heap": {}, "line": 8, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {"x": ["C_DATA", "0xFFF000BDC", "int", 24]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 8, "ordered_varnames": ["x"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {}, "heap": {}, "line": 11, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": [], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "return", "func_name": "main", "globals": {}, "heap": {}, "line": 11, "ordered_globals": [], "stack_to_render": [{"encoded_locals": {}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": [], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}], "startingInstruction": 0}; })(); ================================================ FILE: examples/sample-book/gen/trace/python-code-lens-questions.js ================================================ if (allTraceData === undefined) { var allTraceData = {}; } (function() { // IIFE to avoid variable collision let codelensID = "rs-python-code-lens-questions"; //fallback let partnerCodelens = document.currentScript.parentElement.querySelector(".pytutorVisualizer"); if (partnerCodelens) { codelensID = partnerCodelens.id; } allTraceData[codelensID] = {"code": "def foo(n):\n n = n + 1\n return n\nx = 7\ny = x // 3\nz = foo(y)\n", "trace": [{"line": 1, "event": "step_line", "func_name": "", "globals": {}, "ordered_globals": [], "stack_to_render": [], "heap": {}, "stdout": ""}, {"line": 4, "event": "step_line", "func_name": "", "globals": {"foo": ["REF", 1]}, "ordered_globals": ["foo"], "stack_to_render": [], "heap": {"1": ["FUNCTION", "foo(n)", null]}, "stdout": "", "question": {"text": "What variable is being assigned to?", "correctText": "x"}}, {"line": 5, "event": "step_line", "func_name": "", "globals": {"foo": ["REF", 1], "x": 7}, "ordered_globals": ["foo", "x"], "stack_to_render": [], "heap": {"1": ["FUNCTION", "foo(n)", null]}, "stdout": "", "question": {"text": "What value will be assigned to y?", "correct": "globals.y", "feedback": "// does integer division"}}, {"line": 6, "event": "step_line", "func_name": "", "globals": {"foo": ["REF", 1], "x": 7, "y": 2}, "ordered_globals": ["foo", "x", "y"], "stack_to_render": [], "heap": {"1": ["FUNCTION", "foo(n)", null]}, "stdout": ""}, {"line": 1, "event": "call", "func_name": "foo", "globals": {"foo": ["REF", 1], "x": 7, "y": 2}, "ordered_globals": ["foo", "x", "y"], "stack_to_render": [{"func_name": "foo", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 2}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": true, "unique_hash": "foo_f1"}], "heap": {"1": ["FUNCTION", "foo(n)", null]}, "stdout": ""}, {"line": 2, "event": "step_line", "func_name": "foo", "globals": {"foo": ["REF", 1], "x": 7, "y": 2}, "ordered_globals": ["foo", "x", "y"], "stack_to_render": [{"func_name": "foo", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 2}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": true, "unique_hash": "foo_f1"}], "heap": {"1": ["FUNCTION", "foo(n)", null]}, "stdout": ""}, {"line": 3, "event": "step_line", "func_name": "foo", "globals": {"foo": ["REF", 1], "x": 7, "y": 2}, "ordered_globals": ["foo", "x", "y"], "stack_to_render": [{"func_name": "foo", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 3}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": true, "unique_hash": "foo_f1"}], "heap": {"1": ["FUNCTION", "foo(n)", null]}, "stdout": "", "question": {"text": "What value will be returned?", "correct": "current_frame.n", "feedback": "What is n right now?"}}, {"line": 3, "event": "return", "func_name": "foo", "globals": {"foo": ["REF", 1], "x": 7, "y": 2}, "ordered_globals": ["foo", "x", "y"], "stack_to_render": [{"func_name": "foo", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 3, "__return__": 3}, "ordered_varnames": ["n", "__return__"], "is_zombie": false, "is_highlighted": true, "unique_hash": "foo_f1"}], "heap": {"1": ["FUNCTION", "foo(n)", null]}, "stdout": ""}, {"line": 6, "event": "return", "func_name": "", "globals": {"foo": ["REF", 1], "x": 7, "y": 2, "z": 3}, "ordered_globals": ["foo", "x", "y", "z"], "stack_to_render": [], "heap": {"1": ["FUNCTION", "foo(n)", null]}, "stdout": ""}], "startingInstruction": 0}; })(); ================================================ FILE: examples/sample-book/gen/trace/python-hello-world-code-lens.js ================================================ if (allTraceData === undefined) { var allTraceData = {}; } (function() { // IIFE to avoid variable collision let codelensID = "rs-python-hello-world-code-lens"; //fallback let partnerCodelens = document.currentScript.parentElement.querySelector(".pytutorVisualizer"); if (partnerCodelens) { codelensID = partnerCodelens.id; } allTraceData[codelensID] = {"code": "print('Hello, World!')\n", "trace": [{"line": 1, "event": "step_line", "func_name": "", "globals": {}, "ordered_globals": [], "stack_to_render": [], "heap": {}, "stdout": ""}, {"line": 1, "event": "return", "func_name": "", "globals": {}, "ordered_globals": [], "stack_to_render": [], "heap": {}, "stdout": "Hello, World!\n"}], "startingInstruction": 0}; })(); ================================================ FILE: examples/sample-book/gen/trace/sieve-codelens-cpp.js ================================================ if (allTraceData === undefined) { var allTraceData = {}; } (function() { // IIFE to avoid variable collision let codelensID = "rs-sieve-codelens-cpp"; //fallback let partnerCodelens = document.currentScript.parentElement.querySelector(".pytutorVisualizer"); if (partnerCodelens) { codelensID = partnerCodelens.id; } allTraceData[codelensID] = {"code": "#include \nconst int len = 20;\nint main() {\n int arr[20] = {0};\n for (int i = 2; i < len; i++) {\n for (int j = i * i; j < len; j+=i) {\n arr[j - 1] = 1;\n }\n }\n for (int i = 1; i < len; i++) {\n if (arr[i - 1] == 0)\n printf(\" %d\", i);\n }\n}\n", "trace": [{"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 3, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 3, "ordered_varnames": [], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 4, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", ""], ["C_DATA", "0xFFF000B94", "int", ""], ["C_DATA", "0xFFF000B98", "int", ""], ["C_DATA", "0xFFF000B9C", "int", ""], ["C_DATA", "0xFFF000BA0", "int", ""], ["C_DATA", "0xFFF000BA4", "int", ""], ["C_DATA", "0xFFF000BA8", "int", ""], ["C_DATA", "0xFFF000BAC", "int", ""], ["C_DATA", "0xFFF000BB0", "int", ""], ["C_DATA", "0xFFF000BB4", "int", ""], ["C_DATA", "0xFFF000BB8", "int", ""], ["C_DATA", "0xFFF000BBC", "int", ""], ["C_DATA", "0xFFF000BC0", "int", ""], ["C_DATA", "0xFFF000BC4", "int", ""], ["C_DATA", "0xFFF000BC8", "int", ""], ["C_DATA", "0xFFF000BCC", "int", ""], ["C_DATA", "0xFFF000BD0", "int", ""], ["C_DATA", "0xFFF000BD4", "int", ""], ["C_DATA", "0xFFF000BD8", "int", ""], ["C_DATA", "0xFFF000BDC", "int", ""]]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 4, "ordered_varnames": ["arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 0], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 0], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 0], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 0], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 0], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", ""]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 0], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 0], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 0], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 0], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 0], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", ""]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 0], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 0], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 0], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 0], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 0], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 4]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 0], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 0], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 0], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 0], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 4]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 0], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 0], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 0], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 0], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 6]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 0], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 0], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 0], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 6]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 0], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 0], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 0], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 8]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 0], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 0], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 8]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 0], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 0], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 10]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 0], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 10]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 0], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 12]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 12]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 0], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 14]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 14]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 0], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 16]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 16]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 0], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 18]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2], "j": ["C_DATA", "0xFFF000B88", "int", 18]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 2]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 3], "j": ["C_DATA", "0xFFF000B88", "int", 20]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 0], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 3], "j": ["C_DATA", "0xFFF000B88", "int", 9]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 3], "j": ["C_DATA", "0xFFF000B88", "int", 9]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 3], "j": ["C_DATA", "0xFFF000B88", "int", 12]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 3], "j": ["C_DATA", "0xFFF000B88", "int", 12]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 0], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 3], "j": ["C_DATA", "0xFFF000B88", "int", 15]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 3], "j": ["C_DATA", "0xFFF000B88", "int", 15]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 3], "j": ["C_DATA", "0xFFF000B88", "int", 18]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 3], "j": ["C_DATA", "0xFFF000B88", "int", 18]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 3]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 4], "j": ["C_DATA", "0xFFF000B88", "int", 21]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 7, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 4], "j": ["C_DATA", "0xFFF000B88", "int", 16]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 7, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 4], "j": ["C_DATA", "0xFFF000B88", "int", 16]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 4]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 5], "j": ["C_DATA", "0xFFF000B88", "int", 20]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 5]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 6], "j": ["C_DATA", "0xFFF000B88", "int", 25]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 6]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 7], "j": ["C_DATA", "0xFFF000B88", "int", 36]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 7]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 8], "j": ["C_DATA", "0xFFF000B88", "int", 49]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 8]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 9], "j": ["C_DATA", "0xFFF000B88", "int", 64]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 9]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 10], "j": ["C_DATA", "0xFFF000B88", "int", 81]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 10]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 11], "j": ["C_DATA", "0xFFF000B88", "int", 100]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 11]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 12], "j": ["C_DATA", "0xFFF000B88", "int", 121]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 12]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 13], "j": ["C_DATA", "0xFFF000B88", "int", 144]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 13]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 14], "j": ["C_DATA", "0xFFF000B88", "int", 169]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 14]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 15], "j": ["C_DATA", "0xFFF000B88", "int", 196]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 15]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 16], "j": ["C_DATA", "0xFFF000B88", "int", 225]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 16]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 17], "j": ["C_DATA", "0xFFF000B88", "int", 256]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 17]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 18], "j": ["C_DATA", "0xFFF000B88", "int", 289]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 18]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 6, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 19], "j": ["C_DATA", "0xFFF000B88", "int", 324]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 6, "ordered_varnames": ["j", "i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 5, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B84", "int", 19]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 5, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", ""]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 1]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 12, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 1]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 12, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": ""}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 1]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 2]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 12, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 2]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 12, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 2]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 3]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 12, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 3]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 12, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 3]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 4]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 4]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 5]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 12, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 5]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 12, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 5]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 6]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 6]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 7]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 12, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 7]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 12, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 7]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 8]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 8]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 9]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 9]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 10]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 10]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 11]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 12, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 11]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 12, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 11]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 12]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 12]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 13]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 12, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 13]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 12, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 13]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 14]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 14]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 15]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 15]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 16]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 16]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 17]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 12, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 17]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 12, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 17]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13 17"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 18]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13 17"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 18]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13 17"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 11, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 19]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 11, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13 17"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 12, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 19]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 12, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13 17"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 10, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {"arr": ["C_ARRAY", "0xFFF000B90", ["C_DATA", "0xFFF000B90", "int", 0], ["C_DATA", "0xFFF000B94", "int", 0], ["C_DATA", "0xFFF000B98", "int", 0], ["C_DATA", "0xFFF000B9C", "int", 1], ["C_DATA", "0xFFF000BA0", "int", 0], ["C_DATA", "0xFFF000BA4", "int", 1], ["C_DATA", "0xFFF000BA8", "int", 0], ["C_DATA", "0xFFF000BAC", "int", 1], ["C_DATA", "0xFFF000BB0", "int", 1], ["C_DATA", "0xFFF000BB4", "int", 1], ["C_DATA", "0xFFF000BB8", "int", 0], ["C_DATA", "0xFFF000BBC", "int", 1], ["C_DATA", "0xFFF000BC0", "int", 0], ["C_DATA", "0xFFF000BC4", "int", 1], ["C_DATA", "0xFFF000BC8", "int", 1], ["C_DATA", "0xFFF000BCC", "int", 1], ["C_DATA", "0xFFF000BD0", "int", 0], ["C_DATA", "0xFFF000BD4", "int", 1], ["C_DATA", "0xFFF000BD8", "int", 0], ["C_DATA", "0xFFF000BDC", "int", 0]], "i": ["C_DATA", "0xFFF000B8C", "int", 19]}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 10, "ordered_varnames": ["i", "arr"], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13 17 19"}, {"event": "step_line", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 14, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 14, "ordered_varnames": [], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13 17 19"}, {"event": "return", "func_name": "main", "globals": {"len": ["C_DATA", "0x400658", "int", 20]}, "heap": {}, "line": 14, "ordered_globals": ["len"], "stack_to_render": [{"encoded_locals": {}, "frame_id": "0xFFF000BE0", "func_name": "main", "is_highlighted": true, "is_parent": false, "is_zombie": false, "line": 14, "ordered_varnames": [], "parent_frame_id_list": [], "unique_hash": "main_0xFFF000BE0"}], "stdout": " 1 2 3 5 7 11 13 17 19"}], "startingInstruction": 0}; })(); ================================================ FILE: examples/sample-book/gen/trace/sieve-codelens-java.js ================================================ if (allTraceData === undefined) { var allTraceData = {}; } (function() { // IIFE to avoid variable collision let codelensID = "rs-sieve-codelens-java"; //fallback let partnerCodelens = document.currentScript.parentElement.querySelector(".pytutorVisualizer"); if (partnerCodelens) { codelensID = partnerCodelens.id; } allTraceData[codelensID] = {"code": "public class SievePrimeFactors {\n public static void main(String args[]) {\n int num = 20;\n boolean[] bool = new boolean[num];\n\n for (int i = 0; i< bool.length; i++) {\n bool[i] = true;\n }\n for (int i = 2; i < Math.sqrt(num); i++) {\n if(bool[i] == true) {\n for(int j = (i*i); j < num; j = j+i) {\n bool[j] = false;\n }\n }\n }\n System.out.println(\"List of prime numbers: \");\n for (int i = 2; i< bool.length; i++) {\n if(bool[i]==true) {\n System.out.println(i);\n }\n }\n }\n}\n", "stdin": "", "trace": [{"stdout": "", "event": "call", "line": 3, "stack_to_render": [{"func_name": "main:3", "encoded_locals": {}, "ordered_varnames": [], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "1", "frame_id": 1}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {}}, {"stdout": "", "event": "step_line", "line": 3, "stack_to_render": [{"func_name": "main:3", "encoded_locals": {}, "ordered_varnames": [], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "2", "frame_id": 2}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {}}, {"stdout": "", "event": "step_line", "line": 4, "stack_to_render": [{"func_name": "main:4", "encoded_locals": {"num": 20}, "ordered_varnames": ["num"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "4", "frame_id": 4}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "8", "frame_id": 8}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 0, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "11", "frame_id": 11}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 0, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "15", "frame_id": 15}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 0, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "20", "frame_id": 20}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 1, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "22", "frame_id": 22}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 1, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "27", "frame_id": 27}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 1, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "32", "frame_id": 32}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "34", "frame_id": 34}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "39", "frame_id": 39}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "44", "frame_id": 44}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "46", "frame_id": 46}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "51", "frame_id": 51}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "56", "frame_id": 56}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 4, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "58", "frame_id": 58}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 4, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "63", "frame_id": 63}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 4, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "68", "frame_id": 68}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 5, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "70", "frame_id": 70}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 5, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "75", "frame_id": 75}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 5, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "80", "frame_id": 80}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 6, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "82", "frame_id": 82}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 6, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "87", "frame_id": 87}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 6, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "92", "frame_id": 92}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 7, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "94", "frame_id": 94}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 7, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "99", "frame_id": 99}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 7, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "104", "frame_id": 104}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 8, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "106", "frame_id": 106}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 8, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "111", "frame_id": 111}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 8, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "116", "frame_id": 116}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 9, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "118", "frame_id": 118}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 9, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "123", "frame_id": 123}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 9, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "128", "frame_id": 128}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 10, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "130", "frame_id": 130}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 10, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "135", "frame_id": 135}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 10, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "140", "frame_id": 140}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 11, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "142", "frame_id": 142}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 11, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "147", "frame_id": 147}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 11, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "152", "frame_id": 152}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 12, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "154", "frame_id": 154}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 12, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "159", "frame_id": 159}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 12, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "164", "frame_id": 164}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 13, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "166", "frame_id": 166}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 13, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "171", "frame_id": 171}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 13, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "176", "frame_id": 176}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 14, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "178", "frame_id": 178}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 14, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "183", "frame_id": 183}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 14, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "188", "frame_id": 188}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 15, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "190", "frame_id": 190}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 15, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "195", "frame_id": 195}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 15, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "200", "frame_id": 200}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 16, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "202", "frame_id": 202}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 16, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "207", "frame_id": 207}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 16, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "212", "frame_id": 212}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 17, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "214", "frame_id": 214}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 17, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "219", "frame_id": 219}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 17, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "224", "frame_id": 224}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 18, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "226", "frame_id": 226}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 18, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "231", "frame_id": 231}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 18, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "236", "frame_id": 236}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 19, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "238", "frame_id": 238}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false]}}, {"stdout": "", "event": "step_line", "line": 7, "stack_to_render": [{"func_name": "main:7", "encoded_locals": {"i": 19, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "243", "frame_id": 243}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 19, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "248", "frame_id": 248}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 6, "stack_to_render": [{"func_name": "main:6", "encoded_locals": {"i": 20, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "250", "frame_id": 250}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 9, "stack_to_render": [{"func_name": "main:9", "encoded_locals": {"num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "255", "frame_id": 255}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 9, "stack_to_render": [{"func_name": "main:9", "encoded_locals": {"i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "258", "frame_id": 258}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 10, "stack_to_render": [{"func_name": "main:10", "encoded_locals": {"i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "265", "frame_id": 265}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "271", "frame_id": 271}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 4, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "276", "frame_id": 276}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 12, "stack_to_render": [{"func_name": "main:12", "encoded_locals": {"j": 4, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "279", "frame_id": 279}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 4, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "284", "frame_id": 284}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 6, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "289", "frame_id": 289}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 12, "stack_to_render": [{"func_name": "main:12", "encoded_locals": {"j": 6, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "293", "frame_id": 293}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 6, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "298", "frame_id": 298}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 8, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "303", "frame_id": 303}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 12, "stack_to_render": [{"func_name": "main:12", "encoded_locals": {"j": 8, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "307", "frame_id": 307}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 8, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "312", "frame_id": 312}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 10, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "317", "frame_id": 317}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 12, "stack_to_render": [{"func_name": "main:12", "encoded_locals": {"j": 10, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "321", "frame_id": 321}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 10, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "326", "frame_id": 326}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 12, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "331", "frame_id": 331}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 12, "stack_to_render": [{"func_name": "main:12", "encoded_locals": {"j": 12, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "335", "frame_id": 335}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 12, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "340", "frame_id": 340}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 14, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "345", "frame_id": 345}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 12, "stack_to_render": [{"func_name": "main:12", "encoded_locals": {"j": 14, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "349", "frame_id": 349}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 14, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "354", "frame_id": 354}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 16, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "359", "frame_id": 359}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 12, "stack_to_render": [{"func_name": "main:12", "encoded_locals": {"j": 16, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "363", "frame_id": 363}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 16, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "368", "frame_id": 368}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 18, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "373", "frame_id": 373}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 12, "stack_to_render": [{"func_name": "main:12", "encoded_locals": {"j": 18, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "377", "frame_id": 377}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 18, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "382", "frame_id": 382}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 20, "i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "387", "frame_id": 387}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 9, "stack_to_render": [{"func_name": "main:9", "encoded_locals": {"i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "391", "frame_id": 391}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 9, "stack_to_render": [{"func_name": "main:9", "encoded_locals": {"i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "393", "frame_id": 393}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 10, "stack_to_render": [{"func_name": "main:10", "encoded_locals": {"i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "401", "frame_id": 401}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "407", "frame_id": 407}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 9, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "412", "frame_id": 412}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 12, "stack_to_render": [{"func_name": "main:12", "encoded_locals": {"j": 9, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "415", "frame_id": 415}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 9, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "420", "frame_id": 420}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 12, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "425", "frame_id": 425}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 12, "stack_to_render": [{"func_name": "main:12", "encoded_locals": {"j": 12, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "429", "frame_id": 429}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 12, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "434", "frame_id": 434}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 15, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "439", "frame_id": 439}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 12, "stack_to_render": [{"func_name": "main:12", "encoded_locals": {"j": 15, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "443", "frame_id": 443}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 15, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "448", "frame_id": 448}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 18, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "453", "frame_id": 453}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 12, "stack_to_render": [{"func_name": "main:12", "encoded_locals": {"j": 18, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "457", "frame_id": 457}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 18, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "462", "frame_id": 462}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 11, "stack_to_render": [{"func_name": "main:11", "encoded_locals": {"j": 21, "i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i", "j"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "467", "frame_id": 467}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 9, "stack_to_render": [{"func_name": "main:9", "encoded_locals": {"i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "471", "frame_id": 471}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 9, "stack_to_render": [{"func_name": "main:9", "encoded_locals": {"i": 4, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "473", "frame_id": 473}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 10, "stack_to_render": [{"func_name": "main:10", "encoded_locals": {"i": 4, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "481", "frame_id": 481}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 9, "stack_to_render": [{"func_name": "main:9", "encoded_locals": {"i": 4, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "487", "frame_id": 487}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 9, "stack_to_render": [{"func_name": "main:9", "encoded_locals": {"i": 5, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "489", "frame_id": 489}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "", "event": "step_line", "line": 16, "stack_to_render": [{"func_name": "main:16", "encoded_locals": {"num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "497", "frame_id": 497}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "501", "frame_id": 501}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "503", "frame_id": 503}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "507", "frame_id": 507}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n", "event": "step_line", "line": 19, "stack_to_render": [{"func_name": "main:19", "encoded_locals": {"i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "513", "frame_id": 513}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 2, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "517", "frame_id": 517}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "518", "frame_id": 518}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "523", "frame_id": 523}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n", "event": "step_line", "line": 19, "stack_to_render": [{"func_name": "main:19", "encoded_locals": {"i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "529", "frame_id": 529}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 3, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "533", "frame_id": 533}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 4, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "534", "frame_id": 534}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 4, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "539", "frame_id": 539}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 4, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "545", "frame_id": 545}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 5, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "547", "frame_id": 547}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 5, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "552", "frame_id": 552}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n", "event": "step_line", "line": 19, "stack_to_render": [{"func_name": "main:19", "encoded_locals": {"i": 5, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "558", "frame_id": 558}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 5, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "562", "frame_id": 562}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 6, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "563", "frame_id": 563}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 6, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "568", "frame_id": 568}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 6, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "574", "frame_id": 574}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 7, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "576", "frame_id": 576}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 7, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "581", "frame_id": 581}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n", "event": "step_line", "line": 19, "stack_to_render": [{"func_name": "main:19", "encoded_locals": {"i": 7, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "587", "frame_id": 587}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 7, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "591", "frame_id": 591}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 8, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "592", "frame_id": 592}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 8, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "597", "frame_id": 597}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 8, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "603", "frame_id": 603}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 9, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "605", "frame_id": 605}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 9, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "610", "frame_id": 610}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 9, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "616", "frame_id": 616}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 10, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "618", "frame_id": 618}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 10, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "623", "frame_id": 623}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 10, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "629", "frame_id": 629}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 11, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "631", "frame_id": 631}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 11, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "636", "frame_id": 636}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n", "event": "step_line", "line": 19, "stack_to_render": [{"func_name": "main:19", "encoded_locals": {"i": 11, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "642", "frame_id": 642}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 11, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "646", "frame_id": 646}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 12, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "647", "frame_id": 647}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 12, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "652", "frame_id": 652}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 12, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "658", "frame_id": 658}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 13, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "660", "frame_id": 660}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 13, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "665", "frame_id": 665}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n", "event": "step_line", "line": 19, "stack_to_render": [{"func_name": "main:19", "encoded_locals": {"i": 13, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "671", "frame_id": 671}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 13, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "675", "frame_id": 675}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 14, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "676", "frame_id": 676}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 14, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "681", "frame_id": 681}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 14, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "687", "frame_id": 687}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 15, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "689", "frame_id": 689}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 15, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "694", "frame_id": 694}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 15, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "700", "frame_id": 700}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 16, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "702", "frame_id": 702}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 16, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "707", "frame_id": 707}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 16, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "713", "frame_id": 713}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 17, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "715", "frame_id": 715}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 17, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "720", "frame_id": 720}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n", "event": "step_line", "line": 19, "stack_to_render": [{"func_name": "main:19", "encoded_locals": {"i": 17, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "726", "frame_id": 726}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n17\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 17, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "730", "frame_id": 730}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n17\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 18, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "731", "frame_id": 731}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n17\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 18, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "736", "frame_id": 736}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n17\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 18, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "742", "frame_id": 742}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n17\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 19, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "744", "frame_id": 744}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n17\n", "event": "step_line", "line": 18, "stack_to_render": [{"func_name": "main:18", "encoded_locals": {"i": 19, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "749", "frame_id": 749}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n17\n", "event": "step_line", "line": 19, "stack_to_render": [{"func_name": "main:19", "encoded_locals": {"i": 19, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "755", "frame_id": 755}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n17\n19\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 19, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "759", "frame_id": 759}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n17\n19\n", "event": "step_line", "line": 17, "stack_to_render": [{"func_name": "main:17", "encoded_locals": {"i": 20, "num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool", "i"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "760", "frame_id": 760}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n17\n19\n", "event": "step_line", "line": 22, "stack_to_render": [{"func_name": "main:22", "encoded_locals": {"num": 20, "bool": ["REF", 428]}, "ordered_varnames": ["num", "bool"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "765", "frame_id": 765}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}, {"stdout": "List of prime numbers: \n2\n3\n5\n7\n11\n13\n17\n19\n", "event": "return", "line": 22, "stack_to_render": [{"func_name": "main:22", "encoded_locals": {"num": 20, "bool": ["REF", 428], "__return__": ["VOID"]}, "ordered_varnames": ["num", "bool", "__return__"], "parent_frame_id_list": [], "is_highlighted": true, "is_zombie": false, "is_parent": false, "unique_hash": "767", "frame_id": 767}], "globals": {}, "ordered_globals": [], "func_name": "main", "heap": {"428": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true]}}], "userlog": "Debugger VM maxMemory: 444M\n", "startingInstruction": 0}; })(); ================================================ FILE: examples/sample-book/gen/trace/sieve-codelens-python.js ================================================ if (allTraceData === undefined) { var allTraceData = {}; } (function() { // IIFE to avoid variable collision let codelensID = "rs-sieve-codelens-python"; //fallback let partnerCodelens = document.currentScript.parentElement.querySelector(".pytutorVisualizer"); if (partnerCodelens) { codelensID = partnerCodelens.id; } allTraceData[codelensID] = {"code": "def SieveOfEratosthenes(n):\n # array of type boolean with True values in it\n prime = [True for i in range(n + 1)]\n p = 2\n while (p * p <= n):\n # If it remain unchanged it is prime\n if (prime[p] == True):\n # updating all the multiples\n for i in range(p * 2, n + 1, p):\n prime[i] = False\n p += 1\n prime[0]= False\n prime[1]= False\n # Print\n for p in range(n + 1):\n if prime[p]:\n print (p,end=\" \")\n# main\nif __name__=='__main__':\n n = 20\n print (\"The prime numbers smaller than or equal to\", n,\"is\")\n SieveOfEratosthenes(n)\n", "trace": [{"line": 1, "event": "step_line", "func_name": "", "globals": {}, "ordered_globals": [], "stack_to_render": [], "heap": {}, "stdout": ""}, {"line": 19, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1]}, "ordered_globals": ["SieveOfEratosthenes"], "stack_to_render": [], "heap": {"1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": ""}, {"line": 20, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1]}, "ordered_globals": ["SieveOfEratosthenes"], "stack_to_render": [], "heap": {"1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": ""}, {"line": 21, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [], "heap": {"1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": ""}, {"line": 22, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [], "heap": {"1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 1, "event": "call", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "call", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2]}, "ordered_varnames": [".0"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2]}, "ordered_varnames": [".0"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 0}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 1}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 2}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 3}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 4}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 5}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 6}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 7}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 8}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 9}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 10}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 11}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 12}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 13}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 14}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 15}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 16}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 17}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 18}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 19}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "step_line", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 20}, "ordered_varnames": [".0", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 3, "event": "return", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20}, "ordered_varnames": ["n"], "is_zombie": false, "is_highlighted": false, "unique_hash": "SieveOfEratosthenes_f1"}, {"func_name": "", "is_parent": false, "frame_id": 2, "parent_frame_id_list": [], "encoded_locals": {".0": ["REF", 2], "i": 20, "__return__": ["REF", 3]}, "ordered_varnames": [".0", "i", "__return__"], "is_zombie": false, "is_highlighted": true, "unique_hash": "_f2"}], "heap": {"2": ["INSTANCE", "range_iterator"], "3": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 4, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3]}, "ordered_varnames": ["n", "prime"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 5, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2}, "ordered_varnames": ["n", "prime", "p"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 7, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2}, "ordered_varnames": ["n", "prime", "p"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2}, "ordered_varnames": ["n", "prime", "p"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 4}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 4}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 6}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 6}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 8}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 8}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 10}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 10}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 12}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 12}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 14}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 14}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 16}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 16}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 20}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, true], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 20}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 11, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 20}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 5, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 20}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 7, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 20}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 20}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 6}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 6}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 9}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 9}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 12}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 12}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 15}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, true, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 15}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 10, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 9, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 11, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 5, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 4, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 7, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 4, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 11, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 4, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 5, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 5, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 12, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 5, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", true, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 13, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 5, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, true, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 5, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 0, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 0, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 1, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 1, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 17, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n"}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 2, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 "}, {"line": 17, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 3, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 4, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 4, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 5, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 "}, {"line": 17, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 5, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 5, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 6, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 6, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 7, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 "}, {"line": 17, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 7, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 7, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 8, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 8, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 9, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 9, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 10, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 10, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 11, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 "}, {"line": 17, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 11, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 11, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 12, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 12, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 13, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 "}, {"line": 17, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 13, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 13, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 14, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 14, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 15, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 15, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 16, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 16, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 17, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 "}, {"line": 17, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 17, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 17, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 17 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 18, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 17 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 18, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 17 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 19, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 17 "}, {"line": 17, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 19, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 17 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 19, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 17 19 "}, {"line": 16, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 20, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 17 19 "}, {"line": 15, "event": "step_line", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 20, "i": 18}, "ordered_varnames": ["n", "prime", "p", "i"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 17 19 "}, {"line": 15, "event": "return", "func_name": "SieveOfEratosthenes", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [{"func_name": "SieveOfEratosthenes", "is_parent": false, "frame_id": 1, "parent_frame_id_list": [], "encoded_locals": {"n": 20, "prime": ["REF", 3], "p": 20, "i": 18, "__return__": null}, "ordered_varnames": ["n", "prime", "p", "i", "__return__"], "is_zombie": false, "is_highlighted": true, "unique_hash": "SieveOfEratosthenes_f1"}], "heap": {"3": ["LIST", false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, false, true, false, true, false], "1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 17 19 "}, {"line": 22, "event": "return", "func_name": "", "globals": {"SieveOfEratosthenes": ["REF", 1], "n": 20}, "ordered_globals": ["SieveOfEratosthenes", "n"], "stack_to_render": [], "heap": {"1": ["FUNCTION", "SieveOfEratosthenes(n)", null]}, "stdout": "The prime numbers smaller than or equal to 20 is\n2 3 5 7 11 13 17 19 "}], "startingInstruction": 72}; })(); ================================================ FILE: examples/sample-book/gfdl-mathbook.xml ================================================ GNU Free Documentation License

    Version 1.3, 3 November 2008

    Copyright 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. <>

    Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

    0. PREAMBLE

    The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

    This License is a kind of copyleft, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

    We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

    1. APPLICABILITY AND DEFINITIONS

    This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The Document, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as you. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

    A Modified Version of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

    A Secondary Section is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

    The Invariant Sections are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

    The Cover Texts are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

    A Transparent copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not Transparent is called Opaque.

    Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

    The Title Page means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, Title Page means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.

    The publisher means any person or entity that distributes copies of the Document to the public.

    A section Entitled XYZ means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as Acknowledgements, Dedications, Endorsements, or History.) To Preserve the Title of such a section when you modify the Document means that it remains a section Entitled XYZ according to this definition.

    The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

    2. VERBATIM COPYING

    You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

    You may also lend copies, under the same conditions stated above, and you may publicly display copies.

    3. COPYING IN QUANTITY

    If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

    If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

    If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

    It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

    4. MODIFICATIONS

    You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

    1. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.

    2. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.

    3. State on the Title page the name of the publisher of the Modified Version, as the publisher.

    4. Preserve all the copyright notices of the Document.

    5. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.

    6. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.

    7. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.

    8. Include an unaltered copy of this License.

    9. Preserve the section Entitled History, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled History in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.

    10. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the History section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.

    11. For any section Entitled Acknowledgements or Dedications, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.

    12. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.

    13. Delete any section Entitled Endorsements. Such a section may not be included in the Modified Version.

    14. Do not retitle any existing section to be Entitled Endorsements or to conflict in title with any Invariant Section.

    15. Preserve any Warranty Disclaimers.

    If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.

    You may add a section Entitled Endorsements, provided it contains nothing but endorsements of your Modified Version by various parties for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

    You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

    The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

    5. COMBINING DOCUMENTS

    You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

    The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

    In the combination, you must combine any sections Entitled History in the various original documents, forming one section Entitled History; likewise combine any sections Entitled Acknowledgements, and any sections Entitled Dedications. You must delete all sections Entitled Endorsements.

    6. COLLECTIONS OF DOCUMENTS

    You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

    You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

    7. AGGREGATION WITH INDEPENDENT WORKS

    A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an aggregate if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

    If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

    8. TRANSLATION

    Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

    If a section in the Document is Entitled Acknowledgements, Dedications, or History, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

    9. TERMINATION

    You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.

    However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

    Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

    Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it.

    10. FUTURE REVISIONS OF THIS LICENSE

    The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See .

    Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License or any later version applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document.

    11. RELICENSING

    Massive Multiauthor Collaboration Site (or MMC Site) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A Massive Multiauthor Collaboration (or MMC) contained in the site means any set of copyrightable works thus published on the MMC site.

    CC-BY-SA means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization.

    Incorporate means to publish or republish a Document, in whole or in part, as part of another Document.

    An MMC is eligible for relicensing if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008.

    The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.

    ADDENDUM: How to use this License for your documents

    To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

            Copyright (C)  YEAR  YOUR NAME.
            Permission is granted to copy, distribute and/or modify this document
            under the terms of the GNU Free Documentation License, Version 1.3
            or any later version published by the Free Software Foundation;
            with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
            A copy of the license is included in the section entitled "GNU
            Free Documentation License".
            

    If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the with Texts. line with this:

            with the Invariant Sections being LIST THEIR TITLES, with the
            Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
            

    If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

    If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.

    ================================================ FILE: examples/sample-book/groups.xml ================================================ Groups

    We begin our study of algebraic structures by investigating sets associated with single operations that satisfy certain reasonable axioms; that is, we want to define an operation on a set in a way that will generalize such familiar structures as the integers {\mathbb Z} together with the single operation of addition, or invertible 2 \times 2 matrices together with the single operation of matrix multiplication. The integers and the 2 \times 2 matrices, together with their respective single operations, are examples of algebraic structures known as groups.A test footnote, with no real content.

    The theory of groups occupies a central position in mathematics. Modern group theory arose from an attempt to find the roots of a polynomial in terms of its coefficients. Groups now play a central role in such areas as coding theory, counting, and the study of symmetries; many areas of biology, chemistry, and physics have benefited from group theory.

    helped improve this chapter.

    Integer Equivalence Classes and Symmetries Carl Friedrich Gauß Leonhard Euler

    Let us now investigate some mathematical structures that can be viewed as sets with single operations.

    The Integers mod <m>n</m> Gottfried Wilhelm Leibniz

    The integers mod n have become indispensable in the theory and applications of algebra. In mathematics they are used in cryptography, coding theory, and the detection of errors in identification codes.

    We have already seen that two integers a and b are equivalent mod n if n divides a - b. The integers mod n also partition {\mathbb Z} into n different equivalence classes; we will denote the set of these equivalence classes by {\mathbb Z}_n. \mathbb Z_nthe integers modulo n Consider the integers modulo 12 and the corresponding partition of the integers: {[0]} & = \{ \ldots, -12, 0, 12, 24, \ldots \} {[1]} & = \{ \ldots, -11, 1, 13, 25, \ldots \} & \vdots {[11]} & = \{ \ldots, -1, 11, 23, 35, \ldots \} .

    When no confusion can arise, we will use 0, 1, \ldots, 11 to indicate the equivalence classes {[0]}, {[1]}, \ldots, {[11]} respectively. We can do arithmetic on {\mathbb Z}_n. For two integers a and b, define addition modulo n to be (a + b) \pmod{n}; that is, the remainder when a + b is divided by n. Similarly, multiplication modulo n is defined as (a b) \pmod{ n}, the remainder when a b is divided by n.

    Modular Addition

    The following examples illustrate integer arithmetic modulo n: 7 + 4 & \equiv 1 \pmod{ 5} & 7 \cdot 3 & \equiv 1 \pmod{ 5} 3 + 5 & \equiv 0 \pmod{ 8} & 3 \cdot 5 & \equiv 7 \pmod{ 8} 3 + 4 & \equiv 7 \pmod{ 12} & 3 \cdot 4 & \equiv 0 \pmod{ 12} .

    In particular, notice that it is possible that the product of two nonzero numbers modulo n can be equivalent to 0 modulo n.

    Modular Arithmetic

    Most, but not all, of the usual laws of arithmetic hold for addition and multiplication in {\mathbb Z}_n. For instance, it is not necessarily true that there is a multiplicative inverse. Consider the multiplication table for {\mathbb Z}_8 in . Notice that 2, 4, and 6 do not have multiplicative inverses; that is, for n = 2, 4, or 6, there is no integer k such that k n \equiv 1 \pmod{ 8}.

    Multiplication table for {\mathbb Z_8}

    \begin{array}{c|cccccccc} \end{array}

    Let {\mathbb Z}_n be the set of equivalence classes of the integers mod n and a, b, c \in {\mathbb Z}_n.

    1. Addition and multiplication are commutative: a + b & \equiv b + a \pmod{ n} a b & \equiv b a \pmod{ n}.

    2. Addition and multiplication are associative: (a + b) + c & \equiv a + (b + c)\pmod{ n} (a b) c & \equiv a (b c) \pmod{ n} .

    3. There are both additive and multiplicative identities: a + 0 & \equiv a \pmod{ n} a \cdot 1 & \equiv a \pmod{ n} .

    4. Multiplication distributes over addition: a (b + c) \equiv a b + a c \pmod{ n} .

    5. For every integer a there is an additive inverse -a: a + (-a) \equiv 0 \pmod{ n} .

    6. Let a be a nonzero integer. Then \gcd(a,n) = 1 if and only if there exists a multiplicative inverse b for a \pmod{n}; that is, a nonzero integer b such that a b \equiv 1 \pmod{ n}.

    We will prove (1) and (6) and leave the remaining properties to be proven in the exercises.

    (1) Addition and multiplication are commutative modulo n since the remainder of a + b divided by n is the same as the remainder of b + a divided by n.

    (6) Suppose that \gcd(a, n) = 1. Then there exist integers r and s such that ar + ns = 1. Since ns = 1 - ar, it must be the case that ar \equiv 1 \pmod{n}. Letting b be the equivalence class of r, a b \equiv 1\pmod{n}.

    Conversely, suppose that there exists an integer b such that ab \equiv 1 \pmod{ n}. Then n divides ab -1, so there is an integer k such that ab - nk = 1. Let d = \gcd(a,n). Since d divides ab - nk, d must also divide 1; hence, d = 1.

    Symmetries
    Rigid motions of a rectangle ] (-1,0.5) -- (1,0.5); \node [above] at (0,0.5) {\emph{reflection}}; \node [below] at (0,0.5) {\emph{horizontal axis}}; \node [above,left] at (-3,1) {$A$}; \node [below,left] at (-3,0) {$D$}; \node [above,right] at (-1.25,1) {$B$}; \node [below,right] at (-1.25,0) {$C$}; \node [above,right] at (3,1) {$C$}; \node [below,right] at (3,0) {$B$}; \node [above,left] at (1.25,1) {$D$}; \node [below,left] at (1.25,0) {$A$}; \draw (-3,2) -- (-1.25,2) -- (-1.25,3) -- (-3,3) -- cycle; \draw (3,2) -- (1.25,2) -- (1.25,3) -- (3,3) -- cycle; \draw [->] (-1,2.5) -- (1,2.5); \node [above] at (0,2.5) {\emph{reflection}}; \node [below] at (0,2.5) {\emph{vertical axis}}; \node [above,left] at (-3,3) {$A$}; \node [below,left] at (-3,2) {$D$}; \node [above,right] at (-1.25,3) {$B$}; \node [below,right] at (-1.25,2) {$C$}; \node [above,right] at (3,3) {$A$}; \node [below,right] at (3,2) {$D$}; \node [above,left] at (1.25,3) {$B$}; \node [below,left] at (1.25,2) {$C$}; \draw (-3,4) -- (-1.25,4) -- (-1.25,5) -- (-3,5) -- cycle; \draw (3,4) -- (1.25,4) -- (1.25,5) -- (3,5) -- cycle; \draw [->] (-1,4.5) -- (1,4.5); \node [above] at (0,4.5) {$180^\circ$}; \node [below] at (0,4.5) {\emph{rotation}}; \node [above,left] at (-3,5) {$A$}; \node [below,left] at (-3,4) {$D$}; \node [above,right] at (-1.25,5) {$B$}; \node [below,right] at (-1.25,4) {$C$}; \node [above,right] at (3,5) {$D$}; \node [below,right] at (3,4) {$A$}; \node [above,left] at (1.25,5) {$C$}; \node [below,left] at (1.25,4) {$B$}; \draw (-3,6) -- (-1.25,6) -- (-1.25,7) -- (-3,7) -- cycle; \draw (3,6) -- (1.25,6) -- (1.25,7) -- (3,7) -- cycle; \draw [->] (-1,6.5) -- (1,6.5); \node [above] at (0,6.5) {\emph{identity}}; \node [above,left] at (-3,7) {$A$}; \node [below,left] at (-3,6) {$D$}; \node [above,right] at (-1.25,7) {$B$}; \node [below,right] at (-1.25,6) {$C$}; \node [above,right] at (3,7) {$B$}; \node [below,right] at (3,6) {$C$}; \node [above,left] at (1.25,7) {$A$}; \node [below,left] at (1.25,6) {$D$}; \end{tikzpicture}]]>

    A symmetry of a geometric figure is a rearrangement of the figure preserving the arrangement of its sides and vertices as well as its distances and angles. A map from the plane to itself preserving the symmetry of an object is called a rigid motionRigid motion. For example, if we look at the rectangle in , it is easy to see that a rotation of 180^{\circ} or 360^{\circ} returns a rectangle in the plane with the same orientation as the original rectangle and the same relationship among the vertices. A reflection of the rectangle across either the vertical axis or the horizontal axis can also be seen to be a symmetry. However, a 90^{\circ} rotation in either direction cannot be a symmetry unless the rectangle is a square.

    Symmetries of a triangle ] (2,1) -- (4,1); \node [above] at (3,1) {\emph{reflection}}; \draw (4,0) -- (0:6) -- ++(120:2) -- cycle; \node [left] at (4,0) {$B$}; \node [right] at (0:6) {$C$}; \node at (5,2.1) {$A$}; \node [right] at (7,1) {$ \mu_3 = \begin{pmatrix}A & B & C \\ B & A & C\end{pmatrix}$}; \draw (0,3) -- (2,3) -- ++(120:2) -- cycle; \node [left] at (0,3) {$A$}; \node at (1,5.1) {$B$}; \node [right] at (2,3) {$C$}; \draw [->] (2,4) -- (4,4); \node [above] at (3,4) {\emph{reflection}}; \draw (4,3) -- (6,3) -- ++(120:2) -- cycle; \node [left] at (4,3) {$C$}; \node [right] at (6,3) {$A$}; \node at (5,5.1) {$B$}; \node [right] at (7,4) {$ \mu_2 = \begin{pmatrix}A & B & C \\ C & B & A\end{pmatrix}$}; \draw (0,6) -- (2,6) -- ++(120:2) -- cycle; \node [left] at (0,6) {$A$}; \node at (1,8.1) {$B$}; \node [right] at (2,6) {$C$}; \draw [->] (2,7) -- (4,7); \node [above] at (3,7) {\emph{reflection}}; \draw (4,6) -- (6,6) -- ++(120:2) -- cycle; \node [left] at (4,6) {$A$}; \node [right] at (6,6) {$B$}; \node at (5,8.1) {$C$}; \node [right] at (7,7) {$ \mu_1 = \begin{pmatrix}A & B & C \\ A & C & B\end{pmatrix}$}; \draw (0,9) -- (2,9) -- ++(120:2) -- cycle; \node [left] at (0,9) {$A$}; \node at (1,11.1) {$B$}; \node [right] at (2,9) {$C$}; \draw [->] (2,10) -- (4,10); \node [above] at (3,10) {\emph{rotation}}; \draw (4,9) -- (6,9) -- ++(120:2) -- cycle; \node [left] at (4,9) {$B$}; \node [right] at (6,9) {$A$}; \node at (5,11.1) {$C$}; \node [right] at (7,10) {$ \rho_2 = \begin{pmatrix}A & B & C \\ C & A & B\end{pmatrix}$}; \draw (0,12) -- (2,12) -- ++(120:2) -- cycle; \node [left] at (0,12) {$A$}; \node at (1,14.1) {$B$}; \node [right] at (2,12) {$C$}; \draw [->] (2,13) -- (4,13); \node [above] at (3,13) {\emph{rotation}}; \draw (4,12) -- (6,12) -- ++(120:2) -- cycle; \node [left] at (4,12) {$C$}; \node [right] at (6,12) {$B$}; \node at (5,14.1) {$A$}; \node [right] at (7,13) {$ \rho_1 = \begin{pmatrix}A & B & C \\ B & C & A\end{pmatrix}$}; \draw (0,15) -- (2,15) -- ++(120:2) -- cycle; \node [left] at (0,15) {$A$}; \node at (1,17.1) {$B$}; \node [right] at (2,15) {$C$}; \draw [->] (2,16) -- (4,16); \node [above] at (3,16) {\emph{identity}}; \draw (4,15) -- (6,15) -- ++(120:2) -- cycle; \node [left] at (4,15) {$A$}; \node [right] at (6,15) {$C$}; \node at (5,17.1) {$B$}; \node [right] at (7,16) {$ id = \begin{pmatrix}A & B & C \\ A & B & C\end{pmatrix}$}; \end{tikzpicture}]]>

    Let us find the symmetries of the equilateral triangle \bigtriangleup ABC. To find a symmetry of \bigtriangleup ABC, we must first examine the permutations of the vertices A, B, and C and then ask if a permutation extends to a symmetry of the triangle. Recall that a permutation of a set S is a one-to-one and onto map \pi :S \rightarrow S. The three vertices have 3! = 6 permutations, so the triangle has at most six symmetries. To see that there are six permutations, observe there are three different possibilities for the first vertex, and two for the second, and the remaining vertex is determined by the placement of the first two. So we have 3 \cdot 2 \cdot 1 = 3! = 6 different arrangements. To denote the permutation of the vertices of an equilateral triangle that sends A to B, B to C, and C to A, we write the array \begin{pmatrix}\end{pmatrix}. Notice that this particular permutation corresponds to the rigid motion of rotating the triangle by 120^{\circ} in a clockwise direction. In fact, every permutation gives rise to a symmetry of the triangle. All of these symmetries are shown in .

    A natural question to ask is what happens if one motion of the triangle \bigtriangleup ABC is followed by another. Which symmetry is \mu_1 \rho_1; that is, what happens when we do the permutation \rho_1 and then the permutation \mu_1? Remember that we are composing functions here. Although we usually multiply left to right, we compose functions right to left. We have (\mu_1 \rho_1)(A) & = \mu_1( \rho_1( A ) ) = \mu_1( B ) = C (\mu_1 \rho_1)(B) & = \mu_1( \rho_1( B ) ) = \mu_1( C ) = B (\mu_1 \rho_1)(C) & = \mu_1( \rho_1( C ) ) = \mu_1( A ) = A .

    This is the same symmetry as \mu_2. Suppose we do these motions in the opposite order, \rho_1 then \mu_1. It is easy to determine that this is the same as the symmetry \mu_3; hence, \rho_1 \mu_1 \neq \mu_1 \rho_1. A multiplication table for the symmetries of an equilateral triangle \bigtriangleup ABC is given in .

    Notice that in the multiplication table for the symmetries of an equilateral triangle, for every motion of the triangle \alpha there is another motion \beta such that \alpha \beta = id; that is, for every motion there is another motion that takes the triangle back to its original orientation.

    Symmetries of an equilateral triangle

    \begin{array}{c|cccccc} \end{array}

    Definitions and Examples Definition of a Group

    The integers mod n and the symmetries of a triangle or a rectangle are examples of groups. A binary operationBinary operation or law of composition on a set G is a function G \times G \rightarrow G that assigns to each pair (a,b) \in G \times G a unique element a \circ b, or ab in G, called the composition of a and b. A groupGroupdefinition of (G, \circ ) is a set G together with a law of composition (a,b) \mapsto a \circ b that satisfies the following axioms.

    • The law of composition is associative. That is, (a \circ b) \circ c = a \circ (b \circ c) for a, b, c \in G.

    • There exists an element e \in G, called the identity elementElementidentity, such that for any element a \in G e \circ a = a \circ e = a.

    • For each element a \in G, there exists an inverse elementElementinverse in G, denoted by a^{-1}, such that a \circ a^{-1} = a^{-1} \circ a = e.

    A group G with the property that a \circ b = b \circ a for all a, b \in G is called abelianAbelian groupGroupabelian or commutativeGroupcommutative. Groups not satisfying this property are said to be nonabelianGroupnonabelian or noncommutativeGroupnoncommutative.

    Examples of Groups Group of All Integers

    The integers {\mathbb Z } = \{ \ldots , -1, 0, 1, 2, \ldots \} form a group under the operation of addition. The binary operation on two integers m, n \in {\mathbb Z} is just their sum. Since the integers under addition already have a well-established notation, we will use the operator + instead of \circ; that is, we shall write m + n instead of m \circ n. The identity is 0, and the inverse of n \in {\mathbb Z} is written as -n instead of n^{-1}. Notice that the set of integers under addition have the additional property that m + n = n + m and therefore form an abelian group.

    Most of the time we will write ab instead of a \circ b; however, if the group already has a natural operation such as addition in the integers, we will use that operation. That is, if we are adding two integers, we still write m + n, -n for the inverse, and 0 for the identity as usual. We also write m - n instead of m + (-n).

    It is often convenient to describe a group in terms of an addition or multiplication table. Such a table is called a Cayley tableCayley table.

    Group of Integers Modulo <m>5</m>

    The integers mod n form a group under addition modulo n. Consider {\mathbb Z}_5, consisting of the equivalence classes of the integers 0, 1, 2, 3, and 4. We define the group operation on {\mathbb Z}_5 by modular addition. We write the binary operation on the group additively; that is, we write m + n. The element 0 is the identity of the group and each element in {\mathbb Z}_5 has an inverse. For instance, 2 + 3 = 3 + 2 = 0. is a Cayley table for {\mathbb Z}_5 (Contributed by ). By , {\mathbb Z}_n = \{0, 1, \ldots, n-1 \} is a group under the binary operation of addition mod n.

    Cayley table for ({\mathbb Z_5}, +)

    \begin{array}{c|ccccc} \end{array}

    Multiplication of Integers Modulo <m>6</m>

    Not every set with a binary operation is a group. For example, if we let modular multiplication be the binary operation on {\mathbb Z}_n, then {\mathbb Z}_n fails to be a group. The element 1 acts as a group identity since 1 \cdot k = k \cdot 1 = k for any k \in {\mathbb Z}_n; however, a multiplicative inverse for 0 does not exist since 0 \cdot k = k \cdot 0 = 0 for every k in {\mathbb Z}_n. Even if we consider the set {\mathbb Z}_n \setminus \{0 \}, we still may not have a group. For instance, let 2 \in {\mathbb Z}_6. Then 2 has no multiplicative inverse since 0 \cdot 2 & = 0 \qquad 1 \cdot 2 = 2 2 \cdot 2 & = 4 \qquad 3 \cdot 2 = 0 4 \cdot 2 & = 2 \qquad 5 \cdot 2 = 4 .

    By , every nonzero k does have an inverse in {\mathbb Z}_n if k is relatively prime to n. Denote the set of all such nonzero elements in {\mathbb Z}_n by U(n). U(n)group of units in \mathbb Z_n Then U(n) is a group called the group of unitsGroupof units of {\mathbb Z}_n. is a Cayley table for the group U(8).

    Multiplication table for U(8)

    \begin{array}{c|cccc} \end{array}

    Symmetries of a Triangle is not Abelian

    The symmetries of an equilateral triangle described in form a nonabelian group. As we observed, it is not necessarily true that \alpha \beta = \beta \alpha for two symmetries \alpha and \beta. Using , which is a Cayley table for this group, we can easily check that the symmetries of an equilateral triangle are indeed a group. We will denote this group by either S_3 or D_3, for reasons that will be explained later.

    Matrix Multiplication of <m>2\times 2</m> Matrices is a Group

    We use {\mathbb M}_2 ( {\mathbb R}) to denote the set of all 2 \times 2 matrices. Let GL_2({\mathbb R}) be the subset of {\mathbb M}_2 ( {\mathbb R}) consisting of invertible matrices; that is, a matrix \mathbb M_n(\mathbb R)the n \times n matrices with entries in \mathbb R A = \begin{pmatrix}\end{pmatrix} is in GL_2( {\mathbb R}) if there exists a matrix A^{-1} such that A A^{-1} = A^{-1} A = I, where I is the 2 \times 2 identity matrix. For A to have an inverse is equivalent to requiring that the determinant of A be nonzero; that is, \det A = ad - bc \neq 0. \det Athe determinant of A The set of invertible matrices forms a group called the general linear groupGroupgeneral linear. GL_n(\mathbb R)the general linear group The identity of the group is the identity matrix I = \begin{pmatrix}\end{pmatrix}. The inverse of A \in GL_2( {\mathbb R}) is A^{-1} = \frac{1}{ad-bc} \begin{pmatrix}\end{pmatrix}. The product of two invertible matrices is again invertible. Matrix multiplication is associative, satisfying the other group axiom. For matrices it is not true in general that AB = BA; hence, GL_2({\mathbb R}) is another example of a nonabelian group.

    Group of Quaternions

    Let 1 & = \begin{pmatrix}\end{pmatrix} \qquad I = \begin{pmatrix}\end{pmatrix} J & = \begin{pmatrix}\end{pmatrix} \qquad K = \begin{pmatrix}\end{pmatrix} , where i^2 = -1. Then the relations I^2 = J^2 = K^2 = -1, IJ=K, JK = I, KI = J, JI = -K, KJ = -I, and IK = -J hold. The set Q_8 = \{\pm 1, \pm I, \pm J, \pm K \} is a group called the quaternion group. Notice that Q_8 is noncommutative. Q_8 the group of quaternions Group quaternion Quaternions

    Group of Nonzero Complex Numbers

    Let {\mathbb C}^\astbe the set of nonzero complex numbers. \mathbb C^*the multiplicative group of complex numbers Under the operation of multiplication {\mathbb C}^\ast forms a group. The identity is 1. If z = a+bi is a nonzero complex number, then z^{-1} = \frac{a -bi}{a^2 +b^2} is the inverse of z. It is easy to see that the remaining group axioms hold.

    A group is finiteGroupfinite, or has finite order, if it contains a finite number of elements; otherwise, the group is said to be infinite or to have infinite orderGroupinfinite. The orderGrouporder of of a finite group is the number of elements that it contains. If G is a group containing n elements, we write |G| = n. |G|the order of a group The group {\mathbb Z}_5 is a finite group of order 5; the integers {\mathbb Z} form an infinite group under addition, and we sometimes write |{\mathbb Z}| = \infty.

    Basic Properties of Groups

    The identity element in a group G is unique; that is, there exists only one element e \in G such that eg = ge = g for all g \in G.

    Suppose that e and e' are both identities in G. Then eg = ge = g and e'g = ge' = g for all g \in G. We need to show that e = e'. If we think of e as the identity, then ee' = e'; but if e' is the identity, then ee' = e. Combining these two equations, we have e = ee' = e'. ( helped with this proof.)

    Inverses in a group are also unique. If g' and g'' are both inverses of an element g in a group G, then gg' = g'g = e and gg'' = g''g = e. We want to show that g' = g'', but g' = g'e = g'(gg'') = (g'g)g'' = eg'' = g''. We summarize this fact in the following proposition.

    If g is any element in a group G, then the inverse of g, denoted by g^{-1}, is unique.

    Let G be a group. If a, b \in G, then (ab)^{-1} = b^{-1}a^{-1}.

    Let a, b \in G. Then abb^{-1}a^{-1} = aea^{-1} = aa^{-1} = e. Similarly, b^{-1}a^{-1}ab = e. But by the previous proposition, inverses are unique; hence, (ab)^{-1} = b^{-1}a^{-1}.

    Let G be a group. For any a \in G, (a^{-1})^{-1} = a.

    Observe that a^{-1} (a^{-1})^{-1} = e. Consequently, multiplying both sides of this equation by a, we have (a^{-1})^{-1} = e (a^{-1})^{-1} = a a^{-1} (a^{-1})^{-1} = ae = a.

    It makes sense to write equations with group elements and group operations. If a and b are two elements in a group G, does there exist an element x \in G such that ax = b? If such an x does exist, is it unique? The following proposition answers both of these questions positively.

    Let G be a group and a and b be any two elements in G. Then the equations ax = b and xa = b have unique solutions in G.

    Suppose that ax = b. We must show that such an x exists. Multiplying both sides of ax = b by a^{-1}, we have x = ex = a^{-1}ax = a^{-1}b.

    To show uniqueness, suppose that x_1 and x_2 are both solutions of ax = b; then ax_1 = b = ax_2. So x_1 = a^{-1}ax_1 = a^{-1}ax_2 = x_2. The proof for the existence and uniqueness of the solution of xa = b is similar.

    If G is a group and a, b, c \in G, then ba = ca implies b = c and ab = ac implies b = c.

    This proposition tells us that the right and left cancellation lawsCancellation lawfor groups are true in groups. We leave the proof as an exercise.

    We can use exponential notation for groups just as we do in ordinary algebra. If G is a group and g \in G, then we define g^0 = e. For n \in {\mathbb N}, we define g^n = \underbrace{g \cdot g \cdots g}_{n \; \text{times}} and g^{-n} = \underbrace{g^{-1} \cdot g^{-1} \cdots g^{-1}}_{n \; \text{times}}.

    In a group, the usual laws of exponents hold; that is, for all g, h \in G,

    1. g^mg^n = g^{m+n} for all m, n \in {\mathbb Z};

    2. (g^m)^n = g^{mn} for all m, n \in {\mathbb Z};

    3. (gh)^n = (h^{-1}g^{-1})^{-n} for all n \in {\mathbb Z}. Furthermore, if G is abelian, then (gh)^n = g^nh^n.

    We will leave the proof of this theorem as an exercise. Notice that (gh)^n \neq g^nh^n in general, since the group may not be abelian. If the group is {\mathbb Z} or {\mathbb Z}_n, we write the group operation additively and the exponential operation multiplicatively; that is, we write ng instead of g^n. The laws of exponents now become

    1. mg + ng = (m+n)g for all m, n \in {\mathbb Z};

    2. m(ng) = (mn)g for all m, n \in {\mathbb Z};

    3. m(g + h) = mg + mh for all n \in {\mathbb Z}.

    It is important to realize that the last statement can be made only because {\mathbb Z} and {\mathbb Z}_n are commutative groups.

    Historical Note

    Although the first clear axiomatic definition of a group was not given until the late 1800s, group-theoretic methods had been employed before this time in the development of many areas of mathematics, including geometry and the theory of algebraic equations.

    Joseph-Louis LagrangeLagrange, Joseph-Louis used group-theoretic methods in a 17701771 memoir to study methods of solving polynomial equations. Later, Évariste GaloisGalois, Évariste (18111832) succeeded in developing the mathematics necessary to determine exactly which polynomial equations could be solved in terms of the polynomial's coefficients. Galois' primary tool was group theory.

    The study of geometry was revolutionized in 1872 when Felix KleinKlein, Felix proposed that geometric spaces should be studied by examining those properties that are invariant under a transformation of the space. Sophus LieLie, Sophus, a contemporary of Klein, used group theory to study solutions of partial differential equations. One of the first modern treatments of group theory appeared in William Burnside'sBurnside, William The Theory of Groups of Finite Order [1], first published in 1897.

    Subgroups Definitions and Examples

    Sometimes we wish to investigate smaller groups sitting inside a larger group. The set of even integers 2{\mathbb Z} = \{\ldots, -2, 0, 2, 4, \ldots \} is a group under the operation of addition. This smaller group sits naturally inside of the group of integers under addition. We define a subgroupSubgroupdefinition of H of a group G to be a subset H of G such that when the group operation of G is restricted to H, H is a group in its own right. Observe that every group G with at least two elements will always have at least two subgroups, the subgroup consisting of the identity element alone and the entire group itself. The subgroup H = \{ e \} of a group G is called the trivial subgroupSubgrouptrivial. A subgroup that is a proper subset of G is called a proper subgroupSubgroupproper. In many of the examples that we have investigated up to this point, there exist other subgroups besides the trivial and improper subgroups.

    A Subgroup of the Reals

    Consider the set of nonzero real numbers, {\mathbb R}^*, with the group operation of multiplication. \mathbb R^*the multiplicative group of real numbers The identity of this group is 1 and the inverse of any element a \in {\mathbb R}^* is just 1/a. We will show that {\mathbb Q}^* = \{ p/q : p\text{ and }q\text{ are nonzero integers}\} is a subgroup of {\mathbb R}^*. \mathbb Q^*the multiplicative group of rational numbers The identity of {\mathbb R}^* is 1; however, 1 = 1/1 is the quotient of two nonzero integers. Hence, the identity of {\mathbb R}^* is in {\mathbb Q}^*. Given two elements in {\mathbb Q}^*, say p/q and r/s, their product pr/qs is also in {\mathbb Q}^*. The inverse of any element p/q \in {\mathbb Q}^* is again in {\mathbb Q}^* since (p/q)^{-1} = q/p. Since multiplication in {\mathbb R}^* is associative, multiplication in {\mathbb Q}^* is associative.

    A Subgroup of the Nonzero Complex Numbers

    Recall that {\mathbb C}^{\ast} is the multiplicative group of nonzero complex numbers. Let H = \{ 1, -1, i, -i \}. Then H is a subgroup of {\mathbb C}^{\ast}. It is quite easy to verify that H is a group under multiplication and that H \subset {\mathbb C}^{\ast}.

    A Subgroup of Matrices With Determinant One

    Let SL_2( {\mathbb R}) be the subset of GL_2( {\mathbb R })consisting of matrices of determinant one; that is, a matrix SL_n(\mathbb R)the special linear group A = \begin{pmatrix}\end{pmatrix} is in SL_2( {\mathbb R}) exactly when ad - bc = 1. To show that SL_2( {\mathbb R}) is a subgroup of the general linear group, we must show that it is a group under matrix multiplication. The 2 \times 2 identity matrix is in SL_2( {\mathbb R}), as is the inverse of the matrix A: A^{-1} = \begin{pmatrix}\end{pmatrix}. It remains to show that multiplication is closed; that is, that the product of two matrices of determinant one also has determinant one. We will leave this task as an exercise. The group SL_2({\mathbb R}) is called the special linear groupGroupspecial linear.

    Groups, Subsets, Operations

    It is important to realize that a subset H of a group G can be a group without being a subgroup of G. For H to be a subgroup of G it must inherit G's binary operation. The set of all 2 \times 2 matrices, {\mathbb M}_2(\mathbb R), forms a group under the operation of addition. The 2 \times 2 general linear group is a subset of {\mathbb M}_2(\mathbb R) and is a group under matrix multiplication, but it is not a subgroup of {\mathbb M}_2(\mathbb R). If we add two invertible matrices, we do not necessarily obtain another invertible matrix. Observe that\begin{pmatrix}\end{pmatrix} + \begin{pmatrix}\end{pmatrix} = \begin{pmatrix}\end{pmatrix}, but the zero matrix is not in GL_2( {\mathbb R }).

    Structurally Different Groups

    One way of telling whether or not two groups are the same is by examining their subgroups. Other than the trivial subgroup and the group itself, the group {\mathbb Z}_4 has a single subgroup consisting of the elements 0 and 2. From the group {\mathbb Z}_2, we can form another group of four elements as follows. As a set this group is {\mathbb Z}_2 \times {\mathbb Z}_2. We perform the group operation coordinatewise; that is, (a,b) + (c,d) = (a+c, b+d). is an addition table for {\mathbb Z}_2 \times {\mathbb Z}_2. Since there are three nontrivial proper subgroups of {\mathbb Z}_2 \times {\mathbb Z}_2, H_1 = \{ (0,0), (0,1) \}, H_2 = \{ (0,0), (1,0) \}, and H_3 = \{ (0,0), (1,1) \}, {\mathbb Z}_4 and {\mathbb Z}_2 \times {\mathbb Z}_2 must be different groups.

    Addition table for {\mathbb Z}_2 \times {\mathbb Z}_2

    \begin{array}{c|cccc} \end{array}

    Some Subgroup Theorems

    Let us examine some criteria for determining exactly when a subset of a group is a subgroup.

    A subset H of G is a subgroup if and only if it satisfies the following conditions.

    1. The identity e of G is in H.

    2. If h_1, h_2 \in H, then h_1h_2 \in H.

    3. If h \in H, then h^{-1} \in H.

    First suppose that H is a subgroup of G. We must show that the three conditions hold. Since H is a group, it must have an identity e_H. We must show that e_H = e, where e is the identity of G. We know that e_H e_H = e_H and that ee_H = e_H e = e_H; hence, ee_H = e_H e_H. By right-hand cancellation, e =e_H. The second condition holds since a subgroup H is a group. To prove the third condition, let h \in H. Since H is a group, there is an element h' \in H such that hh' = h'h = e. By the uniqueness of the inverse in G, h' = h^{-1}.

    Conversely, if the three conditions hold, we must show that H is a group under the same operation as G; however, these conditions plus the associativity of the binary operation are exactly the axioms stated in the definition of a group.

    Let H be a subset of a group G. Then H is a subgroup of G if and only if H \neq \emptyset, and whenever g, h \in H then gh^{-1} is in H.

    First assume that H is a subgroup of G. We wish to show that gh^{-1} \in H whenever g and h are in H. Since h is in H, its inverse h^{-1} must also be in H. Because of the closure of the group operation, gh^{-1} \in H.

    Conversely, suppose that H \subset G such that H \neq \emptyset and g h^{-1} \in H whenever g, h \in H. If g \in H, then gg^{-1} = e is in H. If g \in H, then eg^{-1} = g^{-1} is also in H. Now let h_1, h_2 \in H. We must show that their product is also in H. However, h_1(h_2^{-1})^{-1} = h_1 h_2 \in H. Hence, H is a subgroup of G.

    Additional Exercises: Detecting Errors UPC Symbols

    Universal Product CodeUniversal Product Code (UPC) symbols are found on most products in grocery and retail stores. The UPC symbol is a 12-digit code identifying the manufacturer of a product and the product itself (). The first 11 digits contain information about the product; the twelfth digit is used for error detection. If d_1 d_2 \cdots d_{12} is a valid UPC number, then 3 \cdot d_1 + 1 \cdot d_2 + 3 \cdot d_3 + \cdots + 3 \cdot d_{11} + 1 \cdot d_{12} \equiv 0 \pmod{10}.

    1. Show that the UPC number 0-50000-30042-6, which appears in , is a valid UPC number.

    2. Show that the number 0-50000-30043-6 is not a valid UPC number.

    3. Write a formula to calculate the check digit, d_{12}, in the UPC number.

    4. The UPC error detection scheme can detect most transposition errors; that is, it can determine if two digits have been interchanged. Show that the transposition error 0-05000-30042-6 is not detected. Find a transposition error that is detected. Can you find a general rule for the types of transposition errors that can be detected?

    5. Write a program that will determine whether or not a UPC number is valid.

    A UPC code

    It is often useful to use an inner product notation for this type of error detection scheme; hence, we will use the notion (d_1, d_2, \ldots, d_k ) \cdot (w_1, w_2, \ldots, w_k ) \equiv 0 \pmod{ n } to mean d_1 w_1 + d_2 w_2 + \cdots + d_k w_k \equiv 0 \pmod{ n}.

    Suppose that (d_1, d_2, \ldots, d_k ) \cdot (w_1, w_2, \ldots, w_k ) \equiv 0 \pmod{ n} is an error detection scheme for the k-digit identification number d_1 d_2 \cdots d_k, where 0 \leq d_i \lt n. Prove that all single-digit errors are detected if and only if \gcd( w_i, n ) = 1 for 1 \leq i \leq k.

    Let (d_1, d_2, \ldots, d_k ) \cdot (w_1, w_2, \ldots, w_k ) \equiv 0 \pmod{ n} be an error detection scheme for the k-digit identification number d_1 d_2 \cdots d_k, where 0 \leq d_i \lt n. Prove that all transposition errors of two digits d_i and d_j are detected if and only if \gcd( w_i - w_j, n ) = 1 for i and j between 1 and k.

    ISBN Codes

    Every book has an International Standard Book NumberInternational standard book number (ISBN) code. This is a 10-digit code indicating the book's publisher and title. The tenth digit is a check digit satisfying (d_1, d_2, \ldots, d_{10} ) \cdot (10, 9, \ldots, 1 ) \equiv 0 \pmod{11}. One problem is that d_{10} might have to be a 10 to make the inner product zero; in this case, 11 digits would be needed to make this scheme work. Therefore, the character X is used for the eleventh digit. So ISBN 3-540-96035-X is a valid ISBN code.

    1. Is ISBN 0-534-91500-0 a valid ISBN code? What about ISBN 0-534-91700-0 and ISBN 0-534-19500-0?

    2. Does this method detect all single-digit errors? What about all transposition errors?

    3. How many different ISBN codes are there?

    4. Write a computer program that will calculate the check digit for the first nine digits of an ISBN code.

    5. A publisher has houses in Germany and the United States. Its German prefix is 3-540. If its United States prefix will be 0-abc, find abc such that the rest of the ISBN code will be the same for a book printed in Germany and in the United States. Under the ISBN coding method the first digit identifies the language; German is 3 and English is 0. The next group of numbers identifies the publisher, and the last group identifies the specific book.

    References and Suggested Readings Burnside, W. Theory of Groups of Finite Order. 2nd ed. Cambridge University Press, Cambridge, 1911; Dover, New York, 1953. A classic. Also available at books.google.com. Gallian, J. A. and Winters, S. Modular Arithmetic in the Marketplace, The American Mathematical Monthly 95 (1988): 54851. Gallian, J. A. Contemporary Abstract Algebra. 7th ed. Brooks/Cole, Belmont, CA, 2009. Hall, M. Theory of Groups. 2nd ed. American Mathematical Society, Providence, 1959. Kurosh, A. E. The Theory of Groups, vols. I and II. American Mathematical Society, Providence, 1979. Rotman, J. J. An Introduction to the Theory of Groups. 4th ed. Springer, New York, 1995.
    ================================================ FILE: examples/sample-book/integers.xml ================================================ The Integers

    The integers are the building blocks of mathematics. In this chapter we will investigate the fundamental properties of the integers, including mathematical induction, the division algorithm, and the Fundamental Theorem of Arithmetic.

    Mathematical Induction and Math in a Title <m>A\notsubset B</m>

    Suppose we wish to show that 1 + 2 + \cdots + n = \frac{n(n + 1)}{2} for any natural number n. This formula is easily verified for small numbers such as n = 1, 2, 3, or 4, but it is impossible to verify for all natural numbers on a case-by-case basis. To prove the formula true in general, a more generic method is required.

    Suppose we have verified the equation for the first n cases. We will attempt to show that we can generate the formula for the (n + 1)th case from this knowledge. The formula is true for n = 1 since 1 = \frac{1(1 + 1)}{2}. If we have verified the first n cases, then 1 + 2 + \cdots + n + (n + 1) & = \frac{n(n + 1)}{2} + n + 1 & = \frac{n^2 + 3n + 2}{2} & = \frac{(n + 1)[(n + 1) + 1]}{2} .

    This is exactly the formula for the (n + 1)th case.

    This method of proof is known as mathematical induction. Instead of attempting to verify a statement about some subset S of the positive integers {\mathbb N} on a case-by-case basis, an impossible task if S is an infinite set, we give a specific proof for the smallest integer being considered, followed by a generic argument showing that if the statement holds for a given case, then it must also hold for the next case in the sequence. We summarize mathematical induction in the following axiom.

    First Principle of Mathematical Induction Inductionfirst principle of

    Let S(n) be a statement about integers for n \in {\mathbb N} and suppose S(n_0) is true for some integer n_0. If for all integers k with k \geq n_0, S(k) implies that S(k+1) is true, then S(n) is true for all integers n greater than or equal to n_0.

    An Inequality for Powers of <m>2</m>

    For all integers n \geq 3, 2^n \gt n + 4. Since 8 = 2^3 \gt 3 + 4 = 7, the statement is true for n_0 = 3. Assume that 2^k \gt k + 4 for k \geq 3. Then 2^{k + 1} = 2 \cdot 2^{k} \gt 2(k + 4). But 2(k + 4) = 2k + 8 \gt k + 5 = (k + 1) + 4 since k is positive. Hence, by induction, the statement holds for all integers n \geq 3.

    Some Integers Divisible by <m>9</m>

    Every integer 10^{n + 1} + 3 \cdot 10^n + 5 is divisible by 9 for n \in {\mathbb N}. For n = 1, 10^{1 + 1} + 3 \cdot 10 + 5 = 135 = 9 \cdot 15 is divisible by 9. Suppose that 10^{k + 1} + 3 \cdot 10^k + 5 is divisible by 9 for k \geq 1. Then 10^{(k + 1) + 1} + 3 \cdot 10^{k + 1} + 5& = 10^{k + 2} + 3 \cdot 10^{k + 1} + 50 - 45 & = 10 (10^{k + 1} + 3 \cdot 10^{k} + 5) - 45 is divisible by 9.

    The Binomial Theorem

    We will prove the binomial theorem using mathematical induction; that is, (a + b)^n = \sum_{k = 0}^{n} \binom{n}{k} a^k b^{n - k}, where a and b are real numbers, n \in \mathbb{N}, and \binom{n}{k} = \frac{n!}{k! (n - k)!} is the binomial coefficient. We first show that \binom{n + 1}{k} = \binom{n}{k} + \binom{n}{k - 1}. This result follows from \binom{n}{k} + \binom{n}{k - 1} & = \frac{n!}{k!(n - k)!} +\frac{n!}{(k-1)!(n - k + 1)!} & = \frac{(n + 1)!}{k!(n + 1 - k)!} & =\binom{n + 1}{k} . n! n factorial \binom{n}{k} binomial coefficient n!/(k!(n-k)!)

    If n = 1, the binomial theorem is easy to verify. Now assume that the result is true for n greater than or equal to 1. Then (a + b)^{n + 1} & = (a + b)(a + b)^n & = (a + b) \left( \sum_{k = 0}^{n} \binom{n}{k} a^k b^{n - k}\right) & = \sum_{k = 0}^{n} \binom{n}{k} a^{k + 1} b^{n - k} + \sum_{k = 0}^{n} \binom{n}{k} a^k b^{n + 1 - k} & = a^{n + 1} + \sum_{k = 1}^{n} \binom{n}{k - 1} a^{k} b^{n + 1 - k} + \sum_{k = 1}^{n} \binom{n}{k} a^k b^{n + 1 - k} + b^{n + 1} & = a^{n + 1} + \sum_{k = 1}^{n} \left[ \binom{n}{k - 1} + \binom{n}{k} \right]a^k b^{n + 1 - k} + b^{n + 1} & = \sum_{k = 0}^{n + 1} \binom{n + 1}{k} a^k b^{n + 1- k} .

    We have an equivalent statement of the Principle of Mathematical Induction that is often very useful.

    Second Principle of Mathematical Induction Inductionsecond principle of

    Let S(n) be a statement about integers for n \in {\mathbb N} and suppose S(n_0) is true for some integer n_0. If S(n_0), S(n_0 + 1), \ldots, S(k) imply that S(k + 1) for k \geq n_0, then the statement S(n) is true for all integers n \geq n_0.

    A nonempty subset S of {\mathbb Z} is well-orderedWell-ordered set if S contains a least element. Notice that the set {\mathbb Z} is not well-ordered since it does not contain a smallest element. However, the natural numbers are well-ordered.

    Principle of Well-Ordering

    Every nonempty subset of the natural numbers is well-ordered.

    The Principle of Well-Ordering is equivalent to the Principle of Mathematical Induction.

    The Principle of Mathematical Induction implies that 1 is the least positive natural number.

    Let S = \{ n \in {\mathbb N} : n \geq 1 \}. Then 1 \in S. Now assume that n \in S; that is, n \geq 1. Since n+1 \geq 1, n+ 1 \in S; hence, by induction, every natural number is greater than or equal to 1.

    The Principle of Mathematical Induction implies the Principle of Well-Ordering. That is, every nonempty subset of \mathbb N contains a least element.

    We must show that if S is a nonempty subset of the natural numbers, then S contains a least element. If S contains 1, then the theorem is true by . Assume that if S contains an integer k such that 1 \leq k \leq n, then S contains a least element. We will show that if a set S contains an integer less than or equal to n + 1, then S has a least element. If S does not contain an integer less than n+1, then n+1 is the smallest integer in S. Otherwise, since S is nonempty, S must contain an integer less than or equal to n. In this case, by induction, S contains a least element.

    Induction can also be very useful in formulating definitions. For instance, there are two ways to define n!, the factorial of a positive integer n.

    • The explicit definition: n! = 1 \cdot 2 \cdot 3 \cdots (n - 1) \cdot n.

    • The inductive or recursive definition: 1! = 1 and n! = n(n - 1)! for n \gt 1.

    Every good mathematician or computer scientist knows that looking at problems recursively, as opposed to explicitly, often results in better understanding of complex issues.

    The Division Algorithm

    An application of the Principle of Well-Ordering that we will use often is the division algorithm.

    Division Algorithm Division algorithmfor integers

    Let a and b be integers, with b \gt 0. Then there exist unique integers q and r such that a = bq + r where 0 \leq r \lt b.

    This is a perfect example of the existence-and-uniqueness type of proof. We must first prove that the numbers q and r actually exist. Then we must show that if q' and r' are two other such numbers, then q = q' and r = r'.

    Existence of q and r. Let S = \{ a - bk : k \in {\mathbb Z} \text{ and } a - bk \geq 0 \}. If 0 \in S, then b divides a, and we can let q = a/b and r = 0. If 0 \notin S, we can use the Well-Ordering Principle. We must first show that S is nonempty. If a \gt 0, then a - b \cdot 0 \in S. If a \lt 0, then a - b(2a) = a(1 - 2b) \in S. In either case S \neq \emptyset. By the Well-Ordering Principle, S must have a smallest member, say r = a - bq. Therefore, a = bq + r, r \geq 0. We now show that r \lt b. Suppose that r \gt b. Then a - b(q + 1)= a - bq - b = r - b \gt 0. In this case we would have a - b(q + 1) in the set S. But then a - b(q + 1) \lt a - bq, which would contradict the fact that r = a - bq is the smallest member of S. So r \leq b. Since 0 \notin S, r \neq b and so r \lt b.

    Uniqueness of q and r. Suppose there exist integers r, r', q, and q' such that a = bq + r, 0 \leq r \lt b \quad \text{and}\quad a = bq' + r', 0 \leq r' \lt b. Then bq + r = bq' + r'. Assume that r' \geq r. From the last equation we have b(q - q') = r' - r; therefore, b must divide r' - r and 0 \leq r'- r \leq r' \lt b. This is possible only if r' - r = 0. Hence, r = r' and q = q'.

    Let a and b be integers. If b = ak for some integer k, we write a \mid b. An integer d is called a common divisor of a and b if d \mid a and d \mid b. The greatest common divisorGreatest common divisorof two integers of integers a and b is a positive integer d such that d is a common divisor of a and b and if d' is any other common divisor of a and b, then d' \mid d. a \mid ba divides b\gcd(a, b)greatest common divisor of a and b We write d = \gcd(a, b); for example, \gcd( 24, 36) = 12 and \gcd(120, 102) = 6. We say that two integers a and b are relatively prime if \gcd( a, b ) = 1.

    Let a and b be nonzero integers. Then there exist integers r and s such that \gcd( a, b) = ar + bs. Furthermore, the greatest common divisor of a and b is unique.

    Let S = \{ am + bn : m, n \in {\mathbb Z} \text{ and } am + bn \gt 0 \}. Clearly, the set S is nonempty; hence, by the Well-Ordering Principle S must have a smallest member, say d = ar + bs. We claim that d = \gcd( a, b). Write a = dq + r' where 0 \leq r' \lt d. If r' \gt 0, then r'& = a - dq & = a - (ar + bs)q & = a - arq - bsq & = a( 1 - rq ) + b( -sq ) , which is in S. But this would contradict the fact that d is the smallest member of S. Hence, r' = 0 and d divides a. A similar argument shows that d divides b. Therefore, d is a common divisor of a and b.

    Suppose that d' is another common divisor of a and b, and we want to show that d' \mid d. If we let a = d'h and b = d'k, then d = ar + bs = d'hr + d'ks = d'(hr + ks). So d' must divide d. Hence, d must be the unique greatest common divisor of a and b.

    Let a and b be two integers that are relatively prime. Then there exist integers r and s such that ar + bs = 1.

    The Euclidean Algorithm

    Among other things, allows us to compute the greatest common divisor of two integers.

    Greatest Common Divisor of Two Integers

    Let us compute the greatest common divisor of 945 and 2415. First observe that 2415 & = 945 \cdot 2 + 525 945 & = 525 \cdot 1 + 420 525 & = 420 \cdot 1 + 105 420 & = 105 \cdot 4 + 0 .

    Reversing our steps, 105 divides 420, 105 divides 525, 105 divides 945, and 105 divides 2415. Hence, 105 divides both 945 and 2415. If d were another common divisor of 945 and 2415, then d would also have to divide 105. Therefore, \gcd( 945, 2415 ) = 105.

    If we work backward through the above sequence of equations, we can also obtain numbers r and s such that 945 r + 2415 s = 105. Observe that 105 & = 525 + (-1) \cdot 420 & = 525 + (-1) \cdot [945 + (-1) \cdot 525] & = 2 \cdot 525 + (-1) \cdot 945 & = 2 \cdot [2415 + (-2) \cdot 945] + (-1) \cdot 945 & = 2 \cdot 2415 + (-5) \cdot 945 .

    So r = -5 and s= 2. Notice that r and s are not unique, since r = 41 and s = -16 would also work.

    To compute \gcd(a,b) = d, we are using repeated divisions to obtain a decreasing sequence of positive integers r_1 \gt r_2 \gt \cdots \gt r_n = d; that is, b & = a q_1 + r_1 a & = r_1 q_2 + r_2 r_1 & = r_2 q_3 + r_3 & \vdots r_{n - 2} & = r_{n - 1} q_{n} + r_{n} r_{n - 1} & = r_n q_{n + 1} .

    To find r and s such that ar + bs = d, we begin with this last equation and substitute results obtained from the previous equations: d & = r_n & = r_{n - 2} - r_{n - 1} q_n & = r_{n - 2} - q_n( r_{n - 3} - q_{n - 1} r_{n - 2} ) & = -q_n r_{n - 3} + ( 1+ q_n q_{n-1} ) r_{n - 2} & \vdots & = ra + sb .

    The algorithm that we have just used to find the greatest common divisor d of two integers a and b and to write d as the linear combination of a and b is known as the Euclidean algorithmEuclidean algorithmAlgorithmEuclidean.

    Prime Numbers

    Let p be an integer such that p \gt 1. We say that p is a prime numberPrime integer, or simply p is prime, if the only positive numbers that divide p are 1 and p itself. An integer n \gt 1 that is not prime is said to be compositeComposite integer.

    Euclid

    Let a and b be integers and p be a prime number. If p \mid ab, then either p \mid a or p \mid b.

    Suppose that p does not divide a. We must show that p \mid b. Since \gcd( a, p ) = 1, there exist integers r and s such that ar + ps = 1. So b = b(ar + ps) = (ab)r + p(bs). Since p divides both ab and itself, p must divide b = (ab)r + p(bs).

    Euclid

    There exist an infinite number of primes.

    We will prove this theorem by contradiction. Suppose that there are only a finite number of primes, say p_1, p_2, \ldots, p_n. Let P = p_1 p_2 \cdots p_n + 1. Then P must be divisible by some p_i for 1 \leq i \leq n. In this case, p_i must divide P - p_1 p_2 \cdots p_n = 1, which is a contradiction. Hence, either P is prime or there exists an additional prime number p \neq p_i that divides P.

    Fundamental Theorem of Arithmetic Fundamental Theoremof Arithmetic

    Let n be an integer such that n \gt 1. Then n = p_1 p_2 \cdots p_k, where p_1, \ldots, p_k are primes (not necessarily distinct). Furthermore, this factorization is unique; that is, if n = q_1 q_2 \cdots q_l, then k = l and the q_i's are just the p_i's rearranged.

    Uniqueness. To show uniqueness we will use induction on n. The theorem is certainly true for n = 2 since in this case n is prime. Now assume that the result holds for all integers m such that 1 \leq m \lt n, and n = p_1 p_2 \cdots p_k = q_1 q_2 \cdots q_l, where p_1 \leq p_2 \leq \cdots \leq p_k and q_1 \leq q_2 \leq \cdots \leq q_l. By , p_1 \mid q_i for some i = 1, \ldots, l and q_1 \mid p_j for some j = 1, \ldots, k. Since all of the p_i's and q_i's are prime, p_1 = q_i and q_1 = p_j. Hence, p_1 = q_1 since p_1 \leq p_j = q_1 \leq q_i = p_1. By the induction hypothesis, n' = p_2 \cdots p_k = q_2 \cdots q_l has a unique factorization. Hence, k = l and q_i = p_i for i = 1, \ldots, k.

    Existence. To show existence, suppose that there is some integer that cannot be written as the product of primes. Let S be the set of all such numbers. By the Principle of Well-Ordering, S has a smallest number, say a. If the only positive factors of a are a and 1, then a is prime, which is a contradiction. Hence, a = a_1 a_2 where 1 \lt a_1 \lt a and 1 \lt a_2 \lt a. Neither a_1\in S nor a_2 \in S, since a is the smallest element in S. So a_1 & = p_1 \cdots p_r a_2 & = q_1 \cdots q_s .

    Therefore, a = a_1 a_2 = p_1 \cdots p_r q_1 \cdots q_s. So a \notin S, which is a contradiction.

    Historical Note

    Prime numbers were first studied by the ancient Greeks. Two important results from antiquity are Euclid's proof that an infinite number of primes exist and the Sieve of Eratosthenes, a method of computing all of the prime numbers less than a fixed positive integer n. One problem in number theory is to find a function f such that f(n) is prime for each integer n. Pierre Fermat (1601?1665) conjectured that 2^{2^n} + 1 was prime for all n, but later it was shown by Leonhard Euler (17071783) that 2^{2^5} + 1 = \text{4,294,967,297} is a composite number. One of the many unproven conjectures about prime numbers is Goldbach's Conjecture. In a letter to Euler in 1742, Christian Goldbach stated the conjecture that every even integer with the exception of 2 seemed to be the sum of two primes: 4 = 2 + 2, 6 = 3 + 3, 8 =3 + 5, \ldots. Although the conjecture has been verified for the numbers up through 4 \times 10^{18}, it has yet to be proven in general. Since prime numbers play an important role in public key cryptography, there is currently a great deal of interest in determining whether or not a large number is prime.

    Programming Exercises The Sieve of Eratosthenes Sieve of Eratosthenes

    One method of computing all of the prime numbers less than a certain fixed positive integer N is to list all of the numbers n such that 1 \lt n \lt N. Begin by eliminating all of the multiples of 2. Next eliminate all of the multiples of 3. Now eliminate all of the multiples of 5. Notice that 4 has already been crossed out. Continue in this manner, noticing that we do not have to go all the way to N; it suffices to stop at \sqrt{N}. Using this method, compute all of the prime numbers less than N = 250. We can also use this method to find all of the integers that are relatively prime to an integer N. Simply eliminate the prime factors of N and all of their multiples. Using this method, find all of the numbers that are relatively prime to N= 120. Using the Sieve of Eratosthenes, write a program that will compute all of the primes less than an integer N.

    Ackermann's function

    Let {\mathbb N}^0 = {\mathbb N} \cup \{ 0 \}. Ackermann's function is the function A :{\mathbb N}^0 \times {\mathbb N}^0 \rightarrow {\mathbb N}^0 defined by the equations A(0, y) & = y + 1 A(x + 1, 0) & = A(x, 1) A(x + 1, y + 1) & = A(x, A(x + 1, y)) .

    Use this definition to compute A(3, 1). Write a program to evaluate Ackermann's function. Modify the program to count the number of statements executed in the program when Ackermann's function is evaluated. How many statements are executed in the evaluation of A(4, 1)? What about A(5, 1)?

    Write a computer program that will implement the Euclidean algorithm. The program should accept two positive integers a and b as input and should output \gcd( a,b) as well as integers r and s such that \gcd( a,b) = ra + sb.

    References and Suggested Readings Brookshear, J. G. Theory of Computation: Formal Languages, Automata, and Complexity. Benjamin/Cummings, Redwood City, CA, 1989. Shows the relationships of the theoretical aspects of computer science to set theory and the integers. Hardy, G. H. and Wright, E. M. An Introduction to the Theory of Numbers. 6th ed. Oxford University Press, New York, 2008. Niven, I. and Zuckerman, H. S. An Introduction to the Theory of Numbers. 5th ed. Wiley, New York, 1991. Vanden Eynden, C. Elementary Number Theory. 2nd ed. Waveland Press, Long Grove IL, 2001.
    ================================================ FILE: examples/sample-book/project.ptx ================================================ ================================================ FILE: examples/sample-book/publication-decorative.xml ================================================ ================================================ FILE: examples/sample-book/publication-noparts.xml ================================================ ================================================ FILE: examples/sample-book/publication-runestone-academy.xml ================================================ ================================================ FILE: examples/sample-book/publication-solution-manual.xml ================================================ ================================================ FILE: examples/sample-book/publication-structural.xml ================================================ ================================================ FILE: examples/sample-book/rune-examples/activecode-ambles.xml ================================================ A Python program with preamble/postamble def add(a, b): # TODO - complete the add function # Use the function result = add(2, 3) if result == 5: print("Test passed") else: print("Test failed") ================================================ FILE: examples/sample-book/rune-examples/activecode-unittest.xml ================================================ Coding Exercise, with Unit Tests

    Fix the following code so that it always correctly adds two numbers. [Ed. Unit test support is experimental.]

    def add(a,b): return 4 from unittest.gui import TestCaseGui class myTests(TestCaseGui): def testOne(self): self.assertEqual(add(2,2), 4, "Adding two identical integers") self.assertEqual(add(7,13), 20, "Adding two different integers") self.assertAlmostEqual(add(2.0,3.0), 5.0, 5, "Adding two decimal numbers") myTests().main()

    We're not really sure. But it would begin as follows:

    #include <stdio.h> int main(void)
    ================================================ FILE: examples/sample-book/rune-examples/static-listing-java.xml ================================================ A static Java program with highlighted lines import javax.swing.JFrame; //Importing class JFrame import javax.swing.JLabel; //Importing class JLabel public class HelloWorld { public static void main(String[] args) { JFrame frame = new JFrame(); //Creating frame frame.setTitle("Hi!"); //Setting title frame frame.add(new JLabel("Hello, world!"));//Adding text to frame frame.pack(); //Setting size to smallest frame.setLocationRelativeTo(null); //Centering frame frame.setVisible(true); //Showing frame } } ================================================ FILE: examples/sample-book/rune.xml ================================================ Runestone Testing

    We collect Runestone interactive items for testing here, in sections of their own.

    Some of these samples only function if hosted on a Runestone server. To see those in action, visit the copy of the Sample Book hosted on Runestone

    Programs

    First, some samples of programs that are not interactive. They will be syntax highlighted if a valid language is specified. Optionally, lines can be numbered and selected lines highlighted.

    Instead of specifying language on each program, a default can be specified at docinfo/programs/@language. That value will be used for any program that lacks a language attribute. This sample does not specify it's own language and is relying on the default set in this book.

    Python program, relying on default programs language def say_hello(): print("Hello, World!") say_hello()
    ActiveCode

    Programs in supported languages are made interactive in HTML when interactive is set to activecode. Some languages can be made interactive on any server, while others require being served from Runestone servers. See Interactive Programs Capabilities in the PreTeXt Guide for a list of what languages are supported in which environs.

    An interactive Python program, using <pubtitle>Runestone</pubtitle> print("Hello, World!")

    Otherwise they are rendered as text with syntax coloring. Either way, if a language is not specified, docinfo/programs/@language will be checked to determine what language to assume the code is written in.

    An interactive Python program, using <pubtitle>Runestone</pubtitle> print("Hello, World!")

    A C program will only be interactive if hosted on a Runestone server.

    An C program, interactive on a <pubtitle>Runestone</pubtitle> server #include <stdio.h> int main(void) { puts("Hello, world!"); }

    A Java program will only be interactive if hosted on a Runestone server.

    A Java program, interactive on a <pubtitle>Runestone</pubtitle> server public class HelloWorld { public static void main(String[] args) { System.out.println("Hi world!"); } }

    Javascript programs are made interactive in HTML, on request.

    An interactive JavaScript program, using <pubtitle>Runestone</pubtitle> document.write('Hello, world!');

    Some languages, like Java or C++, are only interactive when run on a Runestone server where the code can be compiled and run. Those languages can specify compiler-args and linker-args or interpreter-args as appropriate to the language. Default values for those options can be set in docinfo/programs - any defaults set there will be used for any program that lacks the corresponding attribute.

    A C++ program with compiler-args and stdin

    It may be convenient to set compiler-args and linker-args at the book level in docinfo/programs. Values specified in that location will be used for any program that does not override the values by specifying its own attributes.

    #include <iostream> #include <string> using namespace std; int main() { string name; cin >> name; cout << "Hello, " << name << endl; return 0; } Jane
    A static Java program import javax.swing.JFrame; //Importing class JFrame import javax.swing.JLabel; //Importing class JLabel public class HelloWorld { public static void main(String[] args) { JFrame frame = new JFrame(); //Creating frame frame.setTitle("Hi!"); //Setting title frame frame.add(new JLabel("Hello, world!"));//Adding text to frame frame.pack(); //Setting size to smallest frame.setLocationRelativeTo(null); //Centering frame frame.setVisible(true); //Showing frame } }

    An Octave program will also only be interactive if hosted on a Runestone server. Octave is meant to be a drop-in replacement for Matlab.

    A simple Octave program x = 2 + 2 printf("%d\n", x)

    Likewise, a Kotlin program will only be interactive if hosted on a Runestone server.

    A simple Kotlin program fun main() { println("Hello, world!!") }

    A language not supported by Runestone Services will always be rendered static.

    A Pascal program that cannot be interactive on Runestone program HelloWorld; begin WriteLn('Hello, world!'); end.

    The highlight-lines works on ActiveCode programs, but the highlighted lines are only shown when viewing the initial code. Any version of the code that the reader has edited may have shifted lines of code and thus highlighting might affect the wrong lines, causing confusion.

    def add(a, b): return a + b # Use the function result = add(2, 3) if result == 5: print("Test passed") else: print("Test failed")

    A program can have a preamble and/or postamble which are added to the code that the user writes before it is run. They are visible by default, but can be made invisible with visible set to "no". When visible, the code editor will prevent those regions from being modified. The indentation for lines in the preamble/code/postamble elements will be calculated relative to each other - make sure to indent them all to a similar extent. (In the source for the sample below, the # TODO... is intentially indented one stop extra so that the user's code is part of the add function.

    tests are similar to postamble in that it represents code that is added to the users submission. However, tests is intended specifically for unit testing code (see examples below for unit testing in Python, Java, C++, SQL). Tests are invisble by default and can be made visible with visible set to "yes". For historical reasons, the indentation of the tests is treated separately from the rest of the program.

    Here is the same Python program from the previous section, but now with a preamble and postamble that are invisible. The user will not see the code that is added to their submission. Not actually useful in this case, but it might be if you wanted to hide boilerplate setup from the reader.

    A Python program with invisible pre/post ambles def add(a, b): # TODO - complete the add function # Use the function result = add(2, 3) if result == 5: print("Test passed") else: print("Test failed")

    The following Python program is in a listing since we will want to reference it shortly. The program does not do very much, it just defines four variables whose values are lists of statistics. It should run, and there will be no syntax errors, but it is a bit boring since there is no output. Note that it does not have an language and is relying on the default one specified in docinfo/programs

    A Python program that defines some statistics loan_amount = [1250.0, 500.0, 1450.0, 200.0, 700.0, 100.0, 250.0, 225.0, 1200.0, 150.0, 600.0, 300.0, 700.0, 125.0, 650.0, 175.0, 1800.0, 1525.0, 575.0, 700.0, 1450.0, 400.0, 200.0, 1000.0, 350.0] country_name = ['Azerbaijan', 'El Salvador', 'Bolivia', 'Paraguay', 'El Salvador', 'Philippines', 'Philippines', 'Nicaragua', 'Guatemala', 'Philippines', 'Paraguay', 'Philippines', 'Bolivia', 'Philippines', 'Philippines', 'Madagascar', 'Georgia', 'Uganda', 'Kenya', 'Tajikistan', 'Jordan', 'Kenya', 'Philippines', 'Ecuador', 'Kenya'] time_to_raise = [193075.0, 1157108.0, 1552939.0, 244945.0, 238797.0, 1248909.0, 773599.0, 116181.0, 2288095.0, 51668.0, 26717.0, 48030.0, 1839190.0, 71117.0, 580401.0, 800427.0, 1156218.0, 1166045.0, 2924705.0, 470622.0, 24078.0, 260044.0, 445938.0, 201408.0, 2370450.0] num_lenders_total = [38, 18, 51, 3, 21, 1, 10, 8, 42, 1, 18, 6, 28, 5, 16, 7, 54, 1, 18, 22, 36, 12, 8, 24, 8]

    An ActiveCode running on the Runestone server (rather than in a browser) can be provided with attributes that are flags to influence the compiler and linker, as in this program recycled from before.

    A Java program, interactive on a <pubtitle>Runestone</pubtitle> server, with compiler and linker flags import javax.swing.JFrame; //Importing class JFrame import javax.swing.JLabel; //Importing class JLabel public class HelloWorld { public static void main(String[] args) { JFrame frame = new JFrame(); //Creating frame frame.setTitle("Hi!"); //Setting title frame frame.add(new JLabel("Hello, world!"));//Adding text to frame frame.pack(); //Setting size to smallest frame.setLocationRelativeTo(null); //Centering frame frame.setVisible(true); //Showing frame } }

    Now a programming exercise. The program upcoming is going to include all the code of the program preceding. This is accomplished with an include attribute on the including program whose value is the xml:id of the included program. So by running the next program, it should pass all of its three tests (for example another example using unit tests, see ). Now reload the page, do not run the program in the listing, and then see that the program in the exercise still runs correctly.

    You'll see nothing that tells the reader that the one chunk of code is prefacing the other. And in static formats it might be even less obvious. So you will want to say something to alert the reader. Here it is easy: includes all the code from .

    This program also makes use of autorun to execute on page load and the codelensto disable the codelens feature.

    A Python program, including another

    Compute the total amount of money loaned and store it in the variable loan_total.

    loan_total = 0 for loan in loan_amount: loan_total += loan print(loan_total) from unittest.gui import TestCaseGui class MyTests(TestCaseGui): def testOne(self): self.assertTrue('loan_total' in self.getEditorText(), "you need a loan_total variable") self.assertEqual(loan_total, sum(loan_amount), "Use the accumulator pattern to add up all the loans") self.assertFalse('sum(' in self.getEditorText(), "you may not use sum()") MyTests().main()

    Exact same exercise again, but now we include three programs. We first get the simple Hello, world! program at , then the program defining the variables with lists of statistics at , and finally the program from the appendix just to test linking to material there.

    This program also makes use of hidecode to initially keep the code hidden and download to enable a file download of the program (that includes all the included code).

    A Python program, including two others

    Compute the total amount of money loaned and store it in the variable loan_total.

    loan_total = 0 for loan in loan_amount: loan_total += loan print(loan_total) from unittest.gui import TestCaseGui class MyTests(TestCaseGui): def testOne(self): self.assertTrue('loan_total' in self.getEditorText(), "you need a loan_total variable") self.assertEqual(loan_total, sum(loan_amount), "Use the accumulator pattern to add up all the loans") self.assertFalse('sum(' in self.getEditorText(), "you may not use sum") MyTests().main()

    Here is an activecode with language set to sql uses the database to load a SQLite database file.

    An SQL program that uses an SQLite database file

    Select all the columns of all the rows in the test database table.

    SELECT * FROM test assert 1,1 == world assert 0,1 == hello assert 2,1 == 35

    Now a C++ program that is spread across multiple files. This example will only be interactive on a Runestone server.

    First, we have a .h file that defines an filename. It has an xml:id so other elements can reference it. It also has an label which is it's unique identifier in the Runestone database. (The label is intentionally different than the xml:id for demonstration purposes, but they can be the same.) The filename is used to indicate what to name to use when the contents of the element are written to a file on the server - other program code and/or tools on the server can look for it using this name. The filename need not be uniquewe could have multiple programs with filename="add.h". As we will see below, the author specifies which version of a file should be used in any given location with its unique xml:id.

    The program is inside of a listing so that we have a place to add a title and so that we can reference the code sample, including that title, with an xref from elsewhere. The title of the listing is rendered with the program. It is also used if an xref links to the listing using text="title".

    add.h (version 1) - A very simple header file that lacks header guards. int add(int a, int b);

    Next, a .cpp file. Note that because it is part of an exercise, the label is applied to the exercise that contains it. The xml:id and filename still belong on the program itself.

    It also has extra-compiler-args. These will be added to any default compiler args for the book. In this case, the -c indicates that we only want to compile this file when it is Run and not try to link it or actually run it.

    You can leave this code as is or modify it. When you click Run, the code will be compiled. However, it will not be run as this is not a standalone program. To run it, use the full program below.

    int add(int a, int b) { return a + b; }

    Finally, the core program. add-files is used to specify (by xml:id) the files that need to be added to the program directory. compile-also specifies files that must be compiled with this source file (they will be assumed to be also part of add-files). Notice that when using add-files to reference code we want to include, we use the xml:id of the target program - it has the contents we want to include. When making a textual reference with an xref we can't link to the program, as it lacks the contextual information required to create a valid reference. Instead, we should link to a listing (or some other container) that surrounds the code, like this: or

    using namespace std; int main() { int a = 1; int b = 2; cout << "The sum of " << a << " and " << b << " is " << add(a, b) << endl; }]]>

    Note that there is a cross page test of add-files located in

    A nonsense paragraph just to check on spacing. A nonsense paragraph just to check on spacing. A nonsense paragraph just to check on spacing. A nonsense paragraph just to check on spacing.

    Code Lens

    CodeLens is an interactive tool for following program execution, much like a debugger, without the ability to influence flow control or variable values. For use without a server, traces must be computed beforehand. First, we have some trivial programs, to provide minimal testing.

    A Python program, stepable with CodeLens print('Hello, World!') An C program, stepable with CodeLens #include <stdio.h> int main(void) { puts("Hello, World!"); } A Java program, stepable with CodeLens public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }

    Codelens interactives can be given one or more checkpoints where the user is asked a question as the code is executed:

    A Python program, stepable with CodeLens, with questions def foo(n): n = n + 1 return n x = 7 y = x // 3 z = foo(y) What variable is being assigned to? What value will be assigned to y? // does integer division What value will be returned? What is n right now?

    If a Codelens contains checkpoints, it is also possible to make it into an exercise. For use on Runestone, there should be an label on the exercise:

    A C++ program as CodeLens exercise Run the codelens and answer the questions it asks. What value will be assigned to y? ++ has precedence over = What value will be assigned to x? We are doubling it

    Now some moderately more complicated programs to find the prime numbers less than 20. We do not vouch for the quality of these, or even their correctness!

    <url href="https://www.tutorialspoint.com/python-program-for-sieve-of-eratosthenes" visual="www.tutorialspoint.com/python-program-for-sieve-of-eratosthenes">Sieve of Eratosthenes</url>, Java <url href="https://www.tutorialspoint.com/cplusplus-program-to-implement-sieve-of-eratosthenes-to-generate-prime-numbers-between-given-range" visual="www.tutorialspoint.com/cplusplus-program-to-implement-sieve-of-eratosthenes-to-generate-prime-numbers-between-given-range">Sieve of Eratosthenes</url>, C++ const int len = 20; int main() { int arr[20] = {0}; for (int i = 2; i < len; i++) { for (int j = i * i; j < len; j+=i) { arr[j - 1] = 1; } } for (int i = 1; i < len; i++) { if (arr[i - 1] == 0) printf(" %d", i); } } ]]> <url href="https://www.tutorialspoint.com/Sieve-of-Eratosthenes-in-java" visual="www.tutorialspoint.com/Sieve-of-Eratosthenes-in-java">Sieve of Eratosthenes</url>, Java
    Coding Exercises

    Program listings can be more that just live demonstrations, they can be exercises. The first two also occur in the sample article where they just get a static rendering, if at all.

    Inline Coding Exercise, No Help

    An exercise might ask a reader to write a computer program, that would go here in the statement. But you can also add a program element after a statement. Here we place no code at all, but we do say we want it to be interactive. The purpose is to make it a live coding environment for a version of your output that allows the reader to perhaps submit a solution. The program element is necessary so you can specify a programming language.

    In interactive formats, try creating and running a Python program below. Use CodeLens to step through the program.

    We didn't really ask you to do anything.

    Inline Coding Exercise, Partial

    Similar to above, but we provide a starting point for the exercise.

    #include <stdio.h> int main(void)

    We're not really sure. But it would begin as follows:

    #include <stdio.h> int main(void)
    Activity Coding Exercise

    Similar to above, but now as a complete Python program inside an activity. This demonstrates the possibility to use any project-like block (project, activity, exploration, investigation), but not in the case when structured with task. (There is an empty tests element here, designed to test relief for an error this will cause on a Runestone server.)

    for i in range(10): print(i)

    We're still not really sure.

    An Exercise with a Static Program

    Similar to above, again, but we place the program element inside the statement, not after it as a peer. This signals that this is not a coding exercise and the program will render static, since it is explicitly labeled as not being interactive.

    #include <stdio.h> int main(void)

    We're not really sure. Still.

    Unit testing can be used to automatically evaluate student work. Unit testing frameworks are available for Python, Java, and C++

    Java Exercise, with Unit Tests

    Unit tests for Java can be written using junit.

    public class Test1 { public static void main(String[] args) { boolean isRaining = true; if (isRaining) { System.out.println("Take an umbrella!"); } System.out.println("Drive carefully"); } } import static org.junit.Assert.*; import org.junit.*; import java.io.*; public class RunestoneTests extends CodeTestHelper { @Test public void testMain() throws IOException { String output = getMethodOutput("main"); String expect = "Take an umbrella! \nDrive carefully"; boolean passed = getResults(expect, output, "Expected output from main"); assertTrue(passed); } }
    C++ Exercise, with Unit Tests

    Unit tests for C++ can be written using doctest or catch. Doctest based tests build substantially faster than catch based ones.

    In an interactive environment, the tests in this exercise will be made visible, but uneditable, so that in the event of a failed test the student can see exactly what is being tested (Doctest does not report on individual passed tests and the feedback on failed tests generally won't make sense without the test itself).

    // Complete the function to return the sum of two numbers int add(int a, int b) { }

    For simple programs, or languages without an available unit testing framework, input-output testing can be done instead. IO testing can only be done on languages that are run on a Runestone server (Java/C/C++/Octave/Python3).

    C++ Exercise, with IO Tests

    Read in an integer n. Print out a n by n square of asterisks.

    using namespace std; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << "*"; } cout << endl; } } ]]> 1 * 3 *** *** *** 5 ***** ***** ***** ***** *****
    Data Files

    In the following file of climate data, the first column is Year, second column is Global Average Temperature (Celcius), and the third column is Global Emmisions C02 (Giga-tons). [Normally you might place this inside a block with the datafile.]

                1850    -0.37     2.24E-7
                1860    -0.34     3.94E-7
                1870    -0.28     6.6E-7
                1880    -0.24     1.1
                1890    -0.42     1.72
                1900    -0.2      2.38
                1910    -0.49     3.34
                1920    -0.25     4.01
                1930    -0.14     4.53
                1940     0.01     5.5
                1950    -0.17     6.63
                1960    -0.05     10.5
                1970    -0.03     16
                1980     0.09     20.3
                1990     0.3      22.6
                2000     0.29     24.9
                2010     0.56     32.7
                2019     0.74     33.3
                

    Browser based programs are automatically given access to data files by their filename.

    ccfile = open("ccdata1.txt", "r") for aline in ccfile: values = aline.split() print('In', values[0], 'the average temp. was', values[1], '°C and CO2 emmisions were', values[2], 'gigatons.') ccfile.close() Stack Overflow Developer Survey

    [A data file can go lots of places. But to make it more prominent, and easy to cross-reference, it would be natural to put it into a data block.]

    Now that you are experienced with working with files lets look at a bit of the data set. The survey had 98,855 respondents. We will work with a sample of 2000 of those responses for this lab. In addition we have narrowed down the questions from 129 to just 13. The columns we have included in this data set are:

    1. Respondent
    2. Country
    3. JobSatisfaction
    4. UndergradMajor
    5. ConvertedSalary
    6. Exercise
    7. Gender
    8. RaceEthnicity
    9. EducationParents
    10. HoursOutside
    11. Age
    12. LastNewJob
    13. LanguageWorkedWith

                
            
    
            
            
                
            
    
            
                
                import image
                img = image.Image("luther-bell.jpg")
    
                print(img.getWidth())
                print(img.getHeight())
    
                p = img.getPixel(45, 55)
                print(p.getRed(), p.getGreen(), p.getBlue())
                
            
    
            
                Golden Gate Bridge Image processing
    
                

    This image has a Creative Commons license, but we've lost track of the exact terms.

    [Now a data file and a program to process it, all bundled up inside a computation, since an example gets knowled and the ActiveCode does not fill.]

    This program changes every pixel of the image.

    import image img = image.Image("golden_gate.png") win = image.ImageWin(img.getWidth(), img.getHeight()) img.draw(win) # img.setDelay(delay, number of pixels between delay) # setDelay(1, 400) will speed up a lot img.setDelay(1,15) for row in range(img.getHeight()): for col in range(img.getWidth()): p = img.getPixel(col, row) newred = p.red * 1.4 newgreen = p.green * .75 newblue = p.blue * 1.1 newpixel = image.Pixel(newred, newgreen, newblue) img.setPixel(col, row, newpixel) img.draw(win) win.exitonclick()

    The examples above all use Python, which will run in your browser. Other languages will only run when a project is hosted on Runestone Academy servers. And in this case there is a small twist. You need to indicate which existing datafile your program needs, even if that seems obvious by reading the code. To do this, make sure each datafile has an xml:id and then use the add-files attribute on program to specify a list of xml:id's that you want to be available. These datafiles will be written to the program's working directory using the filename specified by the filename attribute of the datafile element, and are the names you use in your program's code. As before, no path information is needed, nor allowed.

    When the language attribute of a program is set to python3 that means in-browser Python is not good enough, and you want the greater power and flexibility of having your code run on a Runestone Academy server. So this is our first example of using the datafile attribute.

    The data file is an abbreviated version of the example above, just to be different. And is not editable.

                1900    -0.2      2.38
                1910    -0.49     3.34
                1920    -0.25     4.01
                1930    -0.14     4.53
                1940     0.01     5.5
                1950    -0.17     6.63
                1960    -0.05     10.5
                1970    -0.03     16
                1980     0.09     20.3
                1990     0.3      22.6
                2000     0.29     24.9
                2010     0.56     32.7
                2019     0.74     33.3
                

    The program is identical to the above, but we specify python3 as the language, and use the smaller file. So this example is only active when this content is hosted on a Runestone Academy server.

    ccfile = open("ccdata2.txt", "r") for aline in ccfile: values = aline.split() print('In', values[0], 'the average temp. was', values[1], '°C and CO2 emmisions were', values[2], 'gigatons.') ccfile.close()

    [2023-02-24 Testing Java with multiple data files]

    Flowers

    Two flower images as datafile for use in upcoming Java program.

    The following is experimental, as of 2023-07-05, and needs some organization, plus some credit to CSAwesome and Barb Ericson.

                > 24) & 0xff;
    
                    return alpha;
                  }
    
                  /**
                   * Method to get the amount of red at this pixel.  It will be
                   * from 0-255 with 0 being no red and 255 being as much red as
                   * you can have.
                   * @return the amount of red from 0 for none to 255 for max
                   */
                  public int getRed() {
    
                    /* get the value at the location from the picture as a 32 bit int
                     * with alpha, red, green, blue each taking 8 bits from left to right
                     */
                    int value = picture.getBasicPixel(x,y);
    
                    // get the red value (starts at 17 so shift right 16)
                    // then AND it with all 1's for the first 8 bits to
                    // end up with a resulting value from 0 to 255
                    int red = (value >> 16) & 0xff;
    
                    return red;
                  }
    
                  /**
                   * Method to get the red value from a pixel represented as an int
                   * @param value the color value as an int
                   * @return the amount of red
                   */
                  public static int getRed(int value)
                  {
                    int red = (value >> 16) & 0xff;
                    return red;
                  }
    
                  /**
                   * Method to get the amount of green at this pixel.  It will be
                   * from 0-255 with 0 being no green and 255 being as much green as
                   * you can have.
                   * @return the amount of green from 0 for none to 255 for max
                   */
                  public int getGreen() {
    
                    /* get the value at the location from the picture as a 32 bit int
                     * with alpha, red, green, blue each taking 8 bits from left to right
                     */
                    int value = picture.getBasicPixel(x,y);
    
                    // get the green value (starts at 9 so shift right 8)
                    int green = (value >>  8) & 0xff;
    
                    return green;
                  }
    
                  /**
                   * Method to get the green value from a pixel represented as an int
                   * @param value the color value as an int
                   * @return the amount of green
                   */
                  public static int getGreen(int value)
                  {
                    int green = (value >> 8) & 0xff;
                    return green;
                  }
    
                  /**
                   * Method to get the amount of blue at this pixel.  It will be
                   * from 0-255 with 0 being no blue and 255 being as much blue as
                   * you can have.
                   * @return the amount of blue from 0 for none to 255 for max
                   */
                  public int getBlue() {
    
                    /* get the value at the location from the picture as a 32 bit int
                     * with alpha, red, green, blue each taking 8 bits from left to right
                     */
                    int value = picture.getBasicPixel(x,y);
    
                    // get the blue value (starts at 0 so no shift required)
                    int blue = value & 0xff;
    
                    return blue;
                  }
    
                  /**
                   * Method to get the blue value from a pixel represented as an int
                   * @param value the color value as an int
                   * @return the amount of blue
                   */
                  public static int getBlue(int value)
                  {
                    int blue = value & 0xff;
                    return blue;
                  }
    
                  /**
                   * Method to get a color object that represents the color at this pixel.
                   * @return a color object that represents the pixel color
                   */
                  public Color getColor()
                  {
                     /* get the value at the location from the picture as a 32 bit int
                     * with alpha, red, green, blue each taking 8 bits from left to right
                     */
                    int value = picture.getBasicPixel(x,y);
    
                    // get the red value (starts at 17 so shift right 16)
                    // then AND it with all 1's for the first 8 bits to
                    // end up with a resulting value from 0 to 255
                    int red = (value >> 16) & 0xff;
    
                    // get the green value (starts at 9 so shift right 8)
                    int green = (value >>  8) & 0xff;
    
                    // get the blue value (starts at 0 so no shift required)
                    int blue = value & 0xff;
    
                    return new Color(red,green,blue);
                  }
    
                  /**
                   * Method to set the pixel color to the passed in color object.
                   * @param newColor the new color to use
                   */
                  public void setColor(Color newColor)
                  {
                    // set the red, green, and blue values
                    int red = newColor.getRed();
                    int green = newColor.getGreen();
                    int blue = newColor.getBlue();
    
                    // update the associated picture
                    updatePicture(this.getAlpha(),red,green,blue);
                  }
    
                  /**
                   * Method to update the picture based on the passed color
                   * values for this pixel
                   * @param alpha the alpha (transparency) at this pixel
                   * @param red the red value for the color at this pixel
                   * @param green the green value for the color at this pixel
                   * @param blue the blue value for the color at this pixel
                   */
                  public void updatePicture(int alpha, int red, int green, int blue)
                  {
                    // create a 32 bit int with alpha, red, green blue from left to right
                    int value = (alpha << 24) + (red << 16) + (green << 8) + blue;
    
                    // update the picture with the int value
                    picture.setBasicPixel(x,y,value);
                  }
    
                  /**
                   * Method to correct a color value to be within 0 to 255
                   * @param the value to use
                   * @return a value within 0 to 255
                   */
                  private static int correctValue(int value)
                  {
                    if (value < 0)
                      value = 0;
                    if (value > 255)
                      value = 255;
                    return value;
                  }
    
                  /**
                   * Method to set the red to a new red value
                   * @param value the new value to use
                   */
                  public void setRed(int value)
                  {
                    // set the red value to the corrected value
                    int red = correctValue(value);
    
                    // update the pixel value in the picture
                    updatePicture(getAlpha(), red, getGreen(), getBlue());
                  }
    
                  /**
                   * Method to set the green to a new green value
                   * @param value the value to use
                   */
                  public void setGreen(int value)
                  {
                    // set the green value to the corrected value
                    int green = correctValue(value);
    
                    // update the pixel value in the picture
                    updatePicture(getAlpha(), getRed(), green, getBlue());
                  }
    
                  /**
                   * Method to set the blue to a new blue value
                   * @param value the new value to use
                   */
                  public void setBlue(int value)
                  {
                    // set the blue value to the corrected value
                    int blue = correctValue(value);
    
                    // update the pixel value in the picture
                    updatePicture(getAlpha(), getRed(), getGreen(), blue);
                  }
    
                   /**
                   * Method to set the alpha (transparency) to a new alpha value
                   * @param value the new value to use
                   */
                  public void setAlpha(int value)
                  {
                    // make sure that the alpha is from 0 to 255
                    int alpha = correctValue(value);
    
                    // update the associated picture
                    updatePicture(alpha, getRed(), getGreen(), getBlue());
                  }
    
                  /**
                  * Method to get the distance between this pixel's color and the passed color
                  * @param testColor the color to compare to
                  * @return the distance between this pixel's color and the passed color
                  */
                 public double colorDistance(Color testColor)
                 {
                   double redDistance = this.getRed() - testColor.getRed();
                   double greenDistance = this.getGreen() - testColor.getGreen();
                   double blueDistance = this.getBlue() - testColor.getBlue();
                   double distance = Math.sqrt(redDistance * redDistance +
                                               greenDistance * greenDistance +
                                               blueDistance * blueDistance);
                   return distance;
                 }
    
                 /**
                  * Method to compute the color distances between two color objects
                  * @param color1 a color object
                  * @param color2 a color object
                  * @return the distance between the two colors
                  */
                 public static double colorDistance(Color color1,Color color2)
                 {
                   double redDistance = color1.getRed() - color2.getRed();
                   double greenDistance = color1.getGreen() - color2.getGreen();
                   double blueDistance = color1.getBlue() - color2.getBlue();
                   double distance = Math.sqrt(redDistance * redDistance +
                                               greenDistance * greenDistance +
                                               blueDistance * blueDistance);
                   return distance;
                 }
    
                 /**
                  * Method to get the average of the colors of this pixel
                  * @return the average of the red, green, and blue values
                  */
                 public double getAverage()
                 {
                   double average = (getRed() + getGreen() + getBlue()) / 3.0;
                   return average;
                 }
    
                  /**
                   * Method to return a string with information about this pixel
                   * @return a string with information about this pixel
                   */
                  public String toString()
                  {
                    return "Pixel row=" + getRow() +
                      " col=" + getCol() +
                      " red=" + getRed() +
                      " green=" + getGreen() +
                      " blue=" + getBlue();
                  }
    
                }
    
                import javax.imageio.ImageIO;
                import java.awt.image.BufferedImage;
                import javax.swing.ImageIcon;
                import java.awt.*;
                import java.io.*;
                import java.awt.geom.*;
    
                import java.io.ByteArrayOutputStream;
                //import javax.xml.bind.DatatypeConverter;
                import java.util.Base64;
    
                import java.util.Scanner;
    
                /**
                 * A class that represents a simple picture.  A simple picture may have
                 * an associated file name and a title.  A simple picture has pixels,
                 * width, and height.  A simple picture uses a BufferedImage to
                 * hold the pixels. You can also explore a simple picture.
                 *
                 * @author Barb Ericson ericson@cc.gatech.edu
                 */
                public class SimplePicture implements DigitalPicture
                {
    
                  /////////////////////// Fields /////////////////////////
    
                  /**
                   * the file name associated with the simple picture
                   */
                  private String fileName;
    
                  /**
                   * the path name for the file
                   */
                  private String pathName;
    
                  /**
                   * the title of the simple picture
                   */
                  private String title;
    
                  /**
                   * buffered image to hold pixels for the simple picture
                   */
                  private BufferedImage bufferedImage;
    
                  /**
                   * extension for this file (jpg or bmp)
                   */
                  private String extension;
    
    
                 /////////////////////// Constructors /////////////////////////
    
                 /**
                  * A Constructor that takes no arguments.  It creates a picture with
                  * a width of 200 and a height of 100 that is all white.
                  * A no-argument constructor must be given in order for a class to
                  * be able to be subclassed.  By default all subclasses will implicitly
                  * call this in their parent's no-argument constructor unless a
                  * different call to super() is explicitly made as the first line
                  * of code in a constructor.
                  */
                 public SimplePicture()
                 {this(200,100);}
    
                 /**
                  * A Constructor that takes a file name and uses the file to create
                  * a picture
                  * @param fileName the file name to use in creating the picture
                  */
                 public SimplePicture(String fileName)
                 {
    
                   // load the picture into the buffered image
                   load(fileName);
    
                 }
    
                 /**
                  * A constructor that takes the width and height desired for a picture and
                  * creates a buffered image of that size.  This constructor doesn't
                  * show the picture.  The pixels will all be white.
                  * @param width the desired width
                  * @param height the desired height
                  */
                 public  SimplePicture(int width, int height)
                 {
                   bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                   title = "None";
                   fileName = "None";
                   extension = "jpg";
                   setAllPixelsToAColor(Color.white);
                 }
    
                 /**
                  * A constructor that takes the width and height desired for a picture and
                  * creates a buffered image of that size.  It also takes the
                  * color to use for the background of the picture.
                  * @param width the desired width
                  * @param height the desired height
                  * @param theColor the background color for the picture
                  */
                 public  SimplePicture(int width, int height, Color theColor)
                 {
                   this(width,height);
                   setAllPixelsToAColor(theColor);
                 }
    
                 /**
                  * A Constructor that takes a picture to copy information from
                  * @param copyPicture the picture to copy from
                  */
                 public SimplePicture(SimplePicture copyPicture)
                 {
                   if (copyPicture.fileName != null)
                   {
                      this.fileName = new String(copyPicture.fileName);
                      this.extension = copyPicture.extension;
                   }
                   if (copyPicture.title != null)
                      this.title = new String(copyPicture.title);
                   if (copyPicture.bufferedImage != null)
                   {
                     this.bufferedImage = new BufferedImage(copyPicture.getWidth(),  copyPicture.getHeight(), BufferedImage.TYPE_INT_RGB);
                     this.copyPicture(copyPicture);
                   }
                 }
    
                 /**
                  * A constructor that takes a buffered image
                  * @param image the buffered image
                  */
                 public SimplePicture(BufferedImage image)
                 {
                   this.bufferedImage = image;
                   title = "None";
                   fileName = "None";
                   extension = "jpg";
                 }
    
                 ////////////////////////// Methods //////////////////////////////////
    
                 /**
                  * Method to get the extension for this picture
                  * @return the extension (jpg, bmp, giff, etc)
                  */
                 public String getExtension() { return extension; }
    
                 /**
                  * Method that will copy all of the passed source picture into
                  * the current picture object
                  * @param sourcePicture  the picture object to copy
                  */
                 public void copyPicture(SimplePicture sourcePicture)
                 {
                   Pixel sourcePixel = null;
                   Pixel targetPixel = null;
    
                   // loop through the columns
                   for (int sourceX = 0, targetX = 0;
                        sourceX < sourcePicture.getWidth() &&
                        targetX < this.getWidth();
                        sourceX++, targetX++)
                   {
                     // loop through the rows
                     for (int sourceY = 0, targetY = 0;
                          sourceY < sourcePicture.getHeight() &&
                          targetY < this.getHeight();
                          sourceY++, targetY++)
                     {
                       sourcePixel = sourcePicture.getPixel(sourceX,sourceY);
                       targetPixel = this.getPixel(targetX,targetY);
                       targetPixel.setColor(sourcePixel.getColor());
                     }
                   }
    
                 }
    
                 /**
                  * Method to set the color in the picture to the passed color
                  * @param color the color to set to
                  */
                 public void setAllPixelsToAColor(Color color)
                 {
                   // loop through all x
                   for (int x = 0; x < this.getWidth(); x++)
                   {
                     // loop through all y
                     for (int y = 0; y < this.getHeight(); y++)
                     {
                       getPixel(x,y).setColor(color);
                     }
                   }
                 }
    
                 /**
                  * Method to get the buffered image
                  * @return the buffered image
                  */
                 public BufferedImage getBufferedImage()
                 {
                    return bufferedImage;
                 }
    
                 /**
                  * Method to get a graphics object for this picture to use to draw on
                  * @return a graphics object to use for drawing
                  */
                 public Graphics getGraphics()
                 {
                   return bufferedImage.getGraphics();
                 }
    
                 /**
                  * Method to get a Graphics2D object for this picture which can
                  * be used to do 2D drawing on the picture
                  */
                 public Graphics2D createGraphics()
                 {
                   return bufferedImage.createGraphics();
                 }
    
                 /**
                  * Method to get the file name associated with the picture
                  * @return  the file name associated with the picture
                  */
                 public String getFileName() { return fileName; }
    
                 /**
                  * Method to set the file name
                  * @param name the full pathname of the file
                  */
                 public void setFileName(String name)
                 {
                   fileName = name;
                 }
    
                 /**
                  * Method to get the title of the picture
                  * @return the title of the picture
                  */
                 public String getTitle()
                 { return title; }
    
                 /**
                  * Method to set the title for the picture
                  * @param title the title to use for the picture
                  */
                 public void setTitle(String title)
                 {
                   this.title = title;
                 }
    
                 /**
                  * Method to get the width of the picture in pixels
                  * @return the width of the picture in pixels
                  */
                 public int getWidth() { return bufferedImage.getWidth(); }
    
                 /**
                  * Method to get the height of the picture in pixels
                  * @return  the height of the picture in pixels
                  */
                 public int getHeight() { return bufferedImage.getHeight(); }
    
                 /**
                  * Method to get an image from the picture
                  * @return  the buffered image since it is an image
                  */
                 public Image getImage()
                 {
                   return bufferedImage;
                 }
    
                 /**
                  * Method to return the pixel value as an int for the given x and y location
                  * @param x the x coordinate of the pixel
                  * @param y the y coordinate of the pixel
                  * @return the pixel value as an integer (alpha, red, green, blue)
                  */
                 public int getBasicPixel(int x, int y)
                 {
                    return bufferedImage.getRGB(x,y);
                 }
    
                 /**
                  * Method to set the value of a pixel in the picture from an int
                  * @param x the x coordinate of the pixel
                  * @param y the y coordinate of the pixel
                  * @param rgb the new rgb value of the pixel (alpha, red, green, blue)
                  */
                 public void setBasicPixel(int x, int y, int rgb)
                 {
                   bufferedImage.setRGB(x,y,rgb);
                 }
    
                 /**
                  * Method to get a pixel object for the given x and y location
                  * @param x  the x location of the pixel in the picture
                  * @param y  the y location of the pixel in the picture
                  * @return a Pixel object for this location
                  */
                 public Pixel getPixel(int x, int y)
                 {
                   // create the pixel object for this picture and the given x and y location
                   Pixel pixel = new Pixel(this,x,y);
                   return pixel;
                 }
    
                 /**
                  * Method to get a one-dimensional array of Pixels for this simple picture
                  * @return a one-dimensional array of Pixel objects starting with y=0
                  * to y=height-1 and x=0 to x=width-1.
                  */
                 public Pixel[] getPixels()
                 {
                   int width = getWidth();
                   int height = getHeight();
                   Pixel[] pixelArray = new Pixel[width * height];
    
                   // loop through height rows from top to bottom
                   for (int row = 0; row < height; row++)
                     for (int col = 0; col < width; col++)
                       pixelArray[row * width + col] = new Pixel(this,col,row);
    
                   return pixelArray;
                 }
    
                 /**
                  * Method to get a two-dimensional array of Pixels for this simple picture
                  * @return a two-dimensional array of Pixel objects in row-major order.
                  */
                 public Pixel[][] getPixels2D()
                 {
                   int width = getWidth();
                   int height = getHeight();
                   Pixel[][] pixelArray = new Pixel[height][width];
    
                   // loop through height rows from top to bottom
                   for (int row = 0; row < height; row++)
                     for (int col = 0; col < width; col++)
                       pixelArray[row][col] = new Pixel(this,col,row);
    
                   return pixelArray;
                 }
    
                 /**
                  * Method to load the buffered image with the passed image
                  * @param image  the image to use
                  */
                 public void load(Image image)
                 {
                   // get a graphics context to use to draw on the buffered image
                   Graphics2D graphics2d = bufferedImage.createGraphics();
    
                   // draw the image on the buffered image starting at 0,0
                   graphics2d.drawImage(image,0,0,null);
    
                   // show the new image
                   show();
                 }
    
                 /**
                  * Method to show the picture in a picture frame
                  */
                 public void show()
                 {
                     try {
                         ByteArrayOutputStream output = new ByteArrayOutputStream();
                         ImageIO.write(this.bufferedImage, "png", output);
                         String result = Base64.getEncoder().encodeToString(output.toByteArray());
                         //BH: using Base64 instead of DatatypeConverter.printBase64Binary(output.toByteArray());
                         System.out.println("<img src=\'data:image/" + this.extension + ";base64," + result + "\'/>");
                     } catch (IOException e) {
                         System.out.println("Errors occured in image conversion");
                     }
                 }
    
                 /**
                  * Method to open a picture explorer on a copy (in memory) of this
                  * simple picture
                  */
                 /*
                 public void explore()
                 {
                   // create a copy of the current picture and explore it
                   new PictureExplorer(new SimplePicture(this));
                 }
                 */
    
                 /**
                  * Method to load the picture from the passed file name
                  * @param fileName the file name to use to load the picture from
                  * @throws IOException if the picture isn't found
                  */
                 public void loadOrFail(String fileName) throws IOException
                 {
                    // set the current picture's file name
                   this.fileName = fileName;
    
                   // set the extension
                   int posDot = fileName.lastIndexOf('.');
                   if (posDot >= 0)
                     this.extension = fileName.substring(posDot + 1);
    
                    // get file location
                    String[] paths = fileName.split("/");
                    this.pathName = "";
                    if(paths.length != 1) {
                        for(int i = 0; i < paths.length - 1; i++) {
                            this.pathName = this.pathName + paths[i] + "/";
                        }
                    }
                   // if the current title is null use the file name
                   if (title == null)
                     title = fileName;
    
                   File file = new File(this.fileName);
    
    
                   if (!file.canRead())
                   {
                     throw new IOException(this.fileName +
                                         " could not be opened. Check that you specified the path");
                   }
                   this.bufferedImage = ImageIO.read(file);
    
    
                 }
    
                 /**
                  * Method to read the contents of the picture from a filename
                  * without throwing errors
                  * @param fileName the name of the file to write the picture to
                  * @return true if success else false
                  */
                 public boolean load(String fileName)
                 {
                     try {
                         this.loadOrFail(fileName);
                         return true;
    
                     } catch (Exception ex) {
                         System.out.println("There was an error trying to open " + fileName);
                         bufferedImage = new BufferedImage(600,200,
                                                           BufferedImage.TYPE_INT_RGB);
                         addMessage("Couldn't load " + fileName,5,100);
                         return false;
                     }
    
                 }
    
                 /**
                  * Method to load the picture from the passed file name
                  * this just calls load(fileName) and is for name compatibility
                  * @param fileName the file name to use to load the picture from
                  * @return true if success else false
                  */
                 public boolean loadImage(String fileName)
                 {
                     return load(fileName);
                 }
    
                 /**
                  * Method to draw a message as a string on the buffered image
                  * @param message the message to draw on the buffered image
                  * @param xPos  the x coordinate of the leftmost point of the string
                  * @param yPos  the y coordinate of the bottom of the string
                  */
                 public void addMessage(String message, int xPos, int yPos)
                 {
                   // get a graphics context to use to draw on the buffered image
                   Graphics2D graphics2d = bufferedImage.createGraphics();
    
                   // set the color to white
                   graphics2d.setPaint(Color.white);
    
                   // set the font to Helvetica bold style and size 16
                   graphics2d.setFont(new Font("Helvetica",Font.BOLD,16));
    
                   // draw the message
                   graphics2d.drawString(message,xPos,yPos);
    
                 }
    
                 /**
                  * Method to draw a string at the given location on the picture
                  * @param text the text to draw
                  * @param xPos the left x for the text
                  * @param yPos the top y for the text
                  */
                 public void drawString(String text, int xPos, int yPos)
                 {
                   addMessage(text,xPos,yPos);
                 }
    
                 /**
                   * Method to create a new picture by scaling the current
                   * picture by the given x and y factors
                   * @param xFactor the amount to scale in x
                   * @param yFactor the amount to scale in y
                   * @return the resulting picture
                   */
                  public Picture scale(double xFactor, double yFactor)
                  {
                    // set up the scale transform
                    AffineTransform scaleTransform = new AffineTransform();
                    scaleTransform.scale(xFactor,yFactor);
    
                    // create a new picture object that is the right size
                    Picture result = new Picture((int) (getHeight() * yFactor),
                                                 (int) (getWidth() * xFactor));
    
                    // get the graphics 2d object to draw on the result
                    Graphics graphics = result.getGraphics();
                    Graphics2D g2 = (Graphics2D) graphics;
    
                    // draw the current image onto the result image scaled
                    g2.drawImage(this.getImage(),scaleTransform,null);
    
                    return result;
                  }
    
                  /**
                   * Method to create a new picture of the passed width.
                   * The aspect ratio of the width and height will stay
                   * the same.
                   * @param width the desired width
                   * @return the resulting picture
                   */
                  public Picture getPictureWithWidth(int width)
                  {
                    // set up the scale transform
                    double xFactor = (double) width / this.getWidth();
                    Picture result = scale(xFactor,xFactor);
                    return result;
                  }
    
                  /**
                   * Method to create a new picture of the passed height.
                   * The aspect ratio of the width and height will stay
                   * the same.
                   * @param height the desired height
                   * @return the resulting picture
                   */
                  public Picture getPictureWithHeight(int height)
                  {
                    // set up the scale transform
                    double yFactor = (double) height / this.getHeight();
                    Picture result = scale(yFactor,yFactor);
                    return result;
                  }
    
                 /**
                  * Method to load a picture from a file name and show it in a picture frame
                  * @param fileName the file name to load the picture from
                  * @return true if success else false
                  */
                 public boolean loadPictureAndShowIt(String fileName)
                 {
                   boolean result = true;  // the default is that it worked
    
                   // try to load the picture into the buffered image from the file name
                   result = load(fileName);
    
                   // show the picture in a picture frame
                   show();
    
                   return result;
                 }
    
                 /**
                  * Method to write the contents of the picture to a file with
                  * the passed name
                  * @param fileName the name of the file to write the picture to
                  */
                 public void writeOrFail(String fileName) throws IOException
                 {
                   String extension = this.extension; // the default is current
    
                   // create the file object
                   File file = new File(this.pathName + fileName);
                   //File fileLoc = file.getParentFile(); // directory name
    
                   // if there is no parent directory use the current media dir
                   //if (fileLoc == null)
                   //{
                     //fileName = FileChooser.getMediaPath(fileName);
                     //file = new File(fileName);
                     //fileLoc = file.getParentFile();
                   //}
    
                   // check that you can write to the directory
                   //if (!fileLoc.canWrite()) {
                    //    throw new IOException(fileName +
                    //    " could not be opened. Check to see if you can write to the directory.");
                   //}
    
                   // get the extension
                   int posDot = fileName.indexOf('.');
                   if (posDot >= 0)
                       extension = fileName.substring(posDot + 1);
    
                   // write the contents of the buffered image to the file
                   ImageIO.write(bufferedImage, extension, file);
    
                 }
    
                 /**
                  * Method to write the contents of the picture to a file with
                  * the passed name without throwing errors
                  * @param fileName the name of the file to write the picture to
                  * @return true if success else false
                  */
                 public boolean write(String fileName)
                 {
                     try {
                         this.writeOrFail(fileName);
                         return true;
                     } catch (Exception ex) {
                         System.out.println("There was an error trying to write " + fileName);
                         ex.printStackTrace();
                         return false;
                     }
    
                 }
    
                  /**
                   * Method to get the coordinates of the enclosing rectangle after this
                   * transformation is applied to the current picture
                   * @return the enclosing rectangle
                   */
                  public Rectangle2D getTransformEnclosingRect(AffineTransform trans)
                  {
                    int width = getWidth();
                    int height = getHeight();
                    double maxX = width - 1;
                    double maxY = height - 1;
                    double minX, minY;
                    Point2D.Double p1 = new Point2D.Double(0,0);
                    Point2D.Double p2 = new Point2D.Double(maxX,0);
                    Point2D.Double p3 = new Point2D.Double(maxX,maxY);
                    Point2D.Double p4 = new Point2D.Double(0,maxY);
                    Point2D.Double result = new Point2D.Double(0,0);
                    Rectangle2D.Double rect = null;
    
                    // get the new points and min x and y and max x and y
                    trans.deltaTransform(p1,result);
                    minX = result.getX();
                    maxX = result.getX();
                    minY = result.getY();
                    maxY = result.getY();
                    trans.deltaTransform(p2,result);
                    minX = Math.min(minX,result.getX());
                    maxX = Math.max(maxX,result.getX());
                    minY = Math.min(minY,result.getY());
                    maxY = Math.max(maxY,result.getY());
                    trans.deltaTransform(p3,result);
                    minX = Math.min(minX,result.getX());
                    maxX = Math.max(maxX,result.getX());
                    minY = Math.min(minY,result.getY());
                    maxY = Math.max(maxY,result.getY());
                    trans.deltaTransform(p4,result);
                    minX = Math.min(minX,result.getX());
                    maxX = Math.max(maxX,result.getX());
                    minY = Math.min(minY,result.getY());
                    maxY = Math.max(maxY,result.getY());
    
                    // create the bounding rectangle to return
                    rect = new Rectangle2D.Double(minX,minY,maxX - minX + 1, maxY - minY + 1);
                    return rect;
                  }
    
                  /**
                   * Method to get the coordinates of the enclosing rectangle after this
                   * transformation is applied to the current picture
                   * @return the enclosing rectangle
                   */
                  public Rectangle2D getTranslationEnclosingRect(AffineTransform trans)
                  {
                    return getTransformEnclosingRect(trans);
                  }
    
                 /**
                  * Method to return a string with information about this picture
                  * @return a string with information about the picture
                  */
                 public String toString()
                 {
                   String output = "Simple Picture, filename " + fileName +
                     " height " + getHeight() + " width " + getWidth();
                   return output;
                 }
    
                } // end of SimplePicture class
                ]]>
                
    0) { code = code.substring(index); int num = countOccurences(code, target); passed = num >= 2; } getResults("true", ""+passed, "Checking that keepOnlyBlue() contains 2 for loops", passed); assertTrue(passed); } } ]]>
    YouTube Videos

    Runestone uses a YouTube API that broadcasts events when a reader interacts with a video. In this way, Runestone can record video-watching as an activity. As output we concede better behavior on small screens (responsiveness) to enable this feature in a Runestone version. A label attribute is necessary for persistence in the Runestone database. Various features, such as playlists, are not yet supportedmake a request.

    The margins here are asymmetric just as a test. And this text is here to see where the video ends.

    Deeper

    This is a stub of a section, but it contains two subsection which each contain a PROJECT-LIKE item that includes a program element, and thus is a coding exercise. This tests migration to the Runestone assignment area, though Runestone only has divisions two-deep (chapter and subchapter, so both will show up associated with the same sectionthis one.

    The first is a start of a C program, so will only be interactive on a Runestone server. The second is a Python program, so will be interactive in all HTML outputs.

    Subsection One

    An activity next. This one has a program so will be made interactive whenever possible.

    Activity in a Subsection

    We would suggest you do something here.

    #include <stdio.h> int main(void)

    Nothing suggests this next project is interactive.

    Project in a Subsection

    You would work this project on paper, most likely. It is never interactive since there is no indication of a desire for that, even if hosted on a capable platform.

    A little bit of markup, to test a bug: x^2. (The bug was only apparent under a deprecated method for specify a question to be an interactive short-answer question on Runestone Academy.)

    Subsection Two

    An exploration next.

    Exploration in a Subsection

    We would suggest now that you explore something here. In this case we simply provide a CodeLens, which would be graded as an interaction.

    for i in range(10): print(i)

    The next simple exercise will be a short answer question on a capable interactive platform since we have included a response element.

    Inline Exercise in a Subsection

    I am an interactive short answer question, but only on a capable platform.

    True/False Exercises True/False vector space

    Every vector space has finite dimension.

    The vector space of all polynomials with finite degree has a basis, B = \{1,x,x^2,x^3,\dots\}, which is infinte.

    P_n, the vector space of polynomials with degree at most n, has dimension n+1 by . [Cross-reference is just a demo, content is not relevant.] What happens if we relax the defintion and remove the parameter n?

    Multiple Choice Exercises

    When this exercises division is hosted on Runestone Academy, it will be enabled for group work. See group selection and submission features are at the end of the division. See for more detail. (2024-07-24: experimental.)

    Multiple-Choice, Not Randomized, One Answer stop signs

    What color is a stop sign?

    Green

    Green means go!.

    Red

    Red is universally used for prohibited activities or serious warnings.

    White

    White might be hard to see.

    What did you see last time you went driving?

    Maybe go out for a drive?

    Multiple-Choice, Math in Feedback

    What is the coefficient on x^4y^4 in (2x+5xy^2)^4?

    6

    Have you accounted for the 2 and 5 that are in the original binomial?

    60

    What should the exponents on 2 and 5 be when you expand (2x+5xy^2)^4?

    100

    Have you included something of the form \binom{n}{k} in your computations?

    600

    Correct! Using the binomial theorem, we get a term containing the monomial x^4y^4 by taking two of the first term, and two of the second term in the expansion of (2x+5xy^2)^4, and so this term is equal to \binom{4}{2} (2x)^2 (5xy^2)^2 = 6 \cdot 2^2 5^2 x^4 y^4 = 600 x^4 y^4.

    Multiple-Choice, Not Randomized, Multiple Answers stop signs

    Which colors might be found in a rainbow? (Note that the radio buttons now allow multiple buttons to be selected.)

    Red

    Red is a definitely one of the colors.

    Yellow

    Yes, yellow is correct.

    Black

    Remember the acronymROY G BIV. B stands for blue.

    Green

    Yes, green is one of the colors.

    Do you know the acronymROY G BIV for the colors of a rainbow, and their order?

    Multiple-Choice, Randomized, One Answer stop signs

    What color is a stop sign? [Static versions retain the order as authored.]

    Green

    Green means go!.

    Red

    Red is universally used for prohibited activities or serious warnings.

    White

    White might be hard to see.

    What did you see last time you went driving?

    Maybe go out for a drive?

    Multiple-Choice, Randomized, One Answer but with Checkboxes stop signs

    What color is a stop sign? [Static versions retain the order as authored.]

    Green

    Green means go!.

    Red

    Red is universally used for prohibited activities or serious warnings.

    Yellow

    Yellow means slow down.

    What did you see last time you went driving?

    Maybe go out for a drive?

    Multiple-Choice, Randomized, Multiple Answers stop signs

    Which colors might be found in a rainbow? (Note that the radio buttons now allow multiple buttons to be selected.) [Static versions retain the order as authored.]

    Red

    Red is a definitely one of the colors.

    Yellow

    Yes, yellow is correct.

    Black

    Remember the acronymROY G BIV. B stands for blue.

    Green

    Yes, green is one of the colors.

    Do you know the acronymROY G BIV for the colors of a rainbow, and their order?

    Mathematical Multiple-Choice, Not Randomized, Multiple Answers stop signs

    Which of the following is an antiderivative of 2\sin(x)\cos(x)?

    \sin^2(x)+832

    Remember that when we write +C on an antiderivative that this is the way we communicate that there are many possible derivatives, but they all differ by a constant.

    \sin^2(x)

    The derivative given in the statement of the problem looks exactly like an application of the chain rule to \sin^2(x).

    -\cos^2(x)

    Take a derivative on -\cos^2(x) to see that this answer is correct. Extra credit: does this answer differ by a constant when subtracted from either of the other two correct answers?

    -2\cos(x)\sin(x)

    The antiderivative of a product is not the product of the antiderivatives. Use the product rule to take a derivative and see that this answer is not correct.

    You can take a derivative on any one of the choices to see if it is correct or not, rather than using techniques of integration to find a single correct answer.

    Multiple-Choice, Not Randomized, One Answer stop signs

    What color is a stop sign?

    Note: we are experimenting with choices in columns (2025-05-17). Three columns here.

    Green

    Green means go!.

    Red

    Red is universally used for prohibited activities or serious warnings.

    White

    White might be hard to see.

    Purple

    Hmmmmmmm.

    Pink

    I have never seen a pink road sign!

    What did you see last time you went driving?

    Maybe go out for a drive?

    Parsons Exercises Parsons Problem, Mathematical Proof even numbers

    Create a proof of the theorem: If n is an even number, then n\equiv 0\mod 2.

    [Ed. If you examine the source, you will also notice the exercise lacks a language attribute. It is relying on the docinfo/parsons/@language value that is in bookinfo.xml. If present, that attribute will be used for any Parsons that lack a language.]

    Suppose n is even.

    Then n is a prime number.

    Then there exists an m so that n = 2m.

    Then there exists an m so that n = 2m + 1.

    Click the heels of your ruby slippers together three times.

    So n = 2m + 0.

    This is a superfluous second paragraph in this block.

    Thus n\equiv 0\mod 2.

    And a little bit of irrelevant multi-line math c^2&a^2+b^2 &x^2+y^2 .

    Dorothy will not be much help with this proof.

    Parsons Problem, Partial Ordering

    Parsons problems can specify a partial ordering that allows for multiple valid solutions.

    Try putting the blocks in a valid order to calculate and printc Only use the required blocks. There are many valid orderings.

    import math import antigravity a = 3 b = 4 4 = b cSquared = a ** 2 + b ** 2 c = math.sqrt(cSquared) print(c)
    Parsons Problem, Programming prime numbers Sieve of Eratosthenes

    The Sieve of Eratosthenes computes prime numbers by starting with a finite list of the integers bigger than 1. The first member of the list is a prime and is saved/recorded. Then all multiples of that prime (which not a prime, excepting the prime itself!) are removed from the list. Now the first number remaining in the list is the next prime number. And the process repeats.

    The code blocks below can be rearranged to form one of the many possible programs to implement this algorithm to compute a list of all the primes less than 250. [Ed. this version of this problem requires the reader to provide the necessary indentation.]

    This reprises .

    n = 250 primes = [] candidates = list(range(2,n)) candidates = [] primes = list(range(2,n)) primes = candidates + [p] while candidates: p = candidates[0] primes.append(p) for nonprime in range(p, n, p): if nonprime in candidates: candidates.remove(nonprime) print(primes)
    Parsons Problem with executable

    Parsons problems that have a language specified that corresponds to a valid activecode language can be made runnable.

    Complete the Python function isolateRed(p) If either the blue or green is higher than the red, average the three color values and set red, green, and blue to be that average. Otherwise, do nothing to p.

    After you check a correct answer you will be able to Run the code you created - it will be used to modify the image shown below.

    def isolateRed(p): if p.green > p.red or p.blue > p.red: avg = (p.red + p.blue + p.green) / 3 p.red = avg p.blue = avg p.green = avg print("Using your code to isolate the red in the Golden Gate Bridge image.") import image img = image.Image("golden-gate.png") win = image.ImageWin(img.getWidth(), img.getHeight()) img.draw(win) # img.setDelay(delay, number of pixels between delay) # setDelay(1, 400) will speed up a lot img.setDelay(1,50) for row in range(img.getHeight()): for col in range(img.getWidth()): p = img.getPixel(col, row) isolateRed(p) img.setPixel(col, row, p)
    Parsons Problem, Programming prime numbers Sieve of Eratosthenes

    The Sieve of Eratosthenes computes prime numbers by starting with a finite list of the integers bigger than 1. The first member of the list is a prime and is saved/recorded. Then all multiples of that prime (which not a prime, excepting the prime itself!) are removed from the list. Now the first number remaining in the list is the next prime number. And the process repeats.

    The code blocks below can be rearranged to form one of the many possible programs to implement this algorithm to compute a list of all the primes less than 250. [Ed. this version of this problem does not require the reader to provide the necessary indentation, which is the default.]

    This reprises .

    n = 250 primes = [] candidates = list(range(2,n)) candidates = [] primes = list(range(2,n)) primes = candidates + [p] while candidates: p = candidates[0] primes.append(p) for nonprime in range(p, n, p): if nonprime in candidates: candidates.remove(nonprime) print(primes)
    Parsons Problem, Mathematical Proof, Numbered Blocks even numbers

    Create a proof of the theorem: If n is an even number, then n\equiv 0\mod 2. [Ed. This version has numbered blocks, online they are on the right end of the block.]

    Suppose n is even.

    Then n is a prime number.

    Then there exists an m so that n = 2m.

    Then there exists an m so that n = 2m + 1.

    Click the heels of your ruby slippers together three times.

    So n = 2m + 0.

    This is a superfluous second paragraph in this block.

    Thus n\equiv 0\mod 2.

    Dorothy will not be much help with this proof.

    Parsons Problem, Programming prime numbers Sieve of Eratosthenes

    The Sieve of Eratosthenes computes prime numbers by starting with a finite list of the integers bigger than 1. The first member of the list is a prime and is saved/recorded. Then all multiples of that prime (which not a prime, excepting the prime itself!) are removed from the list. Now the first number remaining in the list is the next prime number. And the process repeats.

    The code blocks below can be rearranged to form one of the many possible programs to implement this algorithm to compute a list of all the primes less than 250. [Ed. This version has numbered blocks, online they are on the left end of the block.]

    This reprises .

    n = 250 primes = [] candidates = list(range(2,n)) candidates = [] primes = list(range(2,n)) primes = candidates + [p] while candidates: p = candidates[0] primes.append(p) for nonprime in range(p, n, p): if nonprime in candidates: candidates.remove(nonprime) print(primes)
    Horizontal Parsons Exercises Parsons Problem, SQL statement

    Form the SQL statement by rearranging the four blocks.

    SELECT * FROM test
    Parsons Problem, Python import

    Testing syntax highlighting.

    from math import pi
    Parsons Problem, SQL statement, no randomization

    Form the SQL statement by rearranging the four blocks. This version of this problem will always present the blocks in the same fixed order (but incorrect, hopefully!), as prescribed by the author in the source.

    SELECT * FROM test
    Parsons Problem, SQL statement, automatic feedback

    Form the SQL statement by rearranging the four blocks.

    SELECT * FROM test assert 1,1 == world assert 0,1 == hello assert 2,1 == 42
    Parsons Problem, Natural Language

    Form the sentence often used to show font samples. You can reuse blocks as needed.

    quick brown fox jumped over the lazy dog
    Parsons Problem, Natural Language, with Distractors

    Form the sentence often used to show font samples. Again, but now with distractors.

    quick brown fox jumped foo over the lazy bar dog
    Parsons Problem, SQL statement, reusable

    Form the SQL statement by rearranging the four blocks. Same problem as above, but we allow blocks to be reused (even though the solution does not require that).

    SELECT * FROM test
    Parsons Problem with math blocks

    Testing math mode blocks - correct answer is \pi\sum\beta\alpha

    \pi \sum \beta \alpha
    Matching Exercises

    Matching exercises come in two varieties. Their differences are most noticeable in interactive versions.

  • Cardsort

    A cardsort asks users to match items in a 1-1 or many-1 fashion. The interactive version of these involves dragging cards from the left column (the premises) into containers on the right (the responses).

  • Matching

    A matching interactive asks users to form connections between the premises in the left column and the responses on the right. This format supports many-many matches.

  • Cardsort Problem, Dates matching US dates

    Match each event in United States history with the year it happened.

    Review Encyclopedia Brittania, 25 Decade-Defining Events in U.S. Historyurl.

    Monroe Doctrine 1823 Haymarket Riot 1886 Louisiana Purchase 1803 Battle of Gettysburg 1863
    Cardsort Problem, Derivatives matching derivatives

    Match each function with its derivative.

    Did you compute the derivative of each function in the premises (left column)?

    x^3-6x^2+5 3x^2-12x x^{-3} -3x^{-4} (x+1)^2 2x+2
    Cardsort Problem, Linear Algebra matching bases and subspaces

    Match each subspace with a basis for that subspace. (You may assume that each set is really a basis for at least one of the subspaces.)

    Each putative basis is a subset of exactly one of the three subspaces. So for each subspace, two of the three sets can be ruled out by simply testing that the vectors of the basis are members of the subspace, via the membership criteria.

    \left\{\langle x,y,z\rangle\mid - y + z = 0\right\} \left\{\langle -4, 3, 3\rangle, \langle 3, -2, -2 \rangle\right\} \left\{\langle x,y,z\rangle\mid -3x - 5y + z = 0\right\} \left\{\langle -4, 3, 3\rangle, \langle 5, -4, -5 \rangle\right\} \left\{\langle x,y,z\rangle\mid -2x - 5y + 2z = 0\right\} \left\{\langle 3, -2, -2 \rangle, \langle 5, -4, -5 \rangle\right\}

    For openers, a basis for a subspace must be a subset of the subspace.

    Cardsort Problem, Function Types matching function types

    Sort the following functions into their correct categories.

    Review Active Prelude to Calculus url.

    Linear y=5x+3 \pi x - 6y = \sqrt{2} y=\frac{-1}{2}x+e Quadratic y=x^3-x Exponential y=2^x Power y=x^3 y=\sqrt{x}
    Matching Problem, Playing Cards matchingplaying cards

    Associate each playing card with every applicable property.

    This one should not be very hard. And we have a gratuitous image to test the use of HTML in this component.

    Jack of Hearts Ace of Spades Queen of Spades King of Clubs Queen of Diamonds Ace King Queen Jack Heart Diamond Club Spade
    Matching Problem, Popular Music History matching music history

    Drag each performer onto every applicable category.

    Paul McCartney, Ringo Starr, Eric Clapton, Elton John. Jethro Tull is the name of a band, not a performer, and its best-known member would be the flautist Ian Anderson.

    Paul Ringo Eric Elton Jethro Beatle Yardbirds Guitarist Drummer Flautist Harpist Pianist Some "Math": \sin(x^2)
    Cardsort Problem, Basic Arithmetic matching US dates

    This is a simple exercise to test some grading behavior.

    2 + 3 4 + 1 5 12 + 2 14
    Clickable Area Exercises Clickable Areas, <q>Regular</q> Text

    Identify (by clicking, or by circling) all of the nouns in this quotation by Eleanor Roosevelt.

    The future belongs to those who believe in the beauty of their dreams.

    The incorrect words are pronouns.

    Clickable Areas, Code

    Identify (by clicking, or by circling) all of the assignment statements in this Python function.

    def main(): x = 4 for i in range(5): y = i if y > 2: print(y)

    Remember, the operator = is used for assignment.

    Clickable Areas, Text in a Table

    A two-dimensional array was created in Python with the list comprehension: [[0 for x in range(3)] for y in range(2)] Then the values were (mostly) changed from zeros and the final array is shown below.

    Identify (by clicking, or by circling) all of the boolean values in the array.

    42 True 'towel' 'true' 0 False

    This second table has no area, in order to test CSS for tables.

    42 True 'towel' 'true' 0 False

    Python boolean variables begin with capital latters.

    Python boolean variables are True and False. A value in quotation marks is a string, not a boolean.

    Select Exercises

    These select questions specify a list of extant questions, and the reader, or Runestone, selects questions from the list to be graded (in different ways). They are only really functional with a database of students in a course, i.e.when hosted on Runestone.

    Three-way Select Question Grade First Question
    Short Answer Exercises Short Answer

    This sample book is configured to make some simple questions interactive on a capable platform, by adding a response element as a signal.

    Polling

    (2024-04-24) This section is experimental, and may not be fully functional as you view it. No markup in the source document is final and may change at any time.

    We begin with standalone queries, using the query element. Runestone calls these polls. We plan structures/blocks such as poll, survey, and questionnaire, that will be structured collections of query.

    In my town, the stoplights have:

    Solid yellow lights.

    Yellow lights that are solid left-turn arrows.

    Yellow lights that are blinking left-turn arrows.

    Which of the following is the derivative of f(x)=x^4\sin(x)?

    x^5 - \cos(x)

    x^4\cos(x) + 4x^3\sin(x)

    4x^3\cos(x)

    I like computer science better than mathematics. 1 is strongly disagree and 5 is strongly agree.

    How many stuffed animal toys did you own growing up? (Testing an absurdly large scale, especially in print.)

    Which of the following paintings is your favorite?

    The Calydonian Boar Hunt by Peter Paul Rubens

    Lucas Cranach's The fountain of youth (1546)

    William-Adolphe Bouguereau's Temptation (1880)

    DoenetML

    This preliminary DoenetML example is for testing use on a Runestone server, where it will use the SPLICE protocol to report out events. To the reader, it should behave identically when not on a Runestone server.

    <p> Adjust the vectors <m>\vec u</m>, <m>\vec v</m>, and <m>\vec w</m> in the left graph to visualize the areas calculated by <m>\det[\vec u\hspace{0.5em}\vec w]</m>, <m>\det[\vec v\hspace{0.5em}\vec w]</m>, and <m>\det[\vec u+\vec v\hspace{0.5em}\vec w]</m>. </p> <setup><line through="(0,0) $v" name="vLine"/><math simplify name="c">$cv.x/$v.x</math></setup> <sideBySide> <graph xmin="-4" ymin="-4" xmax="16" ymax="16"> <m draggable="false" anchor="(10,14)"> \det[\vec u\hspace{0.5em}\vec w], \det[\vec v\hspace{0.5em}\vec w] </m> <point name="u" styleNumber="3"> (6,2) <label><m>\vec u</m></label> </point> <point name="w" styleNumber="3"> (3,7) <label><m>\vec w</m></label> </point> <point name="uPlusV" styleNumber="4"> (9,5) <label><m>\vec v</m></label> </point> <polygon vertices="(0,0) $u $u+$w $w" filled draggable="false" styleNumber="3"/> <polygon vertices="$u $uPlusV $uPlusV+$w $u+$w" filled draggable="false" styleNumber="4"/> <lineSegment endpoints="(0,0) $uPlusV" styleNumber="6"/> <lineSegment endpoints="$w $uPlusV+$w" styleNumber="6"/> </graph> <graph xmin="-4" ymin="-4" xmax="16" ymax="16"> <m draggable="false" anchor="(12,14)"> \det[\vec u+\vec v\hspace{0.5em}\vec w] </m> <polygon vertices="(0,0) $uPlusV $uPlusV+$w $w" filled draggable="false" styleNumber="2"/> <point draggable="false" styleNumber="3"> $w <label><m>\vec w</m></label> </point> <point draggable="false" styleNumber="4"> $uPlusV <label><m>\vec u+\vec v</m></label> </point> <lineSegment endpoints="(0,0) $u" styleNumber="6"/> <lineSegment endpoints="$u $uPlusV" styleNumber="6"/> <lineSegment endpoints="$w $w+$u" styleNumber="6"/> <lineSegment endpoints="$w+$u $w+$uPlusV" styleNumber="6"/> </graph> </sideBySide>
    Fill-In Exercises (Old Style)

    This section has fill-in-the-blank (FITB) exercises that use an old syntax. They were designed for projects transitioning from Runestone's ReST syntax to . So they are really only here for testing, and not for any sort of documentation. They will not receive support or enhancements. Caveat emptor.

    Fill-In, Integer Answer

    The game of bowling uses pins that you try to knock down. (This answer blank has been set to be very wide.)

    Arranged in a triangle, there are 1+2+3+4 = 10 pins, a so-called triangular number.

    Close! You may have used hexadecimal notation, when you did not really mean to.

    Incorrect.

    Fill-In, String and Number Answers

    Complete the following line of a Python program so that it will declare an integer variable age with an initial value of 5. (These two answer blanks have been set to be very short.)

    age = ;

    A variable of type int is appropriate for whole number ages.

    Remember that Java uses just the first three letters of the word integer to define an integral type.

    An integer variable may be initialized to a value.

    Use 5 as the initial value of the variable.

    Fill-In, Case-Insensitive Answer

    The word is the opposite of yes. (Try a mixture of upper and lower-case letters.)

    The correct answers are no, No, nO, and NO. Incorrect.
    Fill-In, Decimal Answer

    The decimal number is an approximation of \sfrac{1}{3} to within three significant figures. (Wikipedia).

    Any value in the interval 0.333\pm 0.0005 is correct.

    Incorrect. Did you provide three significant figures?

    Fill-In Exercises

    This section has fill-in-the-blank (FITB) exercises using newer syntax, and the subject of active development.

    Fill-In, New Markup Numbers

    I love \pi. What number am I thinking of, accurate to two decimal places?

    The decimal approximation of \pi is 3.1415926535\ldots, but to two decimal places we write 3.14.

    Your answer is within 0.1 of the value I wanted.

    That is a reasonable guess, but no.

    You chose a value between 3 and 4.

    You chose a value that rounds to 3.

    Fill-In, New Markup Strings

    The word I'm thinking about is hinted at by the image.

    What word am I thinking about? (Interactive feedback explores a variety of options: Try what happens if you mix the case, or type in a number, or include more than the word, or try pizzazz.")

    Some of the characters used the wrong case.

    [0-9]+

    You typed a word made out of digits.

    Your answer includes the correct word but has extra text.

    z.+z

    Your answer includes text surrounded by z's.

    Do you really need a hint? Carefully reread the question.

    Fill-In, Javascript test of numbers

    What is an example of a prime number less than 20?

    [2, 3, 5, 7, 11, 13, 17, 19].includes(Number(ans))

    Any number from the list \{2, 3, 5, 7, 11, 13, 17, 19\} is a prime number less than 20.

    = 20) { return "The integer must be less than 20." } for (let i=2; i<=3; i++) { if (val % i == 0) { return `Your answer is composite; for example, it is divisible by ${i}.` } } return false; }()]]>
    Fill-In, Javascript test of strings

    What is an example of a palindrome?

    function(){ const r1 = new RegExp("^\\w+$"); var result=r1.test(ans); if (result) { let revAns = ans.split("").reverse().join(""); result = (ans === revAns); } return result; }()

    Any word that is the same forward and backward is a palindrome.

    \w+\s\w+

    Your response needs to be a single word.

    Fill-In, Simple Randomization with Numbers

    What is the square of x=? x^2=

    v.myNum=RNG.randDiscrete(2, 12, 1); v.mySquare=v.myNum**2;

    You responded with the original number. Now square it.

    Fill-In, Dynamic Math with Simple Numerical Answer

    Solve the equation =0 to get the value of x.

    x =

    We want to isolate the x in the equation =0. Because addition of is the last operation, we apply the inverse by adding to both sides. The new, but equivalent equation is now x = . Dividing both sides of the equation by , we obtain the solution x=.

    -b m*x+b -b/m {{b}}/{{m}} Check for a sign error while isolating x.
    Fill-In, Dynamic Math with Formulas as Answers

    Consider the function f(x)=. Find f'(x) and f''(x).

    f'(x) = and f''(x)=

    The derivative of a constant is zero, so \frac{d}{dx}[]=0. The term x^{} is a power, so the power rule gives us \frac{d}{dx}[x^{}]=x^{}. Putting this together, we find f'(x)=. Applying the power rule a second time, we find f''(x)=.

    n-1 n-2 a*x^n+b

    You confused which derivative is which.

    You confused which derivative is which.

    Fill-In, Dynamic Math with Interdependent Formula Checking

    Consider the function h(x)=. Find two nontrivial functions f(x) and g(x) so that h(x) = f(g(x)).

    f(x) = and g(x)=

    Noticing that the expression appears inside parentheses with a power, it makes sense to think of that as the inner function, defining g(x) = . The outer function describes what happens to that. If we imagined replacing the formula with a box and then call that box our variable x, we find the outer function is given by f(x) = .

    This is not the only non-trivial composition. Can you find others?

    a*x^n+b c*x+d x

    f(x)=x is not allowed for nontrivial compositions.

    You have composed in the wrong order.

    g(x)=x is not allowed for nontrivial compositions.
    Hodgepodge

    This is a test of accessing program resources across pages by relying on what is in the database.

    using namespace std; int main() { int a = 1; int b = 2; cout << "The sum of " << a << " and " << b << " is " << add(a, b) << endl; }]]>
    With Tasks in an Exercises Division

    Structured with task, recycled earlier from earlier, to make sure that the tasks do not get counted as Runestone reading activities (since they are inside an exercise inside of an exercises division.

    True/False vector space

    Every vector space has finite dimension.

    The vector space of all polynomials with finite degree has a basis, B = \{1,x,x^2,x^3,\dots\}, which is infinte.

    P_n, the vector space of polynomials with degree at most n, has dimension n+1 by . [Cross-reference is just a demo, content is not relevant.] What happens if we relax the defintion and remove the parameter n?

    Explain your reasoning in the previous question.

    A sequence of task can have a conclusion, like this one, even if they do not see much use in practice.

    Exercises that are Timed

    This is a section that merely explains and holds an exercises division, which will be at the level of a subsection. There is a time-limit attribute on exercises, set to the value 10, which implies (a) the collection of (two) exercises is a timed exam when hosted on Runestone, and (b) a student will have 10 minutes to complete the collection.

    Showing results, showing feedback, displaying a timer, and allowing pausing are all enabled by default. To disable any of these features, set the corresponding attributes on the exercises division, results, feedback, timer, pause, to the value no. As a test, we have turned off pausing. Don't panic!

    Of course, if you are not viewing this while online and hosted on a Runestone server, then these exercises will not look any different than in other places.

    (Since this is an unstructured division, the number of the exercises is not displayed when born. It does have a number, which is the same as the enclosing section. To wit: versus .)

    If you prefer that a given section has more than one exercises within it (timed or not), realize that you must then structure your section with a ssequence of subsection as peers of the multiple exercises you desire.

    Timed Exercises

    You have 10 minutes to do these exercises when hosted online on a Runestone server.

    True/False vector space

    Every vector space has finite dimension.

    The vector space of all polynomials with finite degree has a basis, B = \{1,x,x^2,x^3,\dots\}, which is infinte.

    P_n, the vector space of polynomials with degree at most n, has dimension n+1 by . [Cross-reference is just a demo, content is not relevant.] What happens if we relax the defintion and remove the parameter n?

    Multiple-Choice, Not Randomized, One Answer stop signs

    What color is a stop sign?

    Green

    Green means go!.

    Red

    Red is universally used for prohibited activities or serious warnings.

    White

    White might be hard to see.

    What did you see last time you went driving?

    Maybe go out for a drive?

    Projects and Friends

    PROJECT-LIKE refers to the elements/blocks project, activity, activity, and exploration. They are very similar to exercise, and here we stress that they can be interactive in all the same ways an exercise can. Key differences are that they are blocks, and so are peers of other blocks like paragraphs and examples, and are children of divisions. By default they have their own numbering scheme, though we expect this to convert to an elective behavior.

    Both exercise and PROJECT-LIKE can be structured with task. It would be natural to have a project with multiple task, each a possibly different interactive problem type. We expect that to be possible soon. For now, exercise and project (and friends) need to be structured with a statement (and their associated signal) in order to be interactive.

    Multiple-Choice, Not Randomized, Multiple Answers stop signs

    Which colors might be found in a rainbow? (Note that the radio buttons now allow multiple buttons to be selected.)

    Red

    Red is a definitely one of the colors.

    Yellow

    Yes, yellow is correct.

    Black

    Remember the acronymROY G BIV. B stands for blue.

    Green

    Yes, green is one of the colors.

    Do you know the acronymROY G BIV for the colors of a rainbow, and their order?

    Now an exercise with three task. Since the middle one is a short-answer question, it will only be interactive on a capable platform.

    True/False and Explain

    Structured with task, we can have an introduction. If you are viewing this exercise in the Runestone assignment builder, you will notice that each of these three task appears as its own problem and therefore each one gets its own copy of this introduction you are reading right now.

    True/False vector space

    Every vector space has finite dimension.

    The vector space of all polynomials with finite degree has a basis, B = \{1,x,x^2,x^3,\dots\}, which is infinte.

    P_n, the vector space of polynomials with degree at most n, has dimension n+1 by . [Cross-reference is just a demo, content is not relevant.] What happens if we relax the defintion and remove the parameter n?

    Explain your reasoning in the previous question.

    Matching Problem, Dates matching US dates

    Match each event in United States history with the year it happened. (We are recycling this to test the static representation of a matching problem authored inside of task.)

    Review Encyclopedia Brittania, 25 Decade-Defining Events in U.S. History url.

    Monroe Doctrine 1823 Haymarket Riot 1886 Louisiana Purchase 1803 Battle of Gettysburg 1863

    A conclusion is possible and will be replicated after each of the three task when they are viewed individually in the Runestone assignment builder.

    Now an exploration nested two-deep with the same two questions, two times each, just for testing purposes.

    Exploring Two-Deep

    This is a top-level introduction.

    First Iterations of Each

    This is an introduction to the first iterations, at the second level.

    Multiple-Choice, Not Randomized, One Answer (First Copy) stop signs

    What color is a stop sign?

    Green

    Green means go!.

    Red

    Red is universally used for prohibited activities or serious warnings.

    White

    White might be hard to see.

    What did you see last time you went driving?

    Maybe go out for a drive?

    Python ActiveCode (First Copy)

    Run the following program and observe the information provided at each step.

    for i in range(10): print(i)

    We're still not really sure.

    We include a conclusion to the first iterations, at the second level (with no conclusion at the top-level).

    Second Iterations of Each

    This is an introduction to the second iterations, at the second level.

    Multiple-Choice, Not Randomized, One Answer (Second Copy) stop signs

    What color is a stop sign?

    We include a spurious Python program element in the statement which should never convert this from a multiple-choice question into a programming exercise (on any host), but should still get syntax highlighting as part of rendering the exercise.

    sum = 0 sum += 6 for i in range(sum): print("Hello, World!")

    Green

    Green means go!.

    Red

    Red is universally used for prohibited activities or serious warnings.

    White

    White might be hard to see.

    What did you see last time you went driving?

    Maybe go out for a drive?

    Python ActiveCode (Second Copy)

    Run the following program and observe the information provided at each step.

    for i in range(10): print(i)

    We're still not really sure.

    We include a conclusion to the first iterations, at the second level (with no conclusion at the top-level).

    This is an exercise which has been structured deeply with task. It is here to allow for testing a tabbed viewer presentation in online outputs.

    A very structured exercise

    This is an over-arching introduction to the whole exercise. We follow with some tasks. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A super-simple task

    This first task is very simple, just a paragraph. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Now three paragraphs. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A title of a task that has a subtask with an <tag>answer</tag> for the Solutions

    This second task is further divided by more tasks. This is its introduction. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A task with a title and an <tag>answer</tag> for the Solutions

    A really simple subtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A short paragraph, before an answer.

    With a proof.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    And a bit more to say.

    A subtask with an answer. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Right! In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Three simple sub-sub-tasks. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    First subsubtask. Short paragraph.

    A second three-deep subsubtask!

    Second subsubtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    Third subsubtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    The conclusion of the structured subtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    A simple task as the last subtask. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This concludes our structured second task. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This third top-level task is intermediate in complexity, you are reading the statement, which is followed by more items. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    One hint. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    First answer. In interdum suscipit ullamcorper.

    Second answer. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    At last, the solution. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This is a conclusion where you could summarize the exercise. In interdum suscipit ullamcorper. Morbi sit amet malesuada augue, id vestibulum magna. Nulla blandit dui metus, malesuada mollis sapien ullamcorper sit amet. Nulla at neque nisi. Integer vel porta felis.

    This is a simple question. Does this look like a short answer question?

    Both questions in this reading-questions division should render in an interactive short answer form on a capable platform.

    Shouldn't be hard!

    And a second reading question, so we can test having more than one. Specifically to be certain each goes into the manifest properly. How about some math now, a^2+b^2=c^2. Is that all right?

    YouTube Video Embedding

    An video can be placed in five different ways:

    1. all by itself, as a peer of p typically, with layout control,
    2. inside a figure, earning a number and caption,
    3. inside a sidebyside, with size and layout configured,
    4. inside a figure inside a sidebyside, with size and layout configured, with a number and caption, and
    5. inside a figure inside a sidebyside inside a figure, with size and layout configured, with a number and caption, but now sub-numbered ((a), (b), (c),).
    Examples of each, and more.

    A YouTube video is embedded much differently when hosted on a Runestone server, so that an API is available to report reader (student) interactions. We are testing here the various possibilities.

    All by itsef, with no layout specified, so showing the default size and placement. Vivamus in congue massa. Morbi condimentum ac magna at accumsan. Vestibulum ac augue eu lorem semper gravida.

    Runestone Assignment Testing

    This is a section that is specifically for testing when exercises are migrated to a Runestone Assignment page.

    This is an exercises division (at the level of a subsection) which is not being numbered. We've hijacked this first exercise to say so, and to precede the exercisegroup following, which is the real test right now. What is 0+0?

    An Exercise Group

    This introduction should appear ahead of each exercise when it shows up in the Runestone Assignment page.

    (0,0) (0,1) (1,0) (1,1) \begin{tikzpicture} \draw[fill=blue!20] (0,0) -| (1,1) -| cycle; \end{tikzpicture} a blue square

    It has a table, and an image too, to check it all comes through.

    What is 1+1?

    Two

    Three

    What is 2+2?

    Two

    Four

    What is 3+3?

    And a final paragraph in the section, and a chance to say there is a trailing exercise outside the exercisegroup.

    A <q>Group Work</q> Worksheet

    This is a worksheet which has a groupwork attribute set to yes, along with a label attribute to assist with the Runestone database. Note, you can also set a groupsize attribute. When hosted on Runestone, the exercises within will be available for a group of students to submit together.

    Multiple-Choice, Group Work stop signs group work

    What color is a stop sign?

    Green

    Green means go!.

    Red

    Red is universally used for prohibited activities or serious warnings.

    White

    White might be hard to see.

    What did you see last time you went driving?

    Maybe go out for a drive?

    Worksheets allow for material interleaved with the exercise throughout.

    Parsons Problem, Group Work even numbers groupwork

    Create a proof of the theorem: If n is an even number, then n\equiv 0\mod 2.

    Suppose n is even.

    Then n is a prime number.

    Then there exists an m so that n = 2m.

    Then there exists an m so that n = 2m + 1.

    Click the heels of your ruby slippers together three times.

    So n = 2m + 0.

    This is a superfluous second paragraph in this block.

    Thus n\equiv 0\mod 2.

    And a little bit of irrelevant multi-line math c^2&a^2+b^2 &x^2+y^2 .

    Dorothy will not be much help with this proof.

    This is an exercises division with no title, set as groupwork, and therefore its default title will automatically indicate it is meant for a group. Otherwise, it is not of any new interest.

    Multiple-Choice, Not Randomized, One Answer stop signs

    What color is a stop sign?

    Green

    Green means go!.

    Red

    Red is universally used for prohibited activities or serious warnings.

    White

    White might be hard to see.

    What did you see last time you went driving?

    Maybe go out for a drive?

    SPLICE Integration

    SPLICE is a project to supply documentation and infrastructure to help with adopting shared standards, protocols, and tools for web-based learning tools. The project has designed a protocol for an embedded iframe to communicate with its host page.

    One aspect is the ability of an iframe to ask for a new size. Below is a test of that capability.

    These are examples that use the SPLICE protocol for communicating with a server, such as Runestone. They are all integrated into this book as an interactive that uses an iframe attribute to embed an iframe from some other server.

    This first sample tests the ability of an iframe to ask for a new size.

    The next uses CodeCheck.

    CodeCheck iframe

    And the remaing four are from the OpenDSA project.

    Stack pop slideshow
    A List Insertion Exercise
    A Binary Search Exercise
    Dijkstra's Algorithm Exercise

    (2025-11-05) The following two exercises are strictly EXPERIMENTAL. Do not incorporate them into your projects as they are likely to change dramatically.

    Finding the average velocity of a moving object from data (dual, Doenet) $b*x^2

    Consider a car whose position s (in feet) at time t (in seconds) is given by the table:

    t (sec) 0 $a 2$a 3$a 4$a 5$a s (feet) $$s(0) $$s($a) $$s(2$a) $$s(3$a) $$s(4$a) $$s(5$a)

    1. What are the units on the average velocity of the car?

      miles per hour feet feet per second seconds
    2. Find the average velocity of the car on the interval 0 \le t \le 3*$a.

    3. ($$s(3*$a)-$$s(0*$a))/(3$a)
    4. Find the average velocity of the car on the interval [$c*$a, ($c+2)*$a].

    5. ($$s(($c+2)*$a)-$$s($c*$a))/(2$a)

    ]]>

    Consider a car whose position s (in feet) at time t (in seconds) is given by the table:

    t (sec) 0 0.3 0.6 0.9 1.2 1.5 s (feet) 0 0.117 0.468 1.053 1.872 2.925

    What are the units on the average velocity of the car?

    Consider possibilities such as feet, seconds, feet per second, or seconds per foot.

    feet per second

    Find the average velocity of the car on the interval 0 \le t \le 0.9.

    Recall that average velocity is change in position divided by change in time.

    The average velocity of the car on the interval 0 \le t \le 0.9 is 1.17 feet per second.

    Find the average velocity of the car on the interval [0.9, 1.5].

    The average velocity of the car on the interval [0.9,1.5] is 3.12 feet per second.

    OpenDSA List Insertion (Dual)

    Work this following problem. Note that this is really just a test to see if additional text (beyond an interactive) will show up.

    An exercise about array-based list insertion goes here.

    This example recreates the Show-Eval visualization from the Runestone Components, using a PreTexT interactive. It also records student activity using SPLICE.

    It demonstrates how the Show-Eval tool can be used to visualize the evaluation of Python expressions step by step.

    This could also be used for doing similar visualization of mathematical expressions. Support for MathJax would take some work, but this example would be a good starting point.

    Show-Eval Visualization
    eggs = ['dogs', 'cats', 'moose']
    Timed Chapter Exam

    This is an exercises division, as a peer of the section in this chapter of a book. It is also setup as a Runestone timed exam. So it is an example of how you might have a per-chapter exam. This contrasts with an earlier timed exam which is constructed as a per-section exam (). The exercises are the same here, but in a different order. As a test, this exam is pauseable and has a 15 minute time limit.

    Multiple-Choice, Not Randomized, One Answer stop signs

    What color is a stop sign?

    Green

    Green means go!.

    Red

    Red is universally used for prohibited activities or serious warnings.

    White

    White might be hard to see.

    What did you see last time you went driving?

    Maybe go out for a drive?

    True/False vector space

    Every vector space has finite dimension.

    The vector space of all polynomials with finite degree has a basis, B = \{1,x,x^2,x^3,\dots\}, which is infinte.

    P_n, the vector space of polynomials with degree at most n, has dimension n+1 by . [Cross-reference is just a demo, content is not relevant.] What happens if we relax the defintion and remove the parameter n?

    ================================================ FILE: examples/sample-book/sage/cyclic-info.xml ================================================ Sage

    Sage support for cyclic groups is a little spotty but we can still make effective use of Sage and perhaps this situation could change soon.

    ================================================ FILE: examples/sample-book/sage/cyclic-sage-exercises.xml ================================================ Sage Exercises

    This group of exercises is about the group of units mod n, U(n), which is sometimes cyclic, sometimes not. There are some commands in Sage that will answer some of these questions very quickly, but instead of using those now, just use the basic techniques described. The idea here is to just work with elements, and lists of elements, to discern the subgroup structure of these groups.

    Execute the statement R = Integers(40) to create the set [0,1,2,...,39] This is a group under addition mod 40, which we will ignore. Instead we are interested in the subset of elements which have an inverse under multiplication mod 40. Determine how big this subgroup is by executing the command R.unit_group_order(), and then obtain a list of these elements with R.list_of_elements_of_multiplicative_group().

    You can create elements of this group by coercing regular integers into U, such as with the statement a = U(7). (Don't confuse this with our mathematical notation U(40).) This will tell Sage that you want to view 7 as an element of U, subject to the corresponding operations. Determine the elements of the cyclic subgroup of U generated by 7 with a list comprehension as follows:

    R = Integers(40) a = R(7) [a^i for i in srange(16)]

    What is the order of 7 in U(40)?

    The group U(49) is cyclic. Using only the Sage commands described previously, use Sage to find a generator for this group. Now using only theorems about the structure of cyclic groups, describe each of the subgroups of U(49) by specifying its order and by giving an explicit generator. Do not repeat any of the subgroups in other words, present each subgroup exactly once. You can use Sage to check your work on the subgroups, but your answer about the subgroups should rely only on theorems and be a nicely written paragraph with a table, etc.

    The group U(35) is not cyclic. Again, using only the Sage commands described previously, use computations to provide irrefutable evidence of this. How many of the 16 different subgroups of U(35) can you list?

    Again, using only the Sage commands described previously, explore the structure of U(n) for various values of n and see if you can formulate an interesting conjecture about some basic property of this group. (Yes, this is a very open-ended question, but this is ultimately the real power of exploring mathematics with Sage.)

    ================================================ FILE: examples/sample-book/sage/groups-info.xml ================================================ Sage

    The first half of this text is about group theory. Sage includes Groups, Algorithms and Programming (GAP), a program designed primarly for just group theory, and in continuous development since 1986. Many of Sage's computations for groups ultimately are performed by GAP.

    ================================================ FILE: examples/sample-book/sage/groups-sage-exercises.xml ================================================ Sage Exercises

    These exercises are about becoming comfortable working with groups in Sage.

    Create the groups CyclicPermutationGroup(8) and DihedralGroup(4) and name these groups C and D, respectively. We will understand these constructions better shortly, but for now just understand that both objects you create are actually groups.

    Check that C and D have the same size by using the .order() method. Determine which group is abelian, and which is not, by using the .is_abelian() method.

    Use the .cayley_table() method to create the Cayley table for each group.

    Write a nicely formatted discussion identifying differences between the two groups that are discernible in properties of their Cayley tables. In other words, what is {\em different} about these two groups that you can see in the Cayley tables? (In the Sage notebook, a Shift-click on a blue bar will bring up a mini-word-processor, and you can use use dollar signs to embed mathematics formatted using syntax.)

    For C locate the one subgroup of order 4. The group D has three subgroups of order 4. Select one of the three subgroups of D that has a different structure than the subgroup you obtained from C.

    The .subgroups() method will give you a list of all of the subgroups to help you get started. A Cayley table will help you tell the difference between the two subgroups. What properties of these tables did you use to determine the difference in the structure of the subgroups?

    The .subgroup(elt_list) method of a group will create the smallest subgroup containing the specified elements of the group, when given the elements as a list elt_list. Use this command to discover the shortest list of elements necessary to recreate the subgroups you found in the previous exercise. The equality comparison, ==, can be used to test if two subgroups are equal.

    ================================================ FILE: examples/sample-book/sage/groups-sage.xml ================================================
    Sage

    Many of the groups discussed in this chapter are available for study in Sage. It is important to understand that sets that form algebraic objects (groups in this chapter) are called parents in Sage, and elements of these objects are called, well, elements. So every element belongs to a parent (in other words, is contained in some set). We can ask about properties of parents (finite? order? abelian?), and we can ask about properties of individual elements (identity? inverse?). In the following we will show you how to create some of these common groups and begin to explore their properties with Sage.

    Integers mod n Z8 = Integers(8) Z8 Ring of integers modulo 8 Z8.list() [0, 1, 2, 3, 4, 5, 6, 7] a = Z8.an_element(); a 0 a.parent() Ring of integers modulo 8

    We would like to work with elements of Z8. If you were to type a 6 into a compute cell right now, what would you mean? The integer 6, the rational number \frac{6}{1}, the real number 6.00000, or the complex number 6.00000+0.00000i? Or perhaps you really do want the integer 6 mod 8? Sage really has no idea what you mean or want. To make this clear, you can coerce 6 into Z8 with the syntax Z8(6). Without this, Sage will treat a input number like 6 as an integer, the simplest possible interpretation in some sense. Study the following carefully, where we first work with normal integers and then with integers mod 8.

    a = 6 a 6 a.parent() Integer Ring b = 7 c = a + b; c 13 d = Z8(6) d 6 d.parent() Ring of integers modulo 8 e = Z8(7) f = d+e; f 5 g = Z8(85); g 5 f == g True

    Z8 is a bit unusual as a first example, since it has two operations defined, both addition and multiplication, with addition forming a group, and multiplication not forming a group. Still, we can work with the additive portion, here forming the Cayley table for the addition.

    Z8.addition_table(names='elements') + 0 1 2 3 4 5 6 7 +---------------- 0| 0 1 2 3 4 5 6 7 1| 1 2 3 4 5 6 7 0 2| 2 3 4 5 6 7 0 1 3| 3 4 5 6 7 0 1 2 4| 4 5 6 7 0 1 2 3 5| 5 6 7 0 1 2 3 4 6| 6 7 0 1 2 3 4 5 7| 7 0 1 2 3 4 5 6

    When n is a prime number, the multipicative structure (excluding zero), will also form a group.

    The integers mod n are very important, so Sage implements both addition and multiplication together. Groups of symmetries are a better example of how Sage implements groups, since there is just one operation present.

    Groups of symmetries

    The symmetries of some geometric shapes are already defined in Sage, albeit with different names. They are implemented as permutation groups which we will begin to study carefully in Chapter5.

    Sage uses integers to label vertices, starting the count at 1, instead of letters. Elements by default are printed using cycle notation which we will see described carefully in Chapter5. Here is an example, with both the mathematics and Sage. For the Sage part, we create the group of symmetries and then create the symmetry \rho_2 with coercion, followed by outputting the element in cycle notation. Then we create just the bottom row of the notation we are using for permutations. \rho_2= \begin{pmatrix}\end{pmatrix} = \begin{pmatrix}\end{pmatrix}

    triangle = SymmetricGroup(3) rho2 = triangle([3,1,2]) rho2 (1,3,2) [rho2(x) for x in triangle.domain()] [3, 1, 2]

    The final list comprehension deserves comment. The .domain() method gives a lait of the symbols used for the permutation group triangle and then rho2 is employed with syntax like it is a function (it is a function) to create the images that would occupy the bottom row.

    With a double list comprehension we can list all six elements of the group in the bottom row format. A good exercise would be to pair up each element with its name as given in .

    [[a(x) for x in triangle.domain()] for a in triangle] [[1, 2, 3], [2, 1, 3], [2, 3, 1], [3, 1, 2], [1, 3, 2], [3, 2, 1]]

    Different books, different authors, different software all have different ideas about the order in which to write multiplication of functions. This textbook builds on the idea of composition of functions, so that fg is the composition (fg)(x)=f(g(x)) and it is natural to apply g first. Sage takes the opposite view and since we write fg, Sage will understand that we want to do f first. Neither approach is wrong, and neither is necessarily superior, they are just different and there are good arguments for either one. When you consult other books that work with permutation groups, you want to first determine which approach it takes.

    The translation here between the text and Sage will be worthwhile practice. Here we will reprise the discussion at the end of , but reverse the order on each product to compute Sage-style and exactly mirror what the text does.

    mu1 = triangle([1,3,2]) mu2 = triangle([3,2,1]) mu3 = triangle([2,1,3]) rho1 = triangle([2,3,1]) product = rho1*mu1 product == mu2 True [product(x) for x in triangle.domain()] [3, 2, 1] rho1*mu1 == mu1*rho1 False mu1*rho1 == mu3 True

    Now that we understand that Sage does multiplication in reverse, we can compute the Cayley table for this group. Default behavior is to just name elements of a group as letters, a, b, c, \dots{} in the same order that the .list() command would produce the elements of the group. But you can also print the elements in the table as themselves (that uses cycle notation here), or you can give the elements names. We will use u as shorthand for \mu and r as shorthand for \rho.

    triangle.cayley_table() * a b c d e f +------------ a| a b c d e f b| b a f e d c c| c e d a f b d| d f a c b e e| e c b f a d f| f d e b c a triangle.cayley_table(names='elements') * () (1,2) (1,2,3) (1,3,2) (2,3) (1,3) +------------------------------------------------ ()| () (1,2) (1,2,3) (1,3,2) (2,3) (1,3) (1,2)| (1,2) () (1,3) (2,3) (1,3,2) (1,2,3) (1,2,3)| (1,2,3) (2,3) (1,3,2) () (1,3) (1,2) (1,3,2)| (1,3,2) (1,3) () (1,2,3) (1,2) (2,3) (2,3)| (2,3) (1,2,3) (1,2) (1,3) () (1,3,2) (1,3)| (1,3) (1,3,2) (2,3) (1,2) (1,2,3) () triangle.cayley_table(names=['id','u1','u3','r1','r2','u2']) * id u1 u3 r1 r2 u2 +------------------ id| id u1 u3 r1 r2 u2 u1| u1 id u2 r2 r1 u3 u3| u3 r2 r1 id u2 u1 r1| r1 u2 id u3 u1 r2 r2| r2 u3 u1 u2 id r1 u2| u2 r1 r2 u1 u3 id

    You should verify that the table above is correct, just like Table 3.2 is correct. Remember that the convention is to multiply a row label times a column label, in that order. However, to do a check across the two tables, you will need to recall the difference in ordering between your textbook and Sage.

    Quaternions

    Sage implements the quaternions, but the elements are not matrices, but rather are permutations. Despite appearances the structure is identical. It should not matter which version you have in mind (matrices or permutations) if you build the Cayley table and use the default behavior of using letters to name the elements. As permutations, or as letters, can you identify -1, I, J and K?

    Q = QuaternionGroup() [[a(x) for x in Q.domain()] for a in Q] [[1, 2, 3, 4, 5, 6, 7, 8], [2, 3, 4, 1, 6, 7, 8, 5], [5, 8, 7, 6, 3, 2, 1, 4], [3, 4, 1, 2, 7, 8, 5, 6], [6, 5, 8, 7, 4, 3, 2, 1], [8, 7, 6, 5, 2, 1, 4, 3], [4, 1, 2, 3, 8, 5, 6, 7], [7, 6, 5, 8, 1, 4, 3, 2]] Q.cayley_table() * a b c d e f g h +---------------- a| a b c d e f g h b| b d f g c h a e c| c e d h g b f a d| d g h a f e b c e| e h b f d a c g f| f c g e a d h b g| g a e b h c d f h| h f a c b g e d

    It should be fairly obvious that a is the identity element of the group (1), either from its behavior in the table, or from its bottom row representation in the list above. And if you prefer, you can ask Sage.

    id = Q.identity() [id(x) for x in Q.domain()] [1, 2, 3, 4, 5, 6, 7, 8]

    Now -1 should have the property that -1\cdot -1= 1. We see that the identity element a is on the diagonal of the Cayley table only when we compute c*c. We can verify this easily, borrowing the third bottom row element from the list above. With this information, once we locate I, we can easily compute -I, and so on.

    minus_one = Q([3, 4, 1, 2, 7, 8, 5, 6]) minus_one*minus_one == Q.identity() True

    See if you can pair up the letters with all eight elements of the quaternions. Be a bit careful with your names, the symbol I is used by Sage for the imaginary number i (which we will use below), but Sage will silently let you redefine it to be anything you like. Same goes for lower-case i. So call your elements of the quaternions something like QI, QJ, QK to avoid confusion.

    As we begin to work with groups it is instructive to work with the actual elements. But many properties of groups are totally independent of the order we use for multiplication, or the names or representations we use for the elements. Here are facts about the quaternions we can compute without any knowledge of just how the elements are written or multiplied.

    Q.is_finite() True Q.order() 8 Q.is_abelian() False
    Subgroups

    The best techniques for creating subgroups will come in future chapters, but we can create some groups that are naturally subgroups of other groups.

    Elements of the quaternions were represented by certain permutations of the integers 1 through 8. We can also build the group of all permutations of these eight integers. It gets pretty big, so do not list it unless you want a lot of output! (I dare you.)

    [5, 2, 6, 4, 1, 8, 3, 7]

    As a demonstration of reusing chunks of Sage code, we duplicate the previous example. But in each case the code lives in an external file, just once. So if you wanted to use setup code in more than one division, you could put it in a file and incorporate it similarly. Here we do not test the second instance, and so do not include expected output either. Typically, you would do this copy somewhere further away. Note that need to supply a path for the file that is relative to the location of teh source file containing the pretext element, since the repeated material is source XML.

    S8.order() 40320

    The quaternions, Q, is a subgroup of the full group of all permutations, the symmetric group S_8 or S8, and Sage regards this as a property of Q.

    Q.is_subgroup(S8) True

    In Sage the complex numbers are known by the name CC. We can create a list of the elements in the subgroup described in . Then we can verify that this set is a subgroup by examining the Cayley table, using multiplication as the operation.

    H = [CC(1), CC(-1), CC(I), CC(-I)] CC.multiplication_table(elements=H, names=['1', '-1', 'i', '-i']) * 1 -1 i -i +------------ 1| 1 -1 i -i -1| -1 1 -i i i| i -i -1 1 -i| -i i 1 -1
    ================================================ FILE: examples/sample-book/sage/integers-info.xml ================================================ Sage

    Sage's original purpose was to support research in number theory, so it is perfect for the types of computations with the integers that we have in this chapter.

    ================================================ FILE: examples/sample-book/sage/integers-sage-exercises.xml ================================================ Sage Exercises

    These exercises are about investigating basic properties of the integers, something we will frequently do when investigating groups. Use the editing capabilities of a Sage worksheet to annotate and explain your work.

    Use the next_prime() command to construct two different 8-digit prime numbers and save them in variables named a and b.

    Use the .is_prime() method to verify that your primes a and b are really prime.

    Verify that 1 is the greatest common divisor of your two primes from the previous exercises.

    Find two integers that make a linear combination of your two primes equal to 1. Include a verification of your result.

    Determine a factorization into powers of primes for c=4\,598\,037\,234.

    Write a compute cell that defines the same value of c again, and then defines a candidate divisor of c named d. The third line of the cell should return True if and only if d is a divisor of c. Illustrate the use of your cell by testing your code with d=7 and in a new copy of the cell, testing your code with d=11.

    ================================================ FILE: examples/sample-book/sage/integers-sage.xml ================================================
    Sage

    Many properties of the algebraic objects we will study can be determined from properties of associated integers. And Sage has many powerful functions for analyzing integers.

    Division Algorithm

    The code a % b will return the remainder upon division of a by b. In other words, the result is the unique integer r such that (1) 0\leq r\lt b, and (2) a=bq+r for some integer q (the quotient), as guaranteed by the Division Algorithm (). Then (a-r)/b will equal q. For example,

    r = 14 % 3 r 2 q = (14 - r)/3 q 4

    It is also possible to get both the quotient and remainder at the same time with the .quo_rem() method (quotient and remainder).

    a = 14 b = 3 a.quo_rem(b) (4, 2)

    A remainder of zero indicates divisibility. So (a % b) == 0 will return True if b divides a, and will otherwise return False.

    (20 % 5) == 0 True (17 % 4) == 0 False

    The .divides() method is another option.

    c = 5 c.divides(20) True d = 4 d.divides(17) False
    Greatest Common Divisor

    The greatest common divisor of a and b is obtained with the command gcd(a, b), where in our first uses, a and b are integers. Later, a and b can be other objects with a notion of divisibility and greatness, such as polynomials. For example,

    gcd(2776, 2452) 4

    We can use the gcd command to determine if a pair of integers are relatively prime.

    a = 31049 b = 2105 gcd(a, b) == 1 True a = 3563 b = 2947 gcd(a, b) == 1 False

    The command xgcd(a,b) (eXtended GCD) returns a triple where the first element is the greatest common divisor of a and b (as with the gcd(a,b) command above), but the next two elements are values of r and s such that ra+sb=\gcd(a,b).

    xgcd(633,331) (1, -137, 262)

    Portions of the triple can be extracted using [ ] (indexing) to access the entries of the triple, starting with the first as number 0. For example, the following should always return the result True, even if you change the values of a and b. Try changing the values of a and b below, to see that the result is always True.

    a = 633 b = 331 extended = xgcd(a, b) g = extended[0] r = extended[1] s = extended[2] g == r*a + s*b True

    Studying this block of code will go a long way towards helping you get the most out of Sage's output. Note that = is how a value is assigned to a variable, while as in the last line, == is how we compare two items for equality.

    Primes and Factoring

    The method .is_prime() will determine if an integer is prime or not.

    a = 117371 a.is_prime() True b = 14547073 b.is_prime() False b == 1597 * 9109 True

    The command random_prime(a, proof=True) will generate a random prime number between 2 and a. Experiment by executing the following two compute cells several times. (Replacing proof=True by proof=False will speed up the search, but there will be a very, very, very small probability the result will not be prime.)

    a = random_prime(10^21, proof=True) a 424729101793542195193 a.is_prime() True

    The command prime_range(a, b) returns an ordered list of all the primes from a to b-1, inclusive. For example,

    prime_range(500, 550) [503, 509, 521, 523, 541, 547]

    The commands next_prime(a) and previous_prime(a) are other ways to get a single prime number of a desired size. Give them a try below if you have an empty compute cell there (as you will if you are reading in the Sage Notebook, or are reading the online version). (The hash symbol, #, is used to indicate a comment line, which will not be evaluated by Sage. So erase this line, or start on the one below it.)

    In addition to checking if integers are prime or not, or generating prime numbers, Sage can also decompose any integer into its prime factors, as described by the Fundamental Theorem of Arithmetic ().

    a = 2600 a.factor() 2^3 * 5^2 * 13

    So 2600 = 2^3\times 5^2\times 13 and this is the unique way to write 2600 as a product of prime numbers (other than rearranging the order of the primes themselves in the product).

    While Sage will print a factorization nicely, it is carried internally as a list of pairs of integers, with each pair being a base (a prime number) and an exponent (a positive integer). Study the following carefully, as it is another good exercise in working with Sage output in the form of lists.

    a = 2600 factored = a.factor() first_term = factored[0] first_term (2, 3) second_term = factored[1] second_term (5, 2) third_term = factored[2] third_term (13, 1) first_prime = first_term[0] first_prime 2 first_exponent = first_term[1] first_exponent 3

    The next compute cell reveals the internal version of the factorization by asking for the actual list. And we show how you could determine exactly how many terms the factorization has by using the length command, len().

    list(factored) [(2, 3), (5, 2), (13, 1)] len(factored) 3

    Can you extract the next two primes, and their exponents, from a?

    ================================================ FILE: examples/sample-book/sage/sets-info.xml ================================================ Sage

    Sage is free, open source, mathematical software, which has very impressive capabilities for the study of abstract algebra. See the for more information about obtaining Sage and the supplementary material in the electronic versions of this text that describe how to use Sage in the study of abstract algebra. In this non-electronic version, we will have a brief explanation of Sage's relevant capabilities at the end of each chapter in a Remark. Much like this one.

    ================================================ FILE: examples/sample-book/sage/sets-sage-exercises.xml ================================================ Sage Exercises

    This exercise is just about making sure you know how to use Sage. Login to a Sage Notebook server and create a new worksheet. Do some non-trivial computation, maybe a pretty plot or some gruesome numerical computation to an insane precision. Create an interesting list and experiment with it some. Maybe include some nicely formatted text or using the included mini-word-processor of the Sage Notebook (hover until a blue bar appears between cells and then shift-click).

    Use whatever mechanism your instructor has in place for submitting your work. Or save your worksheet and then trade worksheets via email (or another electronic method) with a classmate.

    ================================================ FILE: examples/sample-book/sage/sets-sage.xml ================================================
    Sage

    Sage is a powerful system for studying and exploring many different areas of mathematics. In this textbook, you will study a variety of algebraic structures, such as groups, rings and fields. Sage does an excellent job of implementing many features of these objects as we will see in the chapters ahead. But here and now, in this initial chapter, we will concentrate on a few general ways of getting the most out of working with Sage.

    You may use Sage several different ways. It may be used as a command-line program when installed on your own computer. Or it might be a web application such as the SageMathCloud. Our writing will assume that you are reading this as a worksheet within the Sage Notebook (a web browser interface), or this is a section of the entire book presented as web pages, and you are employing the Sage Cell Server via those pages. After the first few chapters the explanations should work equally well for whatever vehicle you use to execute Sage commands.

    Executing Sage Commands

    Most of your interaction will be by typing commands into a compute cell. If you are reading this in the Sage Notebook or as a webpage version of the book, then you will see a compute cell just below this paragraph. Click once inside the compute cell and if you are in the Sage Notebook, you will get a more distinctive border around it, a blinking cursor inside, plus a cute little evaluate link below.

    At the cursor, type 2+2 and then click on the evaluate link. Did a 4 appear below the cell? If so, you have successfully sent a command off for Sage to evaluate and you have received back the (correct) answer.

    Here is another compute cell. Try evaluating the command factorial(300) here.

    Hmmmmm. That is quite a big integer! If you see slashes at the end of each line, this means the result is continued onto the next line, since there are 615 total digits in the result.

    To make new compute cells in the Sage Notebook (only), hover your mouse just above another compute cell, or just below some output from a compute cell. When you see a skinny blue bar across the width of your worksheet, click and you will open up a new compute cell, ready for input. Note that your worksheet will remember any calculations you make, in the order you make them, no matter where you put the cells, so it is best to stay organized and add new cells at the bottom.

    Try placing your cursor just below the monstrous value of 300! that you have. Click on the blue bar and try another factorial computation in the new compute cell.

    Each compute cell will show output due to only the very last command in the cell. Try to predict the following output before evaluating the cell.

    a = 10 b = 6 b = b - 10 a = a + 20 a 30

    The following compute cell will not print anything since the one command does not create output. But it will have an effect, as you can see when you execute the subsequent cell. Notice how this uses the value of b from above. Execute this compute cell once. Exactly once. Even if it appears to do nothing. If you execute the cell twice, your credit card may be charged twice.

    b = b + 50

    Now execute this cell, which will produce some output.

    b + 20 66

    So b came into existence as 6. We subtracted 10 immediately afterward. Then a subsequent cell added 50. This assumes you executed this cell exactly once! In the last cell we create b+20 (but do not save it) and it is this value (66) that is output, while b is still 46.

    You can combine several commands on one line with a semi-colon. This is a great way to get multiple outputs from a compute cell. The syntax for building a matrix should be somewhat obvious when you see the output, but if not, it is not particularly important to understand now.

    A = matrix([[3, 1], [5,2]]); A [3 1] [5 2] print A; print ; A.inverse() [ 2 -1] [-5 3]]]>
    Immediate Help

    Some commands in Sage are functions, an example is factorial() above. Other commands are methods of an object and are like characteristics of objects, an example is .inverse() as a method of a matrix. Once you know how to create an object (such as a matrix), then it is easy to see all the available methods. Write the name of the object, place a period (dot) and hit the TAB key. If you have A defined from above, then the compute cell below is ready to go, click into it and then hit TAB (not evaluate!). You should get a long list of possible methods.

    A.

    To get some help on how to use a method with an object, write its name after a dot (with no parentheses) and then use a question-mark and hit TAB. (Hit the escape key ESC to remove the list, or click on the text for a method.)

    A.inverse?

    With one more question-mark and a TAB you can see the actual computer instructions that were programmed into Sage to make the method work, once you scoll down past the documentation delimited by the triple quotes ("""):

    A.inverse??

    It is worthwhile to see what Sage does when there is an error. You will probably see a lot of these at first, and initially they will be a bit intimidating. But with time, you will learn how to use them effectively and you will also become more proficient with Sage and see them less often. Execute the compute cell below, it asks for the inverse of a matrix that has no inverse. Then reread the commentary.

    B = matrix([[2, 20], [5, 50]]) B.inverse() Traceback (most recent call last): ... ZeroDivisionError: Matrix is singular

    Click just to the left of the error message to expand it fully (another click hides it totally, and a third click brings back the abbreviated form). Read the bottom of an error message first, it is your best explanation. Here a ZeroDivisionError is not 100% accurate, but is close. The matrix is not invertible, not dissimilar to how we cannot divide scalars by zero. The remainder of the message begins at the top showing were the error first happened in your code and then the various places where intermediate functions were called, until the actual piece of Sage where the problem occurred. Sometimes this information will give you some clues, sometimes it is totally undecipherable. So do not let it scare you if it seems mysterious, but do remember to always read the last line first, then go back and read the first few lines for something that looks like your code.

    Annotating Your Work

    It is easy to comment on your work when you use the Sage Notebook. (The following only applies if you are reading this within a Sage Notebook. If you are not, then perhaps you can go open up a worksheet in the Sage Notebook and experiment there.) You can open up a small word-processor by hovering your mouse until you get a skinny blue bar again, but now when you click, also hold the SHIFT key at the same time. Experiment with fonts, colors, bullet lists, etc and then click the Save changes button to exit. Double-click on your text if you need to go back and edit it later.

    Open the word-processor again to create a new bit of text (maybe next to the empty compute cell just below). Type all of the following exactly:

    Pythagorean Theorem: $c^2=a^2+b^2$

    and save your changes. The symbols between the dollar signs are written according to the mathematical typesetting language known as cruise the internet to learn more about this very popular tool. (Well, it is extremely popular among mathematicians and physical scientists.)

    Lists

    Much of our interaction with sets will be through Sage lists. These are not really sets they allow duplicates, and order matters. But they are so close to sets, and so easy and powerful to use that we will use them regularly. We will use a fun made-up list for practice, the quote marks mean the items are just text, with no special mathematical meaning. Execute these compute cells as we work through them.

    zoo = ['snake', 'parrot', 'elephant', 'baboon', 'beetle'] zoo ['snake', 'parrot', 'elephant', 'baboon', 'beetle']

    So the square brackets define the boundaries of our list, commas separate items, and we can give the list a name. To work with just one element of the list, we use the name and a pair of brackets with an index. Notice that lists have indices that begin counting at zero. This will seem odd at first and will seem very natural later.

    zoo[2] 'elephant'

    We can add a new creature to the zoo, it is joined up at the far right end.

    zoo.append('ostrich'); zoo ['snake', 'parrot', 'elephant', 'baboon', 'beetle', 'ostrich']

    We can remove a creature.

    zoo.remove('parrot') zoo ['snake', 'elephant', 'baboon', 'beetle', 'ostrich']

    We can extract a sublist. Here we start with element 1 (the elephant) and go all the way up to, but not including, element 3 (the beetle). Again a bit odd, but it will feel natural later. For now, notice that we are extracting two elements of the lists, exactly 3-1=2 elements.

    mammals = zoo[1:3] mammals ['elephant', 'baboon']

    Often we will want to see if two lists are equal. To do that we will need to sort a list first. A function creates a new, sorted list, leaving the original alone. So we need to save the new one with a new name.

    newzoo = sorted(zoo) newzoo ['baboon', 'beetle', 'elephant', 'ostrich', 'snake'] zoo.sort() zoo ['baboon', 'beetle', 'elephant', 'ostrich', 'snake']

    Notice that if you run this last compute cell your zoo has changed and some commands above will not necessarily execute the same way. If you want to experiment, go all the way back to the first creation of the zoo and start executing cells again from there with a fresh zoo.

    A construction called a list comprehension is especially powerful, especially since it almost exactly mirrors notation we use to describe sets. Suppose we want to form the plural of the names of the creatures in our zoo. We build a new list, based on all of the elements of our old list.

    plurality_zoo = [animal+'s' for animal in zoo] plurality_zoo ['baboons', 'beetles', 'elephants', 'ostrichs', 'snakes']

    Almost like it says: we add an s to each animal name, for each animal in the zoo, and place them in a new list. Perfect. (Except for getting the plural of ostrich wrong.)

    Lists of Integers

    One final type of list, with numbers this time. The srange() function will create lists of integers. (The s in the name stands for Sage and so will produce integers that Sage understands best. Many early difficulties with Sage and group theory can be alleviated by using only this command to create lists of integers.) In its simplest form an invocation like srange(12) will create a list of 12 integers, starting at zero and working up to, but not including, 12. Does this sound familiar?

    dozen = srange(12); dozen [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

    Here are two other forms, that you should be able to understand by studying the examples.

    teens = srange(13, 20); teens [13, 14, 15, 16, 17, 18, 19] decades = srange(1900, 2000, 10); decades [1900, 1910, 1920, 1930, 1940, 1950, 1960, 1970, 1980, 1990]
    Saving and Sharing Your Work

    There is a Save button in the upper-right corner of the Sage Notebook. This will save a current copy of your worksheet that you can retrieve your work from within your notebook again later, though you have to re-execute all the cells when you re-open the worksheet.

    There is also a File drop-down list, on the left, just above your very top compute cell (not be confused with your browser's File menu item!). You will see a choice here labeled Save worksheet to a file... When you do this, you are creating a copy of your worksheet in the sws format (short for Sage WorkSheet). You can email this file, or post it on a website, for other Sage users and they can use the Upload link on the homepage of their notebook to incorporate a copy of your worksheet into their notebook.

    There are other ways to share worksheets that you can experiment with, but this gives you one way to share any worksheet with anybody almost anywhere.

    We have covered a lot here in this section, so come back later to pick up tidbits you might have missed. There are also many more features in the Sage Notebook that we have not covered.

    ================================================ FILE: examples/sample-book/sample-book-parts.xml ================================================ <pretext/> Sample Book Abstract Algebra (SAMPLE ONLY) Basics Algebra (and Runestone) ================================================ FILE: examples/sample-book/sample-book-solutions-manual.xml ================================================ Abstract Algebra Solutions Manual (PRETEXT SAMPLE ONLY) Thomas W. Judson Department of Mathematics and Statistics Stephen F. Austin State University judsontw@sfasu.edu Sage Exercises for Abstract Algebra Robert A. Beezer Department of Mathematics and Computer Science University of Puget Sound beezer@pugetsound.edu Annual Edition 2015 abstract.pugetsound.edu
    http://abstract.pugetsound.edu
    19972015 Thomas W. Judson, Robert A. Beezer GFDL License Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the appendix entitled GNU Free Documentation License. All trademarks are the registered marks of their respective owners.
    Preface to the Solutions Manual

    This contains the publicly available hints and answers for the sample book. Statements of the exercises are not reproduced.

    See the text itself for much more information about the book.

    Back Matter Notation

    The following table defines the notation used in this book. Included here in the solutions manual, the page references are missing.

    This solutions manual was authored in .

    ================================================ FILE: examples/sample-book/sample-book-solutions-manual.xsl ================================================ left=1.25in,right=1.25in,top=0.75in,bottom=0.75in,headsep=0.25in ================================================ FILE: examples/sample-book/sample-book.xml ================================================ <pretext/> Sample Book Abstract Algebra (SAMPLE ONLY) ================================================ FILE: examples/sample-book/sets.xml ================================================ Preliminaries

    A certain amount of mathematical maturity is necessary to find and study applications of abstract algebra. A basic knowledge of set theory, mathematical induction, equivalence relations, and matrices is a must. Even more important is the ability to read and understand mathematical proofs. In this chapter we will outline the background needed for a course in abstract algebra.

    It helps when testing to know when this sample document was generated: , .

    A Short Note on Proofs

    Abstract mathematics is different from other sciences. In laboratory sciences such as chemistry and physics, scientists perform experiments to discover new principles and verify theories. Although mathematics is often motivated by physical experimentation or by computer simulations, it is made rigorous through the use of logical arguments. In studying abstract mathematics, we take what is called an axiomatic approach; that is, we take a collection of objects \mathcal S and assume some rules about their structure. These rules are called axioms. Using the axioms for \mathcal S, we wish to derive other information about \mathcal S by using logical arguments. We require that our axioms be consistent; that is, they should not contradict one another. We also demand that there not be too many axioms. If a system of axioms is too restrictive, there will be few examples of the mathematical structure.

    A statement in logic or mathematics is an assertion that is either true or false. Consider the following examples:

    • 3 + 56 - 13 + 8/2 .

    • All cats are black.

    • 2 + 3 = 5.

    • 2x = 6 exactly when x = 4.

    • If ax^2 + bx + c = 0 and a \neq 0, then x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}.

    • x^3 - 4x^2 + 5 x - 6.

    All but the first and last examples are statements, and must be either true or false.

    A mathematical proof is nothing more than a convincing argument about the accuracy of a statement. Such an argument should contain enough detail to convince the audience; for instance, we can see that the statement 2x = 6 exactly when x = 4 is false by evaluating 2 \cdot 4 and noting that 6 \neq 8, an argument that would satisfy anyone. Of course, audiences may vary widely: proofs can be addressed to another student, to a professor, or to the reader of a text. If more detail than needed is presented in the proof, then the explanation will be either long-winded or poorly written. If too much detail is omitted, then the proof may not be convincing. Again it is important to keep the audience in mind. High school students require much more detail than do graduate students. A good rule of thumb for an argument in an introductory abstract algebra course is that it should be written to convince one's peers, whether those peers be other students or other readers of the text.

    Let us examine different types of statements. A statement could be as simple as 10/5 = 2; however, mathematicians are usually interested in more complex statements such as If p, then q, where p and q are both statements. If certain statements are known or assumed to be true, we wish to know what we can say about other statements. Here p is called the hypothesis and q is known as the conclusion. Consider the following statement: If ax^2 + bx + c = 0 and a \neq 0, then x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}. The hypothesis is ax^2 + bx + c = 0 and a \neq 0; the conclusion is x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}. Notice that the statement says nothing about whether or not the hypothesis is true. However, if this entire statement is true and we can show that ax^2 + bx + c = 0 with a \neq 0 is true, then the conclusion must be true. A proof of this statement might simply be a series of equations: ax^2 + bx + c & = 0 x^2 + \frac{b}{a}x & = - \frac{c}{a} x^2 + \frac{b}{a}x + \left( \frac{b}{2a} \right)^2 & = \left( \frac{b}{2a} \right)^2 - \frac{c}{a} \left(x + \frac{b}{2a} \right)^2 & = \frac{b^2 - 4ac}{4a^2} x + \frac{b}{2a} & = \frac{ \pm \sqrt{ b^2 -4ac}}{2a} x & = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} .

    If we can prove a statement true, then that statement is called a proposition. A proposition of major importance is called a theorem. Sometimes instead of proving a theorem or proposition all at once, we break the proof down into modules; that is, we prove several supporting propositions, which are called lemmas, and use the results of these propositions to prove the main result. If we can prove a proposition or a theorem, we will often, with very little effort, be able to derive other related propositions called corollaries.

    Some Cautions and Suggestions

    There are several different strategies for proving propositions. In addition to using different methods of proof, students often make some common mistakes when they are first learning how to prove theorems. To aid students who are studying abstract mathematics for the first time, we list here some of the difficulties that they may encounter and some of the strategies of proof available to them. It is a good idea to keep referring back to this list as a reminder. (Other techniques of proof will become apparent throughout this chapter and the remainder of the text.)

    • A theorem cannot be proved by example; however, the standard way to show that a statement is not a theorem is to provide a counterexample.

    • Quantifiers are important. Words and phrases such as only, for all, for every, and for some possess different meanings.

    • Never assume any hypothesis that is not explicitly stated in the theorem. You cannot take things for granted.

    • Suppose you wish to show that an object exists and is unique. First show that there actually is such an object. To show that it is unique, assume that there are two such objects, say r and s, and then show that r = s.

    • Sometimes it is easier to prove the contrapositive of a statement. Proving the statement If p, then q is exactly the same as proving the statement If not q, then not p.

    • Although it is usually better to find a direct proof of a theorem, this task can sometimes be difficult. It may be easier to assume that the theorem that you are trying to prove is false, and to hope that in the course of your argument you are forced to make some statement that cannot possibly be true.

    Remember that one of the main objectives of higher mathematics is proving theorems. Theorems are tools that make new and productive applications of mathematics possible. We use examples to give insight into existing theorems and to foster intuitions as to what new theorems might be true. Applications, examples, and proofs are tightly interconnectedmuch more so than they may seem at first appearance.

    Sets and Equivalence Relations Set Theory

    A set is a well-defined collection of objects; that is, it is defined in such a manner that we can determine for any given object x whether or not x belongs to the set. The objects that belong to a set are called its elements or members. We will denote sets by capital letters, such as A or X; if a is an element of the set A, we write a \in A. a \in Aa is in the set A

    A set is usually specified either by listing all of its elements inside a pair of braces or by stating the property that determines whether or not an object x belongs to the set. We might write X = \{ x_1, x_2, \ldots, x_n \} for a set containing elements x_1, x_2, \ldots, x_n or X = \{ x :x \text{ satisfies }{\mathcal P}\} if each x in X satisfies a certain property {\mathcal P}. For example, if E is the set of even positive integers, we can describe E by writing either E = \{2, 4, 6, \ldots \} \quad \text{or} \quad E = \{ x : x \text{ is an even integer and } x \gt 0 \}. We write 2 \in E when we want to say that 2 is in the set E, and -3 \notin E to say that -3 is not in the set E.

    Some of the more important sets that we will consider are the following: {\mathbb N} &= \{n: n \text{ is a natural number}\} = \{1, 2, 3, \ldots \} {\mathbb Z} &= \{n : n \text{ is an integer} \} = \{\ldots, -1, 0, 1, 2, \ldots \} {\mathbb Q} &= \{r : r \text{ is a rational number}\} = \{p/q : p, q \in {\mathbb Z} \text{ where } q \neq 0\} {\mathbb R} &= \{ x : x \text{ is a real number} \} {\mathbb C} &= \{z : z \text{ is a complex number}\} . {\mathbb N} the natural numbers {\mathbb Z} the integers {\mathbb Q} the rational numbers {\mathbb R} the real numbers {\mathbb C} the complex numbers

    We can find various relations between sets as well as perform operations on sets. A set A is a subset of B, written A \subset B or B \supset A, if every element of A is also an element of B. A \subset BA is a subset of B For example, \{4,5,8\} \subset \{2, 3, 4, 5, 6, 7, 8, 9 \} and {\mathbb N} \subset {\mathbb Z} \subset {\mathbb Q} \subset {\mathbb R} \subset {\mathbb C}. Trivially, every set is a subset of itself. A set B is a proper subset of a set A if B \subset A but B \neq A. If A is not a subset of B, we write A \notsubset B; for example, \{4, 7, 9\} \notsubset \{2, 4, 5, 8, 9 \}. Two sets are equal, written A = B, if we can show that A \subset B and B \subset A.

    It is convenient to have a set with no elements in it. This set is called the empty set and is denoted by \emptyset. Note that the empty set is a subset of every set. \emptysetthe empty set

    To construct new sets out of old sets, we can perform certain operations: the union A \cup B of two sets A and B is defined as A \cup B = \{x : x \in A \text{ or } x \in B \} and the intersection of A and B is defined by A \cap B = \{x : x \in A \text{ and } x \in B \}. A \cup Bthe union of sets A and BA \cap Bthe intersection of sets A and B If A = \{1, 3, 5\} and B = \{ 1, 2, 3, 9 \}, then A \cup B = \{1, 2, 3, 5, 9 \} \quad \text{and} \quad A \cap B = \{ 1, 3 \}. We can consider the union and the intersection of more than two sets. In this case we write \bigcup_{i = 1}^{n} A_{i} = A_{1} \cup \ldots \cup A_n and \bigcap_{i = 1}^{n} A_{i} = A_{1} \cap \ldots \cap A_n for the union and intersection, respectively, of the sets A_1, \ldots, A_n.

    When two sets have no elements in common, they are said to be disjoint; for example, if E is the set of even integers and O is the set of odd integers, then E and O are disjoint. Two sets A and B are disjoint exactly when A \cap B = \emptyset.

    Sometimes we will work within one fixed set U, called the universal set. For any set A \subset U, we define the complement of A, denoted by A', to be the set A'complement of the set A A' = \{ x : x \in U \text{ and } x \notin A \}.

    We define the difference of two sets A and B to be A \setminus Bdifference between sets A and B A \setminus B = A \cap B' = \{ x : x \in A \text{ and } x \notin B \}.

    Set Operations

    Let {\mathbb R} be the universal set and suppose that A = \{ x \in {\mathbb R} : 0 \lt x \leq 3 \} \quad \text{and} \quad B = \{ x \in {\mathbb R} : 2 \leq x \lt 4 \}. Then A \cap B & = \{ x \in {\mathbb R} : 2 \leq x \leq 3 \} A \cup B & = \{ x \in {\mathbb R} : 0 \lt x \lt 4 \} A \setminus B & = \{ x \in {\mathbb R} : 0 \lt x \lt 2 \} A' & = \{ x \in {\mathbb R} : x \leq 0 \text{ or } x \gt 3 \} .

    Let A, B, and C be sets. Then

    1. A \cup A = A, A \cap A = A, and A \setminus A = \emptyset;

    2. A \cup \emptyset = A and A \cap \emptyset = \emptyset;

    3. A \cup (B \cup C) = (A \cup B) \cup C and A \cap (B \cap C) = (A \cap B) \cap C;

    4. A \cup B = B \cup A and A \cap B = B \cap A;

    5. A \cup (B \cap C) = (A \cup B) \cap (A \cup C);

    6. A \cap (B \cup C) = (A \cap B) \cup (A \cap C).

    We will prove (1) and (3) and leave the remaining results to be proven in the exercises.

    (1) Observe that A \cup A & = \{ x : x \in A \text{ or } x \in A \} & = \{ x : x \in A \} & = A and A \cap A & = \{ x : x \in A \text{ and } x \in A \} & = \{ x : x \in A \} & = A .

    Also, A \setminus A = A \cap A' = \emptyset.

    (3) For sets A, B, and C, A \cup (B \cup C) & = A \cup \{ x : x \in B \text{ or } x \in C \} & = \{ x : x \in A \text{ or } x \in B, \text{ or } x \in C \} & = \{ x : x \in A \text{ or } x \in B \} \cup C & = (A \cup B) \cup C.

    A similar argument proves that A \cap (B \cap C) = (A \cap B) \cap C.

    De Morgan's Laws Augustus De Morgan, 18061871 De Morgan's lawsfor sets

    Let A and B be sets. Then

    1. (A \cup B)' = A' \cap B';

    2. (A \cap B)' = A' \cup B'.

    (1) We must show that (A \cup B)' \subset A' \cap B' and (A \cup B)' \supset A' \cap B'. Let x \in (A \cup B)'. Then x \notin A \cup B. So x is neither in A nor in B, by the definition of the union of sets. By the definition of the complement, x \in A' and x \in B'. Therefore, x \in A' \cap B' and we have (A \cup B)' \subset A' \cap B'.

    To show the reverse inclusion, suppose that x \in A' \cap B'. Then x \in A' and x \in B', and so x \notin A and x \notin B. Thus x \notin A \cup B and so x \in (A \cup B)'. Hence, (A \cup B)' \supset A' \cap B' and so (A \cup B)' = A' \cap B'.

    The proof of (2) is left as an exercise.

    Other Relations on Sets

    Other relations between sets often hold true. For example, ( A \setminus B) \cap (B \setminus A) = \emptyset. To see that this is true, observe that ( A \setminus B) \cap (B \setminus A) & = ( A \cap B') \cap (B \cap A') & = A \cap A' \cap B \cap B' & = \emptyset .

    Cartesian Products and Mappings

    Given sets A and B, we can define a new set A \times B, called the Cartesian product of A and B, as a set of ordered pairs. That is, A \times BCartesian product of sets A and B A \times B = \{ (a,b) : a \in A \text{ and } b \in B \}.

    Cartesian Products

    If A = \{ x, y \}, B = \{ 1, 2, 3 \}, and C = \emptyset, then A \times B is the set \{ (x, 1), (x, 2), (x, 3), (y, 1), (y, 2), (y, 3) \} and A \times C = \emptyset.

    We define the Cartesian product of n sets to be A_1 \times \cdots \times A_n = \{ (a_1, \ldots, a_n): a_i \in A_i \text{ for } i = 1, \ldots, n \}. If A = A_1 = A_2 = \cdots = A_n, we often write A^n for A \times \cdots \times A (where A would be written n times). A^nA \times \cdots \times A (n times)For example, the set {\mathbb R}^3 consists of all of 3-tuples of real numbers.

    Subsets of A \times B are called relations. We will define a mappingMappingFunction or functionFunctiondefinition of f \subset A \times B from a set A to a set B to be the special type of relation where (a, b) \in f if for every element a \in A there exists a unique element b \in B. Another way of saying this is that for every element in A, f assigns a unique element in B. We usually write f:A \rightarrow B or A \stackrel{f}{\rightarrow} B. Instead of writing down ordered pairs (a,b) \in A \times B, we write f(a) = b or f : a \mapsto b. The set A is called the domainFunctiondomain of of f and f(A) = \{ f(a) : a \in A \} \subset B is called the rangeFunctionrange of or image of f. We can think of the elements in the function's domain as input values and the elements in the function's range as output values.

    Mappings and relations ] (0.5,9.5) -- (6.5,8); \draw [->] (0.5,8) -- (6.5,6.7); \draw [->] (0.5,6.5) -- (6.5,6.5); \draw [->] (0.5,1.5) -- (6.5,1.5); \draw [->] (0.5,1.3) -- (6.5,0); \draw [->] (0.5,0) -- (6.5,-1.5); \draw [->] (0.5,-1.5) -- (6.5,1.3); \node at (0, 1.5) {1}; \node at (0, 0) {2}; \node at (0, -1.5) {3}; \node at (7, 1.5) {$a$}; \node at (7, 0) {$b$}; \node at (7, -1.5) {$c$}; \node at (0, 9.5) {1}; \node at (0, 8) {2}; \node at (0, 6.5) {3}; \node at (7, 9.5) {$a$}; \node at (7, 8) {$b$}; \node at (7, 6.5) {$c$}; \node at (-1.5,11) {$A$}; \node at (5.5,11) {$B$}; \node at (-1.5,3) {$A$}; \node at (5.5,3) {$B$}; \node at (3.5,3) {$g$}; \node at (3.5,10) {$f$}; \end{tikzpicture}]]>
    Mappings

    Suppose A = \{1, 2, 3 \} and B = \{a, b, c \}. In we define relations f and g from A to B. The relation f is a mapping, but g is not because 1 \in A is not assigned to a unique element in B; that is, g(1) = a and g(1) = b.

    Given a function f : A \rightarrow B, it is often possible to write a list describing what the function does to each specific element in the domain. However, not all functions can be described in this manner. For example, the function f: {\mathbb R} \rightarrow {\mathbb R} that sends each real number to its cube is a mapping that must be described by writing f(x) = x^3 or f:x \mapsto x^3.

    Consider the relation f : {\mathbb Q} \rightarrow {\mathbb Z} given by f(p/q) = p. We know that 1/2 = 2/4, but is f(1/2) = 1 or 2? This relation cannot be a mapping because it is not well-defined. A relation is well-definedWell-defined map if each element in the domain is assigned to a unique element in the range.

    If f:A \rightarrow B is a map and the image of f is B, i.e., f(A) = B, then f is said to be ontoFunctiononto or surjectiveFunctionsurjective. In other words, if there exists an a \in A for each b \in B such that f(a) = b, then f is onto. A map is one-to-oneFunctionone-to-one or injectiveFunctioninjective if a_1 \neq a_2 implies f(a_1) \neq f(a_2). Equivalently, a function is one-to-one if f(a_1) = f(a_2) implies a_1 = a_2. A map that is both one-to-one and onto is called bijectiveFunctionbijective.

    One-to-One and Onto Mappings

    Let f:{\mathbb Z} \rightarrow {\mathbb Q} be defined by f(n) = n/1. Then f is one-to-one but not onto. Define g : {\mathbb Q} \rightarrow {\mathbb Z} by g(p/q) = p where p/q is a rational number expressed in its lowest terms with a positive denominator. The function g is onto but not one-to-one.

    Given two functions, we can construct a new function by using the range of the first function as the domain of the second function. Let f : A \rightarrow B and g : B \rightarrow C be mappings. Define a new map, the compositionFunctioncomposition of of f and g from A to C, by (g \circ f)(x) = g(f(x)).

    Composition of maps ] (0.5,9.5) -- (5.5,6.7); \draw [->] (0.5,8) -- (5.5,6.5); \draw [->] (0.5,6.5) -- (5.5,9.5); \draw [->] (-5.5,9.5) -- (-0.5,8); \draw [->] (-5.5,8) -- (-0.5,6.5); \draw [->] (-5.5,6.5) -- (-0.5,9.5); \draw (-3,0) ellipse (2 and 3); \draw (3,0) ellipse (2 and 3); \node at (-5,3) {$A$}; \node at (1.5,3) {$C$}; \node at (-3, 1.5) {1}; \node at (-3, 0) {2}; \node at (-3, -1.5) {3}; \node at (3, 1.5) {$X$}; \node at (3, 0) {$Y$}; \node at (3, -1.5) {$Z$}; \node at (0,2.5) {$g \circ f$}; \draw [->] (-2.5,1.5) -- (2.5,-1.3); \draw [->] (-2.5,0) -- (2.5,1.5); \draw [->] (-2.5,-1.5) -- (2.5,-1.5); \end{tikzpicture}]]>
    Composition of Mappings

    Consider the functions f: A \rightarrow B and g: B \rightarrow C that are defined in (top). The composition of these functions, g \circ f: A \rightarrow C, is defined in (bottom).

    Composition is not Commutative

    Let f(x) = x^2 and g(x) = 2x + 5. Then (f \circ g)(x) = f(g(x)) = (2x + 5)^2 = 4x^2 + 20x + 25 and (g \circ f)(x) = g(f(x)) = 2x^2 + 5. In general, order makes a difference; that is, in most cases f \circ g \neq g \circ f.

    Some Mappings Commute

    Sometimes it is the case that f \circ g= g \circ f. Let f(x) = x^3 and g(x) = \sqrt[3]{x}. Then (f \circ g )(x) = f(g(x)) = f( \sqrt[3]{x}\, ) = (\sqrt[3]{x}\, )^3 = x and (g \circ f )(x) = g(f(x)) = g( x^3) = \sqrt[3]{ x^3} = x.

    A Linear Map

    Given a 2 \times 2 matrix A = \begin{pmatrix}\end{pmatrix}, we can define a map T_A : {\mathbb R}^2 \rightarrow {\mathbb R}^2 by T_A (x,y) = (ax + by, cx +dy) for (x,y) in {\mathbb R}^2. This is actually matrix multiplication; that is, \begin{pmatrix}\end{pmatrix} \begin{pmatrix}\end{pmatrix} = \begin{pmatrix}\end{pmatrix}. Maps from {\mathbb R}^n to {\mathbb R}^m given by matrices are called linear maps or linear transformationsLinear transformationdefinition of.

    A Permutation

    Suppose that S = \{ 1,2,3 \}. Define a map \pi :S\rightarrow S by \pi( 1 ) = 2, \qquad \pi( 2 ) = 1, \qquad \pi( 3 ) = 3. This is a bijective map. An alternative way to write \pi is \begin{pmatrix}\end{pmatrix} = \begin{pmatrix}\end{pmatrix}. For any set S, a one-to-one and onto mapping \pi : S \rightarrow S is called a permutationPermutationdefinition of of S.

    Let f : A \rightarrow B, g : B \rightarrow C, and h : C \rightarrow D. Then

    1. The composition of mappings is associative; that is, (h \circ g) \circ f = h \circ (g \circ f);

    2. If f and g are both one-to-one, then the mapping g \circ f is one-to-one;

    3. If f and g are both onto, then the mapping g \circ f is onto;

    4. If f and g are bijective, then so is g \circ f.

    We will prove (1) and (3). Part (2) is left as an exercise. Part (4) follows directly from (2) and (3).

    (1) We must show that h \circ (g \circ f) = (h \circ g) \circ f. For a \in A we have (h \circ (g \circ f))(a) & = h((g \circ f)(a)) & = h(g(f(a))) & = (h \circ g)(f(a)) & = ((h \circ g) \circ f)(a) .

    (3) Assume that f and g are both onto functions. Given c \in C, we must show that there exists an a \in A such that (g \circ f)(a) = g(f(a)) = c. However, since g is onto, there is an element b \in B such that g(b) = c. Similarly, there is an a \in A such that f(a) = b. Accordingly, (g \circ f)(a) = g(f(a)) = g(b) = c.

    If S is any set, we will use id_S or id to denote the identity mappingFunctionidentity from S to itself. Define this map by id(s) = s for all s \in S. A map g: B \rightarrow A is an inverse mapping of f: A \rightarrow B if g \circ f = id_A and f \circ g = id_B; in other words, the inverse function of a function simply undoes the function. A map is said to be invertibleFunctioninvertible if it has an inverse. We usually write f^{-1} for the inverse of f. ididentity mappingf^{-1}inverse of the function f

    An Inverse Function

    The function f(x) = x^3 has inverse f^{-1}(x) = \sqrt[3]{x} by .

    Exponential and Logarithmic Functions are Inverses

    The natural logarithm and the exponential functions, f(x) = \ln x and f^{-1}(x) = e^x, are inverses of each other provided that we are careful about choosing domains. Observe that f(f^{-1}(x)) = f(e^x) = \ln e^x = x and f^{-1}(f(x)) = f^{-1}(\ln x) = e^{\ln x} = x whenever composition makes sense.

    A Matrix Inverse Yields an Inverse of a Linear Map

    Suppose that A = \begin{pmatrix}\end{pmatrix}. Then A defines a map from {\mathbb R}^2 to {\mathbb R}^2 by T_A (x,y) = (3x + y, 5x + 2y). We can find an inverse map of T_A by simply inverting the matrix A; that is, T_A^{-1} = T_{A^{-1}}. In this example, A^{-1} = \begin{pmatrix}\end{pmatrix} and hence, the inverse map is given by T_A^{-1} (x,y) = (2x - y, -5x + 3y). It is easy to check that T^{-1}_A \circ T_A (x,y) = T_A \circ T_A^{-1} (x,y) = (x,y). Not every map has an inverse. If we consider the map T_B (x,y) = (3x , 0 ) given by the matrix B = \begin{pmatrix}\end{pmatrix}, then an inverse map would have to be of the form T_B^{-1} (x,y) = (ax + by, cx +dy) and (x,y) = T \circ T_B^{-1} (x,y) = (3ax + 3by, 0) for all x and y. Clearly this is impossible because y might not be 0.

    An Inverse Permutation

    Given the permutation \pi = \begin{pmatrix}\end{pmatrix} on S = \{ 1,2,3 \}, it is easy to see that the permutation defined by \pi^{-1} = \begin{pmatrix}\end{pmatrix} is the inverse of \pi. In fact, any bijective mapping possesses an inverse, as we will see in the next theorem.

    A mapping is invertible if and only if it is both one-to-one and onto.

    Suppose first that f:A \rightarrow B is invertible with inverse g: B \rightarrow A. Then g \circ f = id_A is the identity map; that is, g(f(a)) = a. If a_1, a_2 \in A with f(a_1) = f(a_2), then a_1 = g(f(a_1)) = g(f(a_2)) = a_2. Consequently, f is one-to-one. Now suppose that b \in B. To show that f is onto, it is necessary to find an a \in A such that f(a) = b, but f(g(b)) = b with g(b) \in A. Let a = g(b).

    Conversely, let f be bijective and let b \in B. Since f is onto, there exists an a \in A such that f(a) = b. Because f is one-to-one, a must be unique. Define g by letting g(b) = a. We have now constructed the inverse of f.

    Equivalence Relations and Partitions

    A fundamental notion in mathematics is that of equality. We can generalize equality with equivalence relations and equivalence classes. An equivalence relationEquivalence relation on a set X is a relation R \subset X \times X such that

    • (x, x) \in R for all x \in X (reflexive property);

    • (x, y) \in R implies (y, x) \in R (symmetric property);

    • (x, y) and (y, z) \in R imply (x, z) \in R (transitive property).

    Given an equivalence relation R on a set X, we usually write x \sim y instead of (x, y) \in R. If the equivalence relation already has an associated notation such as =, \equiv, or \cong, we will use that notation.

    Equivalent Fractions

    Let p, q, r, and s be integers, where q and s are nonzero. Define p/q \sim r/s if ps = qr. Clearly \sim is reflexive and symmetric. To show that it is also transitive, suppose that p/q \sim r/s and r/s \sim t/u, with q, s, and u all nonzero. Then ps = qr and ru = st. Therefore, psu = qru = qst. Since s \neq 0, pu = qt. Consequently, p/q \sim t/u.

    An Equivalence Relation From Derivatives

    Suppose that f and g are differentiable functions on {\mathbb R}. We can define an equivalence relation on such functions by letting f(x) \sim g(x) if f'(x) = g'(x). It is clear that \sim is both reflexive and symmetric. To demonstrate transitivity, suppose that f(x) \sim g(x) and g(x) \sim h(x). From calculus we know that f(x) - g(x) = c_1 and g(x)- h(x) = c_2, where c_1 and c_2 are both constants. Hence, f(x) - h(x) = ( f(x) - g(x)) + ( g(x)- h(x)) = c_1 - c_2 and f'(x) - h'(x) = 0. Therefore, f(x) \sim h(x).

    Equivalent Circles

    For (x_1, y_1 ) and (x_2, y_2) in {\mathbb R}^2, define (x_1, y_1 ) \sim (x_2, y_2) if x_1^2 + y_1^2 = x_2^2 + y_2^2. Then \sim is an equivalence relation on {\mathbb R}^2.

    Equivalent Matrices

    Let A and B be 2 \times 2 matrices with entries in the real numbers. We can define an equivalence relation on the set of 2 \times 2 matrices, by saying A \sim B if there exists an invertible matrix P such that PAP^{-1} = B. For example, if A = \begin{pmatrix}\end{pmatrix} \quad \text{and} \quad B = \begin{pmatrix}\end{pmatrix}, then A \sim B since PAP^{-1} = B for P = \begin{pmatrix}\end{pmatrix}. Let I be the 2 \times 2 identity matrix; that is, I = \begin{pmatrix}\end{pmatrix}. Then IAI^{-1} = IAI = A; therefore, the relation is reflexive. To show symmetry, suppose that A \sim B. Then there exists an invertible matrix P such that PAP^{-1} = B. So A = P^{-1} B P = P^{-1} B (P^{-1})^{-1}. Finally, suppose that A \sim B and B \sim C. Then there exist invertible matrices P and Q such that PAP^{-1} = B and QBQ^{-1} = C. Since C = QBQ^{-1} = QPAP^{-1} Q^{-1} = (QP)A(QP)^{-1}, the relation is transitive. Two matrices that are equivalent in this manner are said to be similarMatrixsimilar.

    A partitionPartitions {\mathcal P} of a set X is a collection of nonempty sets X_1, X_2, \ldots such that X_i \cap X_j = \emptyset for i \neq j and \bigcup_k X_k = X. Let \sim be an equivalence relation on a set X and let x \in X. Then [x] = \{ y \in X : y \sim x \} is called the equivalence classEquivalence class of x. We will see that an equivalence relation gives rise to a partition via equivalence classes. Also, whenever a partition of a set exists, there is some natural underlying equivalence relation, as the following theorem demonstrates.

    Given an equivalence relation \sim on a set X, the equivalence classes of X form a partition of X. Conversely, if {\mathcal P} = \{ X_i\} is a partition of a set X, then there is an equivalence relation on X with equivalence classes X_i.

    Suppose there exists an equivalence relation \sim on the set X. For any x \in X, the reflexive property shows that x \in [x] and so [x] is nonempty. Clearly X = \bigcup_{x \in X} [x]. Now let x, y \in X. We need to show that either [x] = [y] or [x] \cap [y] = \emptyset. Suppose that the intersection of [x] and [y] is not empty and that z \in [x] \cap [y]. Then z \sim x and z \sim y. By symmetry and transitivity x \sim y; hence, [x] \subset [y]. Similarly, [y] \subset [x] and so [x] = [y]. Therefore, any two equivalence classes are either disjoint or exactly the same.

    Conversely, suppose that {\mathcal P} = \{X_i\} is a partition of a set X. Let two elements be equivalent if they are in the same partition. Clearly, the relation is reflexive. If x is in the same partition as y, then y is in the same partition as x, so x \sim y implies y \sim x. Finally, if x is in the same partition as y and y is in the same partition as z, then x must be in the same partition as z, and transitivity holds.

    Two equivalence classes of an equivalence relation are either disjoint or equal.

    Let us examine some of the partitions given by the equivalence classes in the last set of examples.

    A Partition of Fractions

    In the equivalence relation in , two pairs of integers, (p,q) and (r,s), are in the same equivalence class when they reduce to the same fraction in its lowest terms.

    A Partition of Functions

    In the equivalence relation in , two functions f(x) and g(x) are in the same partition when they differ by a constant.

    A Partition of Circles

    We defined an equivalence class on {\mathbb R}^2 by (x_1, y_1 ) \sim (x_2, y_2) if x_1^2 + y_1^2 = x_2^2 + y_2^2. Two pairs of real numbers are in the same partition when they lie on the same circle about the origin.

    A Partition of Integers

    Let r and s be two integers and suppose that n \in {\mathbb N}. We say that r is congruentCongruence modulo n to s modulo n, or r is congruent to s mod n, if r - s is evenly divisible by n; that is, r - s = nk for some k \in {\mathbb Z}. In this case we write r \equiv s \pmod{n}. a \equiv b \pmod{n}a is congruent to b modulo n For example, 41 \equiv 17 \pmod{ 8} since 41 - 17=24 is divisible by 8. We claim that congruence modulo n forms an equivalence relation of {\mathbb Z}. Certainly any integer r is equivalent to itself since r - r = 0 is divisible by n. We will now show that the relation is symmetric. If r \equiv s \pmod{ n}, then r - s = -(s -r) is divisible by n. So s - r is divisible by n and s \equiv r \pmod{ n}. Now suppose that r \equiv s \pmod{ n} and s \equiv t \pmod{ n}. Then there exist integers k and l such that r -s = kn and s - t = ln. To show transitivity, it is necessary to prove that r - t is divisible by n. However, r - t = r - s + s - t = kn + ln = (k + l)n, and so r - t is divisible by n.

    If we consider the equivalence relation established by the integers modulo 3, then {[0]} & = \{ \ldots, -3, 0, 3, 6, \ldots \} {[1]} & = \{ \ldots, -2, 1, 4, 7, \ldots \} {[2]} & = \{ \ldots, -1, 2, 5, 8, \ldots \} .

    Notice that [0] \cup [1] \cup [2] = {\mathbb Z} and also that the sets are disjoint. The sets [0], [1], and [2] form a partition of the integers.

    The integers modulo n are a very important example in the study of abstract algebra and will become quite useful in our investigation of various algebraic structures such as groups and rings. In our discussion of the integers modulo n we have actually assumed a result known as the division algorithm, which will be stated and proved in .

    References and Suggested Readings Artin, M. Abstract Algebra. 2nd ed. Pearson, Upper Saddle River, NJ, 2011. Childs, L. A Concrete Introduction to Higher Algebra. 2nd ed. Springer-Verlag, New York, 1995. Dummit, D. and Foote, R. Abstract Algebra. 3rd ed. Wiley, New York, 2003. Ehrlich, G. Fundamental Concepts of Algebra. PWS-KENT, Boston, 1991. Fraleigh, J. B. A First Course in Abstract Algebra. 7th ed. Pearson, Upper Saddle River, NJ, 2003. Gallian, J. A. Contemporary Abstract Algebra. 7th ed. Brooks/Cole, Belmont, CA, 2009. Halmos, P. Naive Set Theory. Springer, New York, 1991. One of the best references for set theory. Herstein, I. N. Abstract Algebra. 3rd ed. Wiley, New York, 1996. Hungerford, T. W. Algebra. Springer, New York, 1974. One of the standard graduate algebra texts. Lang, S. Algebra. 3rd ed. Springer, New York, 2002. Another standard graduate text. Lidl, R. and Pilz, G. Applied Abstract Algebra. 2nd ed. Springer, New York, 1998. Mackiw, G. Applications of Abstract Algebra. Wiley, New York, 1985. Nickelson, W. K. Introduction to Abstract Algebra. 3rd ed. Wiley, New York, 2006. Solow, D. How to Read and Do Proofs. 5th ed. Wiley, New York, 2009. van der Waerden, B. L. A History of Algebra. Springer-Verlag, New York, 1985. An account of the historical development of algebra.
    ================================================ FILE: examples/sample-book/tikz/cyclic-roots-unity.tex ================================================ % Cyclic 8-th roots of unity % NB: comments are in TeX, not XML % \begin{tikzpicture}[scale=1.65] \draw [->] (0,-1.5) -- (0,1.5); \draw [->] (-1.75,0) -- (1.75,0); \node [right] at (0,1.5) {$y$}; \node [below] at (1.75,0) {$x$}; \node [below] at (0.1,0) {$0$}; \draw (0,0) circle (1); \filldraw[fill=black, draw=black] (0:1) circle (0.03); \filldraw[fill=black, draw=black] (45:1) circle (0.03); \filldraw[fill=black, draw=black] (90:1) circle (0.03); \filldraw[fill=black, draw=black] (135:1) circle (0.03); \filldraw[fill=black, draw=black] (180:1) circle (0.03); \filldraw[fill=black, draw=black] (225:1) circle (0.03); \filldraw[fill=black, draw=black] (270:1) circle (0.03); \filldraw[fill=black, draw=black] (315:1) circle (0.03); \node [right] at (1,-0.15) {1}; \node [right] at (45:1) {$\omega$}; \node [left] at (0,1.15) {$i$}; \node [left] at (135:1) {$\omega^3$}; \node [left] at (-1,-0.15) {$-1$}; \node [left] at (225:1) {$\omega^5$}; \node [left] at (0,-1.15) {$-i$}; \node [right] at (315:1) {$\omega^7$}; \end{tikzpicture} ================================================ FILE: examples/sample-slideshow/external/custom.css ================================================ /* Sample of custom CSS to override/extend defaults */ .reveal h4 { color: #3b658f; } ================================================ FILE: examples/sample-slideshow/generated/asymptote/img-asymptote.html ================================================ /tmp/tmp11i4ffqm/out ================================================ FILE: examples/sample-slideshow/generated/prefigure/annotated-prefigure-network-annotations.xml ================================================ figure 1 nodes edges nodes edges nodes 1 node-1 node-2 node-3 node-4 node-5 node-6 node-1 node-2 node-3 node-4 node-5 node-6 figure node-1 1 nodes node-2 2 nodes node-3 3 nodes node-4 4 nodes node-5 5 nodes node-6 6 nodes edges 2 kept-edges removed-edges kept-edges removed-edges figure kept-edges 1 edge-1-3 edge-1-5 edge-2-5 edge-6-2 edge-3-4 edge-1-3 edge-1-5 edge-2-5 edge-6-2 edge-3-4 edges edge-1-3 1 kept-edges edge-1-5 2 kept-edges edge-2-5 3 kept-edges edge-6-2 4 kept-edges edge-3-4 5 kept-edges removed-edges 2 edge-1-4 edge-2-4 edge-3-5 edge-6-4 edge-1-4 edge-2-4 edge-3-5 edge-6-4 edges edge-1-4 1 removed-edges edge-2-4 2 removed-edges edge-3-5 3 removed-edges edge-6-4 4 removed-edges ================================================ FILE: examples/sample-slideshow/publication.xml ================================================ ================================================ FILE: examples/sample-slideshow/sample-slideshow.xml ================================================ \newcommand{\definiteintegral}[4]{\int_{#1}^{#2}\,#3\,d#4} \usepackage{tikz} \usepackage{nicematrix} % for multi-run latex-image (label="latex-three-pass") PreTeXt A Slideshow Robert A. Beezer University of Puget Sound At a Test Conference

    An abstract can appear on an early slide, optionally. This is a standard component of a article (but not of a book).

    This is a second paragraph of the abstract for this wonderful talk, just so we have something a bit more substantial.

    Explanation What This Is

    This is a slideshow designed mostly for testing new features. As of 2019-11-16 it is only initiated, and not comprehensive. If you improve a feature, please add examples here.

    Lists Ordered Lists, All At Once

    1. Two conversions: print-on-demand, electronic PDF
    2. Extensive use of the tcolorbox package (CSS-like)
    3. Evolving styling/themes (Andrew Rechnitzer, David Farmer)

    Ordered Lists, With Features

    These are enumerated with capital letters.

    1. Two conversions: print-on-demand, electronic PDF
    2. Extensive use of the tcolorbox package (CSS-like)
    3. Evolving styling/themes (Andrew Rechnitzer, David Farmer)

    These are inline

    1. print-on-demand
    2. electronic PDF

    And these have pauses.

    1. Two conversions: print-on-demand, electronic PDF
    2. Extensive use of the tcolorbox package (CSS-like)
    3. Evolving styling/themes (Andrew Rechnitzer, David Farmer)

    Unordered Lists, All At Once

    • XML syntax is a nested hierarchy (a tree)

      • foo/foo
      • bar
      • <baz qux="corge">

    • Does not have to be UGLY!
    • is author-friendly (Principle #2)

    Unordered Lists, With Pause

    • XML syntax is a nested hierarchy (a tree)

      • foo/foo
      • bar
      • <baz qux="corge">

    • Does not have to be UGLY!
    • is author-friendly (Principle #2)

    Description Lists, All At Once

  • Central Processing Unit (CPU)

    Controls most of the activities of the computer, performs the arithmetic and logical operations, and contains a small amount of very fast memory.

  • Memory

    Provides storage for the instructions for the CPU and the data they manipulate.

  • Input/Output (I/O)

    Communicates with the outside world and with mass storage devices (e.g., disks).

  • Bus!

    A communication pathway with a protocol specifying exactly how the pathway is used. (The punctuation is just for testing.)

  • Description Lists, With Pauses

  • Central Processing Unit (CPU)

    Controls most of the activities of the computer, performs the arithmetic and logical operations, and contains a small amount of very fast memory.

  • Memory

    Provides storage for the instructions for the CPU and the data they manipulate.

  • Input/Output (I/O)

    Communicates with the outside world and with mass storage devices (e.g., disks).

  • Bus!

    A communication pathway with a protocol specifying exactly how the pathway is used. (The punctuation is just for testing.)

  • Blocks and code Blocks: <tag>definition</tag> indefinite integralintegralindefinite integral \int\,f(x)\,dx indefinite integral of f(x)

    Suppose that \frac{d}{dx}F(x)=f(x). Then the indefinite integral of f(x) is F(x) and is written as \int\,f(x)\,dx=F(x).

    Blocks: <tag>theorem</tag>

    This should also test other theorem-like, such as corollary.

    The Fundamental Theorem of Calculus Fundamental Theorem of Calculus

    If f(x) is continuous, and the derivative of F(x) is f(x), then \definiteintegral{a}{b}{f(x)}{x}=F(b)-F(a)test: buried in theorem/statement/p

    Left to the reader.

    Code

    Here is an inline bit of code with surrounding text. print("hello world"). Here is a more text. And some more. And yet more. And a full program... with Prism support.

    A simple program def f(x): return x**2 # many intentional blank lines below... # you may to zoom out, but at some point better to scroll a long listing print(f(3))
    Sage Cell Ramanujan and Integration

    This Sage Cell is testing styling.

    We have some mathematics on the page, to look for Javascript interference with MathJax. An identity due to Ramanujan:\frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} {1+\frac{e^{-8\pi}} {1+\ldots} } } }.

    numerical_integral(sin(x)^2, (0, 2)) (1.189200623826982, 1.320277913471315e-14)

    And some more mathematics. An identity due to Ramanujan:\frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} {1+\frac{e^{-8\pi}} {1+\ldots} } } }.

    Other features Pausing

    Pausing doesn't always act how you expect from . The first and third lines are always visible.

    But this one needs you to advance the slide.

    (Visible from the outset.)

    Subslides

    Subslides are another way to achieve pausing without lists.

    This is a subslide. It always comes after a pause.

    • You can also pause within it.
    • Of course!

    But this is still visible from the outset.

    Images, from an external source

    Images can be included from external sources. As with other formats, you can specify the location of your exteral images in the publication file. The image below also appears in the Sample Article, and originated at www.texample.net.

    You will want to ensure your image has an width if you want it to fit correctly in your slide.

    Images, from source

    Images can also be generated from source. TikZ works well, and Asymptote. They can be placed in a sidebyside, and inside a figure (or both).

    Common formatting macros for TikZ and Asymptote (which you expect to use repeatedly) can be placed in docinfo, using latex-image-preamble and asymptote-preamble, respectively.

    Note that 3D Asymptote images will be rendered in WebGL, and will be interactive within your slide.

    Two cone images borrowed from the Sample Article. The one on the left is written in TiZ, and the one on the right is written in Asymptote \begin{tikzpicture}[join=round] \tikzstyle{conefill} = [fill=blue!20,fill opacity=0.8] \tikzstyle{ann} = [fill=white,font=\footnotesize,inner sep=1pt] \tikzstyle{ghostfill} = [fill=white] \tikzstyle{ghostdraw} = [draw=black!50] \filldraw[conefill](-.775,1.922)--(-1.162,.283)--(-.274,.5) --(-.183,2.067)--cycle; \filldraw[conefill](-.183,2.067)--(-.274,.5)--(.775,.424) --(.516,2.016)--cycle; \filldraw[conefill](.516,2.016)--(.775,.424)--(1.369,.1) --(.913,1.8)--cycle; \filldraw[conefill](-.913,1.667)--(-1.369,-.1)--(-1.162,.283) --(-.775,1.922)--cycle; \draw(1.461,.107)--(1.734,.127); \draw[arrows=<->](1.643,1.853)--(1.643,.12); \filldraw[conefill](.913,1.8)--(1.369,.1)--(1.162,-.283) --(.775,1.545)--cycle; \draw[arrows=->,line width=.4pt](.274,-.5)--(0,0)--(0,2.86); \draw[arrows=-,line width=.4pt](0,0)--(-1.369,-.1); \draw[arrows=->,line width=.4pt](-1.369,-.1)--(-2.1,-.153); \filldraw[conefill](-.516,1.45)--(-.775,-.424)--(-1.369,-.1) --(-.913,1.667)--cycle; \draw(-1.369,.073)--(-1.369,2.76); \draw(1.004,1.807)--(1.734,1.86); \filldraw[conefill](.775,1.545)--(1.162,-.283)--(.274,-.5) --(.183,1.4)--cycle; \draw[arrows=<->](0,2.34)--(-.913,2.273); \draw(-.913,1.84)--(-.913,2.447); \draw[arrows=<->](0,2.687)--(-1.369,2.587); \filldraw[conefill](.183,1.4)--(.274,-.5)--(-.775,-.424) --(-.516,1.45)--cycle; \draw[arrows=<-,line width=.4pt](.42,-.767)--(.274,-.5); \node[ann] at (-.456,2.307) {$r_0$}; \node[ann] at (-.685,2.637) {$r_1$}; \node[ann] at (1.643,.987) {$h$}; \path (.42,-.767) node[below] {$x$} (0,2.86) node[above] {$y$} (-2.1,-.153) node[left] {$z$}; % Second version of the cone \begin{scope}[xshift=3.5cm] \filldraw[ghostdraw,ghostfill](-.775,1.922)--(-1.162,.283)--(-.274,.5) --(-.183,2.067)--cycle; \filldraw[ghostdraw,ghostfill](-.183,2.067)--(-.274,.5)--(.775,.424) --(.516,2.016)--cycle; \filldraw[ghostdraw,ghostfill](.516,2.016)--(.775,.424)--(1.369,.1) --(.913,1.8)--cycle; \filldraw[ghostdraw,ghostfill](-.913,1.667)--(-1.369,-.1)--(-1.162,.283) --(-.775,1.922)--cycle; \filldraw[ghostdraw,ghostfill](.913,1.8)--(1.369,.1)--(1.162,-.283) --(.775,1.545)--cycle; \filldraw[ghostdraw,ghostfill](-.516,1.45)--(-.775,-.424)--(-1.369,-.1) --(-.913,1.667)--cycle; \filldraw[ghostdraw,ghostfill](.775,1.545)--(1.162,-.283)--(.274,-.5) --(.183,1.4)--cycle; \filldraw[fill=red,fill opacity=0.5](-.516,1.45)--(-.775,-.424)--(.274,-.5) --(.183,1.4)--cycle; \fill(-.775,-.424) circle (2pt); \fill(.274,-.5) circle (2pt); \fill(-.516,1.45) circle (2pt); \fill(.183,1.4) circle (2pt); \path[font=\footnotesize] (.913,1.8) node[right] {$i\hbox{$=$}0$} (1.369,.1) node[right] {$i\hbox{$=$}1$}; \path[font=\footnotesize] (-.645,.513) node[left] {$j$} (.228,.45) node[right] {$j\hbox{$+$}1$}; \draw (-.209,.482)+(-60:.25) [yscale=1.3,->] arc(-60:240:.25); \fill[black,font=\footnotesize] (-.516,1.45) node [above] {$P_{00}$} (-.775,-.424) node [below] {$P_{10}$} (.183,1.4) node [above] {$P_{01}$} (.274,-.5) node [below] {$P_{11}$}; \end{scope} \end{tikzpicture} import solids; size(0,150); currentprojection=orthographic(0,-30,5); real r=4; real h=10; real s=8; real x=r*s/h; real sr=5; real xr=r*sr/h; real s1=sr-0.1; real x1=r*s1/h; real s2=sr+0.2; real x2=r*s2/h; render render=render(compression=0,merge=true); draw(scale(x1,x1,-s1)*shift(-Z)*unitcone,lightblue+opacity(0.5),render); path3 p=(x2,0,s2)--(x,0,s+0.005); revolution a=revolution(p,Z); draw(surface(a),lightblue+opacity(0.5),render); path3 q=(x,0,s)--(r,0,h); revolution b=revolution(q,Z); draw(surface(b),white+opacity(0.5),render); draw((-r-1,0,0)--(r+1,0,0)); draw((0,0,0)--(0,0,h+1),dashed); path3 w=(x1,0,s1)--(x2,0,s2)--(0,0,s2); revolution b=revolution(w,Z); draw(surface(b),blue+opacity(0.5),render); draw(circle((0,0,s2),x2)); draw(circle((0,0,s1),x1)); draw("$x$",(xr,0,0)--(xr,0,sr),red,Arrow3,PenMargin3); draw("$r$",(0,0,sr)--(xr,0,sr),N,red); draw((string) r,(0,0,h)--(r,0,h),N,red); draw((string) h,(r,0,0)--(r,0,h),red,Arrow3,PenMargin3); draw((string) s,(-x,0,0)--(-x,0,s),W,red,Arrow3,Bar3,PenMargin3);
    Annotated <prefigure/> diagrams

    Annotated diagrams also work well by including them in the usual way.

    An annotated diagram that can be explored with a screenreader graph={1:[3,4,5],2:[4,5],3:[4,5],6:[2,4]}
    ================================================ FILE: examples/showcase/README.md ================================================ #PreTeXt Showcase Article This folder contains the components for the PreTeXt Showcase document. ##Building the Showcase Article To build the PreTeXt Showcase article: 1. Install the PreTeXt CLI (https://github.com/PreTeXtBook/pretext-cli) 2. From this folder, run `pretext build html` or `pretext build pdf` 3. To view, run `pretext view html` or `pretext view pdf` ##Notes for Contributors This example has several purposes: * To demonstrate PreTeXt features * To demonstrate best practices when authoring * To serve as form of documentation for authors who like to learn from examples Therefore: * Organize with division titles that promote browsing * Highlight novel features of PreTeXt, which is not the same as providing a comprehensive example * Include comments in the source file where implementation is not obvious, such as when settings in `docinfo` are necessary * Please observe standards for high-quality source. Running the pretty-printing script across the source should only introduce minimal changes. * Do not provide commentary or instruction, just provide realistic examples. For example, if demonstrating the markup for scientific units: - Do not say, "And you can put units in the denominator, like m/sec^2." - Instead say, "The acceleration due to gravity is 9.8 m/sec^2." * Review the existing documentation (in the Author's Guide) for each new feature added, with an eye towards completeness and correctness. * Add any new generated assets (for example latex-images) to the repository, including in all available formats. * Do not commit insignificant changes to the assets. For example some insignificant file diff stemming from using different hardware while building latex-images. ================================================ FILE: examples/showcase/generated/asymptote/AreaUnderCurve.asy ================================================ usepackage("amsmath"); texpreamble(" \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} "); import graph; size (3 inch,0); real f(real x) {return exp(-x^2);} real xmin=-2, xmax=2; real ymin=-.3, ymax=1.3; path g=graph(f,xmin,xmax, operator ..); path h=(xmax,f(xmax))--(xmax,0)--(xmin,0); fill(g--h--cycle,lightyellow); draw(g); label("$f(x)=e^{-x^2}$", (xmin,.7),.5*N); draw((xmin,.7){SSE}..{SE}(-.8,f(-.8)),Arrow); label("Area $=\sqrt\pi$",(xmax,.7),.5*N); draw((xmax,.7){S}..{W}(.3,.3),Arrow); draw((xmin,0)--(xmax,0)); draw((0,ymin)--(0,ymax)); ================================================ FILE: examples/showcase/generated/asymptote/AreaUnderCurve.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %%Creator: dvips(k) 2020.1 Copyright 2020 Radical Eye Software %%Title: /tmp/tmpy6xdnxcm/out_.dvi %%CreationDate: Thu Mar 24 08:49:36 2022 %%Pages: 1 %%PageOrder: Ascend %%BoundingBox: 197 364 414 427 %%HiResBoundingBox: 197.5 364.42023 413.5 426.57977 %%DocumentFonts: CMMI12 CMR12 CMSY8 CMMI8 CMR6 CMSY10 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -R -Pdownload35 -D600 -O69.1bp,239.62bp %+ -T612bp,792bp -q -o/tmp/tmpy6xdnxcm/out_.ps /tmp/tmpy6xdnxcm/out_.dvi %DVIPSParameters: dpi=600 %DVIPSSource: TeX output 2022.03.24:0249 %%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3 def}B/p{dir 2 eq{-90 rotate show 90 rotate}{dir 3 eq{-90 rotate show 90 rotate}{show}ifelse}ifelse}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)(LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse} forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{ BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat {BDot}imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B /M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M} B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{ 0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: l3backend-dvips.pro 0 0 %% %% This is file `l3backend-dvips.pro', %% generated with the docstrip utility. %% %% The original source files were: %% %% l3backend-header.dtx (with options: `header,dvips') %% %% Copyright (C) 1990-2021 The LaTeX Project %% %% It may be distributed and/or modified under the conditions of %% the LaTeX Project Public License (LPPL), either version 1.3c of %% this license or (at your option) any later version. The latest %% version of this license is in the file: %% %% https://www.latex-project.org/lppl.txt %% %% This file is part of the "l3backend bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% %% File: l3backend-header.dtx /color.sc { } def TeXDict begin /TeXcolorseparation { setcolor } def end true setglobal /pdf.globaldict 4 dict def false setglobal /pdf.cvs { 65534 string cvs } def /pdf.dvi.pt { 72.27 mul Resolution div } def /pdf.pt.dvi { 72.27 div Resolution mul } def /pdf.rect.ht { dup 1 get neg exch 3 get add } def /pdf.linkmargin { 1 pdf.pt.dvi } def /pdf.linkdp.pad { 0 } def /pdf.linkht.pad { 0 } def /pdf.rect { /Rect [ pdf.llx pdf.lly pdf.urx pdf.ury ] } def /pdf.save.ll { currentpoint /pdf.lly exch def /pdf.llx exch def } def /pdf.save.ur { currentpoint /pdf.ury exch def /pdf.urx exch def } def /pdf.save.linkll { currentpoint pdf.linkmargin add pdf.linkdp.pad add /pdf.lly exch def pdf.linkmargin sub /pdf.llx exch def } def /pdf.save.linkur { currentpoint pdf.linkmargin sub pdf.linkht.pad sub /pdf.ury exch def pdf.linkmargin add /pdf.urx exch def } def /pdf.dest.anchor { currentpoint exch pdf.dvi.pt 72 add /pdf.dest.x exch def pdf.dvi.pt vsize 72 sub exch sub /pdf.dest.y exch def } def /pdf.dest.point { pdf.dest.x pdf.dest.y } def /pdf.dest2device { /pdf.dest.y exch def /pdf.dest.x exch def matrix currentmatrix matrix defaultmatrix matrix invertmatrix matrix concatmatrix cvx exec /pdf.dev.y exch def /pdf.dev.x exch def /pdf.tmpd exch def /pdf.tmpc exch def /pdf.tmpb exch def /pdf.tmpa exch def pdf.dest.x pdf.tmpa mul pdf.dest.y pdf.tmpc mul add pdf.dev.x add pdf.dest.x pdf.tmpb mul pdf.dest.y pdf.tmpd mul add pdf.dev.y add } def /pdf.bordertracking false def /pdf.bordertracking.begin { SDict /pdf.bordertracking true put SDict /pdf.leftboundary undef SDict /pdf.rightboundary undef /a where { /a { currentpoint pop SDict /pdf.rightboundary known dup { SDict /pdf.rightboundary get 2 index lt { not } if } if { pop } { SDict exch /pdf.rightboundary exch put } ifelse moveto currentpoint pop SDict /pdf.leftboundary known dup { SDict /pdf.leftboundary get 2 index gt { not } if } if { pop } { SDict exch /pdf.leftboundary exch put } ifelse } put } if } def /pdf.bordertracking.end { /a where { /a { moveto } put } if /x where { /x { 0 exch rmoveto } put } if SDict /pdf.leftboundary known { pdf.outerbox 0 pdf.leftboundary put } if SDict /pdf.rightboundary known { pdf.outerbox 2 pdf.rightboundary put } if SDict /pdf.bordertracking false put } def /pdf.bordertracking.endpage { pdf.bordertracking { pdf.bordertracking.end true setglobal pdf.globaldict /pdf.brokenlink.rect [ pdf.outerbox aload pop ] put pdf.globaldict /pdf.brokenlink.skip pdf.baselineskip put pdf.globaldict /pdf.brokenlink.dict pdf.link.dict pdf.cvs put false setglobal mark pdf.link.dict cvx exec /Rect [ pdf.llx pdf.lly pdf.outerbox 2 get pdf.linkmargin add currentpoint exch pop pdf.outerbox pdf.rect.ht sub pdf.linkmargin sub ] /ANN pdf.pdfmark } if } def /pdf.bordertracking.continue { /pdf.link.dict pdf.globaldict /pdf.brokenlink.dict get def /pdf.outerbox pdf.globaldict /pdf.brokenlink.rect get def /pdf.baselineskip pdf.globaldict /pdf.brokenlink.skip get def pdf.globaldict dup dup /pdf.brokenlink.dict undef /pdf.brokenlink.skip undef /pdf.brokenlink.rect undef currentpoint /pdf.originy exch def /pdf.originx exch def /a where { /a { moveto SDict begin currentpoint pdf.originy ne exch pdf.originx ne or { pdf.save.linkll /pdf.lly pdf.lly pdf.outerbox 1 get sub def pdf.bordertracking.begin } if end } put } if /x where { /x { 0 exch rmoveto SDict begin currentpoint pdf.originy ne exch pdf.originx ne or { pdf.save.linkll /pdf.lly pdf.lly pdf.outerbox 1 get sub def pdf.bordertracking.begin } if end } put } if } def /pdf.breaklink { pop counttomark 2 mod 0 eq { counttomark /pdf.count exch def { pdf.count 0 eq { exit } if counttomark 2 roll 1 index /Rect eq { dup 4 array copy dup dup 1 get pdf.outerbox pdf.rect.ht pdf.linkmargin 2 mul add sub 3 exch put dup pdf.outerbox 2 get pdf.linkmargin add 2 exch put dup dup 3 get pdf.outerbox pdf.rect.ht pdf.linkmargin 2 mul add add 1 exch put /pdf.currentrect exch def pdf.breaklink.write { pdf.currentrect dup pdf.outerbox 0 get pdf.linkmargin sub 0 exch put dup pdf.outerbox 2 get pdf.linkmargin add 2 exch put dup dup 1 get pdf.baselineskip add 1 exch put dup dup 3 get pdf.baselineskip add 3 exch put /pdf.currentrect exch def pdf.breaklink.write } 1 index 3 get pdf.linkmargin 2 mul add pdf.outerbox pdf.rect.ht add 2 index 1 get sub pdf.baselineskip div round cvi 1 sub exch repeat pdf.currentrect dup pdf.outerbox 0 get pdf.linkmargin sub 0 exch put dup dup 1 get pdf.baselineskip add 1 exch put dup dup 3 get pdf.baselineskip add 3 exch put dup 2 index 2 get 2 exch put /pdf.currentrect exch def pdf.breaklink.write SDict /pdf.pdfmark.good false put exit } { pdf.count 2 sub /pdf.count exch def } ifelse } loop } if /ANN } def /pdf.breaklink.write { counttomark 1 sub index /_objdef eq { counttomark -2 roll dup wcheck { readonly counttomark 2 roll } { pop pop } ifelse } if counttomark 1 add copy pop pdf.currentrect /ANN pdfmark } def /pdf.pdfmark { SDict /pdf.pdfmark.good true put dup /ANN eq { pdf.pdfmark.store pdf.pdfmark.dict begin Subtype /Link eq currentdict /Rect known and SDict /pdf.outerbox known and SDict /pdf.baselineskip known and { Rect 3 get pdf.linkmargin 2 mul add pdf.outerbox pdf.rect.ht add Rect 1 get sub pdf.baselineskip div round cvi 0 gt { pdf.breaklink } if } if end SDict /pdf.outerbox undef SDict /pdf.baselineskip undef currentdict /pdf.pdfmark.dict undef } if pdf.pdfmark.good { pdfmark } { cleartomark } ifelse } def /pdf.pdfmark.store { /pdf.pdfmark.dict 65534 dict def counttomark 1 add copy pop { dup mark eq { pop exit } { pdf.pdfmark.dict begin def end } ifelse } loop } def %% %% %% End of file `l3backend-dvips.pro'. %%EndProcSet %%BeginProcSet: texps.pro 0 0 %! TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def end %%EndProcSet %%BeginProcSet: special.pro 0 0 %! TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known {userdict/md get type/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale }if 0 setgray}N/@beginspecial{SDict begin/SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N}N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup} ifelse scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if/showpage{}N /erasepage{}N/setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{ count ocount sub{pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N /@fedspecial{end}B/li{lineto}B/rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X /yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet %%BeginFont: CMSY10 %!PS-AdobeFont-1.0: CMSY10 003.002 %%Title: CMSY10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSY10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup /UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSY10 def /FontBBox {-29 -960 1116 775 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSY10.) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 112 /radical put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD 028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A581BE543D73F1FED4 3D08C53693138003C01E1D216B185179E1856E2A05AA6C66AABB68B7E4409021 91AA9D8E4C5FBBDA55F1BB6BC679EABA06BE9795DB920A6343CE934B04D75DF2 E0C30B8FD2E475FE0D66D4AA65821864C7DD6AC9939A04094EEA832EAD33DB7A 11EE8D595FB0E543D0E80D31D584B97879B3C7B4A85CC6358A41342D70AD0B97 C14123421FE8A7D131FB0D03900B392FDA0ABAFC25E946D2251F150EC595E857 D17AE424DB76B431366086F377B2A0EEFD3909E3FA35E51886FC318989C1EF20 B6F5990F1D39C22127F0A47BC8461F3AFDF87D9BDA4B6C1D1CFD7513F1E3C3D3 93BEF764AA832316343F9FE869A720E4AA87AE76FA87A833BBC5892DE05B867F 10FA225E233BCFA9BB51F46A6DF22ADCEACC01C3CD1F54C9AEFA25E92EFAC00D 7E2BA427C25483BA42A199F4D2E43DFCE79A7156F7417ACF78E41FCA91E6C9EF B933450D851B73A6AB6AEA7EE4C710CB5C14270D1674FA334686653793FCB31B 491E870D3C2BC654D2C1DE463EC9BA29D7371AA1078800EF93D3F66263A2EBBB F5723697BF7448BD0D2E301544BECF497FD475B85DFEF52AF4F8F8BE445CABE6 019318806D10C5952157FF8F8286C1EE701545C8F60EFA854EAE66835A2046A6 915D395F1E0366EFE0C0391583FE001FF16D82A2E2DA5F57754A2C6F69306E36 356ECF8EFC3F1188AD6FCD2427E0580C97A5B69B4E0E09B85EEDE142F5ADD2F0 5DE51D6DB72B127412A0D57106C19CA493048A4F815129ABE767D51715B1515D 9C21067CB5BC88741B7298C83EAE36A866DFA87D8981F179B1C31292F56BBB64 3C430779468AAF07C8A8B4934E1E775FE3F35186BD1FA6EE3689C1C750678AF1 FBF9B23195A124C5C991FE670AC0C86FD39D2B07B9A319E74EFD498B45820252 720ECDF7294F7B0B137CEB86D33BFCEB8606985A3260FD669E461C8BE94216C5 D434FD8854F44EE66E5A289A9F9E32BC36AF645D53F96652602BAED418C8D726 BD04A1B4617551FE4DEF54083D414F7DCE004E6BB2DC9C2EF7CE232B254BA2C5 7DCBD36C2072ED46FF711F121A701E2284BF1B718B3164382B8F453D68FA0377 DFE106503B8401D4DB87F5402A3AC9A442FA060B0610A9524D530C7157C26B56 AC970FCC1D5655FFFFA39246E6420CF97D08ADFB7B05822679BD40C638DDF0E7 A97BFE8918B611A145AC965C203F1428812F9D340AF499B3A915B22BE798594E 0F520109FC81E452180AE45B170FF999C5FC2761C6CECD8742A5A6FC97F16743 AD4EFCC6572A6D3F3E4E330C5CB2FF6FEA48A5B64DD3DBE943BD9918D4A18E18 CBCF598AEFBB6AB3CD2CBC9BFD6099272F6543F3E532E0E21E614BD2880B1023 0AC234CB705827BF016DB84E00E8C255FDEFA0101A842929540B7B4AA8A089BD 5EFF05B72356B6BC3727817823B5CDBB1B963103000D7F2A4E2A1472FC3E614B 5CBCB6D6D784023173DEFEBFA8F9ED87EC1A0A9EE98CA59CFC964CF943DC683F E9E00DA718C4425A705A69D99988EC6F152525C790912C2E46A2381A569424AB 54DF4798BC2D7E7A361E7991641D4B756CE2A7FF4A2848927092C59C2C4B8809 E13AB84FB6B111E680D7FB9F2FFC2C5C66B0B501E4447C2E46C10E2F6124476F A140C404CFE2DC9E0199BF61E035CEB481D438139A9630934E541D261FFD2906 4CAD99E20655FA746AFB81EDBB5601F5FD6B1D6832A01D585E2C55053F6A7378 4DAACCAC7608DBDADAAE732D66B3E7F87E79756337C1A961E53A4651BE7C77F4 038B89C87F650C54A2A90EB7F1D525BB353F33318551EE8D84A6A83C718EA5A4 B2AC0F7306B1E095819B87015A90CA3ED739B09061782C28CDB36BA4BD5E5308 5CBB70414E4112193DAC4A1FA30996327230D1E021F3CD8115E12D239D93FFDC B645910EB29E40D830E7BAF2DB255FD7C4E776557BB38157917D993EAC245837 A3B515147043574157B8342D829C7228CCEA843ABC89D1785A9672A5923FC4CD 2F3FF27E6FCACF84E2D3136CA2C0FD3EF1EE7354CD04C38B5FB874553646ED2D CEDF7E362EADD04B18051F20A8FB0DE18E152385B9D05F98A3A7EF177824E246 455ABE69E2F700EB78185CCFC07E3B4C6FA301112528D977367D30D0D5D59EDE FAEB706DDC970A9E296236C725B2B55B09B9C336B8E23CBA5FB8692D56F33B03 16294E5FC7FAA42E96395A57CE51CA8DDD77442F142E2E576B778373FB31C81C 16840BB422CA827E30A81829648BDF1CA36700EA32AD888D097C1FE0A05B2D9F 483AEE40269DF09AF0D1AD3DF80C45DDC59C2A03FBB661C79B87853737C6D352 67626B657321B16198DBD6DB98A092F17878AE4698121E1006E53D6F9B0A3BE2 3FB68828EF854A0CDBAA68B37ABCA6AD4A3D809AAF0BAB1697A81FE59C98C472 1E33CD70A75A22C249DD11D76C2575ED3370A25892A16D2FD569CDA70C130770 93F493C7D47D6F9A5424A7A542BAD726BFC3AB225DCEBBE6AC4BE006F8C7C0EA 051424B08305BF2D951AB2986AAFEA04E078CA79B399585BFF0F1ADCED02E15B 8765EB6BF6A8E4D0901EFF2C3AA104924EAD9637A35D877E0C51A3C37DA78CD4 8643C8CE6DCDDE3F116A6C2390F948E5371BEB5AD2E87B41C5F01FB5C196C436 6E256A88D082E3F46E4EFFBF605B2EFF1E9D9AD5EE4DDC323A137CD9451EDEE0 06F7D82898D71FAF2362C0FCF1F726F97F820305B7CE20728CA08C63575083A7 84BA28B7DE2B916432475510E274C12FFD1660A717F51DACFDF0A102D85224E0 D6DB607BB72569ABB8A7BC6A10354CBBC01732EFE35B72062DF269CB25EA3DE6 DC603B04C90C5912D2C38D7A5ACDCDD3F6F116D884F0D8C528F69D5D47BA20DB 0A9E585C7D8CC3C324FE8A1DF150279F7E8FB43BDB720E624E5E9918032C02CD 8020636AE5C38DA2484B7F4B34163E0D0A561B43B80E97746DC05C871AB620EC C5D47101ECED4A7E25F291184BEF8B80024AA7BB456C1B83A907652B331DEA34 754226C39C6889EBEEFDAD081E01EF8FE47751987667836FDE4C8BB8A3FD4406 1E643B4EA37BD370734D1A2DB17C2F4B74B4ED75098B433601F75A88C9A37A05 CCB157EF6E32023BFA33973F3E655A4D58289136996FCFA61EEABD70791B6523 1FF5DE71AB8A17038923118A5EED8D59C4C58D246FFA9BB26472346B40C8741F 153D19CAFF20DD2A86C6DB89154A630FB1761929FC3F0448EE2F089C1C953E02 905BA8DE75D101A982A611056C4B237596C10951DD98BAB838B742D3CF7DE718 617DB72E5268583223E37E029D1C8FD3F1D21690151F76B76C52C725CA135CA2 8666553E863CE188BFC9B99AF56AC2DB5BFEBEB12FB563D00244EB89E478657A 98AF2E1223C1ABC25A4500E8119B86EB3C26B8A2F3505A3E5610F89B7C34E278 53FA0A54A7F46D84A35EFEC36AE660A9E3C37EE3864106702DE5AF6C45ABF64B 888A4A51323138CE77DB935576FE6B4824B6942DF80625098CE1B5B32B234F1D 052A9D6039697118A9D793793775D8729D8574A2E74D7109C7B7E23BC5E2E87A CA8E019203952A4892544E1AD3D4EDD22971611358AB230E9A2ABDF00A288501 A01B67C42B33F6B78C39562DB50F4663B922D9BE0D8A150311AE44B83C1F129F 07337323E9A23211EE58E16043E127C6F9574019179F5635648A011266677B56 B5D0201A4E1470B952A1579B57AB2329CD4C615395023C653F784D36B5EE3672 10D191F29EA508CE84763CA4CE7C2C5229E38E241255A5CABCD6C7CBAED901A2 CA53B5E24111921CDDF83578D33D463D70EDACA0E470D8F592303FB6BFD68B4D 3F3BE2D7C5EC8BBF10C90111A33E205F2649B56E8443F6FAA6C721C66575AE12 D4C40F1F46CF9E9DA675AB5D5840D938780CD9E4AD6736ECBEB6A4397613586F 849B51048AC5F9405E03E14540A5E5582F61CDCDB57EDDF95A8C6705F433EE16 648F098C03DED8A2AD94AE3DE202D629B9422ABB031318D48F2C85F9DBFA17BE 84708AA3B6C9F81F4508F7A5CB7B6646AB8722ECF817877B77D473F577556DAA 2BA0ABACFCF5DEA7498C47328E873019A956FBB250FD9D8885D21D368FA70CBD 2709D2DA44EE7A9869963EAB48789541906DE49FAE785ECE1F18A22C7E7ED204 9768896B78E9EB7A2BD6EEC1B26083940656ECD689D92942CC8AF05CBF82AED0 B45A7DF4DD7AA6526FB597322560B9ED3087A65B5EEF1371C328A021411BFE3B D9B5088B2F1AAE381FFED52D2D1E02CD0DA78683E3B06171CBE94BE9760005D7 135893D7CC2DB097F6AC664D9594CF1C650F84DA80D2EDE04802DBA33CE3DAFE EB7A37E8AEFA4FDA6252FF21E8673DD98E67124D5DBC7BACF361E57077B71939 C1D1FB923E4E35C075CD1BCBE0E80DAEA1320D55B43EAB45D9B26C366B278782 7519FDC482D98839BF0DF2E7C3A56A1C1A3FC0E57A75CA414F6536C1FE8EB7A0 4ADFEE3BEDA0F53BE8CF5F64230784A797133E8CD46BCCB3BF38BCE38A73CCE2 9E073ADE792F7128231DDD1F63E6156ADB2609C200837C2E8A2D93D2A7BC9171 050C709A71E44E32B1B03C92EB5CF1D3BAB1C38E027DC4ED9AED633D98CD7486 3F773ACF8AE332631CF2ABE6D606607593FE862ADE31803964E3F4DC3CE3A271 C76BDD95C87CDB3B87BC26FC7A16D567EEC62E6FF0D471B4853DB8A94D4CACF8 843824F818083F10E88D52FC4253E8203292CB40F1414AE7E51DD7347007C342 CD70E8E9F2D2A13D71213B841DDEAAB208AD9EA644591C15DEB084165F9DF24B B91D3BBEEC2E34E38EF16A0C3F00700A7BDCBBFED2EC0D09601AD6538288DB50 3478B051B5E16B604A0341FE621A58718D960D699D3FAD284310DCF54EB13175 19A75A539EE98E804AEA24689D3540F0F12951A3C01FACCE9A7BAF4D0DAFA946 FF65A4D2A4C39969607272C6886F44E90ABE27CA3A1F12A29D9B32E60E8E34F0 17C5FE43D0E69A99A922D98909B2BBCD145E59A5E7F5426B3988F73B09A525F6 8BD4915663C1301323180E760BE81CB874B020FDA3AE63340E4261E4F3E4949B CC0966BDC4426190BE9F5D77F76A72AD925662E5FE1CEF9CCAB68F0BD33DA003 F11EB91AC4502FBD6AE48DA0F9D07C35B96B103E379B8A83A05FE728F1716194 1F650F75BEBADB2E3810388F3E2DC7B19F1BA9E32925F2FD9F19F4E8701F3E4E 4069125D7C401144740691E7A460021A47B1E27997FC1DDABEC5BD0EE0B20194 2D579C7D6727AA124083242BDA46D8E116E2751C5F298851A62B60AEBE82A929 9B9F2492BA35690D1EFD16215B8EF14E7A3803B93C28FA41D971B05B6AF3B593 E74AD1E68A5FCE12A86E63B78BFEA87D3949FD164F12277A4688BE96356791CB 8671C49365608F3EDECC109321AF92B4C29CAF073DA3A7D73E913D0D83FAC5EB BD884D4C686056404DAAAD6F82F94F803FA1FB0DD8908D1DF08FB87A8BB83027 04DE0CBB1C6FEB6B517FBD7CF065120079E608CE41893C2BC96A347826CCDFD5 C69E161217F2127A59F1A6F22037641613F191F22D5B4CDCBCC2EE5615623404 ABA7BE6C5FE475481615B2AC1A2412E54688DD21E44CC9AF5F16E634AFCA389C 4D740B7B51BB141BFAD1080E7C726C1606A28ED492E6BDE9F800EFACD1513909 84E98CEB6A0B7A2A6F3E1D1DCC3B2552795E0932673E59ECC56DDD37A1D52BA6 C3F0E905978AB568941A163F4CE3AAB5C5B16F86016EC47BA6F3F7AAAA77C3B6 09C8C3ABDB6D514A76ECD37C37AA88B5860630B3406B494F7725975596F84777 D9CF48686EC9C5DBCC1D78513F591C7C10AB9D153B3D41426B7BF668B0D04503 56BCB686258462C1DC61095724B9F3312316262FD7C1AEC6E54DE7E5A7BD8EFF 035299B8FD8A4A7B0F51404F4A760F4D8B4C0FB7A32FA4B2383AB6E9C78FDEDB FE6A5788D38A6701B123630C2A6D820A684166FBBC83DB17069494FBD411B333 CB37E2491C5BD035A33867A6D3A3D420CC31ACF43AA07182CAAE67E40EC63663 B678F71D4C6E0EC3A0AAF904CD3AA66E0DE5E3CDE049E94249B39A1C06E3CE9A F974B2484BB2CDA14282B9511E505B3C89F9C802218AE40D1A7541335C5736DD CD565D4B9F4CC78F3A393737EDB4FBD0DA299E21CCFEBA5478EEF013F0552A8B 0BB11FF46CCDB784E8BDCF730A16363E66572049E42C695886EAB42A9AD9094C B635DF4B5B9BD9B9AE8455DFA3EEFC77653190F9A8B1E93B7281C2A21EA7DDA9 33484745BDF7E3DD63C7AC66C286C9A5A698A5E4D7A91710B7FF943FB23609B6 4B442F83CB795788FAB5E9CF3F75D5487DA26170E4561C7941C910B088C3B86D F844B0F340CF82786A3FCF347048463EBD2006281A816627065DDA6CD4D3AC5E 2024BC96C7D896381BBB567951E7A1F29D4E95351298B000D29E5F3D0448CB5A CFDAE1BADE9403B90371C3A07D208948AFA022A69C519434B6813086ADF518D5 88E0B92072A44BA1B3EBB630A13B7AB90992E85B6D67361C8D96F3E0D826FF37 17B67E4B1EB7BADFD98D7F4FD17BECE740ADF13C141EBF0A91CB105DABB32FE0 55086D56A0D358841D15FD349E6B95512E4EDF4C430216FF85C2ABE995E4B40A A6044CC8820AD885C07E052B3F91C2E9A1D163BFFD210F7BE95B923E2500DB50 2075106DB541C267BD450B25B670CE80BCD068D4DBFF2D82634175B61FBD3BC3 406131F44C7D6F18D375D1F2270829DDF29DC14DBB58A30AC193245D18DE91F8 AB88AB548D8138605BB5A50073295534E314366E26665AE70482B890E4101D6B 60E4F3B37ABCA1346DAAE8FDB8DD9C832EFF3E73BA470E2BACE7B8515CB43388 C27AF99FF9322175CF8D4947E6B3846AFF5163E972156847F58A66660EC8A3A6 5FB47C9F637B4CBB4C73B6A080B0CF6FD1E9665E92032540570FFCC747C67C50 822811AADC404BC7ECD1673E8AA6C3A2F1D82F39430B58C29145E2F1B679C46E 94EDC711883F1E4EA84117A54757E8895A40401A26E1437B39A2F65CAADD6E02 D71FA8AF7453668DC613F326A3344F74AD7AC67569AF399385500ABDA5EDD3BA 343CC5EDD4B558467626850E752B9959FEF1454E53E7A3DCBC2255AD8F6AB4FE 894455118A61C58840CB68A925ACCAD75CEACE863D806916228F0614191A1CD5 DC9BAE256018615AA3725834519449B0A88B4F396654E74099C007930ADB1327 DD119BF799FE3B0B223E1EDA04FE2DA7A1C879143E1C33B6C6344F4BA033AD6F 8E88C33DEF1977796B454BAB2494C930F492A518E8198C708A75FFEF8C49C324 A718AB59B889DED521229E741FFE53F98EBE88B0405AD523254FD3FA4BBE96DA DA1C27C1C979A0DD4E61C3B1F4C4DE01E42F1C4435EECFC02D97994BC8AF5270 E7CB1458D76ED0229C5FFB4A23B8716018F9050970895D51722CDE8F2EA3D947 DFF374D84915D5C5D16463A6FFCD079D1ED416C4347BF831FF0C4ADFB61295DC 4D5785BB0852BF472CFC97EC174491CAF961AB90629F055E75DAA6D9898E8653 5BCF379816CAE46FEA62E7BE8E9B953466E51828172C4DBD0E1BBAD1CE28B5B1 02B3E36403BE80B49A47446A6677FCED438F01D60EB10F478C89528FA337D0D8 88D3FC123C076507ACDAF783A9A6E24ED73BF24B6E0F11C13E532DE5F70EB02A 60651FC2E263002D3986B7B20CC2AA08330B9FC2E26765CD52266969A86EE30E 71E0B41B6C1C6DA423D3A7E1553D2FAF26EF40DC183099322D362E4965695C52 9FC3E5BD7ABD743CDCB717DB10372A722A39CE53FABB454EADE2179C4CBFC016 A8E893C28EF549CA1692C8D8ADFC471DCCDE266FB4E97A1F3035801F3F034D44 AE6ADA0192657E8078A1D27420093FEBA111333314658021B90DA4E7A8D4B829 F1795501020D5FF0AD25584C1D568EB61E7A468B41B75891A32F6702E0FF3BAF 79A37867B3E10F6F0EFF20DF7D7829ED6B654CD4FBD5592E82A5EAE68B9E9DEA A3B621EFDB9DDB9BFC5335B4D267D8411D91E7AF1E83A55024591A98ACDF3307 F29891E6DD71C83FF87251BEBF638C493773407670A93B2E687C9BB9764EF06E 6BB743E9D6FD1C2ED638BF46B08CBEA45460AD155927F4089109E79A071F621F 0483122F72A4C8F0A1AA7F86A2826B08457592B7C6D170DAB85C0A169AEBAE83 0904900C58F9062994FEC964697458FB0B1F6FCAA80640260715E80557944B91 2054838E945F8E7D4D1DF87FA94F 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMR6 %!PS-AdobeFont-1.0: CMR6 003.002 %%Title: CMR6 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR6. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR6 known{/CMR6 findfont dup/UniqueID known{dup /UniqueID get 5000789 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR6 def /FontBBox {-20 -250 1193 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR6.) readonly def /FullName (CMR6) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 50 /two put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DAE339BA29C1C6F656 1DEF13780383DAE38A868377CC7D396B2A05F341AEE0F8BD0A0191F51AD11A4D 2E927B848A1EF2BA15CFBE57A51E3AF07598275195C9613041F71C1AF39E61F9 EFD5F6512FBDA76E29DE6B508F62F5CF9F73F5288DF1C7B0B82C92D3B6358BAD EC3CA20BDE55DAA7CC58004AA86B6CBF8C410D8287E88BF20588A39309C2B703 CED322F030AA6069869064486CA651DA054FF3F5E56534CA358B0829A6B954D8 9103436E6B06DAD1658BD4A95AB41343B01F5866FC87C4EDFC71F1477C98F8E1 1DCF27EF743FF90BF918AB8C4E5AC35841E2F745480E5EDE1C1DEAFAD8D0018D 2C1F1CFCAD9F6609859DEDFD1648A6CD23D8ABB80747F94899F17C8F3E6CA55A E176F19CDFDAA0D7C920B3A72051A4745560AC81978C92459EEE5AFE85AB247A 32981139CBE352B248F4BE5F73503A084A3E91F05328EE521D9669E44E202584 5407E7846F9FEE3D54EA18FFB144BF2D6803BF65AE402034B3CDBB40DD24217A 3CE0E95E2717CACD603A958187C42B3558AA38D6B6390EEEDD396F96E6041FCF 6F8888221AFA87EAD79F46E0E32CAED91E6C8500879AB6E580C581E8C8CE9B68 2BB5EFE2604E8DCB2432D39D75EE556969F1B2FBDF6A4BC72D106AA7CF22C268 464027898B311613E06E1584707F262F71D9F49D2149306A88E02BC60BBD6BDB EF41D90F19197BA9AEF32B5E63D5B9FF41B5602F9F786E76621DA54D574981AB 87A72081EA05D6C6BA940EFEBD0904EA4E77BBCE17E20B42E1722617E0F6EF32 F1ACDE9D758594E9C81049CCC10605A27C2A06872FBA9F159CB155609B496ADA 4886F478E44029B5E620DE8319E257697E93E1CDFD27D560E2E4D34507020E2C D9FF06BFA14E056D81DF701FAC3ACE4BE6C098AE116E079F0044391EC1661F6E 7A93B9320BD7F91E8FD2E8EB3F5CAE997D5CDD35107A1D35302260D1499B8B65 39625B7925F97D917B66BAFEEA992873F07220714F192839948CEA080BDB9A03 77B9DD032273DDB5629CB28B5D8797EDEFDBC601823E038384C90C79012A7D96 8F27784DA15BACE21501C26E3AFA5DCCE81B52B0ABAF71A35D33103EA86F2415 A39A830D559C5C6CA7423945BD3DFA942B20A06D7A8D8671F9831DBB52907AB4 4E54776D29C6085CD9970B6DD21DD3EA8EB09C49CBEC6CDCEEB0BBB1B8827109 3BDE64DDA024D67F098D6C1998506DDFF7907ABAADA1C39C759C850E0C6F8E89 A392D1C9329ACFFA92D361218D75E115F70A47C53B73B356D703E9C499AAD098 AA9C8119EE9E9708A9EA3049E976FA19AD04210D5F6092C7903FD155113F3A3F 269B746560F70970AC9F8D09956E0E84DACE4112C4E7C7F6B3F0B63D26EFF95E 2B2E9699D16BC8AFC4AD9113AA3A974C9E82E877288CF71E9169D2DCC61AAAA6 C536E5604EF0716F6487292BBB677518504B52C63822BED3BD5FD14EB41EE6A8 AD4B6CF90D39F98E12A765B645CBA3E8552FB9A986390212CE119E7C3DD675AC 17BD006144BEC534DA2A860188619F17589008409C5A309CB83FBA70F6446B6E 2B56991B6A03B1DE10C621591CEE45BECA27C54BC8B4F1754A9E8F660812710E 117850E1BB6FD89BB13F8CE391C43DA89EA67E9C3E7A4697790EA26B0E4E2E80 DCA508873A7AFFC11B8C02EF86C2316E8D8B6BCEA37F81A3A87546705F070C3B 9D4D28C366CEBC1EE485B8E2357DBE46E86C87B9939DADA60888AA9F1B92FECC CC1C198DDB594BB70A8FE690ECAC21A414BAC89BF019F34D2A130F485EAE35B7 2A10C67EA3A48A4D9734759CC93AD85C6A570500AE5AC9973FC76EFA06BF5DDC 26E20E28D16B50957EE01AF2653F8D860817967AA5A9BF9BF7ABCDA710E9F34F 4F0EBCC32B3C9C2971F6225D2DAA6A451366B83F32B2ACB83E746D365B2DE38D C1AB7447FE7B37F9630E410E5D8F0ECE74DF46C538947B3A167AD9F3E4A7EB3D 60F5425AE75AC3A27D39311DA35696C3DC7282AF1532E7AECE63D13DDA0296A2 01487185FDF1875AEF55A36C17D6A8DD329279D229259463A2F05CB7A874374B E2320E1F6CFECB9C1CE62FF468C29751ACD9754AF1EABE8E7696C2888914416E 235B6766F20FFBEFF285277B639A51EA2F2E30D207BC891B00F0436008F980E0 9EEE7FB375BB069B9E0BA11DA951A99D8E60B4F920A0495C247FA7DE904765AB DB5C3B2D634757E43EDD6FAA4DB3C67F82D6853E1170F0B2D8CE496DD4E72B0D 28277BEF172F1402959F64527F9B640619F04416DDB9D05FB2ACD019CB9C119E E544D24EA6DAC5C69785394EA50E6EC9AAA9E14B904EAF29A733C6D7942B63F4 85729686742F26DEF78DF0DA1CA7CEFBB684F4CAD99021A3B3D1FE03B9C5A4B1 BD04CAC89BB91B11952A2B17A61789BEE0C54B46C03FE9A1AE73D17CF94BA30A 237C29D414C3BCE8E3E2DDF83C0BD59DCB66C4D2C3DE73DA8378F3C6C8035D28 7464399857E57651A53E9C4AA68DFCA91B2376CF98AC5290FDB9BDAD9EF1604E 9B0A70EDDA1E564B6D2456E7BC722454ACA8C4950FDD44B6EB9AD01169A9F845 B06A0DDB7897C847A5B1F42258AECF3807AE936C8F52C3A7A0A85D68160AE442 FE81543DA6702D76AB6E8701F80DFC1D87C961E350D0E52AB2A298B9E5908600 7E14D2A87309043CBF13F69AEAAB1BC239DEA88EB5176624F6046664B1D2691F FBB2071D3706F97DCCA355A6DCC4D09FD35DC078FBAAF672FFDECEC61050A120 10B5A96629041303FD01ACCC7686165DED6AA712FF8E5E85DE33C4E7D877C49C 6C469A90410BAF60BE65ECD91CDC2EE7AC0CA8BA7B53865F26092BFCAA0BCA77 B80DC51DAD09C93C8DD8E43502B4B68F3D5918C3492196292447732BA90F5AB4 9F5E1D634ADE1CCAAD028DE5EBA9535F6FC5908DBD2D643E0A7E059C8C386FDC E72659C0033F535C0D7F6B98D0335552D0BF3C6E302B672A5EAADFCEF81912E3 8F54E6FB7EC2B325125159713D0AC50DEE3673B9B148643727E94C80971A2E73 5E1E13237BE69C84FC039DCE02ECE2668AFD047F21A61BB94A9F498C9FE5CDEA B274B40728B6F6CA9B6C15BAAF92F465B0D7311B46545CBA90D874839443CCB9 3110F052EB247B24B45A3D2FA6FBC7EB2A4BEC2A5892914B3C5EA3F4F9B9DCBF 6F932D95700E045B49E4B1F2C9D2A42CF39CA2F5A2654E6E8E6E92473D28AACD 5E35C6705EA728F704F5996D286BED433F976AB7E018621A577AED7C0AC0A84E A032FE1869F603E6F20386E3A190A30A21EA886249ECF8CDDE2C33D73BA8647A 3DCA7A8DD9E8EC8D9A415D126BA38B6771C489DFC419303EE9C1B83FBFB3A0B8 97D64F30E4BCBEC24DF603FF3BF541E00D5804B6B6543D3D2B661CC551D497A9 9DFFF535AF424B2F3150BB39AAE8CDB306AAD37767BA10BADB031DC2FAB16955 EE78342CCC0E8B5976BF98F215461A8C6F63EBE6E2F1A1104662DDE53388CB51 8B44F3534853B8095F3B746A2459C2EF800FB1EF7F235EBAA9731E3AB3BE4369 1D3636E3ADD5BDF0C34FA80E90D8A1DDE770943FD196E0A7C5F1FAF6970B34C6 4673AACA6B2B5C12B9608521AE736C1F4B97209B063D991300ED5AF3D7F27E76 68E0B858FD8BFF86581E2B9548C691E3E5D9EC4D39C9715CDE86C7D22223CCEB 8A38C776A30AF14912390A7546DBECECD7A687D4F08646E57A12C80DCA022B7A 33399761A50B8E0ABEFA1163EDEC3DFB5DA3248792EEEDD894872D4E6814B4C3 548BAFCDE0CABBCDB97EC6D1BA47F2E77CC1389BF19D73661749AC33F46A618E A665A85776545BF9662F2179D7BFD604FA8EF4700591AF3AEC647E27B24B76F3 133F9198DC15C1AED830E737909E43EB91C334C44BA35810007A3888E33F5DA5 B3B2C35481C648AFE630CC3E08F77744E401B2934E407D1EC17ECE737606B076 F8DE8EF3344F57495EF49D11580D6FB28AE0B1422521B320843B13467501CAE2 3DB93D7BB779F73B6AA30050DA74BDBC3F8DBB30F32EAFD07734A151BB2BAED5 C9B1F790059339B64BB4146470F30928C9A49AE88906BD6FDB7431A4B50809CE 0F67ABA01CDCC2320B0B097187B9299E3D80CDD7BB5DD5BFA7B28D924C5633C5 45A23CCEE097C41C3759C1FA8DBA0DD95034BCA89BD23FAC18C70093F40FF2F8 0FAC5DD4835F2DFD40540E9A9E9FD951A8AF2CB766597DE00147B163BACFB7E6 EFDA4DED594F1C746D8B46A1145E0E4058F5917B3F21E9BEBDE745EE72CDCA64 FB31EF7A2E55265F32559480E2B6726D3DE26FFC97EB4E3160F117E890C4B2E5 8DF310E6A728ABA85540F571C024F8DD58E1D7827FE97CED5EB31547EBC36415 02B8C0E10B7E37D816F01D56A364B8552CBFAAA95BC4BDDCFDE91CE0EF005B4B 7AB56FFB47A093AEDF0DE1EA48FC8103CA3CA1470864D2693E360006D05668A8 AA422CCCED20DCEEBEA5CE0DA1EFB00FB93E922B18124FA11A88D0F6E0F719DA 57603DD5DA42E1C56C2FD9E5415AA199D4F334C151C1157E75C107FBBFCEB706 5F4EA47A29B54ED8CAEB8DDA2F53D2A703B95487619780A52DA1270011648A28 AA64338E04AA5B92C1EDF3D8DA34FA6D227A0325EA6F22E9B38B6338C657BB21 CD4C582DC04010330F62923F817E4EDC6E5C0E6500F2A975A8A95BAA30C4A134 BB31B5AC45A2E7F6E9CDFC810D41344C4F606049445F8E93D74271C1E29DF7CB 5459593BA28AECF64D903D3E4D77CF5C04B06DE44A41EE4D9FC769854503AC85 69E4A5106E84016DE3D59865D4AB30BD6C9E45C45DCB5408421CC50CD6179C85 34E55CC70FBD8FEFE9F1D5160664981716E3BC7F24B6F54E0323D9BC4B692971 24419EE62D8B0BA726E2B4294A9A76F328B8101DA29E78BD5C4AC383350FE196 4D42DB1653637D19530124858950C22F1E9CF5BC07D46B7A58CDE19CC88DCD2E 7FE4EEFD8AA6047E919823C8CAB2EF5274F45E861E6508CC11A8AA90AED2403A B2BF1315C2157B3B50A3685205D93E40906EEE9DE5985405974BCE0B84BB37DB 080A45C5237B269B93C0A7CF294A18B45464A41F604C494CBEF829A381155CFD 71CEEA54CC39EEDB6DF58A9896246B09F95DC6BC40BA6916AAB5ED3D24F66154 3662F8978FC63DA9280FF7ADB09EA5BA79D3B66E0C88BEC1EDD78DA93839073A A4D7B0E627000C4ABA76C47CCFEE92E319315333A5584A951E34C55412049C4A A5569FE65A006F77B416E0530AB6A8E7AD6C72340AD4CE25937158FABB2153EA 281E1D840206F5DA38E00815E9081F81DAB9FAA8F4DAB305867AC84735DB4F52 A36129929BD2084A8EA37BB6889695204BF7290B68D5E722540BF8A276F8BB6D 451D582EE59D2FF03F6B97DDE05FA00C3D375D2D0AAC8FE298F85CC067B15481 48D70B6A0354C705715B891915FE8EA45244677B9FCE81E72D66177E309F3F83 F744B9EA9E55C3B30DEC6E5E03B3988FD526A82A5E8E1DC79127FC62B2FA7949 B3AD3148868DE22BD4B5708E32CEAAE6ADEED1F463EAB9692411E18F8D6BF391 126B2700B4CF3B59D02E3F8795130C96285A63FCD1E0F647ACB1D35E9C58BD01 1DD06BABA00CA4343BEBEDBE677E053E9732B33A7495DF51782A07DA07F5646C 770C957AD915CC70BA8E08BE7A1F4E6BA5BB9C603E38F6FB0A2578471C4D02F4 283069856D926B9076EC73AA39CEB0A061AFF1575C7093FDAC9F89C3DC06EA45 06F3C2A3BC9FF21128B10CB758DF0F099B459A5264A8C24C098110D2BA1A8532 8FAE146A91BA7D033F591AB1A94B8A6FE0FFB610F698D216D58B4EF6C87B1524 8037CBB7E23D8550A620341C6625A1A2ECE7CEE2598D66277F857231A36155E3 984F147783E9B93975AC38A29F2FBCF704C8A04AD84C3E04A12D2321FA56811A 5B6744813CCC187968C5C26BB8D3E6615A912FA5369C01CCF8C0DB790593B190 1A90CFB5339B8771F325C5FC448D36C7312B11A15A8635BAB59CF3CAD176131E 026F6E141B2619EF7F3048750CC9291397F141591EEC8B612D6656DD34DB54D6 DBDD303CED74BE76664E7DC86FCFEEF2001C9DBA56418FB61F589566A47AF36E C94671C5E8939AF9F4D53C0DE7142B7B63C86AAFA65877EBBB48C64589AFB2CB 1280AC099FC48058855CBDEB6C2D2A0D092267996591DC3B5EC8252984E9B27D 2E9EDE8CD8303F0905DBFCAE497DE1B755B924452CDE11CF4F20893DD6FF7251 427F520FE00580DAF1703FD968E0F8ECCDE618E1EA5820EE6CFED97C78864EF6 26FAFEEE194A268F24249D44829AA360D731C34DC285501E966A959180718F72 6330E4CC060588A2F65AE64A720DCAA818D49D4440F5D0B6C1F6C3A107E12445 F1BED2D3FCBB87A9597F01C7332AA79143564056219BF87D4B907A04F77621AD 054935E883B2B137D3D1C4BC792E8335CA08B6D83227F35736C41312A0BB077A 60FC6488C5E02FD51A10AC113D4EF70038C649C1677B2204A77F2ECBE9B3C341 F4126BECBCA61E3F3801F9188A3775924A62D30FB096B440286FA655EBA00A74 9A4162904BEA07CE68EE76018346DEEE20839C9A2FF71179B58E1D4AB30856B5 F5D97295A097174467010B15D733AAC5813CAA633746B430B1AAF9F997FDAAFD 436844D1A56B8E25A89D2CC4BA6EE7ABD167818FD4F6C747E07B262C99EE2C35 323F0B471586CA50F54C6381B052B15B0C58C19DEA82C0CA29F00400B727419B 2379979CDCBFA966AD513FA903160C571C3BF1BA239540B11EF2371A3880837C 6D6CA2F374280CFA1586427AE975A2AEC34244874E4D441DBAC6CD1828841C91 069AA87FAE849C5DC7C9EC1B9876E59F3CCDF8BB23D939F5348D7486934BFB02 CC5A22541ED352616830A510DE7732E5D8F7E785BBD31C2BC9D348CE5632654D 2C1740F89D57FB2AA1FD8FA3304EA03F757BB8F498ED98E48485722E78D97B12 A05F3A28438084D1CF90AC4C3FFCD7B3365941C45E1E02CB13CA1E99F7FA1D00 1C9D489D5C95F019AB4CE89FA3B6604473DBD2CE8E278969E0A0FCBCE68C23F6 9381882443D3FC16966555FC222F3FC4B1207522201AB7A15A7A6F22CDC9D392 360BF4C95DAD35770E0AC7E5EFF015F2C74ED7391F40EC94B8D1C163B5DEE5B3 911A20C2625AD3B24BD94D2A42405E655DA47D3F94F882CA2F479437B4E0BE71 8AFA4482C6FB270F8D05B4599A01403DAAA90C01DF3AA7C2BC7E66AB6AA833AD FB6E5EE13E45CC7CE7E200FBFE639F9CFFF5D08512C02764997FD28368969BFB 0876F236EF6189BE73AD827332DF1B2EADEAC0ED3B939CE5BC3CEC78975FC636 44FCBC2CCF4396AC7343EC62E0E4F3DFFA2B880BF31D93ADFE201BE9CCEC8BA5 0B9B919E05B851E0909968DA259EECC6AA0743F25247978CC09C28C4F878E29A 5070E4023BCE95FE0ACCCC01D0EE219FA8344E8F6D7D4347563BF8AC030B9097 41F24D4BC9494915A82EE9FD37FBB6A46BF077B728FB569B1258CEA5F51F36BE 4F4D0F890D782E44748CA3FE8C8A515998371D9C7D2311F192B4B7E7C68FC6EE 3F7136714C282A2570FE591F247A08319CE9EF1E43274E4E57166E31A2ECA506 85350DA31AA4C33C9687F5210BA225EA1007C444FBFA2126769767E47A967884 9F68589E4BAA9ED32A7A466DE35554C132810C68ABDAE536D9D884352F28EA02 8A555D2CE11F30598F44A65E2D86B43ECCBDEED9E4E5B5B7DCDA20EAA09D9FF7 422FC91F2201431A9E8FC624FF44D26C0100183D77BC7E6B1A6CFBD3FA8BABC1 AE4CB0FD382E26BE0A83169B46D91429DCB746A0326243E212F802AF6A56C709 6E70C6C7CA3775C382F911F6DF3D26A9F9F39C6A49A61FB0FDFD443ADEB01F74 1254040BC520FE9C85FDDA97E17CACFC505669130254F9C16D813DDFFF35ABD9 F6BB806C8138B974A5F04238A6E74C67684411B94915503133B27DCE131280E9 6F1C994EB581AFAB29C433337F40D3DC691D98C47FE66C75B0B49A09E086BC38 ED8B4F690E0E9848B3602A13A3BD0FD800C618C6CA60EB9397A78C285BB8AC49 CC99A84EE7C903DD48A13B074D142DBC3B5A765D05ED43D547D3D66879BEB840 0B24834FF601400FC99396AC6411C9968F04EC643BB1005C0235743DD58FC6F3 010CC1517CA0F37DA17F47FF62F3E48698FBB83E8F7C99F4D7F8BD922F3E5A9C E074FD9E33B80308783E17221E760F500A185C89E3279101A0DE477E268D236F 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMMI8 %!PS-AdobeFont-1.0: CMMI8 003.002 %%Title: CMMI8 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMMI8. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMMI8 known{/CMMI8 findfont dup/UniqueID known{dup /UniqueID get 5087383 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMMI8 def /FontBBox {-24 -250 1110 750 }readonly def /PaintType 0 def /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI8.) readonly def /FullName (CMMI8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def /ascent 750 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 120 /x put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBA9B440A6DD72BF8 97084C906B05FAD969086ED21AF0AA1471613182B26117D7494DD9F9270EF3ED 8DA4D957225F75D060237B6DAAD5A0AE3E702B3D1C437835B93B8AF1F9E7D966 E739CF3AD5E256F90286A34069E5BB4122F94F18F3485658D0D25B938522A879 8215A417CA2CBD20F71C5C5FCDE21EEA7BB27876D93BA667868A419287FE59BC F538980597DBBA743DBBDBEBC61E3286DA7977833DC8BFC5E52FF5DF5EFD9A92 D070EB769E31E760A50FDE012DC0057835E8B9B046FCC83F1A0C40326AFB4E3A 0CC3BFA35FCC64E32854F32EB7DF10A19F95830136BBB8139DE1663B7FD790CE 464EA431AC109FCA0E03F3E0D355FAE20AC8774D6B1CE233C27680C77DDA7356 560A27C75993E8C980CD1E3B0683F7E8A05119B3AD567DAB4851B66E418687B7 F9B21B3BEF607918D5973421B68E65DFD8B6C8DFDCF1CAFE2637D365148EBCE3 FA4CC00052A2A522205EA3AE3461CEE02042E1A3F11467CB6C8C849B200CCE3D 0BC188EC7B934CBBC0AE2BF5DEA228181DBF0F774119F313516E7D97FF532621 9278F856C166CA6547504F34991D588A0631A5CD06363F3FEE9FA0772C783447 ECD0A200929CB58EBFB6B72008E4082B5D14AA560C24915B9463A92F38237886 C35CBB2D4DD6D0CA8C1D4EC46093041C6181C2F6586EE3E7D4E647A107B6DB23 DAD9AB5A0C2905455FE58075EFF6B48597078BFCCDD84812B98986F34987CE49 7EFB19814F2A58B0233A59331F6F8EB66401F04EE7B1ECAD9BC90A2BCEBE213D DDDB1F75C83609ED6A669A0CED58B2E269E76ECF73616D94F13CF827C9BF354A E82202988DCFE856786B8AE569AFF3105B55C72C58D310FFC0E10B2ABAC8DB06 40D5F72E54770E9DED1AF4616008595B8481E3D9AF4191CC9A5BFD9DDD01C9F1 FE7165D21E488DB40879E863D470CB31CA06E5B5F1F8C3CCE04B697CEB0F3557 ECAA358D2EC2B370519CE06138FA702314BA01F1F33881825EAE1230098BB3C9 59666983275CA4E8D9DB34979F86535577E79393A72F84B0F768FE8C92692907 15E9FE9894E98A0EBEA490CBC8C7E5A9F3E43B24C2C5A4BCD71DAAD3CC0B8B82 AC13933543E295C163F61C9FD18371CB514493F90BF7FB460C029B8DD2E2BF05 FD66B451DF277864DE1EE42100BF29E01A50258C2758F3EDE211BB3457B8243C 20BE72983FD6FA2581C5A953D94381E32E80D6D6095F2E93A5455C101BA71E8C E560D4694E4C167EFA25FB1E9D214AEA745CE34CAA5468FAEF8F6BDB6C6BE8F4 3D58836C26A2392E4C4DECE284A90DDB3858A16D6135FED655A600929DE71605 6CA32F6851A2A6F71A9DF3D5D657593BB729CBCA2F4B059365B7263DC08AB211 9C547096E6427F6AA53CB2EB87DF0AFE2ABCDBD15D7EF228D3396413B83C6B4A 79E41F9BA55A2688F62A10472675E5658F151F9FD6634EC94EC0682C17448024 CC1633077C07A93E4DA8749D974FB8F4332B5DECF97D749C10DB60D4C90ACBFA E65AE928C88BAE19234690EEABDB30BEDCEF2660D7464D5071058C30C572A2BC 7DEE5384BD7614A4BEC4C84E18CF7EC81C810256E8CE6520466C033E2A36D3D3 5D6074B3857415011D8D9D49A474D994571CDBB89AF92BEA879BEBAF67663F5C 17ACAE809C2231EDD0A76641BA52FA7B19A2798D54A4A9B62C42F9905851229F 2CEE0191C8AA5AC12BB0CE9E5E3E862683AB57DBB4AAD6AC0FA8BA4F408D41E0 755F72B82B7C18EC6B13995BF7AFD66AF4BA0EA7523DA8B75EE751744EBA9CA4 4E8BC1FB37734503A5B24FB9F2C2D07A47CFC477F02413D55BD7DC180B0344E8 50248801FA6BE26C97F397797F5F9DF762967E7CD92CCB8B2E587C92177619A4 BF8046CBC72C6E69DC78B8CB6B7381A290080EF59F5B9F29C1167B261C932E9D 010D2D14BB425D157F22BC0305770AECC5BC80000F8CCFB9930255A68F299ED9 D3B5B83A2CC00E3305EB281E1A7054734661B175C6CA0AF168790985F173DF03 A8693B677BAFE23C3CF833FF6463B136FC370E4F0C29E322DBEF637F62C33CD9 B0A8338FD67EC628E3BF2FCBF7CF0347D5CBA1DBE6DE878DD670176B85F69EF2 3C5CCA1BD2B8A385F113EF1CE522F5A6AE053B9C1E39408C9459DE3E7FE2C4ED 77F026B0081BB80D40185458139C16333EA27F43EF1204BFBF80BC5301B2A3AD B10F7EFBB4F5B7E04DA1167F68BB6D4049440B0F57385FF0A95E72760C6A12F8 1335BB31CB74081FBAA319180DC00113CF50CC5A41D2E751E055DA1429CD75BB 0060C21CED634FDA106C49A12B356129D010E29F2919301AA7F80222AF3905ED 672FF85C9897A70241E8DDB9A53034B6BB44E140D9E739848E7A782F24B98AC8 00DA09EBE4532787E5CF3ED815705F659D8E52DC2C2D4949374A3BF192BEEB99 1D9A90A4F3250BF8A1FD40D91F5B34AF2CC561FD02FED712500B24330D87DA9E 4AA46B6E34BCB40B1F73A1DDE07E002B9478E9651D2BF85E67585B6ED812BE03 A594874A235B1C1840C4BF4BA6D863583D8C12DB49EF7F8CC24DCBB6B21FBCA9 378F3E2DC406291AB324571F76E0805DF8826090F0E8B50599CA58D124653D16 16C782B01C91A6F3DA6346482E3163D28D95EA49866360147296838A3FD0CC53 920F91D895F839CB61FFD2FBA296CA4C6304EEE579782AE5FD33D0FA652BA7E2 CEC7C01DD0D3E0D56E6177EE5F609A396F7FC8EADABB465DBA7F384E215C4DCB E64F807A50A461545107F9C3F7D7CC7D33E6EBD6D9228B1DCBFEF160703E6129 0DCED8D45DD54E2A36E698A616E7906A50901E453BDB2A363EB77144E9EA6F2B 6BD927495EB0EBA5755165707CCFBF8759CE5856881117C7F3EF6D494EDDA7EF E499BCA56C86467AC573DA9C2724FCC74BEB331E736FB093DCB67DAD42296655 415D110F2729BD1D55E5C9CCE2E724116F45FB2E66AE0F790258851A5C808762 68B8A110BD326F8D3EC45004E7CC08DA42F6CB80A6B6E7C286F139534A275BCD 2F812993DD9C9A1AEB5E7E4BDB4805DFF3A7030263AB060C9B74F0C25C5B9005 965284884450CC2815DF28D5F9B0496DC7A3AA85E1E42741E1538797175C28D9 FD904699C771FB066397FFDEE8E8DD1ABBDF67E6BFEF95BB700A7C1BA91354C5 42EC3864F6E19B379E79A1CC3C786C0DA146C6B0B8E507ED58DBB1F12F613A98 0E1F8967991427A22ED323901C4B83336CD343212131E8B59C2F5D232702ACC5 7891BFD4EBA5D0FA35AEF9F3520CA82D121BF6885BBDAF15248A9E4649ADB94D 0735CC4D14E1D7275427D00C8E709579612F7F74DB6FC218C10C278CC63E2AE2 37EC996B10C0229D687F0DB5E38A8C4DAFB3DD8A9E7ED37186FEFC97790A1EA6 636A88FA9FB4D282234BAAD301A1F3AD33F252C5EEC49410562FC52809CEC466 A0F6D148E9AF19D6DA2337C8283FBFF6005C37AAEB0B7F7217A8DC6F949B9984 72DEF163E4D5ECE4288404448C96A7FF0AC76F732D50AD63A1D286C9180E80E7 C218B1F48E3034FCABA6BF262CEECC284AC29E9F3CA1CFC1639A681ED66C1FBA 666F073D45C84A286E05FF809D4764FE819B6A330E73695CCF2F448B4D4EB4B3 F63E94EC289807A2F9A1159CF328C002B467B19D6E9454CCE36FC19E0A214190 B251818DD456EF658B0398E275514B72D9C1DA5F806EABCF1DD56BC025D69FC8 A0C2FAAC1892B64D2AF79EA2F57F103CA623E440307600D50E783FAA998EBD40 51D23A0CEFF8D8649B48B982DC38D613F882DCCAE5F51233A641B3CFD783F830 D984F116DEA3ED8F0D3369AE629A006BAD4523F8E3C7C6B39A6C972508B67AE9 32613F28CCFFC4BBC86CF31A0C25C786554F7A1F3DE97F5CFD1A941F775067A4 784385E2D02EE1FF886701B1E87D966D3F500E15591A5012E645837FE2DBE3E6 A3D375C6CA0ADBF96B33EC3FCFFFD888D7344B31D40427B8A8BED0FEC6FBE038 1FB5F0714C4B5A0E607E215B5B7F76ACF0FEAA4C9790EB7E13C0E3933B7C63FE 5B934EA34F4B741C3667BF1735C685CECA63507E6FB9EB06AA010311F12AC1AB 4CE3FE8D1EA1EDB3C700BEBA516FC71D740B1CA1A60D4578003973CC3EE21DB1 58FB1CF7E2EAEB2A4A6C742EBC3575EE6378531C6EFA6E6986E68B8E25CEEA67 A59623FC1ED2ADDA9D72DBA627D179E47DC7F5551E07EA4D54ADB6CC8109D340 7279F288E552EFD79C17DA3431E53EED66D16F24BF86468C2FE7EFF421560500 12FB048D6CE2F370BE4E560F8B4AA12362ACFEBC839351C1D5100C625B14CFDC 747B66082D4AD5474A63EA0054E9C3E6295AF6B133348487B0471395857F4B73 4BF8337DCE2FE2E1A4EAD7E7BEDC822BDDCE42B79B308C11897C98E3ADE253CD 09CEEEC0CB1DB66AB072E36E1E04911F40B535B0FD85982C21B8A587D65C38D2 DBC5A07A0A26DFFF7460F10781069490AC1B611CF7312A14B4AA6005A4582C5D 336BCC30EB47749193BE8D457A43F54204B070DF5AC2057B6437E23705C7FE8F 7BB150560F7044BE3E48EFDDA539FEEFB0D2A7856CD4E405FCE0F5EB190D91AE 578E2EDEB9ECA218573BB1A8EF116043A27DD17A4047BCCC7C5F3C563A910778 45ABCA32C7347E6180ACC86F9D665FF025DD8AF514FC3724B5C3510F3C37E0AC 5101D1667C6ED4E8F37F06CC2BDF66CB5A9FB7C52CAD26344FD1557571336A1E 1E340EBA149B4EB99016D1A411FB874914AAB2A415CE3F5FDFBBF5AFD7959B9F CB127BDC68D2A2F3F07FF3D4FF32046C0371CD2E68A6471E46B08413FC3C7A80 A107EEE57979DB387B2206D2810DB310B7232B2DAA385256C8A58964B512003F A0C24ED21809E2576229627278118107B9C32345C1EE8C0CFB452CA362379369 31320DEB5371037AFAD093B61E8AC7A6DCF7D49C7F8EC32DC0ECEAFD7E892810 039570D2956289B15E078C2545911BF535F72F7DAC619BBDEEFA855BBAA81704 18F7D351B0936357085A32157AD8E27438A58B2397D69264E748B0B8D01B33F4 D04DC59326A7DED39E247A1C1A1AE49382BDBDE9478A1CB48F88BDF14A268B40 A40B9FBFC4C87FD3DF1EB2464C3C14E36CA41E09EE0A9B75FEB0769F9ECEB1BA EBF73B818427FACDBC33BB95B9654F31C59A766E931C698A8608F15290FCDBD3 5C535D9036A19CB7B55BF54E96F9B2206DC71624E2E55FE632FDFDEC8757AEA3 1D83D190ABED5E7A7AAE2F41FCEBC7C18626BF58F9E9F02FBAE0C8AA85E9DB21 A3D8907522DCBAE4923C6A2A09FD2F08FE32215C544AB577B337D929E625E704 E041C2381AFCFEA37F3133B6CA20093EFD457C772E428325E56C9CBCC447EF9A 05A8C3F28017DD4FFACC51B38E4896C5044266EAB4EB7C13FE855E790DCF8A17 B61B1D30DD866BC57397EF6297C4891451FD6A5C6AD6D7446F58F56A68650908 224D9F4C31C6906FD29BB51DC947465B808438E6260325752808963C808A4AAD 60422ADD62CAF315F6AE92FACEC55D5B682089AC0BC051CE1E2C06A3874736CF 0DB5F7C8F178479E4F11665402781D80397C75456F5CDF0A4F382A19EC6AD64F 71A9275264800E178F212269154DD8352167C57EBC0A38BE794AAD1601C8E541 7E1AB8E969A76E1EB4092644958FEA2AD29635E70C4DFE2EB0D9B3E1644FAAD9 B27AD5466EFAC724718962B62E7B8C32F412B69DFFEB792587D571FB5C591D95 4CD441662CD1B07595E245FA537FA9EB5A20A97E5C9251EED22C9961B48B25ED 85BB7524F635F9CBA3714C6D60A6BF920C45A64F4C366C1F9D22F53084997C9A EFE2D79FBE3347111F5093E271DB7E3770B35D253DAF93653F6A23FA145AD775 AF11E188EA0428137D9A14542E3EDA6F7B2E5AA86C9F3D3649A85ED2F020C696 01A339FE6D7E42BC548C8F92A4E3809C67A986C99418772403D16D0E8662595A 1F37563671D6DA0F36CAC99DAA8FEA215DF7D45E61314915A30A22FCA86A50D5 2FF2EF08E240F9FAC030D92BDFBE40F1972DF413E6B452024CD11792BFDAA2D7 C82716528AD4B3D637BB43E748336DCC86A952BE96F1EA423E31340FCACDC1EB 02EE932F58734AF3A5B2279361B63F1D824EE3BA9F4D2EC7B33A300A1CE8CA43 24616444176DB8099D85AC68329B1F85E4B5B16F3B396FE2AE7774F3065D0203 AA140DC128D6F935C44733EF585F89E8639A2096A225A2E5E49D447D8AF9FD44 CF6C1BAD5C5E5262AECC5543EC8199B00B72BE32A0F110F64A1D0D5CCEF38FD1 155D6198E9A343702F8ECF5052333272CAC2FE016681E12745CBE14E1065EFD5 407DA3686080989F6F6D650A9F1EB3A813B070C30C0D3B4A1E9C206E2E4DFD51 D8DCBE9AECF956640A2E79F1B4FD0EB8E0449AE1B8FFEBC43275743B4D7F6605 0673B61EB3189E74F51F3780A91E6A5C6464C8CF7D563D9958D46F39B1A12087 6BBD4898BA9ABA468AE1F24115891FD3CBC2195F75958E26DF8BF1B93F7B521A C12112237AB23A8E5A7B7D0DC4C53692B35F3CD813EB463C0BD3A6486B0476C6 3B36DA71FE512E5745D097FD4AF5D056E434DEE2AF926B2EE79F7FC4FEFD4130 BB4B4BE01E5C720325A4884507CB51CBA4FFB615B78A4182444F0ECBE4161A58 E86FE1DA2E39C2BECBCF1F1D7B9B776A26078FC252128FA8108CB83F673CFD37 CCDA493234FB93E1550EF8D2DC049ED95B00A8A57834B024B277D3DF062E748C B61F183F2D72AD075474F8165528CE75E4F40B38B0FAAE45751C1907F8D31619 E88EAB02EEED415F3EE3BC5BECC6AF565D34E0BA2958FF337A2B06012DD1858E C53DE52C108BD5AAB76C882198C72CDCC958D68EA8FD26F76F04EC1A08B2AC3F A6D0E8724D2656555DBC0C8C42A3E22ACA7E1BC8E9F897D9AB692E0FB9EC32EC 59E31CCA4516A3C3BFD5411BAC3DEDCE374D48681CE7D67DEAB93F5B5C5290AC FEB29C5EA2C98095692873D36C7DA24847B66F31E4CA4C7AE5C79D7CE4F0532B 78620582E3731A2A6533A03E7155B33E7CD142FE79F72721862EDB24959B9783 F834CB616FFCB2A23497BA6D99AE34DC459A2F7B3E4DA2B54BED118ADCD92178 66C40F4E60F6E1327D5DBCA645A2A7C770807E6D7E47E1265C753F8793BD2D1E BDCD749CC24D4AF9315A93F01180A0F9A7F420DA1B87664DA5FD967131273271 9DCC45C3D57EB9B8AF14771E8E751D88B98D2FFDC72F5011D402EC34FD010ACF D3B0660304725191D64FEE106253FCB3470F1A16EB7B45C1489D3534BF94F740 C2781DAFA5E8A9E7B25A85BD7935DF3ADDE08C960E283D8FC3976FDB4085DBB4 B6B35FB239C28C785B18BE4FC98F3A5F410F562DB5FCA04E8074E4E790F4265E F88117B3D0833AFAE6E8B8A71D7731BA6F14FD6F217EDA3F8CC687A494FC3914 B84FDC37C8C335AB1E7E0BEC7FB6B7A595C50CF8F0080C8D461BCB8B579A5155 F963B6587873FA31C3A6572740C63EFBE58A2EBB723B7517D2A243F6CB08A038 54F4DF0F6692022B2EE8C6F6B73735ED3166BAC58D9216A06EA6FC7B63B20031 D0F0F99D83D9030B413C2360DD2C553E34BD67851B743C3FDA676AD63C5BD759 9131358C6BCDF05FCC048F4EBB9005899ACDD8E9EC9BB8C5A08E83485047D263 0ED69B4D1869A38068FDA03524022A1D32FA2AE0BF728D2A654E52B6A6C90A3A 725F86627D7C3EC5AF5AC512976D35FE42AACA3FECB401788D0BFFD9F4743BB2 EC5B4E7891F216DCA5A69E917A171E0069A03FB214ED307DE947225049D46E0C 4707503F09811A597A9113921AAC23AB1CAA9866F81A02BDF349FAB129F23E86 E384C043053055938D42ACBF9F0EE86CEBEB011BD5BB7D593104140E6AA9CFB0 4E0B47C91E504BB6A95B2CBC36EC03BE01897C3D498EB30FBE4BD9584B9D766F CB3CC7C96FF46D3095DDFCD8F5E62795B9907B8C19AF413AEAB8977E08F2F125 65F30421139AD2E57A997E79582A34C195CF9721665976289D00DEA1CC064F8A F2CA911F6A29FB107FCDE29514DE8E0ED6C778C91320A95D15F29A86D7D7F66D 9DE59C354A24A6F2902CF1EBAD0A4D57BFBA226A3668634B39695A008E743395 319CB7A55DD38ED03F0368225BE3A2EAC1B9975C0007DA5C40663F8170F13B96 CDA0947F2C371687405C38625A85783B972469D50F8DE70F8A648C1E38930FB8 E7011C371A0E0623E4DCA1C40FC17B326DF89B5DB6CB3A4E45496D22537656A2 C442A2253CCBF4475404A09D93DB7DB6C4A52BEC00F00D141A687076E5B96A95 386ADE86CAC13D4638AE817EC49C82B8F90897A719886054AE4630699C7C2C7D 96C307FFF4E9037B734D7FA828F8E94C12A3E028AF5996E530524D22385A1D29 6CA1554C59DEB01276F5A823A6 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSY8 %!PS-AdobeFont-1.0: CMSY8 003.002 %%Title: CMSY8 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSY8. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSY8 known{/CMSY8 findfont dup/UniqueID known{dup /UniqueID get 5096649 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSY8 def /FontBBox {-30 -955 1185 779 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSY8.) readonly def /FullName (CMSY8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /minus put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD 028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A4D80B73E7B6CB7548 0E1D77FFC695988391DC44AEED8CC947B3D7E198B9620E2238DB3A2819182F03 14498B8CDFBA48926DA721920B221FB33BC21A8456AF10891403501D0F6415F0 7E041AFFE109F640E54FC1A365674711EFF94E752652A4C8DA62CDB1149DB899 2C4A4BD77A06E81E93C5698C05DD02F74A0756082738BDB53003B483752AE498 DD718AEA8F3FB5A6B7E2D2AE8F309065F3D556F9A34AB90C88833A54295E0982 209C466A301BA3372AABEE20D862C6DC6B6FAC1463C8CBA8AD766ED1B4C9D712 2BECB4E6ABF558D8AB5281C35726BB8D046982C0DDAE17BFFC9394125E4E84C0 B283977D31460B8EED4346CCB09F64DA0ACB640C6DBF32F2DC30D54668C1CC12 24C7280593088E9958C047125C323E9C842801346A9CE5F50413D69F6DE99471 65D2E387765E92EA4C43F17B467DF6E266D92551009C0E52E7219AE9F5E2E8D2 88852086FF3600BFB50AF3EAF8C009D8D5F084B510F792385F328F7EFA8C38AD CDAB2EEDFBC6AA45F6DD7364C2F02DD2BE6C79C8361E83D4267CEC2407689864 B57B5D967FC80AB3BE8CA43955FB0FD3081D438437559AD24A7ADD484C1E4A77 B00BDCB0D1B121FEE983412E1EA5489BDCE5DCB4A7310135956B230C0DE7BBED 516369A92BC41FAC8D73490984942D930DC193BF0C774C1AEF627B969EE4B001 11381AC57815D7581E2372A1DB740B09F4A7FB4318B765DA4E7B44E8805CEF85 44EC3B10613FE7B397BF91B69A5CB2E9086D1E7A1FAE0A9ABF2A237A2D29ABFF E392A18AEACBF28274E775D3FBAED4F46B982B9DA4602E24094EDCCBC9D6FC0F 67C60376879245606C0B9C9A678E8917516BE1CF097B1C75C9F0DDAD6899F08F 81FB7A198D45FE060CD2A550D9B8D58B882B969D7BC3EC018A1FE92BDB262835 26516FF97AC387EA525FF987E5EB1EAAE4EA5866C9CC043D183763C530F7D7A1 2070E4044507C4E5611FCC117FBE4396E0B24F672CD53D5FDFA56D561FB86D40 90A52A7C7F29A119DFFB694A8C445367746A49CA5FA83163BE448EB19625DF26 609A8C8672631A10411036CAA3D6C2F822A4B2505DCBE8E1CE6916AE515E78CE E8C894B134BF811671D17C19248853131DFFAEDB24B15FF17EAC194662460642 48D23515AD434C68DF56753806FE96DB3A29F9D4980E0B6EAED7383F9FAD2584 8F85679D6D1933677ADF5D31FE6E43DABF137E834A1DEA632D36EA5728625159 8F33348893C9D1C510501628E4A9A80587DF6E179FAF68B158406A3EBCD726E2 AC17F2DF8B3607072824D2E5A6479F7BADE32E603E54E7A83BB2DFDEDB0D80CD 1F1BDD4F6C9025CC3A8A3685DF10A8183FA80CE0F0FE2BFF2500F76B1037AE41 56D2D7FB468C3CA7549E3599A2AACF66302572F1B35BC8EF7C23F6FC4B720228 1D673D903111CE378AAE83480B4DEB7EA84BB35F4F7BE997DD4FFF5A9B5E7650 3C7365BA0965B242DC369D03215651184024A08EC284F1798B0726152884B4D8 46411B3BC8F5CB53A70AD53BD7B1AF23528849B56CF2F75609FE715878CF6448 38579380688B47AE3D374B0DB6ECA5B8284414090123D47F3F9DF389E023F431 6B4C0DDEE4190DEEF4CA772742012754DA9A44A8F550FADA6D8FB0C512D5BA2C BB7DF71B1DA41FB6936BA71B710CC6A80751E43436F0F5888F51AB370DD4A088 40F402661E08732C960705C7E0D29B8DA1A8A3E119409E51EE575E9655F47568 023977917C8EC610BEBDB9C1F4EBC192084D63EAA00EC87B53E86620BB5AE51A 579B0F8E1972CE1DA02832FC75184F45409DD9D413402C2FA27BCB0AE6DB4CE1 5AFB114E23232DE07C4674969A1FC94D152C6D3A611F029ACF4D949A2C0755D0 31C7DACDBB4DFCFAF7E87295CCF5D4AE28D87ABC3533D87EEF1507B9FF9063F7 F007DF03734A20BC3A198B049000C92D2849C62DDAA719FC28EB372793E20128 D786670E08948808BA45C4F6AA0DD8A8357CCC47228A760C5C7864853BD9C9A4 285E446CB72C5C9D3F03FAB000810DC5674061FA116153040743E846506CFA67 FA8770E785D7DBC7293F37389A0859CC22275B23C44B57B92A033A7BD194340A D6BAC6E103402F8396A5394C617CB2A27D9500921D5DA06115EC81715EA8E360 4A95DCE8689CBE268B8E6C8B806CFB0ECBF634250243C9E1AFFACAD65311FA4C 1DB0988203537E5EF12B86FB454D06CF05E4F4FC4143D62920E99304245B6ABC 82E21192BE94F5E980DB21E07FEDF0EB0CAF4ABDFC20EF08A2A44A7940E2862E 08FABA516152DBA899D6CA561EB08C7C8298DD511084E5230CEBF28AB1D84C85 B5BAF4616C28FE05AFA4BABB3BA03F8CEEF3F3EB0D3034BD3D8D06629B8E9EBD 72484057E71C9EB4DFC7C2CE7749271AC926C2419D618FB0B60FD6F81F0F2C04 E529CC74DCC9E4AF32D935D7CA65FBD0842A7BAF162D08F782E65DF3AD9EFE69 198AFA9208B22BC21BC4ECABB9BFFBA84C8421B74748E1EAAACEB59E566838F2 C439579D6C75074F94493F7D5C8942D881AAE6302C37A61003AF77684EE99AD7 EB5EEEF050C52E75E4E842F8174470FA60CB213BB6F257EEB26CC55D1202931B B981DE2535A87CF37BFF912220C117EE166CCAE58BBF624170FFBC0716726B36 304D698F2CA131675F7B1199E6581B8C812C4FAF75814282477BE2B7EBCBA7C2 FA6356B2876F89698C6C2493989E9EB252DE03BB374622A7C88B8EE9FEB4851E 02F85CF70CDCA7BED5EC94E81170FB557C3BFC6F32CD70B506E56A2CC5451592 130C6F570C679577C44D60A811DCEFB3535D855259B1021AC168DB76DD38B459 F1813E3DB20AD9275D58880CE94058490ABBBB0D8DD16D4A65F680B30057F15D 07FF54D779CC978E90A850A2D8D79961EE276BB26B594C16F56557435671A3D8 ADD3DD0BC4BC73B0652B9DA8462FE614A14A11ADB2214EC4910823FB4CEC8938 24354C5C62547EE5710FB5ECD93AA45DEA7411F6CA8D5B5FA222685E622AD73C 1BD5DFD1C8F253352D6C7D14FF2FACF07CA5EB11392C6A33E9CABFD99F743BED 55E8DEF49E07B9444171D1780C698E5B65B540F41F845AC188DC7C0C8B5BA5F3 546BEAAA4F29F0DF30D5AC12A60862742623100074457BF2D820DCAAB340C1DF 22FF26992DC02F276B40A7C528C84B72CD189A4088C90070486C49A1014FDDA3 5093FC12DAF309FBC063653E6A33E14EB51B081126AB5BCB8016E975060B796D 6CBFDFE6CB9E191F12E309254BDD6660E3227012F5DADE246B02B6D8127F1EE2 248F48DC5ABBD229748444420C868450602120664984FE3A8B2373232CE5CA15 E67172CAF7EA99F73A66AE33B1EDE5E8351DB02497CE3338930147873D4E46B5 E918F5592A21789FA9F46232BE693DFC33240E2649D6AC1940B101D806089436 F0CE230BF6D0363510378822891DBD3EEF3365430E74FB6C994BB40C8EEDA593 CEDAFEBC3B87C7C04F52FBD7D557A77B44855CDBEC8A8D26F44D66446B5662AD 15B6B79D13BD262D79BF51C09F8F690A61C7F11EC2E05F6BEDA273648E9E1EBC 3D5F1D6ED486797F753064ADDA8494405556D43D395B1487EDE877CCC1EAE954 1AEE2513DDA94897B733609E8179DFE1975590568202EF20D58A89B34874CC3A A5579473AC65E0EE61545AEF578ADE10BE3FB3E2CDC96678F613E4DEF7BC1B38 8A551C93438A0540E292F65F1FA73D9AB30A5F545284085E4930A570C1807995 7108AA8194607304488616DD4AB189F8EDC5F4507AEFD7847817A8ECFFDD2DD5 DE95E04EAF2774F8AF661827229F01E769A32734097C457EB6FF056D90C46C5E 9F936AA6BF2EE8244BBEDB8862E56423F5845BB10C8809730B011D650EA18945 83C320A3F4ED095A5EF91929FC877ECC28A1C2CE74A53245E629BF46C6534983 307B1C94EB35CECDEE86551F0C308F66690E591C5D9D8FE14F534CF3F5DB6D32 39D7C799F392C4E65759B7BF61F4D8312E3B26C31466206A367A0DD7A90D25E2 805D36ED5CE0A4BEBCAC0A348FADD2D2AAD670E28BE6E33F627B4A9F35078B1D 6688084C4C18840673EF9B3526172EE14EF64E97C8B006C27DF6EF73BA6E6459 3608F10EB1EC4B824DD5360B42AFF2084788B165747AABFB2C9C0EBBA9C6246C 08F28143809315D6268E386F09BBAC54C34213438B56C386B34AA457D149CC39 A3C163F56E3C2E637C63A79CF7F2DE969EF3AAFF75F3F20499A9ACA61279D545 866FFE57D25998244F448AAB042B141952BD653007A889B1A716A4042CBBB827 C1ED5E3C616C22D5FCB39D3B3539F9B71D50D25ECD2E5D953C7A5194C867DDB1 75CE10B2C3A20E8CDE15AAE9F549D034838DC066CA649C31EE365D46450AF18B 893748D055DD88C72391FD92DDF0AA1A1316051BC756F87BC9A425019B2FA7BD CA9F35E89E2229B3021DD24C9DF0DC3217F44DCF510116DDC9E92EFDA3E0A892 491C8961CA484BA29B8CACD2FED2E246FA7414F892AF7B9F08698FDEC82D2E4D 8C6ED1FD9E0BA2645663E7E97B0F780033D025F2EF3B364574C03F04FFC4E09A 3D4182BBFCCCD8CA54A92434E2208803ED36F931D31C7498B7FCEE4B78AECF11 B27123A10F031F9CBA36066680E4748E346D18FD0EFA395D1A9227530618ADD9 64D96C50A0172F712CB427E8F7170F8A1691FB95B247A271499F0E63676BD64B 167438333A3BD9CD9641AC637E0ADB17F1E394DF34AF5A2BD02030DD087BBA02 E1209338B74075744A9A9966039AB6D223F385E06FF359257913E6C01BF32F5B A3640C7CA41A6C51F296E50DC1CD1D68491CE5D75E0ABDD4C5C4A97C8BE2BA35 D91AF9F8F38E7AB8C1778B06A212D0416E6137087329AAA2679C51D014CC4DEF 0F1543E2FD97621E552E19B29AA1368CB5046C188BA59B1E1875B25FB269DD2D C0678A42CD310702465694F2BF302AEBC43F714F7C657505132DDA71CD23D17D 628BF3400EB5DDFCE2850F31B40C5913394649AA4241CF646F3939916C2077AD C11F8C3E478586AA7931E327333FCD8A2EB31DF4B47AA2F31B999556602DD998 5848143C0CBD0B5187DF08E675550F2384D48C2954EA7D16AD2B94DF97C194D2 302CC47BF968CB1F6C9641A87525D5C6972ACCA1D4A4B4DA8EC54BEA6E7312B3 2737754A9FCBED3BA5F8220B751506BB0A5BB5CF706AFCC04BFD713A3BE3C842 9FFDBAA0CA5691D0FCE76134841A169970903843163DE68FF09649E99945DB64 491FD6D8B2DF237DBAF550D1B74263B3BF1EF6211F40D4DF2DEC46E4DE557088 5D458A7CDC6F34B8C3F5C76582C8B7D24A333AAE0B43CA67436F8ECAD7C50B12 35BAAD521033D8024E4DFCF01580AEC63BD5F8ADB778F822AC4FF0DA608EB7CC 1A52A51B9F38FFADC0D2F4D8394C5D598123B483AE5AC1215F24F2492EBAA134 3C58AD4E3B493AABDF753EBF1F04058C6981C353D6788C2D3294165B667D3765 7883A8493F5D772F789F73979B254BB9397FDE4F8B76CA6FFF312F4B012949F4 3EDCF1AC60FFF2681549DFF430B498405E79CB407DADFCEDCAB1E2FAD3B0F4C7 B575A33EAFF9F67D37F50BB06D06834EA683862991C5BE340D4A7F8D131E733D 289F72977870F9958102F5D835739F0F5A642E7194E8AF7FDA2937E5C0712CE4 EE15CB475725030CE0F238C32775D3EC95CE3D0886046E3EEAE322F59D423E83 DE88DDAB5CE0F70537487EBA5A16A9306BA7DDCA14A85A9F83B3BC3600DC9421 BDADA2704A5A24F7174A3A486ACE68739EC5960038CB44D969A594E97AE1F42C 42C1B7E3A456B3CDFC7683537B337AA8777F18CA45B22C8BEB18877DC624496B 9E8EF9F386B7FE4D94ABD5CE3B5786E76FE04A35909C472C04654A4405932EE6 A4A3E0F6DB088603FDD82F0EFCB85A962002A662D1AD0647A2F484B59075A1FA 9F4327D542ED7962620B998ECC3A95CE736089593461CED9B5AAAB05C2DA3820 5AF29B32904E1EEC357C8E282189C6D8F562DB11291091E6897E24CD8F8E2A34 67F35D261E01336152E69831B0CC6B03FF1AC7EA22B745F513A25FE10F70E74A 3FD71FE1EC9999BEDE7CFA6A97EA2DF621711BE950FF8960965685BAAEA71FA6 36F165573A0A6A92DAEE41A9B0C97BF03419FF6BA1F44524D00FD671EACC4233 9A857680DFD27B9F1E7A760058C8277B3761DB9969241D1824A7DADF70BBFC38 89C6DB9091E3BFCB36851CB9662B365A4B7384BDBA1D385902D1E5DABA72A159 63790096B927EA49299AE03E41C7F593F3B995D1155E91C62D5F68845ED3C797 7798B56858F96C2FE2E37D812873B7801767082A6D6B60602CEB94B7F6D7A142 72814734DC584A18D1FFEA7333D4C7E2DFE5B91E9AD92EB52533CA52FA888980 C79FEEDF0FAFB3B20B497F9AB668BDAFA364B405916526D5C48E57DC30BC35B9 BF684FDFAD199D9A28541327F3899AD505FBBBBB22F419E22E0149EE5FDD2B43 AF442E2724EC16934C307FA731F90AD1C76B74569B78CDEA7C19808233C6364B D049F3F50A68D3EC5F29F2B96BC58C44AF90FE13F244B7129F14B5DAC3F3F310 B330E67CA4EB76F895DAC8025F11EC7630EEB4826B5721348FA38F28B2AEEB1C 5F7CA413C486C94B1DD96988F07F7A08D3635E28624878E55D4FFBEB5E183CB5 93014D8A272EBCF3A09133603CFFEF43A6FF059BCE525706D3795884FB495748 C8AFB50DB464459A5C36D7CD087631BC09C693A11BDF1C6011D9864FE66EE8C0 4824A42E97D16E017C0BB73732D4537E2A5BB283B3568950E5681364DBC1D6DA 058A122862A44ED85029A7B39F2FA7C362D859D0B429E056891339626AE6091D 74F6110CA32F8F3E9507216997E6AD1A2F1FFBE8B407C9880DE230E234F6FD41 A291851178BEAE5DB9DEB22E3443807E2BCEF12A4AE8C490AA9E3D2918329F47 42314CD258A0760DE5FDAC4AF7209CEB530B8508B278952A3638CA8491C3B493 516F461610DBAF32E923ACB834B15E2D169A10F2609EC0ACDF7BDBC777DD2C19 2DB330FD557D3B06B78824D6AB237D8F2D57A7ED35F02CFA9290ED6893B41657 A2485524A3F1642FF5808FDB77015D9467EDAC4A6BBE8A175833B1225A5554F7 2C60207F7A2632A4023255E8EF1F38C1B8216C9B03319B60BEC9799E5378683F 46E698FA75F2DFD40F17C603F3335F1EC70DBA1449C7A33EDDD46CC3DE4A6557 EE67BF349AA8680FDBF415DC527129288B5879500180F75DF80394EC7CF11BC8 9EE9A4ABD64DE3076A2963F83FA333F19FF74F79ECF36A87A31D6F125FD2415B 3F6A6FC33C179F54CA164835F3C3DB62AF444BDF27AFF23098C7212477F688B8 6F48D9AD080D544D57FEDD33D3D9AED9346CBB644C97C951D4AEEB2BF6F0CB18 E2517BA7ADCFD00FE44E290E731D53E5C0D762FCBA08004562DCE6A5EF2FBB74 B3053CBED3B6E896B1C3356DD9E8FCB69691AAF6BEBA0424D62B9F266D560B40 89E20A9F35AD4A7F65A7183761ABBEE0F7EF26ED3565A25516A3A5A57143979A 1EEED8CD52A69E4E1AE4795F3EE0CA21B9F4D166783A9AF54B08B6C56703932A 310197E328C6E6A6BADAA11D66A952964F31FD690082FA02D1E2A4512A9F2742 33B203FB770A3A1C7490ED630D0FAEB3066429D0237E18818EC368D0DA72EB08 1951C70139EB0DD59EB53AF5039A7618C77F6CED9F0A066FED6FEE0C0E328351 BA39746C1224A29D191D8B86491E0A306ABA070CAA2756C3A33990EB6DDF34E8 06EAAFF94AE6686EEB06A17D6D020D1F4E59428D533DB0EDA6434E6E1A478D5C 2A0D08CB39DA7D5F5200199FFFE3F41729478D4F63AE01FC0BF3B378FF6402D1 CCF1BE5F191BAEAEC7FE400C9980E103D8776EC196E741AFE11D249E0C277263 80FBD329524C55943E25631F113FBD8331C0044A7A2138637206A7941CF02590 577043EB0F205392C34E18B1ADA47CE63CB8F01365A044CE570FA20446102210 F03C0647CD0CC29E28B149F84C2F39256EE1457CDC3862C4082A95B44A61E8E1 B4ABAD32DA3E2FB8D849B1C5CEE60F205007464DF38712737776BB6BB3223941 95169B5BE578BA13DAE40B19AC184CB6F260A1EFE13CC8438ECB56EEBD30ACDD 8E24F52934 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMR12 %!PS-AdobeFont-1.0: CMR12 003.002 %%Title: CMR12 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR12. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR12 known{/CMR12 findfont dup/UniqueID known{dup /UniqueID get 5000794 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR12 def /FontBBox {-34 -251 988 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR12.) readonly def /FullName (CMR12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 40 /parenleft put dup 41 /parenright put dup 61 /equal put dup 65 /A put dup 97 /a put dup 101 /e put dup 114 /r put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9C535A5E57376651 F6823308463DC4E0339C78699AC82C769542FD3B410E236AF8AF68CF124D9224 FD6EE92A38075CAAF82447C7AF41EF96F3ADF62F76FB425BEDE4C4124E7B1E0B 8BF254D91912D3A99557F5427907A56514C5A3EB961B94112077FE9417B70DA0 B2E1C1FA3E1D6F01D11F640CF848E45BE3E205258E64FE36AFBD4DF4E93F6B1A 966C8E7FBE2CC8FF43C1F67BF6C361678B5E90F4BA524FE8A4CAD6AB28183E6E CA6C9636E884845105595A2E40CDBE8D4807A81AF4DB77B31873FEB221BCADD4 2C4669459704CB58A7BC230FC59F867EEADE660E49AEEDEEB042BA9A7DD8193E 56C3A36A1F639F7EA512EE4BC6992F52C2FC82A890EFDA730105B0AF7B819295 EE00B48F64C2B5BCB275B1DD62F289CDAD4AD9B7EF057684642FA6FA6322C277 E779CAC36D78F7779CB6DE12638B3C65B70C6B5F8A8C6421A379719B8DD44973 5F52856A4A29B2ED37F2B1FBE6EF4B79B7C0CD6395C756A00FACD763C235914F 847D1D99831023CE1FD89EFEC83AA7E313131C0C197248605EF5BA773D0A4000 72F607551A8EA6F0FF19441ACA179177D1FF7B423FEBDF58B0C19CAE3C10EEF6 3538D8FC4762B77C5AA023A8186C40D0365A4487DC3564265B3DF908572DEAA2 57E29EC669DD72974F806EFF5ECAFA9ADF1F9D2A63087FB7BBD100F0F81C6FFB B1EA1C9DD46548AEDD147EE64B1B4894972DAE1DC3E8569D6A3CEF9F9E46DEB7 547E10BB2959D374A33E47C58F1B20419920AB485F166062FCCC08EB5CC9AC88 F388F0C0155027B727729488E44CCABB7064A1432E179189C4627453C5231535 47D1F2B8BA43069696830CBB6E5F9A135CF22D3D1FE490A3A63C088EA32FF444 24A2427BBA63033DFE2E06DF8CE67949B6AB02F26335A376B57376814D2A7DE7 64A4347577EBE9A6E33DD2FC214A09C6D889C8FFBF1D567032548851B8F97204 49E215CC7D222F593E1EF1439ED60AD922D41E0E9EFB5CA48F2FEFF75AC5FEE7 FB6676D8B8D4DB6885FBE8B61B586313E4DAFB09D94CEDC0507E93000104F3DD F83865A2C6F6A7DA8562BF86F5DB233CC9B53391273A1462E40876A8AC2B098A DBADD5A160DEAC061F86A5FCCAB495EF8A9D121AF07928EAFD56F618E4EAEA97 CF89A3AFD406FC9DE1E9769C1E1EB83BB883786BC075EB5DA2692CD59C4DD7C1 7FD2FF9B18AC740A390C1DB38670DEB18C67721A1DCD502FE7368F47DB4281D5 459B3F020595FA3B10544AAE9EF786A0645FB7C9BB29D091E1432CD878A05918 1665643005BFD9A4B0FFD347ADC84CE22D6F9AD4EDC05E8C7179DCB360AB57D1 6ABCD200A4B4AD56825DC345984D9A3DE11CDA5E9EC1E5006EE4181E4EFE0846 67D8C27BEE8F84A1E01947E945BBE988702DEB2240C4BED952E433E5305484E5 71965D3DE95C4115FF78CE9EC18E323C599727C8B93CDFBCD1CCA780DB8C81ED C4B5E596E1603624308972FFAE9A57B0EDB51FDDB6E23EDE2946F61BEB241345 2A192D8CAD53E823D687F9C64A70A4B4B703291FA6317C051DC6A44BCCE0288E 3839D726A8F2E39BFF429865E95C726E808E02CD06F36C1CC9AC77999F8E28BF CE9D74B699CA982479E9D0DD98EAB24D29C981EF0349721D6819549A39413801 F80182D567EE316E2F0AB208068E15693E4C399A381BF9BBA625E597E6E109B8 16F3A84C8EC92F2ADE288821092A421A8D3B907048FE947230810F0777EE2542 29A3485223FEA079B359034F70464DAD2F0E420271A4E0CCF57A0ABBC20AB327 0CA71B292126D395E0D083B19BEC6B48A9DE2BF470C3D01A8C3F52075BD4BE02 A0C518355814478202FD4762EC542F8E7B9B1F7824F0554660CEB83E35635E1E DF0D03C94C903ECB36B4948ED98B6324E0094EB1DF70863142D4ED3A932D7346 39D69F8F044B6084482D7748C27328AFD24A3A70B99D1F7D32CB984488672254 28B6A9E9DCA2C9FF6A1B311D72413404B3CE5428BDB7FF3C36357D7975184F56 FA6B32AD54C37D0AF7576663AB1397B80D4E998F0B4C4F6D90B483029EF2EDA9 D4C4204C1546EFF3100629453EAE01918D09FE104E626ABA38646F17B6A94CE8 116BC7A8D9C319434CA5B830859B4164DFADF1D7C3ECA5C78D8DEA930EA4AC3F 59DBBF3148C91A2E807FB934E3439D4F67C6DBBA9972854E6E3688E1E0A34B74 482217CFE031CD7B5DFEF727C3EF8DAEEEDA08F4C90289E62FB2AF2357EB2E45 4BC547980FD479101FFEEE477AAC6268DD659E8DD9E244676FD3C6909713B71A 323B211E571BE711D103FA23B5B9AF077D84E2D20FEE805E81D20C03501F0F17 C3B081946CD0FD577F00E50B76CC37CFA97A61B89C25DD43911B28857284BEBB 5BEC61FFE3A14C64BC5425A7A82326617F6F1FA4FEAE56071C9F559F91568179 46369B394A5CE96FB7420FF8AB7C61CB83492FA5AE4A4B0799578594C9EA67E1 E54498AA5CD6ABA34AD3417F04F5D8D664A7EB39D41E2D17643CAEBBCCD9C38C C5C9541641A09335EFBCE0D276A54253EFD68141807A66F1DFEB4BEA5889FFA3 4D20BD52012206A9F8D3E0F6AFC03FDBBDF3E51506EC6336E249CEFB571AB84C BDF8E471E3795C04E38A5306BA6D450D72E50910D1AC385BB06CCD4B8E433A32 5A4B7FACC976BB31FCAA1E62DB2C4FE06DDDE7367930E336B49F47DAD91C8735 9A35D80CA2E117E86B52E41E9278046ED923454989E48610ACB3B1663F197117 52659A9D7BFA561C7ACE0771794FC778675F83C5EDCB132AF124C7E6540A140B E0A268836C73A3C746DC964E482E63C56C0D396515283970FBFF182F9F684FE2 655FD8F5D057D22246DDC3FD11B77552DB4D90ADBAB77BBB1FB1592129DE0AEC F822D7D36E52BCDABBD560B403A5C56C5E1BE789C3AC049318C7FAC5E5861E42 FD66C3C0F46361078D7E036281682BCE9BBF77983C93ECBBEBA9B359769CA442 87FCA1B98F4EEC4935CC93B08AAADDF355C99816453587310F08C50B9BA3D107 5388A1F3AED2AE32BEFADF0285DA90436D1D7EA85D7B9B6DF2AC4B778CFADFF6 6EEE54D1A1C5DEE3CCA7EFF57A7C2931933CEED90CA26DAAB45E4388EC4DC366 B9E88518D6CF094861D2A59282044CC06E63EFB390A6DF4BA5EAC7CE39E1EE03 3D84099F5BE96612789AF3EDED07266EF10A0FC23EA1EA97040B6BAA63138B1A A9CB8F5DED781260962D7618EDB200C3ED976033E8967A8CC676E9C11F74BE34 343A7ECE7EE97E8F76F7E95517A6D6163527406EF5A669535CB2BF4031F29046 BB2D0FFFB47A576F5EAB1D00A582965C56F28C00B3BB7BE2CC8D8391F789070D 775EB775437F0CD53DA840BB3575104B63E4B0BF14E3F14B320EDEF65FD4CAF5 8596DA491BBCF3153DED3B718F833D106432DF8DB8B8E6B34D5308C9010A5DD0 7E0E53260BB84BAB3EA748E8D72F75901604F80F4416920D69B4B983DCDB72C5 E9928F01A4A85954FD74578AE336C782CDF81D1EB7EBCEBFBAE7ED8AB4862584 397928F502D65139CCD582CF0723C5262EE54B9D2B8C39614652A8A90E1C3B65 7D26B99DA298FE4B9A7E98848F619C9BB4FF9FD215B72F99506F06355B332689 37D80AFD9F9ACD8172CDC51FCD3A759ACA0F7D4EBB07840840EE42C2D5B8B257 2C6DB3A7657B75F2F0B9730A20112745703E2D0FE709436CA6A5F36F59E64D9E 37C0A23D6D289E1AC1DA273872F5FC5C3DA2B127F078A4D7AB3FD7E124455817 DDC796D54EF26A1FBFD539D3A21B86DD4477DA49213259ABB3FF241424F2BE5F 89151E02FF87E0BEE26E85C0E518D8BE7CC9214B8E9A9EA1DBB49C6C212CCF08 90C0F23E9858947EE344062EBD9C574979087439975EAD4E85CD7BFAD3C91CF1 EFF577843AF1427D06CB2F3BB519ED1591974218C43F0D2038665F9E2E3960B7 FE68CD3CB2DB6B36C7997C6B21EC11CF1DE049541001FFF26D14C255E3AE862C 5A5701292FD2FB3D04523D6E2F3547923BB117718DFB6E6520F0D0B5450C695B 8C9242CC8671B7284CB2E1E9EB097A3DB1B4D5E8EEB93B4DC7E38C0A10474665 54DDCBAF079B92EA494F6FA75A84C5AAFE280284D0823D7C22249A21044BB0E6 4062074ECD17B62E03EDF4945A294BFEFB51F5FD870D9D7230FC91B83C1D85A8 86CDDF326FC90E04362145D6E8630C50594484FB829DA18F5C078F2EE67D2F2B 08DFF39AE2E8C9741FA989AE494C7166F122D2C5F71B97C973B7CE8500E9F87E D59C30F2E99CC4D34713DAB680598F41955FBDC26A14CF1E73D6BD6B9AAC8D3B B998F2D0D647356CD236DEAD6561389ED3A6746221B0CF15D6648412B35A6B54 6A0EF5BBB34AA376D9BAF025BFC650C1B74333CE85413D0EBB2F4D082A26A5BC 3C0A25D2B12CB159F140E00E262F1CFECCB2C802FF94CD34DA0CE9B4B3830FB1 DA85B9B670D5169928990A2E9CC869891CA2FFAD9774E6B92549644DAA5FE00C A5BE4F5FF91A0B6D2FD8F96121D766391EC4ED3E73DADD476B7DAE1A50AFCD98 DB7E27E44D30416088D9BC07D4661D9ECEC0806830ABF14CE55AA3CA2DF66E8E 748B8ED46466F1EEB072AC0674FE6FED231E0DDA59ED7C42BC05EF00E176050A C4834D893DE42474EA20DB1E25059E84BD137EF65A02CC295B0FFDE4CDE95879 0FE88BDF2519ABAE7F8CC3E6386ED35E04A14F1E3861922645E3A3F43B48A5AA 1999A5EFE192515FCC625C829FF5A7B337AA422F5E920545F9BB269C869A821D 6C4C26DD2AE746EF0F0B4C1E7E9871ADB5270E1CA9BE28225F7A0370D4C52422 E25263EE101C4EC1C7811B05AD42F364844A56BB91EE72FC8ED53CC6954D2BD6 F945D739BE4C61E36143CE890FC0CBF2F610018D678ECF7CEAB18FF5A0E48F76 FDE2463D40A99380D679B3B76D39C664F4992D23E5988B0D1AF33DFB04894016 E852EFD1EFFE586153C0F31ADBDBDE3F73FB49C5EE64D0D02E1504248FAFAC3D 903FD44679BB09C30288139B41B1E90A10139CA3172677250B16535A1F3E5E4B 6F4264DE58896E66051FC677030A121C5A285C47B6129CB5A3998830CE070D21 2F093FC1B44089F603A21F45F60960F134A47226874C737EF6C085634B0A4A66 139420501351F737A73F39D960EC38420BE46E5B09D298E7C16B8E32F01507D4 0141FC52DA1DE718D634AD9C8B00E46EEEF84356759324D2B9A3473C5DA38DE9 E30182B87F91B6A7F7BACF29A93B44C879CCDEDB063F9D2E51E0F1FC9F018FE1 2433D85AF24B55DE3A61C4D0A2DA4FDE933F5F6FDF17E9FA9932BFC46E2D71F6 585EEF5B2E4E89E797A24B799D7F064DD1A817A53677FC9EB8CC3E7F93FE50E8 D50E3191052943FD6C98B573BDD1F6D70349E1F8011599E3F8FDF1D6E80A710E 51E434E85801617C6FD8ACCF1B77B4BFCCDD35CB4C0367F4EB4D8D9DE8284D5E B4F43E2F8320C2C5A9AE90ECBA7E65D377E91DB69FEF27069235366AD3E126C3 A73CE97F4C90BA00D206FA012C327FD69EE59AF4470A315B1799CDC0539BF90E 512C8FC3BEFE4D1B01D969EA9E3FEF976CD6E0FA4C9ECEC955B265CFD58AB8E5 F7371E479279EE14B689269205C5B506940606CF3E24A1E7EFF3CA96ED30AD6D E243DE57690C3D69A401AB3315FA49E4BF4ACD4DD1CA39272533E82EFDD508E5 1C2CD286CCC5DE1202C7C7F654521750632EB637F918667E2233A43DF75239EB F28F3129EB5DEE2FC5BFC331FF709B0FE9B327CBBCE98BCA2C861C6547E50407 1218CEBE6EB5F9BABA4F2E11BCC6FB553A544A567B459E06375102C69F8018DF BA6A227CFB13E2D74E6A521E01B74F2963E9A0A1C9FD87A88EE6356E3BFABF55 BABC751D2BF85E6712E8EF57914920775906662E4BA68FFA21AD422D34E15578 43CA0568B431101A1194F8AB1EF25E886BFCDFC10F4A5EBD9530816548BC298E AE4A0B6B52B8B59C644C409B4191B6F4203F52314F2675F02AEB65A72C66E92A 2AC703E15D8D381522C0AC30C165B822A9B8D18CAECC094EDE020756018DCF51 D0701B507519C4270B70D8CE94B436F640C15872F9B5B77892AA3D110E4D6A65 8F0815C61A5127BA25815378683F46E69E54A391A8675977E7DF9C2D4E6FA991 9F029E50CC2F266B31EE9F9F24452D5838905F330CB7E416B8AF836C5AC26AB8 BE2ECC6EA4BDAA08C30995709E225C21D35DB6369167602CBFA8DB2697635925 969002CD1BEE745DA2E56C17EF3F0C05E3847147F86963C37A221C8827195A8A 3D38993E4939AC915BFD9A212F5FF3F826F742B952018986F9FBDDB69C3AC65A 845F7F33C55D4BE60A1817EBBCA7E1538E8087E1BD5C083A320D52953BE65F31 E8339C612A510B59CE48D2EF7061560C4AD258E7DC59694493E3AC878246F37D 6DE89253EBC8830C6B209E818213C4AC4CF1F391AD91D57BE76FB0E2924A1407 E4A949C905E44F54EAED6419F13D59942C8079336A172D4758BEB5D3E786FB93 3CBE4FD2EB53E4E1DAC34E821EB30FD44BC6CB4298242C38F848FC23AEDC9733 52BE6F32E31E25F18301370F8936810B0566B664B042C7AE0D78ACF0A87E5BF6 F9B66E358168B2CEA30DCD940074F3ADB793CDB136161FE2522905E87B8E463F 95D4DAB7E14A3DF7BCCE8141C5A08FCFA2BCE9F2D1B05A7642E75877EB840149 AAB007CD239AE47AD115929427717F219B0A8907F0EC79ADE1B901DAEE87A2F8 39361DAB43DFFF69650F601B24061A9353CFD619FF9626F63275FD09A5B13BB4 8B3379EC4D147C41197E8387FC04DA7BE409524CEF74EA91DC066808A7FD0EF3 957A44E2503EDA67B1C61827479486134E922E560A673BF314D601C66003CD07 55569085AFC8428389A140EB976CCFB8F29E27587E46C413ABE2EFB51AF5913F 53EEB74063162E0BA1E24CEDCA320377D3E11BD374F0B44E132A5C35835B6E2C D32948EF9DC7931D104C1385709DA882DED6458319F21C2329938396BC074106 CB9CFB9E0A915F8DBC8435F386917AC87A2BA45D857EC30ECA66FB4044F5439E CDD556B82A0E43418D179AD883C85AC276E1190CEC242E3E1D86E725ADC39E46 BB6C47FE9E17E29F8EA81E870302A00D91434F3B7A05F243176E6EF1082541A1 B9052191EE5C2B8E94A2E02DB65FC769653CA8D1C07A13CB853544AEC7FC35C5 218DE3128AA31952DCE19C55C23FD69BCEA2C661F57B11B8F9E86BFA718D1521 3346E78C701A5E51923D6D937E62FDE3669B214D240538F069A100A542720A86 31DE88116DE775F7ACC2A49EA6C02A24408271A846990669F2AF60AFAB4C16F9 7F4E88E917F0FFDCE68F22998AC0AF2A60A73258C3A4BBC42A2F918123128195 196D0E150D79AC3CF4628503D1F3FC528265ED8324E56849A47B3B07C29940B9 1BC270071E221D355EA51E9942D3BD7F99816304FFFC8F5B036C953B38759341 ED5D7B9C8E6B70C409DD8362FD291201CC385E4A98D73E8518A4C0E544152563 82032FBD2FCB6E403D34B85ED4053A8CB619BDD4DE001F4C3007B1F317579651 E6D6662189CC2D95AB85D7473F65C5D7B4AC63B0FE928F3400035D5A9D443D0D F3532B99F3AC26CB25EA3CD64C341159061E02EFBC7C033C05CD919BBD827A6A BAD47EE10B9AECC871B76227228CA161EA7B61DABB252EF91E607AC8D3F85774 DF0B1507B60BF52E4E9BC0FD04400A548D553D4A6EDB247875E0A2E013685C51 D23EE8A56AF57025AD67D929CE8BE791BE91A4C4D9F00DB8B4F16252C04F7BC2 02236296A9052306639F4672E90E3B9DDE466EAC17E200523B2AECD6C05A0A83 66D4EBC86C0DF27B789D5597FE88BCDAD2925CFF60F5A8EA618FE867857D585A CE25A158AED63B8FE391030C518693AEC75AC0AADD0C11B0065E2ABCF51132F3 82E3718B9A9FAAF727F2D8286177EE27BAD040C66D0D2D7C092B45D9330265B5 6B5C8E29F71C9EF548BFA4BAFAB242B26455E4B7FC1882D68E408D25E6F58EC3 03AE9B7A5F45D61E02D0AB82AFBE793D708ABEF45FEE865969895654C00A5FA2 093A297AE74BF625A96FD85F58FF994921C9F1276635C8CB65FECFEE37C77BD7 FBD692DBDF1079AD35F8A8198D63A3526ACB37FD507B639B1E4E4B9F5CF7C0EB D6C82F6C0744DB00237271FDD51C3689D1D79F2B876A309705C0663C50E4E4B5 8DFACB0C8D61E3D97C0EA231ACBD46BB2EA31EA37F2595440E2FD1E74A4E0EA2 B634608228883BCA642508FDD657F166F5AF13CF8B3854938B9EB74F4BFFEFBD 3E6AAEDAC79D2F5DF17A135BC07F7E1900569397AA50F92CA49256E1E3626940 EC87937436322B2D459B7932086720E40D3CA1A89C6F0B9082F6473E2E03730E 623C9D7AEC559241D5B857A6864A7656C8B5B1486052A1950B96A9E07009BF4D 22CACA43BF9DE9C60C82FE251AEA55FC46149EA01EDABF24F242EFD0428BC511 2D97F2384EA05B9CD082C14D3C7BAA96C077E69F9F224D327600EBA9A8E283F5 E79D9DC4DBE7D4C6D27E30F50B88E625A3038E9A9542CA266CE58585DADC2EBA 769C6C4F3FB28AF32DFCD75147B2EF3FDD03E0A9FF6BD9AD302413751CE0BE16 D10F9B3614868A00711A6E038AE633093358F44B9DFE0DEE815B76EE9F864668 ACE76AF30396BA17C7AC5740EE4098B7EE6C1C43573ACC6819F44A15C6705C17 40A7AF4466D9A2A1DC80828382B83A55C652B6C5B05AAC400F9C442897DB7DEB D7303F917F03AB0AFF002243D6C4D6338BC53A3E2D8CB6517E22EDCC352A5BC6 335319D504FB0B70ABC35314D6E712F9FC9E69233FC886645F10AE06BECF9E81 DF5FDE31E3394FAF7F5B2CAA817C9C04099ACDD96ADA159A1BAFD3BC580FD614 AB1103F418ED2B7DAB4C434C6ED1EF3C21B899448E31A2A0202F0935BEF1546F B25C1BA6C00DCB3F2A2308DA417B771C136745EEDD97DB29E18A7B4227C81C71 63B4931626B5FD85667FAE11D7DC256DC01C3DEBCC59DB2FB154E0BCAEEEF649 43EBF20656DD6DBB7993E932C841B577681AA2A392128B73565FF8DB4E541B07 8822BB1142AA11989D9AD42FFB67B7FDFC540CD9F8DAF6957FD0075325807288 0395CAEEAD87E3BEA1539CAF535CC8361D05FCFE394B9D308E7CF517A47D35C5 3250DBA070350F8FF0C315934C9C8AC6E0A68FFFC092C57D4651D5C063B44221 BEDA0C08CAFF65C7C6210816485D29DA806D6C83E4B45263325765714D23FCEE D76C88FE0327323296725DCCE4CE6F6752F35A220AC0B23B1623C926E2AB38C7 8C6445F87952793E98BB9196F6D182B93632E57A125E1F9640558007CE3F9360 D55445D29C15DF53A58832964B553EEF3E7BD14F7AB1887FC7DBEFCF77290094 95AF32C5397D86192AA1CB0EA6E1F40293B7BCF95B75702A7A7753CB1B117BCA A917F9C3BD90BCF6ECCB6A35B94DE384D3C56CF9A798C6744E7F2E22BB15B4D3 0286A274B97CC9C10C9E1FAD3929466D02F070B980AA397F44344475781A7C56 778F210245850EF8EA362274729C74093231B72166898C3D737A781CA628253D E3E567DCE91824AB90EF7A12A9ABAA2E947A82A18DC082EA4746861C448DE464 0107F2AB9F330A0FC600FFD77F2753A53E49030BF845075FB0A5D8E707BCF211 8EF3C5AE13E9B44543BA353350E4737A90FBB0CAD101E4116829589407036733 0D8AA70CF5301445BFA91C7E2B24D41616 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMMI12 %!PS-AdobeFont-1.0: CMMI12 003.002 %%Title: CMMI12 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMMI12. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMMI12 known{/CMMI12 findfont dup/UniqueID known{dup /UniqueID get 5087386 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMMI12 def /FontBBox {-31 -250 1026 750 }readonly def /PaintType 0 def /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI12.) readonly def /FullName (CMMI12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def /ascent 750 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 25 /pi put dup 101 /e put dup 102 /f put dup 120 /x put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBFE3573BF464E2BE 882A715BE109B49A15C32F62CF5C10257E5EA12C24F72137EB63297C28625AC3 2274038691582D6D75FE8F895A0813982793297E49CC9B54053BA2ABD429156A 7FFCD7B19DAA44E2107720921B74185AE507AC33141819511A6AC20BC20FB541 0B5AAEC5743673E9E39C1976D5E6EB4E4D8E2B31BEA302E5AF1B2FBCEC6D9E69 987970648B9276232093695D55A806D87648B1749CB537E78BB08AA83A5001F7 609CD1D17FFA1043EB3807AF0B596AF38C91A9675E2A53196FEF45849C95F7DC 182A5EC0EC4435A8A4B6E1CDBF9A5AF457564EA72BF85228EB6FD244F2511F5A CA9B71A65D53CC06EF5F7EC3A85106139A4D312378BC22183C09A229577B793A 1B7422611C03E84BF809F46C62CE52D3AE29CE01C32B202ACDAA5B72733EB0AE C31D7EF7BA88D2D14F85313F7A8B9B7A5B124B03AB923744D336C969E5CE304D 3AD977A46664479EDEFB69F113024E761C05FA48A54072DF9E12C2F352ACB3E6 D04F6EEFFDE209E7FA3DA22E5B1D1409461F4286B7F4F8251B44E5CB7805762E E129FF4A06A7458F3191926B1CAF70E32C6571AD2DC07C34FF62840896F4D200 761B1A7FA356526D1E3AB4C542AF13623BAEB9F61B1BEEF79A9205B1FEFDAE24 8799D516A9ACC30BC0139C63C9A0523E9D5439213B67D490C96F902958779B8F 68BD8E9FDDCE8A3A2E35877DB6C94B7612382ED8F218EB1157D2ADD090A2448D 10B99FBC9211C5629ED1C61C74FE93041E5AA03EA4AC3FFDA00C2B6E719CFAA4 262FE17F66804A6B54D3669836EE4367D2A2991580C5564463C973CA0DA38AC6 922716E13B4A807B50304B8826CEFEAA47C305FC07EB2AF25FA7945797237B16 56CDE17AB0834F5C97E0CC5741B061C6FF3A8DD1A79B9A173B66A6A750538E26 32FBC92E75BA15CFFE22A7302F47908547007402569158F62C29BA2956534FEA 7DACF1E507AC309DAE8C325F2A6023D2FBD81EF42146BFCE6A16A6310A650460 7B07BB7647C8760FADDF0DBBCD3DA6CC4645D1732DB3A22D8B76E1D2D48E4D4A 46F4BEB80CE65F3517283A1AE08391FD1C10ED452133706BC6725AABC80107FD 754A8BA47B0281D479F052CE26A723EFFACB79B213041A536542AB334769A2BF 88505D82C498ABDD5A73EB539530F47CAC52825D16A969C8BB56D4A7F2830B8F CB63B92B576E7BD922A4B25E634751F8A3B7C4EBAFCB373EDC8B8281B1D1371A 7844E9AD990CFF09F0D7ED73A5CF873D2D5C9E8A9923CFA31E1A4B4CCCC40760 8B3AC8FC3C88BC08BD7407725281BB879A1A822D94997826418F1B89D303F2C0 BE7A0102E6F529630CBF1BC5BF3E4578C164A3DDE45E62A957EF3FB7F0FBBA6B CA1E79A1ED195B6A11CFB345B663C5E72FA55D80476F604F6C4257B51686AE25 8F7D159FE605DDA0AC74BAA5034F29FFFD403070013C6E2D8EF6A0990D91173B D5A3AEB98B64E412991505C3CB7C2CDE13C091FEB3DFBCAF30C4C19511102300 135BD5D444BB55692013F52056908DFAB2ABFACE81A58423ACEC59344CEF7D4A C5A3EFFFFF70759BC3E593D878281225060B97D1BEE6B26EED90571FEAFA1812 1115C0EEC892F5DE6FDD68321A0B3F10A2D771B79BD85476AF6018472A499A86 07D64CFF4550866AFE590C471C80EB12CB3A989A60BC7BED39097C12D9286E39 14C7952C4C64820B4DE44A1827B7B0B535244E93FDB80036D6332F90F95B472D 7031E7E3819E881BD0313CFA112EB3AAE943C99C47635CCA7E34DC0306C04E5D 2E9F60FF037EB11602BE74E8E6B711392E866E3E55D988F7C856417A2B9C186D 639819B4786D039B77F8578EF63C088FF28BD08D8353031445C8498A8F445BC3 D08923D32AC04BF3CAFEFCCC1E77EA894F4E846F47EF62D6841B8D8576FEAE8F 90044626869D04D61D64D56E8C51AF8C18D6CC3FEF3B6C4F7D56FE3260354948 10104F69B117FB8269292579A7D52FED688C663B643D8D99F13956612271073E 1A337AED059B7A93819A28CDF01569CBEB51069D22ADAE25C47355560F402B2E 8C9900DA82B79C64497C8494F42FABE5AC41791C2010D98FB7E593C744F250DC D837DB0EAA4F75D0016970F3AE8359878A08CF9A697A06C5EA945819151265B9 1A12122B98F79185DF852257BB4798E7DC03712EA6ED34F6E6AE1476788DBC33 9229FADB8D581BE1A63F596698DBD6DB98A092F67197A4FD4A50B648F2691875 EE2495D6BB310078F516785A0CEC7EB6E8305FDBAEB1D15690409FE32DD9CFAE DBD3866FB63EBCAAB73E3E4BE5D7F3AA44793938AAF3F8341683F0790F1D46A3 60CE083F9BEDDA22E0639A92393960F86602216FA51E2754BC2F4CD0BDECE3D8 FFAB7E0E49613DD4956C9A10AEA798BDA1F756C755BEC12147ADECAB0FB73B7D 203A11D84DD2AB5AA98FD38C1C2573570FD49A4924A94A106D2A7D850E793608 FB135853E8C4204441CDBE697FD0CB330B1C3596F32D2BCBF263237EAB362D09 DA6F531B40384DC91F30674760CA7B64BA1968F6A7FC9EBEF431A1AFC5E76D7F 2D44DCB7F61C7F6B16196B3E8B47343F572DBA8B8B21B43E35BB6B2DD5C7982D 244FD4304D254D6CCB5E8CF70E77F50812F41A988EEB3B26BF0F6F69BBA18077 31134B5A5823D10FEF6201D045AEE7A24E0F25376E9FC66340C56C05F6CD810B 724D85CC4BB8D789834A447CBBA159565D08BA5793D8599035BB5063271518E8 F6C50E7DCE71B1D186270DDC860C6DC0CD506010EB5B1FDF6BE47A9A18CC15D7 D657E58BED9EECAD5CE5D49F63139A39BC52C6584BB2C3264D51BD584B40F8EA AFCD8B83F548594386EB2B05CE803105E84931DC6E7A1398073D48E130E0D907 CD0F1ECC3254EDF5D4DDBF44415DC9BA66C673820CDB0FDF033D59BE2B5EFCEF 01FF9D33EDC88F8D522E07F1689D024DBCD09A16A63519E1764C8630FF36058D CFC07027E0ECDA01E0E85B166C613B22F587B4D355EB018BA93E92A36007B4DA 287FF5A91F7D8A0EDF5554ACCF45AC8066E88865C5692E63EB99CAC81367B605 8E6C19EB98EBFE0D2D161B447B9A70CDD1122C7B78A413369016E6D8481E2AE9 9AA97B5DD0ACC9B0820F7742CEB2F46F89F3E2092621969A88DC0156B4F941A1 6BF1546D4B136657C47B082A8A35FE96016BAF3D9679B8C32EDDD6AE6DF3BFB5 7854074FA019707FC22BFA82299E72ADF9A980AE29A8E2434277E58B01F6B03C 192E1E25DADD49F6E3F69799AE62B56E00B60A031BF8721DB8B2CB6D4A4C15CA AB1FDE010AB7DC0DDED977389B101B8E53A949222FAA126656E02817DD32B0D4 A49516CEC2B97EA7C78FD66229B044EB92F502384BCC6CCDFFF995EABE3BB7A9 50D5D1AED861E7D3BA8D333026C673C5762712E763E59261426044583D789C67 A606B96F97663F92BF104CE02FBFDFC521EC0D6670B7D4F85A229F51426DE912 3B729C4A535FB7C88D0A5E78074751B58885DD6BDD2DD9E9C83F105E8CF63DDF CA7DB39D0319CA7CC2E73F42747F007574DE25AE1538B4D493D22D0D5F0F80C6 5F6FA3937C8391DE2F0116F81DB2DB0EF751EC838A7F85F163A6F48804E84B96 8D715EF25B7E2A5CAECC558D80F421052A1D698F3B8452AC27E30A4E6226E3CE 084C8A83ADA0818A110923CF7AC7AD4CB92AE4ABBE0A9EC1FF935FD02774C1F7 92A278E513012AD17722A23C55EF82E18F8847B5CCE47F4FE3EC508BA563F7B2 AE56C94285A18DED4D432FB0CEFC05A20BC17DDF9FF919C724810A8ED7358A27 97EC93C1A13C443A91947FE1F6F528EA7B628917FA7E554A1D7B31ED46C5ABCF 92BA57961C8876DB4041305EBB029B03D8351D5E2819FF87E97ED214D8F1CEF5 7F7668DDE223721C0B810F4A4AC81CA4EAC86EAE546E1B15D91E626FB9A31824 5BFF17C4E79FD56ADBF6DBF01BAF6453A81EBDCB38A5FC0FD0FF0646B3B0D199 13E2E59A1B5CAB6DE5329BE389BA0E2A2AB55CA40B711ED746C24F1E48892E76 6DACF7DA163CDC90CF076763008E7A899870CDED5A80758E6177BE6B93B07EB1 5800A3BF7B9AAC3FA825CE594EF5B7546B181375FA8F37608DF17856D2F8EBD5 6030A9E6F6BEAF224AD2AEF76D03B023E2FCB922CB8E3C6816AABB61FE6E4F83 F21B4935102C860ECA03DBEFCA461F0E5B93E5A8D18440BCF7D1D6252A24CB6E A64FDAC8B67C4888519AA368D9C4A8C08C7155DF5BACD75C5196C571C3C456C4 7CE8D90215FA6EE8CDD72C48740F7F5930EC3632DB63A9C8D2DA125088C0F05A 9FC83D16B7F53163F4EB6FF372C6C3115F1E68EB35967D11126EDEDF0BF80817 E68A698183B3EB0A207DB43786E1B9D289359D75AD5E465328CAA90E712C2962 AE2A466173F2FF30EB535A6054BB0B875DC8552C16B49DF17CF84D98D35497BD F55E273FCBB0C735899529A69990E09149FBD2DDE64B7FA8D50AE83925DF03C8 0B63EA158FBABB12A028803DA4B9DD6C48C0FEC469C4E730729F4BB420D5B003 1918B4AE9CF35CFD31E8E62A44C0484E3D00143BF1D330235E821E5CFEAB4D31 7CB4604DB1F310457FCF9075A3527279644D908DE847CCD00B6F50DBDEF91D3E 38238CAF550FDCABA2C3A46237218DCC5A09AFAF69997E1EBDA7EFE6FC99ECC8 5D4AFD5EE35FE2346BE79B499EC8EC436868154A947D13BC02C780EBA4B9E64F 3026F1BF5DC1F8D64FEA1281EA40B4BC355638A3A59BD9055BCBB232FA45EA0B B405131B64F105814019BC55466EE78E9E9ABB62DB30EA452F7EFD7196C76A85 15B2CFCD89922CADC0F392B0C54A231F3999AEFB53C24EB0C63B0C8A1A1ABB6B AAB2F93E5ECC7AB90EADA320E918106BAAFC1F8C425C617639984629018BA674 6FF4F338AC43E23BC3740542911C058D43A49A11CB3A0CC8E3088BB5BA6048D6 CC2AD250DE956BFBE83BB24C945C20D9C22E7105983F284EF478F9B68BFB0322 EEB7D62802CBAAEFF1C2332159DCC7243EA40CE15C734EA905E04C476B178B82 A08ABCB0B86A7330C75E62EE7844C9E22DDB013ADDF20AFE08122EE1B930A81D 806A0F8CC584CB7FF5F56F9B35E5FF78FD93E7E4A40C64537464EAA275FE88F4 461FC6A467C8A69B9A9FBC10D44AC1B753D313A8E7D97F5FAEB60F82855658D1 4DCEE043C8FCDFD8A29DD091F3BA55874A458B2B8989F35055C72FC411382361 9AADC717E602B48D7C9521D3971A6F7EB19D539445DDE9EFBC5B58FA9E5E426C 172C45CDA24985FC4632287FC3B15849DEB56F5A061993AB10A6BC59868534E6 69888175053108B77E4978D971B4EC57224C0F93EEA4C15AE92254140A94704E ED5666FC06C5341F643F779CC88A9E81891565C63B6F7F6286E664F4E0A48690 356DC96F1B98026C563700772485B83BFA06435D4E0793EF822F423C93FBACA0 E5D889D2B76771C6F0EE997A5DB43C2F6921132890406E3C33F6F159B14C5D78 7C151BDFFDD02B697315F191B5490073EB418A4FF2A398C68D44F0CD1B87CF9C B52F12728B72F94D752D23151196A256908135C87991E508B8906CE2539DCA8A 31F86809C8C6C18A09F6129BD7CDC6B37E76B648788056851F22BD3E3B5772FF EC01D822B57FFDB3BAE624F05531292641FD6A7E3666152D18F6C653048DD7D7 98A942C840C4A0FA662F260B21C64214152BB86F03662A330109C5AC0A5EBA30 C6201F558858130703DF76AF4FBBEE069BDE45C0D9467077D85FFED4F9BA9C61 AED87D67CDCA453A6528AC5BA153E1039D9CCC556CEA5CBB542265FF54A1B208 E0E13740E7E7C26AA00AEE909F8F3ADC2726081A744D8EF6BB711BF5F611A900 76F91C26A338DA13A7160A9F42410CCEB3190000D963D036FDA05A29F598EF40 8FAE6F8E7E6F50C99C3304A573501C13A00023085F057DF331E3354CBE65D573 CAE73BF15B3B96B502E0AAF2B4A86237E98A997AAEFFF4227D5A26E8972C48E7 761F430733E6EF8AB2D903C17FAFBFA21C25F8A0AC157D397BF3CC1AE7598F0A 2BE4FB46B29443CE57F41FD5F91122E9D86F903E94D5B55E2BB95949C156D138 89883BEFD634311F9280C7F028DCA6408D3A682DF5B55B9F7ABF08F019190F60 D39E4F0E80F0594235B09A5320109638B938633A2C196E4ED2B43DCD8643C3CF C6123B076B7F73352F906D96FDE0FBF50CCCA432712C574D5857838BAC30B485 D25024EB254A7EFE57D1DF0892C275CDB3DF77602F0FED0FAEBC644BCACA04B8 B424DB125E487794CAB36E01B5E1A26F5E1E97A739AA36D77A12F5B45338EB39 AF36CEBDED55DCBFCF497FD475FC6BAB5530AD6153C6BD982564EE8712185F1F D5EA7ADF4104661168A01994C1FD773A50C8AD6A3E4D332E4D59521BB8BBC6C3 866EB4AC3EA4532477E6CBF6BBF0860031C3B916AA25E3492670EA67F55CF4FD 207C684A0DDB6F4AD21B2909CBA71BCE2E762012B0927BA72367A6AE0AF87F73 756C9BC85E4EDE35317E2CCCD138C02C7A8013AFDC1A48C3A4BB8EF257BDEEA7 60E012F54D12D31D18DC59D5E526F12567B8688B4B67E16B56713870300016BD A3B9DA87FDC865246AF8E94316799110D86B1DDADB8A673402D4226C519C058A 1D1E5A5778584FC28AF12819B1924060BC4F54B1054EA6AB0149E04B8C4302D4 A56D8A347EB5D3D2A0E12CF7E35059BDB53D9FF6BD25F6D9619BC4669CFC1048 C6C9978B8751B840F27D82A69075832BE59F55C1737CBB1220FB8FF691FDBDF3 03BD7D225A9372AC221C38245E48320E1CCF898D9EEDD678E5B8C65B7F588321 1A3953EEB9B39EA9A8CB72DB08C3E9234DFFF5FDF9DF804C021D57E97DA7622B 97F4CB6E0EB640E0DC9EA15C5193F92A3A7565F4C7A4C9CC327F7CD2C44900AE D9E76FFE62FC37FA376E77131B566AE67C3E09DA80F198BBB995EE8FA47EEDB8 4B467C6C7DB8AEA745CF8C56B8BE56534E9C56FCB2B7006426DFE93D728FA4CF 94F131C549814E54ECE7C914C5FE8E4961D3437CE7475D03534B62650F551D97 201C794AA877445DBEB11C85ADF6119B05360700F8CEDE4766E3A1D7A35CDDC7 9ABF7C619E3868A39D1852DBE1EEAF5D7898C78323873AC005542B68C43C5000 CC58F675EB595F87C879694751494676465891E8A897158B481F11A171CCBBD7 29603F00210CFD7FF31FE3D273933ECC34AFBCC4108D9B76D9ECE63EA06CF939 4799092A54A749DACB82C1424E9879672C8BC084C360014C9C1B6D5D65C68AED 66CE329C3AD712C0A36BE7EF03FDF339CAA2E0336D387A693B1DFAB5D5164E31 14755A158168962C9B399F8F1DF3FF5060D7464D5071058C30C572A2BC7DEE53 84BD7614A4BEC4C84E18CF7EC81C811724463BD46CECA5FB57B0F55EAE20CC74 6AD815D1897B037C197D2456797B992C20C70B663BF99FE28C513B4E221C8E12 49779F8C0AE8517048ADDF7CDF0D698E3EFE60071C4997B7F5EF12B6CB65390C 224F13FBB99FFC034C0710F05019899689B6D3350BBA65C7CE7C2AB03D81B9A5 5F3D65E4D462DAB189006669F7390A78A1B8908A4C913B15DB8827DFF15BB9A4 A6037DDB643103B937257A7DAB025F09D53FBBC2BCB6B0BCD8D56B2B2784E498 1F6CF8470DCC892AD0CFE11578718948BABF9C1427084643B66BB9181094E29D 5FBE37708E1D8A6B7518A96876844CB66954227A7A6AF28DD075A462526DD5D6 40EECC56FA366106E55C7068997B54B7F0D03AC1AD45D28C67C7ECA99DBEDB1C E18A79C353113E2E05B837E703278B202112B1C69E42A69D64B62F0E7D8F7E5B C1F93F0F99EC20EF312046F4B0CD7DAB31E422070B629A7FAE6D3AA20F6E3BAB B0B90ECC38D1125B6CE5FD3FE7DEB668F67CBF0D89A9C4746392E83E96D154A6 E2E7C14C2D30131D2E083E6C5D87F9C357CA8E8A7A94618C07538BC6AB211386 C644315FDBDE675F5F3CBF07920698300D557056E6E84EDC3A48DE2DFAD5A761 696A31E67FA12266C93639B4BDF627234BF4D16FC39D6188342C6FD885565980 2EF0112F969A5BCBA3DCC2291B1256AF839E5C3AEA9BA493732A0F4EBD347D21 06359A5F31B04346ACA437D86E52CE1338436371CB810C626F03F3301E605610 0CE38698E6DBF1E1995377C58A96B45FB997F72CD736AD7AE654A711BFF77768 0FCF8EC212B174913AD5CD8561D1FA2261586FB46F513A1396DA74FB5F55F7B9 6EF701A67C0044EEECB80FC89C829789984D95D93AF2F3A8717C53D1DA659A3D 03F509C0F7BFD1EA8E68A1F6F1DE55E5076E6187136D6020511092BA8FE3F093 FF9DA4D1A46CEE9343E51A07A83B234721E6015BCC998A03A8474122E6862724 2C75E303F4A08E5C1FAED95449E02698DD3C5D019DE07B3906E0B6BAA5290C21 393B73EE84B9BF5F95CDD62FBB789CD9C58EF58637F969F40F8F07435C27DACE 3851462FE779A140A20F7104AA38B4C27B3B4821D7A5555C62776499A0629869 0737A0556E746D1D740679C7239BAAECF22CEEEC4AE1C2A9CBE1F9D6846EE9E5 A7FC358C12BA40782C87AEEF5DA6365B57432043F954D5F0124716ADD0F484D8 DD4E760BFCF42ECB86F931081DFC07FF2F1E4760918B45AA6602EB3A459319DA 5235D8628BFBE2AABD9272349EE0AB09B14A9755EBE916A86C83500235E0B109 085BEF2EF1E7020C7986AAC2B0A5953A45D658ABE3B7A0463C0967F915B32B1A 7C2685B5509E4363C98FAE0CDB417D77A92E671322A1E4CC86595C39BBEDF8BE E0363D80AACF05E20864F4DF9D8D4EF804A00CCAC77E76E12FF29E33734D07C6 E881889727C51B25FC53F8CC4E1135CE4B1DAE898DF3CEB80B18F5227C2FA4E9 3DD22A14DA94661E7A93F287DA34F6822C0173923A9FBC24FDC61601C6ACE61F 76B41EC7C5F894AE6B78F549D4D60D627711A51FF0F2CF51C1256FC5ED6D73D1 0544DC7823C406002E180B708EDF1C6BEA4E652C2CFEB14F07509E4E32A205F3 CB962C4EA9FEAE806EBDEF78758B61B5BE0FACFA6888A6BF889D0DB66A105047 77A0EC2112061FB66CA4F1DA18EEE0DEBA48948ED2B693A1AF6B724EB2FDA8FD E1 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont TeXDict begin 40258584 52099344 1000 600 600 (/tmp/tmpy6xdnxcm/out_.dvi) @start /Fa 143[83 112[{}1 99.6264 /CMSY10 rf /Fb 205[30 50[{}1 49.8132 /CMR6 rf /Fc 135[40 120[{}1 66.4176 /CMMI8 rf /Fd 255[55{}1 66.4176 /CMSY8 rf /Fe 141[38 12[43 3[49 31[73 3[76 19[38 38 40[{}7 99.6264 /CMR12 rf /Ff 135[55 17[48 45 75[55 25[{}4 99.6264 /CMMI12 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin end %%EndSetup %%Page: 1 1 TeXDict begin 1 0 bop 1046 2963 a @beginspecial -108.558693 @llx -11.811164 @lly 107.441307 @urx 50.348377 @ury 2160 @rwi @setspecial %%BeginDocument: /tmp/tmpy6xdnxcm/out_0.eps %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: -109 -12 108 51 %%HiResBoundingBox: -108.558695 -11.8111639 107.441305 50.3483768 %%Creator: Asymptote 2.79git2.79 %%CreationDate: 2022.03.24 02:49:36 %%Pages: 1 %%Page: 1 1 /Setlinewidth {0 exch dtransform dup abs 1 lt {pop 0}{round} ifelse idtransform setlinewidth pop} bind def newpath -77.0744259 0.705833676 moveto -76.5603756 0.743355225 -76.0465381 0.783737714 -75.5329374 0.826979266 curveto -75.0188421 0.870262452 -74.5049913 0.916409597 -73.9914489 0.965822069 curveto -73.4772775 1.01529505 -72.9634257 1.06804036 -72.4499603 1.12437165 curveto -71.9357029 1.18078984 -71.4218456 1.24080372 -70.9084718 1.30476682 curveto -70.394109 1.36885316 -69.8802469 1.43690205 -69.3669833 1.50926737 curveto -68.8524961 1.58180519 -68.3386284 1.65867749 -67.8254948 1.74024228 curveto -67.3108616 1.82204542 -66.7969883 1.90856512 -66.2840063 2.00015433 curveto -65.7692045 2.09206845 -65.2553255 2.18908363 -64.7425178 2.2915406 curveto -64.2275239 2.39443436 -63.7136395 2.50281061 -63.2010292 2.6169888 curveto -62.68582 2.73174589 -62.1719309 2.85235652 -61.6595407 2.97910924 curveto -61.1440939 3.1066181 -60.6302013 3.24033332 -60.1180522 3.38050242 curveto -59.6023483 3.52164444 -59.0884537 3.66931892 -58.5765637 3.82372219 curveto -58.0605871 3.97935815 -57.5466924 4.14181715 -57.0350752 4.31123474 curveto -56.5188156 4.48218956 -56.0049235 4.66021377 -55.4935867 4.84537356 curveto -54.977041 5.03241951 -54.4631541 5.22672862 -53.9520981 5.42829096 curveto -53.4352714 5.63212932 -52.9213928 5.84336469 -52.4106096 6.06190644 curveto -51.893516 6.28314813 -51.3796488 6.5118547 -50.8691211 6.74785276 curveto -50.3517849 6.98699816 -49.8379318 7.23360586 -49.3276326 7.48742049 curveto -48.810088 7.74483886 -48.2962516 8.00964397 -47.7861441 8.28150193 curveto -47.268435 8.55741103 -46.7546174 8.84055773 -46.2446555 9.13053549 curveto -45.726835 9.42498187 -45.2130376 9.72644441 -44.703167 10.0344517 curveto -44.1852957 10.3472923 -43.6715191 10.6668582 -43.1616785 10.9926223 curveto -42.6438231 11.3235075 -42.1300675 11.6607622 -41.62019 12.0038129 curveto -41.1024219 12.3521726 -40.5886868 12.706486 -40.0787015 13.0661425 curveto -39.5610947 13.4311739 -39.0473793 13.801689 -38.537213 14.1770484 curveto -38.0198426 14.5577081 -37.5061457 14.9433325 -36.9957244 15.3332603 curveto -36.478665 15.7282591 -35.9649854 16.1276598 -35.4542359 16.5307841 curveto -34.93756 16.9385859 -34.4238963 17.3501873 -33.9127474 17.7648955 curveto -33.3965243 18.1837204 -32.8828755 18.6057063 -32.3712589 19.0301458 curveto -31.8555535 19.4579775 -31.3419187 19.8882972 -30.8297704 20.3203804 curveto -30.3146423 20.7549776 -29.8010209 21.1913564 -29.2882818 21.6287694 curveto -28.7737844 22.0676824 -28.2601762 22.5076361 -27.7467933 22.9478522 curveto -27.2329727 23.3884436 -26.7193775 23.829298 -26.2053048 24.2695953 curveto -25.6921986 24.7090648 -25.1786166 25.1479792 -24.6638163 25.5854632 curveto -24.1514525 26.0208765 -23.6378834 26.4548716 -23.1223278 26.8865011 curveto -22.6107227 27.3148232 -22.0971662 27.740812 -21.5808393 28.1634305 curveto -21.0699957 28.5815608 -20.5564502 28.9963839 -20.0393507 29.4067531 curveto -19.5292546 29.8115644 -19.0157176 30.2120276 -18.4978622 30.6068654 curveto -17.9884792 30.9952436 -17.474946 31.3781573 -16.9563737 31.7541792 curveto -16.4476447 32.1230635 -15.9341083 32.4852842 -15.4148852 32.8392467 curveto -14.9067215 33.1856698 -14.3931713 33.5241411 -13.8733967 33.8528891 curveto -13.365674 34.1740144 -12.8520962 34.4858084 -12.3319081 34.7863248 curveto -11.824462 35.0794801 -11.3108388 35.3618375 -10.7904196 35.6312957 curveto -10.2830417 35.8940016 -9.76935269 36.144369 -9.24893111 36.3801881 curveto -8.74136949 36.61018 -8.22759397 36.8262465 -7.70744259 37.0261472 curveto -7.1994085 37.2213911 -6.68552909 37.4011214 -6.16595407 37.5631811 curveto -5.65713724 37.7218852 -5.14314509 37.8635522 -4.62446555 37.9862535 curveto -4.11455987 38.1068793 -3.6004599 38.209095 -3.08297704 38.2913623 curveto -2.57171483 38.3726408 -2.05752901 38.4343864 -1.54148852 38.4756027 curveto -1.02867786 38.516561 -0.514444194 38.537213 0 38.537213 curveto 0.514444194 38.537213 1.02867786 38.516561 1.54148852 38.4756027 curveto 2.05752901 38.4343864 2.57171483 38.3726408 3.08297704 38.2913623 curveto 3.6004599 38.209095 4.11455987 38.1068793 4.62446555 37.9862535 curveto 5.14314509 37.8635522 5.65713724 37.7218852 6.16595407 37.5631811 curveto 6.68552909 37.4011214 7.1994085 37.2213911 7.70744259 37.0261472 curveto 8.22759397 36.8262465 8.74136949 36.61018 9.24893111 36.3801881 curveto 9.76935269 36.144369 10.2830417 35.8940016 10.7904196 35.6312957 curveto 11.3108388 35.3618375 11.824462 35.0794801 12.3319081 34.7863248 curveto 12.8520962 34.4858084 13.365674 34.1740144 13.8733967 33.8528891 curveto 14.3931713 33.5241411 14.9067215 33.1856698 15.4148852 32.8392467 curveto 15.9341083 32.4852842 16.4476447 32.1230635 16.9563737 31.7541792 curveto 17.474946 31.3781573 17.9884792 30.9952436 18.4978622 30.6068654 curveto 19.0157176 30.2120276 19.5292546 29.8115644 20.0393507 29.4067531 curveto 20.5564502 28.9963839 21.0699957 28.5815608 21.5808393 28.1634305 curveto 22.0971662 27.740812 22.6107227 27.3148232 23.1223278 26.8865011 curveto 23.6378834 26.4548716 24.1514525 26.0208765 24.6638163 25.5854632 curveto 25.1786166 25.1479792 25.6921986 24.7090648 26.2053048 24.2695953 curveto 26.7193775 23.829298 27.2329727 23.3884436 27.7467933 22.9478522 curveto 28.2601762 22.5076361 28.7737844 22.0676824 29.2882818 21.6287694 curveto 29.8010209 21.1913564 30.3146423 20.7549776 30.8297704 20.3203804 curveto 31.3419187 19.8882972 31.8555535 19.4579775 32.3712589 19.0301458 curveto 32.8828755 18.6057063 33.3965243 18.1837204 33.9127474 17.7648955 curveto 34.4238963 17.3501873 34.93756 16.9385859 35.4542359 16.5307841 curveto 35.9649854 16.1276598 36.478665 15.7282591 36.9957244 15.3332603 curveto 37.5061457 14.9433325 38.0198426 14.5577081 38.537213 14.1770484 curveto 39.0473793 13.801689 39.5610947 13.4311739 40.0787015 13.0661425 curveto 40.5886868 12.706486 41.1024219 12.3521726 41.62019 12.0038129 curveto 42.1300675 11.6607622 42.6438231 11.3235075 43.1616785 10.9926223 curveto 43.6715191 10.6668582 44.1852957 10.3472923 44.703167 10.0344517 curveto 45.2130376 9.72644441 45.726835 9.42498187 46.2446555 9.13053549 curveto 46.7546174 8.84055773 47.268435 8.55741103 47.7861441 8.28150193 curveto 48.2962516 8.00964397 48.810088 7.74483886 49.3276326 7.48742049 curveto 49.8379318 7.23360586 50.3517849 6.98699816 50.8691211 6.74785276 curveto 51.3796488 6.5118547 51.893516 6.28314813 52.4106096 6.06190644 curveto 52.9213928 5.84336469 53.4352714 5.63212932 53.9520981 5.42829096 curveto 54.4631541 5.22672862 54.977041 5.03241951 55.4935867 4.84537356 curveto 56.0049235 4.66021377 56.5188156 4.48218956 57.0350752 4.31123474 curveto 57.5466924 4.14181715 58.0605871 3.97935815 58.5765637 3.82372219 curveto 59.0884537 3.66931892 59.6023483 3.52164444 60.1180522 3.38050242 curveto 60.6302013 3.24033332 61.1440939 3.1066181 61.6595407 2.97910924 curveto 62.1719309 2.85235652 62.68582 2.73174589 63.2010292 2.6169888 curveto 63.7136395 2.50281061 64.2275239 2.39443436 64.7425178 2.2915406 curveto 65.2553255 2.18908363 65.7692045 2.09206845 66.2840063 2.00015433 curveto 66.7969883 1.90856512 67.3108616 1.82204542 67.8254948 1.74024228 curveto 68.3386284 1.65867749 68.8524961 1.58180519 69.3669833 1.50926737 curveto 69.8802469 1.43690205 70.394109 1.36885316 70.9084718 1.30476682 curveto 71.4218456 1.24080372 71.9357029 1.18078984 72.4499603 1.12437165 curveto 72.9634257 1.06804036 73.4772775 1.01529505 73.9914489 0.965822069 curveto 74.5049913 0.916409597 75.0188421 0.870262452 75.5329374 0.826979266 curveto 76.0465381 0.783737714 76.5603756 0.743355225 77.0744259 0.705833676 curveto 77.0744259 0.705833676 lineto 77.0744259 0 lineto -77.0744259 0 lineto -77.0744259 0.705833676 lineto closepath /Compatible .setblendmode 1 1 0.5 setrgbcolor 0.5 Setlinewidth 1 setlinecap 1 setlinejoin 10 setmiterlimit fill newpath -77.0744259 0.705833676 moveto -76.5603756 0.743355225 -76.0465381 0.783737714 -75.5329374 0.826979266 curveto -75.0188421 0.870262452 -74.5049913 0.916409597 -73.9914489 0.965822069 curveto -73.4772775 1.01529505 -72.9634257 1.06804036 -72.4499603 1.12437165 curveto -71.9357029 1.18078984 -71.4218456 1.24080372 -70.9084718 1.30476682 curveto -70.394109 1.36885316 -69.8802469 1.43690205 -69.3669833 1.50926737 curveto -68.8524961 1.58180519 -68.3386284 1.65867749 -67.8254948 1.74024228 curveto -67.3108616 1.82204542 -66.7969883 1.90856512 -66.2840063 2.00015433 curveto -65.7692045 2.09206845 -65.2553255 2.18908363 -64.7425178 2.2915406 curveto -64.2275239 2.39443436 -63.7136395 2.50281061 -63.2010292 2.6169888 curveto -62.68582 2.73174589 -62.1719309 2.85235652 -61.6595407 2.97910924 curveto -61.1440939 3.1066181 -60.6302013 3.24033332 -60.1180522 3.38050242 curveto -59.6023483 3.52164444 -59.0884537 3.66931892 -58.5765637 3.82372219 curveto -58.0605871 3.97935815 -57.5466924 4.14181715 -57.0350752 4.31123474 curveto -56.5188156 4.48218956 -56.0049235 4.66021377 -55.4935867 4.84537356 curveto -54.977041 5.03241951 -54.4631541 5.22672862 -53.9520981 5.42829096 curveto -53.4352714 5.63212932 -52.9213928 5.84336469 -52.4106096 6.06190644 curveto -51.893516 6.28314813 -51.3796488 6.5118547 -50.8691211 6.74785276 curveto -50.3517849 6.98699816 -49.8379318 7.23360586 -49.3276326 7.48742049 curveto -48.810088 7.74483886 -48.2962516 8.00964397 -47.7861441 8.28150193 curveto -47.268435 8.55741103 -46.7546174 8.84055773 -46.2446555 9.13053549 curveto -45.726835 9.42498187 -45.2130376 9.72644441 -44.703167 10.0344517 curveto -44.1852957 10.3472923 -43.6715191 10.6668582 -43.1616785 10.9926223 curveto -42.6438231 11.3235075 -42.1300675 11.6607622 -41.62019 12.0038129 curveto -41.1024219 12.3521726 -40.5886868 12.706486 -40.0787015 13.0661425 curveto -39.5610947 13.4311739 -39.0473793 13.801689 -38.537213 14.1770484 curveto -38.0198426 14.5577081 -37.5061457 14.9433325 -36.9957244 15.3332603 curveto -36.478665 15.7282591 -35.9649854 16.1276598 -35.4542359 16.5307841 curveto -34.93756 16.9385859 -34.4238963 17.3501873 -33.9127474 17.7648955 curveto -33.3965243 18.1837204 -32.8828755 18.6057063 -32.3712589 19.0301458 curveto -31.8555535 19.4579775 -31.3419187 19.8882972 -30.8297704 20.3203804 curveto -30.3146423 20.7549776 -29.8010209 21.1913564 -29.2882818 21.6287694 curveto -28.7737844 22.0676824 -28.2601762 22.5076361 -27.7467933 22.9478522 curveto -27.2329727 23.3884436 -26.7193775 23.829298 -26.2053048 24.2695953 curveto -25.6921986 24.7090648 -25.1786166 25.1479792 -24.6638163 25.5854632 curveto -24.1514525 26.0208765 -23.6378834 26.4548716 -23.1223278 26.8865011 curveto -22.6107227 27.3148232 -22.0971662 27.740812 -21.5808393 28.1634305 curveto -21.0699957 28.5815608 -20.5564502 28.9963839 -20.0393507 29.4067531 curveto -19.5292546 29.8115644 -19.0157176 30.2120276 -18.4978622 30.6068654 curveto -17.9884792 30.9952436 -17.474946 31.3781573 -16.9563737 31.7541792 curveto -16.4476447 32.1230635 -15.9341083 32.4852842 -15.4148852 32.8392467 curveto -14.9067215 33.1856698 -14.3931713 33.5241411 -13.8733967 33.8528891 curveto -13.365674 34.1740144 -12.8520962 34.4858084 -12.3319081 34.7863248 curveto -11.824462 35.0794801 -11.3108388 35.3618375 -10.7904196 35.6312957 curveto -10.2830417 35.8940016 -9.76935269 36.144369 -9.24893111 36.3801881 curveto -8.74136949 36.61018 -8.22759397 36.8262465 -7.70744259 37.0261472 curveto -7.1994085 37.2213911 -6.68552909 37.4011214 -6.16595407 37.5631811 curveto -5.65713724 37.7218852 -5.14314509 37.8635522 -4.62446555 37.9862535 curveto -4.11455987 38.1068793 -3.6004599 38.209095 -3.08297704 38.2913623 curveto -2.57171483 38.3726408 -2.05752901 38.4343864 -1.54148852 38.4756027 curveto -1.02867786 38.516561 -0.514444194 38.537213 0 38.537213 curveto 0.514444194 38.537213 1.02867786 38.516561 1.54148852 38.4756027 curveto 2.05752901 38.4343864 2.57171483 38.3726408 3.08297704 38.2913623 curveto 3.6004599 38.209095 4.11455987 38.1068793 4.62446555 37.9862535 curveto 5.14314509 37.8635522 5.65713724 37.7218852 6.16595407 37.5631811 curveto 6.68552909 37.4011214 7.1994085 37.2213911 7.70744259 37.0261472 curveto 8.22759397 36.8262465 8.74136949 36.61018 9.24893111 36.3801881 curveto 9.76935269 36.144369 10.2830417 35.8940016 10.7904196 35.6312957 curveto 11.3108388 35.3618375 11.824462 35.0794801 12.3319081 34.7863248 curveto 12.8520962 34.4858084 13.365674 34.1740144 13.8733967 33.8528891 curveto 14.3931713 33.5241411 14.9067215 33.1856698 15.4148852 32.8392467 curveto 15.9341083 32.4852842 16.4476447 32.1230635 16.9563737 31.7541792 curveto 17.474946 31.3781573 17.9884792 30.9952436 18.4978622 30.6068654 curveto 19.0157176 30.2120276 19.5292546 29.8115644 20.0393507 29.4067531 curveto 20.5564502 28.9963839 21.0699957 28.5815608 21.5808393 28.1634305 curveto 22.0971662 27.740812 22.6107227 27.3148232 23.1223278 26.8865011 curveto 23.6378834 26.4548716 24.1514525 26.0208765 24.6638163 25.5854632 curveto 25.1786166 25.1479792 25.6921986 24.7090648 26.2053048 24.2695953 curveto 26.7193775 23.829298 27.2329727 23.3884436 27.7467933 22.9478522 curveto 28.2601762 22.5076361 28.7737844 22.0676824 29.2882818 21.6287694 curveto 29.8010209 21.1913564 30.3146423 20.7549776 30.8297704 20.3203804 curveto 31.3419187 19.8882972 31.8555535 19.4579775 32.3712589 19.0301458 curveto 32.8828755 18.6057063 33.3965243 18.1837204 33.9127474 17.7648955 curveto 34.4238963 17.3501873 34.93756 16.9385859 35.4542359 16.5307841 curveto 35.9649854 16.1276598 36.478665 15.7282591 36.9957244 15.3332603 curveto 37.5061457 14.9433325 38.0198426 14.5577081 38.537213 14.1770484 curveto 39.0473793 13.801689 39.5610947 13.4311739 40.0787015 13.0661425 curveto 40.5886868 12.706486 41.1024219 12.3521726 41.62019 12.0038129 curveto 42.1300675 11.6607622 42.6438231 11.3235075 43.1616785 10.9926223 curveto 43.6715191 10.6668582 44.1852957 10.3472923 44.703167 10.0344517 curveto 45.2130376 9.72644441 45.726835 9.42498187 46.2446555 9.13053549 curveto 46.7546174 8.84055773 47.268435 8.55741103 47.7861441 8.28150193 curveto 48.2962516 8.00964397 48.810088 7.74483886 49.3276326 7.48742049 curveto 49.8379318 7.23360586 50.3517849 6.98699816 50.8691211 6.74785276 curveto 51.3796488 6.5118547 51.893516 6.28314813 52.4106096 6.06190644 curveto 52.9213928 5.84336469 53.4352714 5.63212932 53.9520981 5.42829096 curveto 54.4631541 5.22672862 54.977041 5.03241951 55.4935867 4.84537356 curveto 56.0049235 4.66021377 56.5188156 4.48218956 57.0350752 4.31123474 curveto 57.5466924 4.14181715 58.0605871 3.97935815 58.5765637 3.82372219 curveto 59.0884537 3.66931892 59.6023483 3.52164444 60.1180522 3.38050242 curveto 60.6302013 3.24033332 61.1440939 3.1066181 61.6595407 2.97910924 curveto 62.1719309 2.85235652 62.68582 2.73174589 63.2010292 2.6169888 curveto 63.7136395 2.50281061 64.2275239 2.39443436 64.7425178 2.2915406 curveto 65.2553255 2.18908363 65.7692045 2.09206845 66.2840063 2.00015433 curveto 66.7969883 1.90856512 67.3108616 1.82204542 67.8254948 1.74024228 curveto 68.3386284 1.65867749 68.8524961 1.58180519 69.3669833 1.50926737 curveto 69.8802469 1.43690205 70.394109 1.36885316 70.9084718 1.30476682 curveto 71.4218456 1.24080372 71.9357029 1.18078984 72.4499603 1.12437165 curveto 72.9634257 1.06804036 73.4772775 1.01529505 73.9914489 0.965822069 curveto 74.5049913 0.916409597 75.0188421 0.870262452 75.5329374 0.826979266 curveto 76.0465381 0.783737714 76.5603756 0.743355225 77.0744259 0.705833676 curveto 0 setgray stroke newpath -37.5088276 23.3966969 moveto -50.4777785 24.9099536 -70.1833795 10.3395913 -77.0744259 26.9760491 curveto stroke newpath -30.8297704 20.3203804 moveto -32.2648192 22.9207723 -34.5222439 24.496047 -37.2673885 25.4658846 curveto -37.7325418 21.4794154 lineto -35.3483857 21.8154014 -33.0353788 21.5375647 -30.8297704 20.3203804 curveto closepath fill newpath -30.8297704 20.3203804 moveto -32.2648192 22.9207723 -34.5222439 24.496047 -37.2673885 25.4658846 curveto -37.7325418 21.4794154 lineto -35.3483857 21.8154014 -33.0353788 21.5375647 -30.8297704 20.3203804 curveto closepath stroke newpath 19.0569192 11.3380855 moveto 46.3558482 9.84950618 77.0744259 2.15273474 77.0744259 26.9760491 curveto stroke newpath 11.5611639 11.5611639 moveto 13.9952252 10.9132552 16.4643985 10.1633895 18.9486117 9.35184262 curveto 19.1659085 13.3368315 lineto 16.5736998 12.8004676 14.0258287 12.2172187 11.5611639 11.5611639 curveto closepath fill newpath 11.5611639 11.5611639 moveto 13.9952252 10.9132552 16.4643985 10.1633895 18.9486117 9.35184262 curveto 19.1659085 13.3368315 lineto 16.5736998 12.8004676 14.0258287 12.2172187 11.5611639 11.5611639 curveto closepath stroke newpath -77.0744259 0 moveto 77.0744259 0 lineto stroke newpath 0 -11.5611639 moveto 0 50.0983768 lineto stroke showpage %%EOF %%EndDocument @endspecial 1046 2963 a 0.000000 setgray 1046 2963 a 1058 2600 a Ff(f)11 b Fe(\()p Ff(x)p Fe(\))28 b(=)g Ff(e)1425 2564 y Fd(\000)p Fc(x)1520 2540 y Fb(2)1046 2963 y 0.000000 setgray 1046 2963 a 2352 2601 a Fe(Area)33 b(=)2692 2529 y Fa(p)p 2775 2529 59 4 v 72 x Ff(\031)p eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF ================================================ FILE: examples/showcase/generated/asymptote/AreaUnderCurve.html ================================================ /tmp/tmpkltskq09/out ================================================ FILE: examples/showcase/generated/asymptote/Deathstar.asy ================================================ usepackage("amsmath"); texpreamble(" \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} "); size (3 inch,0); import three ; currentprojection = perspective (21,25,15); currentlight = White; real phi = (1+ sqrt (5))/2; // Vertices of the icosahedron are of the form // (0, \pm 1, \pm\ phi ), (\ pm\phi , 0, \pm 1), // (\ pm 1, \pm\phi , 0) triple [] Pts = { (0,1,phi), (0,-1,phi), (phi,0,1), (1,phi,0), (-1,phi,0), (-phi,0,1), (phi,0,-1), (0,1,-phi), (-phi,0,-1), (-1,-phi,0), (1,-phi,0), (0,-1,-phi) }; // Faces listed as triples (i,j,k) corresponding // to the face through Pts [i], Pts [j] and Pts [k]. triple [] faces = { (0,1,2), (0,2,3), (0,3,4), (0,4,5), (0,5,1), (11,6,7), (11,7,8), (11,8,9), (11,9,10), (11,10,6), (10,1,2), (6,2,3), (7,3,4), (8,4,5), (9,5,1), (3,6,7), (4,7,8), (5,8,9), (1,9,10), (2,10,6) }; for(triple T: Pts) draw(shift(T)*scale3(.08)*unitsphere,lightyellow); real t =2.5; // Scaling for stellation height // Function to compute the stellation point triple stell_point (triple u, triple v, triple w) {return t/3*( u+v+w);} void stellate ( triple Face ) { int i= round ( Face .x), j= round ( Face .y), k= round ( Face .z); triple S= stell_point ( Pts [i], Pts [j], Pts [k ]); draw ( shift (S)* scale3 (.08)* unitsphere , yellow ); draw (S--Pts[i], red ); draw (S--Pts[j], red ); draw (S--Pts[k], red ); draw ( surface (S-- Pts [i]-- Pts [j]-- cycle ), lightgreen ); draw ( surface (S-- Pts [i]-- Pts [k]-- cycle ), lightgreen ); draw ( surface (S-- Pts [j]-- Pts [k]-- cycle ), lightgreen ); draw (Pts[i]--Pts[j]--Pts[k]--cycle, red ); } for ( triple Face : faces ) stellate ( Face ); ================================================ FILE: examples/showcase/generated/asymptote/Deathstar.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 197 287 414 504 %%HiResBoundingBox: 197.01 287 413.99 504 %%Creator: Asymptote 2.79git2.79 %%CreationDate: 2022.03.24 02:49:41 %%Pages: 1 %%Page: 1 1 /Setlinewidth {0 exch dtransform dup abs 1 lt {pop 0}{round} ifelse idtransform setlinewidth pop} bind def gsave 197.01 287 translate gsave [ 216.98 0 0 217 0 0] concat /DeviceRGB setcolorspace << /ImageType 1 /Width 868 /Height 868 /BitsPerComponent 8 /Decode [0 1 0 1 0 1 ] /ImageMatrix [868 0 0 868 0 0] /DataSource currentfile 1 (~>) /SubFileDecode filter /ASCII85Decode filter /FlateDecode filter >> image Gb"-6q0,j#U&Y._J@8HN'c!tt$HP>j@Ech5&g1UTJ1r:n,`m[)KFim/0GESo#,PMDhJ8[^m;5 X7[FTXEHJ;W:D8#o'cW]4UiOd\8Q[\\k?jIWFcER%lSnINDCV:N7dV9)f,(BFL9!;si:5 ^f&Td)joQ2g-U?LKA/7'=oo[AogcO0^Q!!)HWS)"r*J[.&sWPrhaR$oMEN"Mn__,!6$ao9dbn]a"d ?iJK`Ho\]ZX4X^HPa@;k&i"OdBa,Z!DLB< 5@h1,9CT>QF+Xf_!!Bp2Z*`cNJ':gginq!hh[=E3l*+o>2"JglR9DPZ^R,PLO?NK%Df%VpmXY ebX!1H3oH%mG*6-nGf+p9u3uT+h8*!5K&Xr]5/_9(:b)EV-1hE^Z:%m+ISEq!\fs>T%qK7%^S cmrHBT:e[A=D\^IJn1GV@=Z5>>b/6j%ii. I-X%gr@;!8oi?^M]Dk[!T:7\'HPQbV+/+#jgFHSc/F-gqET9lKY27"s#l:SXM%*:(9mh*k6Bq ;>(7(T5VFM^%PX\c'o7"\FKMRB9Gr02Le*2G6bP.E`SM%4!4_;'LbGs*o[2#!!'l`q.8dRdGU qmq5gQjE/T77oFrP@maGJDo(iepUFq sL-?T7=)a(!YX"W[_e=/hOJaH1"q"SS\i+K*R;jB+3H8)#sX:^i=ho'4^]MCMBoLY^W[T[-Ym 3dJV^?,kGAH[S/5S+EDKjH@!&S$Qjfqoi&.\ZMj_"n"J?>bP]IX*]J09ni`mG"e(oL;c@*$p- .(D/Jef8"'c*r9UbOljjR+!!(q.J,XM&mp>>Ic`:)LA*a!aQ6MbPmARDA HHk?aKiY1?O^\66s5Cl7hgG%+m#PsIToa9dB].=8DAOsL4*rl)r-7/HTg2OT[iIQAf@;0I<9]N+!1I_!5Mb:pr?32 @d`kI$_ehD4B]X;>:e4(b#g5C?T"gDAMKkME7@#=%t<1Ud)qWiOX$uL^)7f_DN`X5ag/ja3B`PgopNDLac.06Ie%`EIgPYK@*iDppu\&8TD@n`=b>;Mm'm5CtN./e??I;3X0IKr 3c?17>9C(nb.7t_F!Pl/no$Ngt_ellZ9i9in(J#2uipYJEn&,BnIG;ia'-/rnG*&QX>IW*Xmd aJX\CUYe8a`=derjbMfZPZS_,'c'uIR%8)b#@G"1d5Toqrn"pa?eHM=!!!!a#$nd6-["tA9d;%+\ff(9 6IQ>Z0=JO@N%'k[k?Bl=AnG4j#Nb%%ZYEM?s7hXjZ9KuB!!%NpU2WQil/LluLXrX>NZTpO:Uf 3XCs&G#N>AqC&^Y6*P970 mpKRK47H1Fa]?cM:8>)1&ip`1GEH:dRu65r##J7!.9`6FBL)><>U/@B^E?$/0EPd@c>*offdB :[pIIf@Ap^0Uf]G>h@66oo?&cWj`s5e`rlAB!0B]%Y37`K]X>L=Rl2s;c`HB#-;Q*03-k&0X! ;t[5M=iXJ[t`*IW5>#*r2'&!!!#;7uXV7.:"chc_'W.5L7!5PKXm##!3@`20L]dlu4!WW4N:PnolD GTM+`)W/WF<\pldg=6++6!!!#g*O`PR#.f& [d=5PMc>T7!!(pbS9ID%F>Ytf5m-:ErEQld/MZ<_Wi,R Om7EN+Xh+R]UF[`:Og\MS/Tm!!!!]Mo-@nW1o1VP_s1GhoO%T%0-A.* _1r89$kN[9#YJD7@%Te!!)L8P$HC7>th>!N7&H?('+C8^k4Uo&[rCaQuK#AN@RmY!WW4N#BB8 FZlEAYUK!3#'r_rL!!'fMaEC"mFYU&r\)TI)6F@(!!!"'.!EZp,([Wg9id.RGeKOtn!.]dhQR d6]MtWHW2O00I]->cL!!!"D#C2)th9\Sp9?$+#OfQ"n!!'eZ.-?CFl_:MX@e>^4Z:"cp!.[R9 cP:5L7!'kn\\1k sP?$)rCN7AZB('+C85]>.q`V=T'NgKTbR-9U?:b;_K!.abkmu$Z!U.m<6UKRd#!!$B$dRDr7l Cqdb@N;OA[0Qa4!4noi+m=T$dG[tX%Th_+D?'Y:ckGYeF e`,Df8@8^'!!%>5L7!'k8j^G&/qW>N_lUC]ko70!;f:`B:<;/WA#(?(CpkZj6b&HDe2e4"j gPZoV\=tN2qMH#K6!!&Z?qHq/m]i=@N'k7hEW^Qmf!)OC.%md6m.b`m>>g3]X!!(08\LT.-.^ jK=fL:oK)?9a;<((e/P]d"LqqQ>,-!jY`M$DKSQ? )dSS@&HDe2'LLO^F&XY)D0/4H70!;f:^(]A;70<,`>'&9AmYXu%!!!!A+$C-#X'$q+mYY8o%0-A.P0q_nPq5L7!'h#t\Y9k9@[[D>>Gr;"TSPL#>Hi1euhtoe.nqu46-p%f_bO2UY^<4e:e:dNutj b`>q$."'/[6R8&nNT;-0PsCr8L;)1(>&m%=<*gc Ot`5(C<$Z"'(M2Dg4A>=;V^=LCaP=^jP(R$K'gNu"Wh)mV[]!!%Nrkhq>eQAU^6,1U-A55;oQ Ha_\:CYu[EWV`)>JYP^;HhSlSfTB-;)lT\HldgpSbJf&:,!4P*E3Z2aprOm,fcM(3!'gd2E(* Jo`AAs'[nnZbk3md14o]opWDe@hk5qM/Si@l'+&4kCoEWXc&+A.jDcKeF_ZoG+`POs(P9VDKZ Bj^4(Cf&i)?9b&H$$QP>Mi>@C=+oqHdC?T;`$Fkj2]-dUZ0WDZ#=!YF6EC+^-&X)nc%h=^rDA .Ur7;mlteD%ZC!=3>e4IermUoJ!6V(S+_Z9s72K3kC,*q:D](DiU8c7\7WILKrsh.g[+RlB5M?8467"G>M[.l0Bd/0t*k!rr8mj 40mmQfscB1/&WDST+7:Z$*6/;'>l8$1[-\lg']H9,-R6'/O9i\Te)QU2RdA6MBRG!!(@H[4gP 55cNDI>'/%)W>85-lb>b>D$]P>MRb#rk>i%>BsQj`s#sU;>:,5bXIBs2ZUJJ:=L33lJ<`\r^LR.kqs8*Vc T+q>+5SFiT7F.3Um^T"KX2S;;B_nE:M5cK@DPZ.b%3IduJWpj'@tmNK%HQYpHh#'%fq/uZ!'h V?G"'`AMJ3RXaA'(p7MOUeif[pq\@O59m@&%T7cOk02#dP tcpLI.W:S:;c+?lMsZ5%b7::g_.U"QIt-rN@Xj_DnZPVl;tuj/&?)W6uB(![`=$Zisa._>)+SuibQMIM>C1p6$Urpc&rN>nkop'EO%p5%P:7=DkGMl!9$lQ&o&` L&BSDdW,%i("lCA:I\]!)6;9'g5eO]'P=2X;3%<@V5d"Y36,)r%`BY;JL8oi5CJJj2V6lNemZ 2/R>H['cT&5DZe>/ZgM[>MJgYB]@bA+ /:BcThI!O+-`Jq=EE;S.LGcM8i"^=!u/6`QFI?YY`Q4A[RF@7uH2+27-"Rl=PI/Zr2!MMf@=fp47N*\C -X11YlF!!)+Xmgujm?L"GE.se!pN'\4u76gD<^P?-A.IHro++3b3?IuB1pY<;E\5tMG5[@ZgW _/M@M:JZGd\UFPI-[KOfRO!!'E(bS@hc;Ekn$Z'P]uk)N1N,7Mr4\;o>0KL3\ @,Ctah]3W"tmJQdql-k2n`rZJV-8d])DeS?8>8q7T((1MP#8a:3&YhgP$Ps6)*uk8GD%q%[5E q%'>Z'r93]^,s>UnV09fR>rp+HUiiTm[7f<,:<*"f)EM_f"aWDhgOEH1bmd]m:FcC]Td\bXWi gU^Bc=smQI8urmkm#%Q.S+`6Gfk2J]+!1JJ@8sgCd3kc"Rd8!uoNn8e(<+S%3_n-65>MaKs3Q3-FN.qYKV[toL%r9*)dap)o^*n8PMqR*BsC?;q(K MDG@.0&F7qPVkK$+XQL=r:U``3oB+QK57bm8p](:$UPp`"Vc8oEMOIP'Z%ujG"#R1E@D;XpFQ >usZ;PMrDCVC5YsW?^-L0jtgU8EYf6=9r9A6Zt@*7Qa[:8rPZ#HDXc5%iX8\ng/)`O3rIs(el [8FpYI8qc>E^cP!`>D#uRK4=.oIT.^c\CtRMW!dMU7stR=,SY76rfKeo4p/E(T&TufH=4s'#h i@$XC!C6r)&%lKe%*s8:KS5JS^1eE`ZC/Z_(/rJ$bd(#eT\RgW[5KCM%pMesJ_ $ejY>Ztk_G$_r?1;gCQlO%Mcjqm/URfCgaV,jR_QR=OE]5?GspZ7aVPPkjh!)OVG%RL!NrpBE Q>3qX/75;pc)HZP@@7<#301m$CQTj%qp$/Loqt"mP#+I*PA;TE$.p#n+ip,&pbV*"uY^V'#I$ 'mK1,8obKo`qCjuM,0$ig:h;8X,3s&))3>Z'a#0eQ=^I'"TqkUB[MM(OTu`r*^O_jf[.Y+&sm >F@@l)O_HoZ5.(/M\fT?@R5RdaV!e%,!5\Y%3(&:s8MVqIk^p'b+j\AqQj.ck_eY+MfFS_oVE b7W%jhWM(PH8Wh]Ca^rHuC^M6ZMZ.&-51s('%T.,b@k#dLSrg90*1,D?Q.+6P,B$U>"_1R[Gq 9M:Jr`&t!.$"G4khB!4Xt/A3(7!=eGXX>6=6.m`RdmL([P&7T'ZK04q@0#P@ShBcrZghQ3)GP O,Gn3njj6UlMKPWPo][PE,H7guj,\]fNU1!k!.YP-E"TQt9>r`5a'7u[77BhW"@P!@!W$uIaK &OPi9m_X6VD5-7FMmq%-eQC`GhE?dI513]p9):s2&8Tdn$NLXJcD2]kUfaep-duj.H=hfk1;8 k`C4$Nh8t`E$SJB^!p2Z'+i-M9#]Q"C0o_j1/SaBXWL@JMdgHpCl.tOk.bI+FZr$(gq7A!nW+ jH^GZ&l%?^%8IP)@8E()(Q`Pb/!27dQ\g"Dch77sZ%-hF')u/k?!$EF!E(*!XM UGd-I^PQI-q8Ka,-Ijs;&>'DM'B).!+5o70B2]arS%[jU bOaRM(;DCo>nJ7PCU)fsF`rM)LasZm,1!0_84+(.mB2\g2i^^"!;C],nO4Bt!U):oNN@W-sXs ,Tth3h.Q!5M@*\g!uF3j.[i[:kaP`]$0CM@t_iNOBLpLarN,fRl:fUf:=<(#?KjgHJJnoiadh ;$*<$O"VhQCtYAkHpA9F"9>YDGo(I!.^k?EO"C!FB8O&m']Ue\Hh$A:(J)&,N4VjG@7:.r4-= Vn%]*Y3W),)>EdESN<>6*d`Ep3g`AnP`&ec'M8jr^[gQ:KRP`!VpU4_!jh4bb\!.ET:H$,%Yf Mj-9EA7s+#QWd*10fr>;.WgNW`lc6'GE#4Hh#1ONS%;X`c3^CXp>$c+HeA:k,!Na];#8SU'%- W)V;BS\>#PH>pLc247f[#!.`>83!:6S'cE\!8!2g`p/d0tLgkb`.cQ?Z@!@`HY:*9u!W^l-$s 06(N"?M#Mp@,fiWD$?(_=n+M0;%TLarN,fT5@$8?&PG/)!oR3[T`@&(%gqCcGH@gA$2->?>?c "oq16f3OM:;'T.9oP/7k75=<5)HVk)LPnQIGNZCF/+R%"!'oPRHP&35@[BsWOi:XH0@@63_`: T$AUqc8]>3ALd5b'7J-H"X'6c+RTi?st8l^e_i`Mpn*Nh>\f/Z]%n63fC9UJnj[)&"OZ2O*\p ]HD`+om-<\F,6=MV>UMCt59OU1dW-Gh[msF\<*['oC5dM*.jF!+8#D\g$leC[-ejU9>><&Oi0 pO]T$%=:e0q#8D/H!!#N.d1n)F@u=mKU5Pb5C<*`>5'=h_(")t(d@E=\ LD9gim)L\ZUf?u:/,&80>'*g[D7N]pGHQ2bf'L*s\g`M!X9\f6-Z6I=V4onRZ%K*fh%`B5#AB 11U?j)/N@6j!4#9,(!'#Q\(NEA'HH$\H[9950(Id'`B[=8a!_$RV-//7Y5$S["^f=XM0S`O\N i769jc3RLK4,L7=VP]pTY9KFaqT[bn'4%s#QWcscFY9s@baho=qnhb;068tmcBj<[jY0#aq[> dS-tO&Y)&g9rXLN<.8A_f<&f8rDP:C\Y;QS/1OdJ.O'b& GutXY^g8"(77tP;6ac-p!3M52W`g[J,DnUb#QS6g%_Ep]U:4F5Qb1eBF/>VrY,HN+fOB]C*`2 M)!<'CAKmr_Oj.1CQ2r65pHd-g7H/m$^j7I'GGJ=O-rb);i$(Q*+8jttSU79]-mFNh&i/5YnM 2Kf>rcH+t^'TK[VATU(l9n@+fX+57P_anm0k5qT5$TXD)#Wc>6aAp$!9fK-(NEA'qSc&UYsa r9grBEN_Ro7T7uuO,e"?>\jd"]cc6XJq/e/l*Wl=7d5LJd75A5T,.KL` \CPj<:lG+p2[ZHFF&K*-1TM;\eU((lU40bB>;":QX>KM>t_kNj2#rs*VA'$^!E=cj,,]OU:aa 4=X04b'm&PA\i=St3-EB*rK.+G>9(82Ro7XhY39Q,kk"k'>Beo9Na'CF;/oGQm$ibFhgXsmgnd?RC%*PTX%I3fH=4t'SV6MegrP$Z;iK*r,G:$VZm,aEU45n V4tZNifV2dN`D!t?E;`@o=Ijkkuf:?&Of,0:i%0P4KKA,)2A`\ZY'C'cNhZ9:S%t73KeLZn9t 3-4j_Pp:N^fQ]NhOA,o/-LF689me&9=iinQO]p88)p4`SIV.2AD0T;tD)8k$d+;1*k^rp4l`W[B0*`"-&BBiiP:*ISS"%C5KAE_:Hfi>-iD!#WeC4UZD%`mNM^;"I=.DJ1R\;Z X9`-DB'`fF0*,n>=7A%2dmF@qH"18$0W.0r. OXL^jpL2%$K^a0/?]Jj8Xn#'P*Z)lj0ls:ta3L6Q,)Y3g772^+Y7EHHFDkj&Vlm1,*4eC9ilR%h*)PBC`fMA=^qQCJqWQ1^]M>A&Eaq6+B0('&l VfR70<0D0B=\f>X&OY483BW&%6[*oaQ<$Z3X-f-9eV%:pr$Xr,??INQ)#-1'A/$o.mo4BN8f5 &uALS,G:[U/ZoSK4Z09E4UU&Oc\U(V(ce(kqReRW1o=D-@WAXfo8EG97:)SYNk_ZsHWI7pk *Niq@F+BK!;I,;0B/j.`"cLsQ>4gl!P2A)YAWlDOk=-".US.`@H)Z:;%k+3&G&-Br+n=hMjZB 'lZ)LeXb4r&=X"]iNjRm.gq.L^_LMLDZad_:!!(Z!#b"X'=)=K3X$r?[khD^inuH!->9pY5U. 2cd?);"C"18%ofNHFZA:EIoFq]cU(SaK)mq53`YqgI%Q&:I+Rl?i9pd^oT"FpWZeJ0MJ?&2h- >C%T#/\4&0\+jeFb2Klu.p`k-40E8.TBCk]Z7)0VSDRo]%j*]i+#hK91G3%CEoi0uor@Q8B-I #aWrR\%Yg4%5'jZ`IW^SkMOR0fg]38-gFc]KU+VT-ODMKRL!oWJE'JQ FNta.Ac#E=7f"FfOB]k4eUFgiJ/0&S"Vd2Yf#6K'bNk7E#SU+io[(d\7/uSN8nYjRBC4P$hcl KfHQ3Am`oZA78j\m/"EZ7./bnm!:U(K?'rN&rS3?TO"@^F=A2ApqZF5$+(Tgk1Zq4imeJ'S9; :W;=(H^`!;E_>'e'l'Ni(?99M;a^V./'ic&_%O,-f*"[dm`&VMR[-fDAHfkkk)9?r[\[F.>ib+2F+ T4"+[H)ER!/eYiIMS=+"en4u%)`q;e;Gg%C4l4VfbA+X)X2T!GdDc3U,-eO(HE9jMa$1(bZ9AA@";5lHmbc#!j7B_ iWl:jI9#\_uBbZDQ&B2K")5(-)IEUOI(Ac_1N47Y!?@UdUq.8U>B8qfcN>![u%mLKErb14#'" `shQhoZuM29qm=*$=./J[:eTICL8'1IuLcG"MMK5K\,E(O9=e_DP.2=9E41%DXhqT$E.sh2'7Fl)nnrJ9RSp` M>s*h4kT.g[N?S=7U8^mR^\TE!t>0e";8@Y^]Ae_Rb^IX"tWp">u8p:$%%O*>ZC,K)qG6fq3ZbPS=C`9-h\Q;W7PO-*pdSZ@jd.)OVknI4aAcB5@'EEfq3paNT\W;s.+?<]_lg='.3k??IZSla9>qMqM%5`4 4?b_@oP: A$`ldq&[.n*m?Qo44'K8X6ZLoXSdfcM(o8n+qoWMi.*5Md%(^V^4"p[+I+d#_O9)-jk$b*"(2 o(,@^A.6'"/jB-MTLUFD&]G7?q1f\6(&c6=ru$.Ue^S['`7_KVj@O@dE+&_FHh[!tZ$Z6De^[ 6&AYQQ]3Y4GeNoc..a',Wjl&m4e;hISsf+kiG>H)k?=tD'C^Mi!\dhSp`;E&EZ&j. <&;N5cM/o73Q2>`n^4ci!_(`pV[Bi'DA@JCq1um+N3,]D):\BDNZ5r)cZf\$E>5:RUC+mA`Eem>X.Yu_o39#778lQG]J=HI>6=#qIun81c Tfg84g'-9q4)aZ:&JP%U)(q2+CQi*>h'VnOBa6(gW8%;<@$@aJ/L8c]*1>,L95EU2M,MoXl][ 5!p90R@$C)^/g&F@BO$Vg,SO(l% jm-Dkg.5dA!QHL,'/en9fS7j!H1S?\m[dO!r=#=>&SCQ\l3u. L0&IE7g`9`-W"FZ9CW<(e3<2@[u;22#<260$L"g<'U5j+p0Zr(i-cC5dNXA4P[No`*Qa9_Aap CrC5;>8?&OVoQ!UW:"0u!;^uMr*NMX#e!`bE!0&Br+-/RdaSH=%i_$V72u8Z8%ma,D C(sBJO]&GO;.On=/7'6f=eEMO>c\_27NW5#.oIk^'(&qd;_@AgOc+5Wj,0qa?lMi^Ekr^n96@ >XrS)We]13Vc(#+Ng]5s4>k`(?4=eEN*DLG`5Iu-qM)u5t1AYO678k&-A=1*i7,)WYF1Cl"A5 (h+Y<%Z,JNKfDP'?*DqP_qLk,?JE+DBk$$TGUD90gN'/K-NoJjFT=:Q7+B0TiBMr)S%&g@Km> kqUH<`T>;se+*'rk)gSqj3P'6"8juI,.r#cAkP/:ZpP0JdT>;6\)t?CSFQJCEMOI#$j" 1\dLgh@o^r)&2cepc$ukIi/&a@;/bNFBSd ;J'mZdNma8ldI97t>0i!>JrF&.GB5eUSMY-B0&Y6OC\ 5[!heiJ[1Dt2ec(,!V3-!Ci+XNr!i+&n/\]s5bCqB,_CrSeWJRBpOYjlKt%.T'.jlKa)SY8cZ N)on!Y+++W_q;7iM3kpK?;UHF\\Q\W0WQ=Ld.oIjK*'AGd-#RG`cl<#J=l[M]eD7aUcCJGAG# ;0_b0%Y['k6T9Od[c>N"Q$bM)fX/+lE9;[Z_)?-l"lY>Z$V+MY=WUV@P1tTd!#pad5Dri/M)- -8$qdLCXX6*&o(0RRBMqW2^JGel^I3G.*c#=c=1@IeZ8bHZnnr%n!Z&Mj-LTY"5PUR4.BY^)E Yi5gdU8qlh:11W[N/eRE1JG]_WV#7l!mE8`lkce`a8BOLjhZ"o\+/ZrG6MMjoP^<"A,;l5B0_ aU1]@aUq.-_H'&s**]g*P!AjU6hV@,E"`7'mW'lp?4S'ZTa"PI!3RWb#B?&qT_04hg9;$Pq1` RIb^q=_lgLhUF7Q'M\h;'!g/`oVG7kY#$GI.\Tikn6j0f)ae+"mg.'W%YB cVO?#*hH+:6$*(7a.f4WqI+nD'V0;6m2f;=I0N]E>.cqdNXiX@V>IZ9pKkG\rQL\FdA)8@qZ8 j'#&7oUQ'GCX\9bPb\l?nG062-QZt\*DMk`e#.t.>;H"0@IaSjlMMh8+qm8B'*pGj$a+')p## )/^Rr&4/8P'7sqq#'r&_REgQXT*4FC8$3[IOn(+2n8,=f\'"%gb^4g &-6HKNH#gU>p:;%ZpFhO:-rMJg&c\8bQHj??g+GG&="0\FYc.2=u`eW.+`G^r6tEQ*r,OnBTV JgIu_05"M[RbF?-9pQtE4Xuni`W#h1Z-d[4LOSlj0c)GNXKV*.'dl]gaiT+uZQDrE\msG8Iku 5ZMmt2N]c*`I7B`#7LnZu6W7SqEXO!Of^0dU/='SVMZ`['ifje0Zq;\V`U7ia7HhY5NpAMc\m ]Wb[[X#3%]Of%h;-7KpYF(J^l=+/@N,B@ZO0lu:S)6RDHK3ftk"mOR39n#J-VHlL:in)=4fla $%-g0efU+V,C1(24W3"]QfMlfl30@+rkbO!p>J +_@0+.kQ8G0"1PI/M(aD-Sgn76$j;UJBZjpI3l%MOok9eY:(gB\qP-^+8L>YTiBhk^i20&tN0 p4L_-Lil0IpMP_8o?>Y\IAlc%>*`H=LjGkX#A-D&>HZ8l=iY=OV%@oF-S/'NMG:8FkVF,Lmg) K/Q1SiPEBM(]X6j6Za9W?+&qqR6%%kFqLK/QOX2WeSP*gi.$*HRf:hg2&)EO"VbVBlun>1<)e R3Fe"UnrpLXDS1F%g3\2h'.`YdisblH=Pg,&+k,;+nNaqlDS1FfZFqSWLk8a/(uD/m*>#hUB- hV)0EaiLKoFraV2",NZTp+6-B].o.40V(Rm*H\5PK%PcW +4Hp_ga)f)o$O7E2gnYmJ0:s7;iU]La&u=EhcGa'P>RN[``-XCJ(1@U`@Zt(P`:f`8)(`I=20'1p[1."4*T!*[OnPS,'DG9. 16rPH"#'pP`#Hs6s%laJ7a"k*\@S0en<>H%_6Zoo/FVcD)&`LF?I0WYqp+\Z>>J&*FnWZs8Ch >^\#sW,=glR2p^st,&cmJ-gEptaSH/[M`e"`pDXOb$ePi95$un>r]:sHN1`,2N(<'RAobfjqLKlla7<`?W(Dc;WlM/6#hS7;Pr+^M# F*$mFm5$7C;`AN[[W:K*U8"oQ@-@N78#o#$?LMVpdJs,uU>OYT;9[SV1HNn% '`/6nXLEqQdk>LGEIS6f*V]P*GlMSmkDYsE_$mQ\"UM^u(pWu70En6nc:BCHomdB0/9$ltrs-@X,sd\pm8ECJDM7 7:"V./:"jlSJ;JWl;U1Z"gO"Bsb?c6lL3,duQ%0GcHIUEO:XU"#T="p_9_shmd-NhIsMXSf.H nBoGTXqJilG<2rpY@N8+;ROb[-K7DjA9<3;[L5o%Jj7C9V2c(`YMT7*IaR6-D_?7/+%kFqLKA YW6dB2E#C9]R/[&\"Z,E3P8C2qN6eJY"l7=Cq7WQ=oEIYV[CSLaQ:>)_C!2G,2)1o_>S>Z$V] OTuT.N`*%$q@$cJ+d[,BdJNq(8n/jtLbpRrkDm#BG=>KT F2;3NB;.kDkI0O?me`*\b6 cUdeUY'FF;N(pd0rsC@-nahWm\&kclQ,YTiBh5f^) shhhpt>.!*)'3qKHg"V55I_8+l!0&CQ/;cQkaSH;V$'sdZTj"g/)WN4b\_5a%fN9^t3Rr^0H7 p`Vd&bOn>sPfR.lno7M(I03m&duP\m-`UJ>-,?Jh+,j"*>"&+u?UDhAGuRbl`s8,'BWh,Q2%> en9N3i/l-a:bB7$NH(;E8>@cAl]FUp#A?NQ_iar&,3q$M%.KEn>g[\46lMo?Q>4gT;NWp4Grs FZB\$gH)";OQB`=/h9/I`S`!;'&3`O&@'De/#T0Ld%O_R`*DaYM/F[`3$77>NNOo)@ ,lSCerGdgk8XG@NK:(PDCRVG]^,dL5kN=h?3nJ8%[lc0*bre\PoRSj_?+hUf,7]D3G'Cl*I:S]]T=1#53jC0+$8'8`,XNpm ,TZ.W#g#Il`-t8Z\OVukGM7%0l[PZ-I74uS'K4PJnM'Fs!60Lg1*'ga&FW;?7I.VUa7WXXN:5Hi&Il=Ms;]71UK@[ rBfn>S%YS@`Pg["`rh3p,q_E`aSH>'##83W$7[7MU'*]DiHUPg>)KGg53'BMQ_QS_0W]HuuE/ VkV80WmR?aSH>'2@1q^g*n5r,3^XU0%@I'@l2_F*2OitmN\:A[>,K"T)n!aitAK%,.;J[W^Y? "d4Ee)9;<0'8=`9q`3fW7obg")d8c+]:rJ[h^-C%WU04GFPf>=]1"H@D;'_:aN[qD!"3@;0C= -OKfY1P-'hOaKAt`6t)S:B-0r@j2MfD:SET(=pen5!)Zod@.@7>"mMTjEmVKB@F.rqt?jD$DA =6*g1&l%/,=HW7o5X+'Xd:#]?YTgN/)4Dh6a:!,`A4^86=,_0MAp5S!`e=G^obg"$^9&0gQKV aGC`R,$P'A0(e?Yl)Jh';h.O'`qqDdl"XNpm00br+6?_85-s0&g['"tE'/`EEm@W.ti)r5c[9 P:LFc$TD65`ru!V]SrMI0Pd#-]7+095Fpb,&ne=Us]+WN74\43]l12q7V5>TL`OOdgmt74p/; (MMNbqG8"DYG$5eGX;3#hd-T%'N]9'bZT\K$#E%/ZR%]@Pl)\]C8/g6p@Y@Z3La%[/Nk-G#1P "MYLs^okOgpnedV+)XB(0<=87U9eY75_eElR$'PFh'@<92;P,`t(\YTiBhJ:jMN\0BRU/!a#)oLo<)Y8.5Cu1_0kg8*PLC+M2R+'QLf?fUb$kY.A;M;j@CNF?>@gQ>EY @.'M&2SJkA_5gX=SijRQd%Pj)aK;Md/2*Vm;Ne\+dFeBp&K)I=9O1p&j?lR04t^,!Lq[lm@7A a[J2fh,SIa6pd39S`e6uj7H"t)qb#7,DmspfV=-fI@\KL6r>IS3\hOLlhh:.]?-^hP*B9&gHU IRO'E7>DRA.=j-*(8780gN'/"2kV*kdi9B/J=&k^23]uJ+U-a.kY18HL>%cn`03O*mENTgZfN SW`%$_Auo<%Aa.VLoB21+3HJkSnl*G]pDuB/^NAQ[R`5Y8Uf7JQJZpGpLb:#:6W5QL*>=aYT1 j_1h^d/.>ZbNoii,iaNujj9n6j)h]`l#kc)RnjfXs5SDV`eW.jbuHNlfH`2J(%[UIP3$AF`[: Ee[,o%\dHLIoqg@'`k&gmNN63F?.Rl7-bOgUn0QNi:Q8f-Vl?SG&6$/6Nou?'Ku3GQ4"KeeCW k_`+TTcJq7?lehbg8c,'U?qQj bIoHS&6')bW9ufiH*=F?bEnRN@X/R%\#YqIrb*Ye#)dWa!6Kfp=MPoZT\J5%$)V_(1q6SFlof sC)FL.pWhL!-ZA`slRqUr4*)>[o>;Mh77D1oqV)s2:Sj)nAr7Nd`$iP(OKGMob jDS.&+ReL*lb/f#m'BRe2>hm-WQ6lKU.5DU#,\b;<^d@T?ECH23CVCSiXe2IXFRdFm2?.RlSk CqiIm5P$;t/!;l$j26bUcN&/S&Tn?q/J=l>u)@-fi&Eh>jKXM>Y(*aEI_YL#%*!,C)^E?BU\V CqX9g&J,]An77C^P/ffFTk0U:Qn+$7A-V@!oQS"\/<&D%V?t<$Xd.Hrrg"F9LekA`iPuFr8U1 oRgV3.4/F;_\qOnBT>$Atd3R%]@s1&lF11?kdl7H8I3B&o8UbcXY+Z1Mb 'e&):AQY"rB\YjC^"WMotu;?d8Vc_Sf)Q!,&A/W(.!O_pPoM-UWBZ9EnJ5S6-t>`i]a%RneC_ _:jNEhrI(#>FJGEE^,V;u;gjn%F"dJ2$r+*"psji \758$sRf@%V?*X-k-i/jK@aMVKV]YA9lMJW[>O??d8=!3Y\%]gN+U_>F\a3aaSH<+JKg7Z_F9ANH6OGVNd cM%_%ipe]q)YTr6QKSS;nF;f%H,Em+`@d,^C"+bl4KQX#$qc-rP(\H< &h/\.,YRb3F>upWTBpVmpSXW7?A%;8DFP.1iXnJSn-7#'dM=h@:O,97^d$qM.;(M,Dq_ Ci'&P5OV+T^icGeF`@(t)gY_YdW%h1+WfoDIOnBTdjQj!:DnKNVgV4UZ^1^cbC4,r!./pssMF aNI=!Z';N[)m?Q&9aHR3` =?\'2T%@/UMG^/JEB0ek`QH?BP_Q]13;qmTW(N4f8GLnX'2#X?Y!]'M%dkTU#N>t`1/j(O$3n nnE5#$25>sqHGZgU[7KXV+qH*A4[?NpaSHT3U*0DYAn-i%!88O,gU)<1rXmGSDpl(>P g)X7RraA7HBBYM>5&.ZSoAR19Icc>#*^+u-ElEb;b8&X21X/`1(0X@QHFaqX?M*\>L("Z\Mh< E%d4!5c,k3./OsQ4k>175kNA4@5NKa[Vp4W;tbf6UuTF N(O@Z"Att[`genP*[Oo;QL*>#7V=/H3k:JBG>&lP$i)daca^FXh-)QXr1F_,LU6uU*$%2T-5, %q+KbhOhded8Ja!)SN\&J^YZ:Ed*RkR>FSSh&_O9S_@ 0-OM(L)Xg6[[O%FC\d`P50Fjq^_?=2pu5Y1NUL*lH0`Wm1k//>kZMQMl#RaE9[N94P;en9 ens8MK6N>o^/8&^;uin,u*porD_2sKPRLMtrbEUmYtg=kuVjjja)iaOW\T&kjOaegHj-;P-0M F=Xed3=Dl:5C*sfU4Qc2FaJsqF(.`,3q$QaW#.8e^\-d50FQL*"[JjLg@WU%NO\Prd=b.k/V4 O]!]'-gptu?4_9M<2D$?plo)!8.I#ag$&L*1M^8/OH]l@6!F"BUd"rTL"DMD9mOV3Fd&bP)-% Gl/kgZTip?eTZ;=*.V*Ik5q%l?+bCM:5UY-*+O2%upf$(.H#rqs?M@c^ 5JCeOQWSG`;?p@"XNUT+A*[LhiC$r*IQm3c&j]4-/aU/,%!NAO+31Eqg\>qtofMQG,8.pm`CC 2UId!*rn`9KB2Q&=&O3O6.Oe?Z3WhV7>0(HV7+ol&($LCBhJeBDK;oPBeqld4nUY,]XlN5dAQ 6*I"LH.p$P(N7$.6Ct%?2o<9G)1W7,1Y8U'#>5dFFeQ.fG.\cb!RPi[B/6QG=@W&>K.V<3:Q' V.@jmJDHbE$`hF1e"W6)!:<-TCa4qe)l%=e`\%L0en9f"+8s:%bHmd2/1_L41bN-Q`VcI/ a?%a)F/C7@B!S_*G4*TOlX)l^rg^UXm`20Z7#N`dP7HX.8JZXXB[7c=M9d$$`op]joblcOo?T c_DA\j%#Lh,&[m-@23.J[8U\T%5Q:O`XP*$o.F-D(Nj/087E`a6Z)2T]6=sRtEkXcP:#AB`2M f"D-b*p^rgN;M3'j7.P62pA/d.6;7&L56DW?O.IMQ)E\VctkrZFW*iKbk[-oVYO+Iko#71^U< U>0#lk/G9S#\716A(m?\#]4R$"YTiBhfY[OSLQ3?/cCHbo>r/Wj2m-Jp@Xe:BZc3egKY%0S)5 `8]@>6*\ET$peHO"4h0m[@%V_gj[TNRmQ3N*gP_P(-Y6X:Ks]*;qR0sWN'?Sf.DVS+.4&R:Ik )&*6a,YBEMMH#MJNGBnES/@p$j"1@\ICpjuBoLRZ^%"?tB+HMu5(i,S9G>AXStW,!r>F3^ZEu 8"D&K"KN.0d-@oSBV(h5DNW:)Y#fu&]Kc_(s$N's'f6i/ZWSn)i><5]O30ZKJp7X_,"#@,RT2Bg4s\D!C`nkEAXg8^GNr01MV-e:5>uCWH .D".rl?X3Fe"S)O9$RgCMZ4ceqr0eVjpc`9C)MH98E-ZEt^Hm4B'P(7d-Kh.t"gY/pGJhM5O. \.W&o_ia_EU=03$Y3;f@`bLHi87S-E'j70F0/-'5LVjPfeL2W!%LpdpUAMqIP;Kkc9t,CMOnB Ui#fAK=/6%NKMtE2amL7IPU-$An9?l+8J7a36?c+Ql*!i_2V5S?rV+mrQciD>\(71jP%V'TZ) I'ftlSAOY1pK!`d%6($-X#/iM@L*B,u=,-Ik 0&fIR;Wu5,+X@T;rciFR(,iS7,5M`*-.,+-Im6hOfPV.q%er4cD@sEMfg[F+LWVrnr&Q&\p&; Fn^5^;1Y^/=/@9C')A5i[aMP@2XKf/=Xm`A=.#\(N+s_C *%VgdECGns.$@!D^VjD6:1#c*mcl6Hb9q2R)"chGa3'/0*]iquhS$ZgIt$5rrpZWJDoMe"__= eo$o>86;=,W%HWRS\<:%O:akK#;\(dMQ4IERWL_*BS;AW_up#R_3%Ekfh7:aiRu*L?Y@(dJ`OVFf9GL=Rki5+pO@S$,iY>SM0H"dA^8*I4."=uE.P-F7mIbQA+4m+sn3VC$` iqPhHQj6+].R@QKOlI:98#PT]#0)5(fO(<_N#1*^3BbEk%Tll4OU6t&n!0&KYScji5p,1m5\R X5Mj>@r\E8eZs'.4P84D;97D/FT%g%8:F-C_S+Dr)m@(FMn$Eqo.\(G6\mrN-l$6Pu[l`,O+u qGHr397'`^B7Ru:ePG2BFGhtV:@,I=aM2b,g"E]#a,eP2E+$to?'[!A$9+r$4q);UMlQR\S6`jkH6/B-K4 nn-OMUboN?Z0Y3u.GQ7Yr[C$mA2lE`_4([[)$1m;=10nn:KI=g!H/c\pA$Wks!dFd$C!nKTct Z&K#8GpWMQRE8M<)jm/n<-%QY =0A'Tr@Jf#6SM2tDaUq2=u6j\7nQ3TdBf6T-7k,_)IrPV`lh.AoTN-:Cm`p04al8\klWCbQ@A P\mq$ui"n3]Ee%Q?qW(qFpal9BPFsW$UU:-KCOq*I+^@O!j+8c&Dr>sfZAamkr?^(Et'u89P9 `$fnd#(5XP:Wg\AUqc8[EZoRZ"9:4)rm3]*rB]o!p^dC089[M'S^>:L2'S3F;./69#^"!OlJ$ >VQD@e#=kO1/*H27Z7qp<> _T]'4tqBU8XV/AiXk5@aq-./*`NT>g\jG)Iio3!5l0.6FA5\'"'gCd\^!.1-jlWg*S:NZt5WE (]i^50^\+X?'/mL9i9F1!Q?t"-u4@Q(%k7:Y*euMB$ Q^0_)Y^iktCo`^n>[i#3$Q?48WsCSIcl8X;92U;R)$C/N0\.$9^-c-:O.*=(UECK?:2HNT5r(Gdr&Rtr_'8C6"_[Pq&-#.k h)-8(A`I;*ODj\N]!@5Q:X_kR]d32B:r?P&%-o+'JML*8S=,_KnDJb?IJ*9'P(aFR30MLdMW^ YZ2d/tb!>"=]QOe^9L`^*[bH^G9^U\TC&_Rb!4(m.8fG@6fh/\%PBU?EIfCiMo@9?"DGO_Rb2 \D`>8%FZ=7,Ju?gb:lV*&nYfF0g_[CX,&9@*qrno^0qpi"HX/3Zjrd59\^8oFHWJCe/=p!76T \>/&jMALTf9Cd7'!+5QVr8dn$5p_%dUt75(3BC%$rE%+)MYL6:VUYn#57a'MG:4>l%/1Dh?e* 2ja?$o;uLU?JkG/?Rs^!1eWjEkFiM89Vu'`Y_FpfJ6$RFV/*dO9W_'?DnY"(.D#&@Q7*lcj@3 +eY6rD08ac!N9uVp[PVHP!%u/CX\s+,7'TIV\lLO?;8a2lMgRaJ]4PkrN5ZJ-R^pTYO[]=0Tk 77Hbg8(IU/t-r[#UTO,-IkKjI9SZ2.O#5a=n(]4rC']:b>-cMB4t'Jh%H=,2W^e0ZH$!fQ'e, @g%l(_mF5]Ufr^.MB4t'dQ.jJcj@<.a'3YDHlJ%$(aIOhD%90JMu`FBAop2p)4G:pZ7(%U'#R ST<2<^I0_.@\nX?^M@l.J25gBq"&O8)gUUsrh7MKi2@X$o!T3]Ih,)pF\@`0)ajMN\=<]K'dT dBQo,YRI%4@%qa)FhI9-"r5Xe;Oodn,CAADuSC_0lk)?J4umZSIa7[)c?7L8X@qIYZ/OUr>>@ QB9tGu:bt<-^%THj=3\ei3ri0o(i`!R7+!A0=k^K^b,$;bW*A>PSjUNM\n:NFP0UXIf7 (sO/?M8gAsq^hC1bJr:T)fNH)r;45Jk1;P1)OE)rJ+uB%p30O;07kqAq[5#,R@V]KOVQ]dVY2I^&WU&/o/R-0Uc!p'DZ$X;652Op+o4%S+7P8N0-1Mj?q\m-MG4)t,k-+E6sdi5 h%rTgN;X?En:4W3$dR2Mg@%Od@Gm9bX9lMnXVYJd&uO57Yg7L'ljQ0Lf;%(/a_1-"^jK5]aS, X2t#o=iT+VcudnWGN[ao(eL&Ihgb%I"6[sP5CQk)]%GLXlKcEd9k*3VX'3`h&Mn$T0k7;.nb@ )kp:!p"+2BQNH[I\<,DtG>>:S@oMH#L;7D?FVQ,XSLr3D[!\6*"GnGT!ZI-@&nt\6mpi`iC<@'P@'WY;>\i>2RQoS)=Sh*?i&80<-ZG1ehp^ E*9(0C-I[E(q*f$S8``YEWSHs9MmVD0-!dIYGA^u`bqY$C4?nRBr"Z[ic;!f%9kR[TDJDbmC9 %W'uQeuuQKkb97UB9#MUZ^0h'daV&W%E\V+$/e#bVRoHFLA#Aia@V[UdB6He't&pH:K&FIoog kKpH3n0S3%NHIm.i>S2bq#*'7cDi]RMWhVZu\]t1dmiG,X)e@IlBTYPTeET8TU]MtED-/JXMT P!OQ?Cdd85d<[XFKe_d`YCMjU/0isRL1M!qFl=N[5ad@.8HG>IQVetr55=?a+!Np$_sn1)8'J "^"(YanoAN#/hRo\k?>#J@=kJ:JW%2FYC-G5%*$r1.sc#d7MOUtg%Y>'k)*,rqF&&qWK79@cW !tMO!^=,GiX['UugN#Z$1-7TgLt\hAg\6nt:_lHadh%b8!rS7<3EVo&QT(,O[iSi/uc4I_cj% ,f26`G<@cNF-cJ\k+2J4h#:7FE-2%lWQ`p&3G(?G4+_Rf_E/9]>*++6*F I'\RL$%eLSq4d60Lta3`%Rmg9IB,LQi?$Ym\"j-^dRP:Vi%;7ciI=4A_j4\_'_X*UYUgj2W:N ZFjf6($N=FfY=nJSj-Ck)V*,>=qMhk7qXU(7CTHB?u$?H@EVpGJ6Ii]Z%-7QS_-o=8'jq'r%eR\fSmcAYo'0Fg[Jd>HI]:_ft5o?S2ZnXZLS2$[_@"?a-OgYD k&AMu[VOqdE\&C68`8,KK)R0nN@gi/JVNs7]]g,?B2?@g=80toPhVl^@Z1<0iRaMqCKEn<,KK=i'chHdN^E%Fq5Pdn&mO5Lo"mZX17Z 3JCLoE3YdDn0'$Zf0\8nG=R,Yu:f(s3?@WqH.-VlALH+Z7k-t8,8.cN[&e9$H-,YKuA\l>J/e 11$C9qj%j/^Y7m;s.1UG[tR/IHg"I9:npm/1M9*QJ@KLOE9SgDtc'fe[2\KDXM_8Xr3d11+aD G`#&N>_e6loG1@ca=`?g(=QDQ5'MAkdM.'%674rCuK@B]-)117s&Rt$)X$<+3b?CF\jQ26B9^ =R_.4Kh,N25CU*[>;]*PEl00h*eJ!DirLe;S^a+t$NfN:$d)Y,G@]S"';LfMX**=COr":?gMW bTd3[h)B_k(dD?NQsj9]PEKD.j2@2Z`b%=g53pT.3GnetpnX#[Fo[cBlc,mN%*\m3dDq5E&Q^ 6e,@B<_[)]-8V*@Z;>Y._=Vs;<8[aP:U^l)Zqq "W))KdS>2CKCn6A:!bd+>L1rNG78C/,m>?o7d't:1'DY+Q-";f5WhY'g(j8?EW^Rt*N%Zdmd' t:1'DYttKIEib3_*nC>d+='&3:b?G_T7s>!s(bNgBt6hAgI],P'C1?;&eW:@,Q(jFSBP(!q,k $kupLl?'/l!LWC8o/29%mA=*Qt"Pmf^'i)8XOsRrS<%?mbUi#1^?K.^CJ^G?F"ON <.kj.5[pSRT[k12bN'K8LleKU`D/)lH?7_\4d-Xr#7qXXLK=3A]b/hS%AMeW.iro?Er&(;.sO X&2/a1VKl=!VW-?hpooN"J<^rplEUCi1l[ZmfS0QF&FU7_b/beDHkmJXXK`X;RIj/@NK\V'<( @8`Ye:*2;Y\d2?Esd"5>+]sqOjUpY!9XBRW+j2U?($V%icXoEI16b_daLharnEj`t[(40?7H_ k1iN^E%Dq".%KO_RaKa>^o%/j0iu^L7ISJep]\tYjbVUoVF]o`ZoU=18)&cAZ2sq .%\0C/[ni\ZF;%-Z<32R0W[ka5d0F].U;!G >a1BsAa01tI`mdFhBT*Ng+`<.2q5lbGW>O;*?*5%cSY6Wa-fXLo\i7Z61l-N2lqeC#/CB^"(/ ZnuIVo'09/OWoTF-DcX!gR^VOaY$3V)N5>eO08Ot0E^.NeIufO:?'h@eT,,1U.M`lN.6!'?$K I9(!J[bVZYal6Q1/JW7odV7bm@S5gYF,(&Td8Z$\80c+[O=5+NcRK@Pp7)#S8KmXO#=MBtLB6*`-r84rL#573/*jSJ\1L[](%i7GEc`7i;>:U8pq-m&_.B+ /ZrYQsd=X-orB@P`!.7hP*:m(nEah(0R@d7K4brS(nFg(0h). CYkp.D=i5@:1GgI^gkjbf1p0@n7?>ia6S93#J.aj5R%jJqFF5H@36C/`gb'=]71q%qN6YC\mM dCkV#f<0iqi#Y0HFr:a9.;P]:u@&,-FH\7@V[B?'HXp(aFQbN:klO@6,`:6knI9X7,^[5SS3, jeL;gbS%%20d;V8:Sb/>;:^[\%Fa(oNV\!o#J6M"3Q^90r&-h7js[V%d:m^">#`?UH'AngM"? tofP$4Ler1JX1Q&3\b-km[a7KCpX$odh\/u$T=qkpEW^X=jg#sEL>!s/]7K>qTj"\O:NNpZ8H ?"(R;q%iHqt&]@+)Lr2?6%R0:2+aodL!_nUQ]="+-S]u=NZ.;fg@a@+sdjo79kss&cG2^cDj= !BU+SIDgr/.ql]J742tKC)?9^)`euJg2f9JqcPsY!I2@AWJ7K@@9JMQrZ-=tn=[$?=m_%#H(R ]QF4QX&?KFVm;j7MHV-dJ>K3]D7r0_ikZ0mtB#Sfh=/r"e0"d(#h@d;O,eYXDDA8hn?2N _=m#Fm-u5e:%54rr$1?ahKukAIX1P,P7()dgqDH_`U`R;X&i)'\obf@"f7b:\:.\#RF6Cb]LY(c"K1=qkM+#3F3QI?#k< DeBT/UH7H3obCR.s7Y;+\uP'if:?-QDM]BQCi$??qn<^Yq&r`<#\X^76]#bueN-ikfWF,DGq,P.MZ@sik['cC2p?J5^]RqA+P Z\9D*l$U&hn$Dpr;!au:M2OC8ln]eW(8Hho'Y>GB`%LKldsHf[;&>!\ljlT.Aj_@gYugHUft- KCcQSI:bAE"(,fdeiKo^NT",[PlHg'B84Q;->@=o>R"I,!0#)V2<0L&#Z@`B\bK:G)$C:&4[:%I\frMR- :T[AL?(B[cEsC"$+pf`B*BNpo/M`/@4e7Whrg.j(kA=_3>oP1tZ+4#J@TA[A/6&M_2fETc`OU '/eu`qAqNK6A3<6RMjd5%]OgPEmCMM;CSB3sA2Q*Zop$'q.9hd.-R^-7F-1C3RSX#Hh77H(gg kAt@bZS);@(J>.0]nUW\0;5/Fr`UKcpas'.n'@Pr,gejs)Y9OZeTWlU8PELF5hkNY0KsGjXDV jqt>je42h!g@c^2o+0Y+CS3O3Fm0t>ca,`7>'JHn[qdEcCPcK:OAP" q_g>rHK)$"DI:Z#aR5SNB$A/HK+;j,PR3,eG8"YV8i$QIaZ#85$%b90[ e`ouN9fL5+5KO(MFks6GjBjp^ukR[0)."DKOgi/L4HK_P=G9GF,\HAeV0j.S9ZU;aH&IrK2(O D/D@-Veni>+WBUI=,8Rn>`KP`Pq+sMgl-e?#fRS0kZO0b*?/:70-YSj,PR3,lR5\/]I8WpEpq APU]U3Q!@I[=BV%s8>AIZ!)9k7mFZdLN% S9o3I:rh2+^FTNK)rM0i)<>j-MBX3dl!! hS$/#1p3o2^8*#LI^"=:[)[Fe6"/`84a[,$TP(B33@-+g>\!&hs(BYQ[FsKP0iBnJ'[ps-i// f4fRE&>D4!_\*\$B6WufeJ;-,-**"g`OT'GU.6\kM<=8+:"pCnC#gg&A[AnHpr,Yq\#J6TMJb n^J%2pRsXG9j:;D9\[)?+Um=h7H3)5C[Z=_%N/aq\JAW/sN*_Z!T4?EGU)Qp;PWZ^J_f-PrZb N$m!jN(b$EsNG545Y"1m8]nam4McNKk4m;Y'MuEOlJHKYbUAR9*>>aA4^VB_bbKcYf_ZmN5Hc :ji2JsN)c9#[`Fp2hDcCI.C:3qJ8p$1f-f?`6XA^6;Vo69V-+Os>dYKjAMR]C%A,Ds@J8,[%N3XXNlrX*/g\Z#S.M&?kk3%YS!qjPKRDM :QQR?tD;PdhtNnTn"?+oV'pTJu9c!@Y]!F1QsQfN7JqusemHhdSC_ig5(ARnK#d^X2NbRGM'8 P@:LRD*_'Pgn4QnaU+"P*Z["l&3),`5m(;&Z4e 'kJ:)+4+./),^\W9#]*7.^XoiW&h2a/lF8j;\;*@"dZ`%;;k5B;bIhVXAKXDWJL+Lq=1IbW_l G`oVA;mr6^R?E()Gi(E?BG^Co6RMOPE@(mcuQV8XZLbT8[q4*p%`On7bNZt.:WU1qs:06h2[p 9]*Lk6=c$Snc8$00S]H7DCZCjGfC`\0BIth;_%!lj/q_%'i;$CKW^TrnPuSiD2Z-mFpZm1Ik_ o:/=rh'/MD^d\YA)79lA\:/=;IdMH9g2Mu)Hn/tIjVWb2sjo8LG7'UgQ,`J-&4*&s&Tm*(F+I +U)9+3A2SO;'I+:Oo_79cR$o,PdZS\#?]U:uL%\4GtPgUDTJD;(7*>$deEiBje[M-.,U'GPeq ?a%.gZhC`OHN,o((kpG:c[eNi,P(j[Im>9^(lU:L2Kk(JV'<'5Jr$d%q:fo``MX\Y-[#ud>YJ #5Y'g/Pn%o7qPugq0715KDe#1M4#8GLEI3sImqBLKK0!@n4f=O>OPZCc(OmIb&[2Y.%LVpP-sh3I'a-5SpC 8K=Ac('G3t@kMbVN3MD>)Ts!%sCt^P%_0D_RV:"?)ZrLCoC=.,rFB+n,:q5R!N$@OBCBh"(N] sgZGhkKk)P %+5bKNX2f*TuRkZ/l<&-(%2PO,lK<`]%C.(rG0(g1<'<*UYU^T\0A(hO\dEK%?kI_6uY!nSN[ :h)^hj?b5_2a=,XoHN".?Wbo]2TgD.9UJgHj)f2deX,(NUic]O-['jNI=Bs`6?BRZpoD-*N:N /f;AF:Jj`X]n1*!PZI.dq;rSd8I+a[PZ^:Cr@'.7<:&C3jI;HADJHM&HNrgM+_kUg9ti[=6rK s]/<%sQ&V(H5i[a)%$h`b/ip:AUdtXP"t(Hj%/\2Rm9K0)Bae6&>/+mL<5]Nr&k.Q#TuLN->Y mh=*c^0o7=@VP0!"JYsaMgesBWd'-BJ93,\S/KID"CMtV21Yba(AZ8" [abcHl]>W[D@2La,;n_9kMOfsAYb1#gmFrJ-> V_DGaZgB2FaUFhTh;0Qo*K.H71j`&#_q(In*?52?WQ1tr+P74chmZ1oU]Z)G[h/fCco+:E-$*XGMdi=_[e-/p=`HIXe$#(/1q^K\Z/ht]!udW84c\Gij `u;`42b,U!8lgW^SJdVD39-c0?5J4`SV!`Ft.g3*WLee4U^tW#5]%NW8jV\@G==]\)E0bt"pD +*ca2baC98'g6\^SuO898Vu*/:[Hd]2K'?k3?f\8,UA0`1W4qQ;'//pD1K-jNhXVA3LV\'>%I :8JBg,cqAa'DFIOe(2TA:`Z*QC?/Eq6BQukdCji]CLgN2O?/M3RSa/(<[WNPYf?LB6l&psA1D ;3dF`T1PaB9&EK:RjUV`2k@fMe3nNY,I7);C@orBNC&8RK3i5.F[JDMkW:=;."$2bo"gW,gMt rkKg2Ic^YTlc-d@(SN]34\bVZYlMdWVSpgLcWPo;ce0PpqMK@s\9.mP`Mt+-G`"d:2O=ZMTd? I%m>!rr'N5beFB;:eAiedq3j2afQY2?%$`D`\!-+:0O;&#"LT#Sc??@RCWCTl"0[)^>3@e0-@ (jb43Od2bJEW1>7MOsY84VQu9MVWsO/R:fM_\/p^*N"`77g+VPp0WsrS_Z98@MmPGX"d4J>eR RAFgYmr&5>mYpi0/<05>8cF`mX9>^5N2q%8Al%4j%$86=TWZeZ@[P/P4kSjeS6b[1).Lfm)a7 B4>BQH7G+3mi-ac#H.%-t3-cMWTd?Xr(7ZK;f_)GR"p!MaN9L`TPrYEVQatGYfaLd%PnG2>o! S@Z$(,H$Nl>NqO?4@\S[:lb@Q+TUAH%&3Wn/($uckc5)?keKV>3J>crW@u=,fU51f>Kh7T >VT2TAE[jSpoD@fF:gqE0F+'h;`*S_9@q7W>s8@n(l:)p=YsOAPG35TuMkm.4kKi>i+'4L%^Z/\2rHSA)B:k!70q.KY\74rnaO&V_nQ1Vl9qlnH++S(XI /7Xk;=(4sEQ(JEEU)lkCY+I2gXQIngg#u.VfjQ4a:I>rb3t[k\7SJ4X':aNqjp!bj/8a.4-h` "NR:jB1u%tJ`S`>1TsM]OjL$C3u:6%B"\94kC_] :hg[p-:sp$5%i[TL7Kh.fMPn>)rT>J54HS0d2WQ8Ecdoes$d1u%sqNSCU&1N^',!aKb3&HStb SYse7'1H.\Eat?E5']uHF:fUuVT_pVf;qiI'A'B%X&lA#gM(BertH7s&eec@0'tT/ecU[KULB *n]-#R4!)$kdCqFek(0Q%f?nH3,,fdhLMR[+0UbOfWpn[_<-;PD^Z0K$KbEf+[ETpADnTi4hZ $>GlU%7^L&Em-m7M,[&Kl )l">$2RJ7X+p)61[*'@5,#\R;!5[%g#@c;G.'encH\u$ SS2Sk!+6E*GtcTm9,)_q791rXQf-JA)eb1BMdI<@hXqY=cH](0[>6=7=9NtGT.P;O"]mP.(rM QW8<5NpD1,BA9,K]O2!rhff?%^i ek1.`fLGSAh0LC?*SIALa>)>9VMR3a+d6-Ca=nJU?UpTeiQi@$u.J5[dpuX'r_l&'<4J$PHij s7E[;\`"ajF?#%CINR;S($TjcO#4G0VBY*kFM58b1=,Z8d5kM>90h%#h`p"rC;<7o?MAAd.dM V0rUY3d+8N+kBd9]nJ)*5Acm*>\d%9jiO[&GHs)$r*;Vnh>n) 0EGBPT<5jr&Qc>X*g4McNUaWLnZi)A\85o=[W"YdOncg?(P&GnX6Ht(DR/2Xp._K$]cS(bh_R aV8YbraOeFSq#h:+a<3adAf`@h'/(uMIcDD[)9\ZRZ['D2[-^(Vu(BL7`I?rqR6PON/RjKCp[ &Gc`o1a^:+pef-d/\o2T4\UeiWE(kj!-c] /].>g]MWE].e)_6iI0aO$?.&TeUMJ*\k;[eg\+>g]qc8K+^CN$_kLThZkqKLn"Nc<,Plm%g+% \>!aPN&4`--tDnM74aQh*i_X/4gFpJ*+t0RY38TC76c12dJFKi50h&#.`k`B]O9r/BgQ\Il#$$T 2M'NG%=p,*E$Qi;hTd\oXUo3jleiV#E)0L-l/P'N5_[?Y$IcX.hWNEH*+QjAdmoPj3lK,.k6\h$C5Ma3cF-2\I#*P=Rp3)tJ'%.h\W+\Rt1f`7XBQ`nAJopD/$iC/R\tj*0ru\8L-HV<_c>\'/,_ YaD+?Z"'.h"+5mCQK00G!Q(mA82Sd=NH^*elI?_-2pZ2S>]Jgq>'YB[?=*!\c#^1rVPU/M?a= -]@E)jC6t42UaT\=X.ihPV'QHQN_/q2e%iM/"'fBiB77C[7ro0J1kAT'24$-[3ie3dS4oNdD^ ))7f`86/%VLS7d,kt1f![t-l9G(.?'oBoY+cUCn)YqtshsYrWYrQmj]j=RH@U\5Y]mCR_fJ.l nL0:QX9rXL9I+O`/;l2Z9F4it1^\STV;U@jO4-hn(a:^pHOk;0g%]9.`Dt0Hc:&=Ieao?F@\o m[qN?%lmY(`=1?k#ID#. o2eoFR)t1>MG1\b*:oF\@m7fXuIX`FhDh8fs?I[T0HfAWi;kFkpIb+:b@8@-I(@/a7 QS4KS18D7;s9u=H^Qr(0m!S3bupu%j+QIX%Sd>E[7cu3i0DK[AG:QW[_T[re//*-+UPo[qqJE HM-pkjDeMpfO`6<<[:AM4DPdLF,1ih/qU^>^bJ8G&Q^6$c`2DO91n1o/!FKR*([008G%B^7Bs ?^DVr1I]65dYZtX\qk1$3&EI7Cijqb&555I;>^)d6J7AQ'u.nl\R/Qgqu,,0lD&dK\"DsYKWY lt;($4BjkMnLD_ERGI-$bcH2`U;Tb9#WZ'Ah7:Q.62[jV+\kp:=Ws9*cgi)-Y70[52[Su`#FR +6a[3&^]MOj&Ofre3$r?$eQ/3B>NbD+0g@U@iSM8+AE4!d+#e&*/O_B=@rcV\\CB#"NK*%R#P 4OVnU`tGdb(Z\,)sOHBs/<"7;srX:7k[`Las*nV)Wn_O!d,'g%``5Jne$"Ke^An3QbSMHtX'g%2VOk;)LeKU2jE%7_[T@o4!9B&MH%ObB!bO>(L7jfUBMbP$MB&62:MIKt-Uhh:l%$P@D/ >c17&Od_X3c8D\pdO`@n>E^A7o)mP3$ib/jN5_"=R]3tin1'&Z-j7p@n4\c=YsUAU(Lnt^"BA 6Ft8PGW/3CL,o:MCVCou!M'B)n*0q(3/D)X,[OPEl`g4.KdjE;]S@WD4XOmugne[=ro"t-E:A DY]=i3S36mgF%(84n7#@cOE7;fEhMSrrf.Z.MQ/U!qS3[o:cMBZUVZ#%cUE"qFT;a_=>7H1NS ,Dl]9,%W"(>*q^16SRtr,,0lD&r.c(;2g)WEZKm:+]OBX&58NV,Dq5eUAT`h!!&W3;7>V U3NaFp"8PkJjS8Mo(OkY@`^79ks709M0em9Hn@]4\kIm]9js39,^b:)j&[1J^h*P2O5')XKb3 VpC0n.?U6>q)QJ1M*]NX'K]RIoW-?4B(D*^X4GMIZ=V>XoeR+1*dMP>pM[eCH12nTq_U6NVpU& M-WjQfP@ia7S;I`/*V*MRFQnDk$Z0`LPn,EMF='*a)UTiTACn:I"gQ]>&(Ydb)Y\O[dbZkTX, qBH:#>'WhpOOm!kB7FAiP-m/6PMR9EcccFnTqb`E(lZRM_(MUf,>ok???q$f49T^WY((%-7oS jHWBPUZXmAi?\,C(tBMdSQ>F\Ipe/Ck-189BeVU?Ee&I-<4ob!n_*#Z`0"dq;(r;N\+1^UVH? nYU(+Z$VEC7@1Sp#@4-fZI)[G=p,3FQ0C*!BXP'ROm!EF75=N8%A6T;9%O(MC_W3IW.^gG5S1GF@6^B%0%u+-I`M4P@uWN,H&lCA?eSamuI"tc6"%X(Zh+!33@g,`J(!VE;d<_Ki"J[YYqTKR@]8%,Z,]G:YMQuoZ6JH'gNh]ja1R*lb$+^E =A&.`)Rk,$TY"/W43hg<"C=0;hfE'T4/.a/UTI0q;T+OM)"BQj3`G2-'.puWg]saSLAZkU;a<&j,3]NKK?V>/OJpiED2K@MJe>o74 AXC)ba$ #JJ"pj4MUm!jXO0CQ02LO7[/%4Y6JYs"15U_q,!2ZX.(VONU3klQ'l>O[eosPT74[B?#rRo[p l7c3mdunnMPP;qa6i4Q9GDJ8cl#>\LZ+DSgBi*#b\eEk:iJi.a*FD8.tUVXEC.nr(KV:g\[R^a_cX&^89-AL!OHgdkPf'Y2=P H4$h=]Js"-4'^1%=.sV&-Y(o:O_W9dKQTs#;'Z/d>u>p%ZjY=lLZf@`Mdl&O[5lg>(3)cE@)M :akbgY9GM(%A@?puV2Tr)"8" X+pcA;MK:1:X&7iZ:t8'uA=#\85^3U;I:WqTNgs&q"Xe#K0W:Lb"'oYZTT"\j[t[iq+*c,U!= m[!URTMO&D(XO0CQ02J:HJSq^9FVlIQN[9qS1J8ERW503c*>aTBm/=!3T ?9_96.Pa6Ga#2B]$6>"BUCWMVHS'[Tc@!!'M3P3Iph=Z)dLd6EO.(QMVonW?8ciG `ArTl9G(,IOb?fFfIecm79gEE92s&'0"ErsTT:NGMBp'sMY7COLb")K1&*d2TZiA.bLP8DrNMromV5 7Yi?Empk85C&nkDO??6tW=j2o"mNrMtW)"L05--&SL6\oklm>51o$2pP`7SK^:+D2uSf.,p*a h%O\Z\>Ee=?(Imma`IBiVnQKeer#(b7<,TbYsW&5M>2ZH^Jf;iY+aV$Ii*][-"> NbtG';*sm4Ldlm`tT+S[mbKm`"d,*6kNK'#`TrRe8%^4SN]4+TDiR&qsTTZI(B9F1SUj?eCCN iFFLsV\lIhPLulf[]/XYr)Fe)DTUGbZJp[-59G(-DG(M_V(qCFAMRJH@I6eQe7=[)V@7#BcgR u`V#JU6;k]bp4n^=6tXf^U$M0;rO.MB@;X%P'C(RH]eEH,IQ<70F"RJeXehP\\UU14hX_*Wd+ .p=k1;@ub7i/6*r$B6QfVL9#.)(1!;+RKmqQEFl6a^=e&i;->GWa*'.78Cg:i(&et gmJ(Fgs4Pa&*c0)ee-dM3QL&2RsF/mZ=/c(jGJ3JaCe@r![_2Y,P^1ZOAD$)2)p=(D:?G2['u dg?H3:;u86`Q==<\QO@Mo#ia8:Hj3ogA!I:T(fj+?CofX9rqKmB$cGOH03HAHf`CIZ_-'UoR' >p-&SQI]RtnRf>=\Vk^R2Ld5jQ-ECBlfq!'BeackSe1:8:gfJ/ZF>&ibfkO@HERPqCIVI)cGV muN6?83`p,U2n ^$K[f.Zp;di.jPX/?VS:0RZD)d6])UYT$#Yke\[LBQas+0]KhSD2#AX\0BR`2rE-9Y#Qh^GO8 :0T(DO&St,_+omq3Uq>F2*Za.NtV'7/En[I@i2Z%c*8Is9_6r?H%FP+FHn.`.`%g+4h#IktPB [9eV>/V/l?@;a_YH#aW@YL7+Y@"IkDf=O9+t[f`-6Y6ej[sZr,r%,$,NHnS/+TI.is]5MmD!X1%"Y1L.Ush0RAg;>[iOe"n@J\2 ]Ok`QH>f0>IFufamC4\h(s32\'".\KCN/AIa[snZ5h\'Q"[l&KkmRrn+]"UNaQX0mBck85R__ ,;!p*@NcbtW$q)rc!%*2Aj<0ik]0?/;%,o%+/m9K^Y2T>Om/lX\ful-+a+6rLa^t5\0=0`r9e dCVC&FI9tPF7]5^3MGuM=u9tP^OI=(^kcg7QN-!cN[\o!:5Y6PHIEPe=F8(1`,MENFujDPgO' bNl]#$1p-8+GLl7;(Lg$)]6]hKeNl[nBt'[jcB:IlMF:7+%%b];"OkTlEL$d")G"cV>*AA$rO FmYQq0>uCVNEtFsA>S0i??2SJZ9Wo4O70&..#H,oA'h&eCYZiqYIW]Vd23oXjLcp,XECE:CVQ muTqW,3r_uE46!7%Ijo[t"SW9:u`@m6M[.M]j(LM4K$'N[[:D&Ul/0l-ECgWdC`!W[i3l`Ya* ]VE19VRf$7p8mu87m?UZpQsrCF,?VkWksj:KI]N=arHdqeMjXe.,$DQ]-7>j!!pf`s1@a;%lK ac51%TFna>23(7lm"M-71'eudep(@CkVUQ3G]CT1it?tr("'l`=RopZ4f6GSd55PpdVV\P/&qci`"`\>?ad"POS=("U/Ae0!T].d`#e@<4b,,RaT0sF!$maoO2#n$U_g((L(]\+a+6/EtCdp#$1p -$h>D>iVU_mi\"U3>eV2!rk.FdBhr66kK&dQ!s`:mM`l?2@`Jt`@=u/Pi]jq4EMC&0Our%c(E G%`!XfuK[)>!n,JY$+7GA#J"98hho4cIoikbk=rk)o[';nTN)B/J%f0<;?qfkOuhnh_+mbM@$ -BXiNdaH'c"fbar0uJ).3NBs;0[CK)0P(_&Y,G^gV\)eE'`l,3867p&>dUr>['YYLa$'+grGU M\EpM;`R[Qa(M`lF\Lb2iLlIG:)3,=gmmbF0[)rmKa(8_Z!M_.\n1'\"be1(Ap&Q+L!be4@C. fquFr:61hX^Y4m3,q8A2N"8"7;ZnVX&m>K]fNF0H=2LYk2[plN/a+eQ]U^XX]mHJrSTR].Ml< Z?QjS#Y)"L[3@7db\0:opbId4XV5[lHphUWguPa%!P;Y<>)^+'l,DH1Un=g:<(imOZarqON.Ajs0!4=/BSoMB[R*oD,V1DPfC?u(&Dnbain:;qX:]I4J1jJ+0o7pgD,Ss[`&:916[mV?rnkYM"("8Gi[5#i>)*e9h!' ^G<='=e4aA@X)2f;S`U@^ohM=T\s*;,?,PS>F$M2@g]MM*Xspl3tQCGYt1s3M5r&iDP@Z;MFG \[g^jl/@kaNa7ER"LqnDU.D7s"]pZ^+01TN,neV6mL&8ks*UJ9K+\ak93\BPr` 4U>r4^S+om-4plGIE^%GF]V+VktoB/7g/Y7\$c]KH#.OnnbMU^C"[Vf)HLFQ5ongi^ja2OV2E @@PFY[T=l;+)5&&6oeI^^^5,=6`6/kK^'6[Yj3Z:Ldo7P:).8f0?ruJ"M/d`:iS5+&U9,EIG@ ,oUNuCla_D2X$\q!.n1Y=kb@=X'`e0,beKb:fo? D:dA45B1.'IJm+ApW)@X\%CYjjhg?V,UYg=On&)0YI!Cs-ZI$I7'Tfp6l/QkoW(Dc&HErrI/U IVXj)4^TXt#*?*+l^=&jMU*`V;;91h(41hP#GPa^>6P2V5-MmBRBJkZ$GrS/W6SP-"XlQIai')_`A0 1Yuafpq>;nkm^65_OZpmIDHmbR!-IDE5Lq`0;HgSSYO]S_!gS32eG!e8W_15F.n!j@e4&6"XZ ,u*#ZhE[MOcq.9VO,+:9HQ-9!5ZVK-^p+!)_m:075W7hX#'$/lBdMNZIDDiqDb+$=lnl3iSL2 UgB(FP1'*tf8l?uY`=?YgqAU)rD+,kBFErg=#=.uZUPJ9h9:AR!W\V'B:nu,$Ih-N1G[IuH0n dHM5s[6Zo%H5D>F-%8Y1fsps22)[Fn@@3,liE7.K#>X$q-X'N_qs(#!V4A,m&=?m6\Bm(7L>b K]]4>c:CFb&k:0]=9igeQ6NNs4h8\1HH+Q0c3d[K.^=\rj=`s`>*C(XaYJ1KogMmsr2!4 WM5PGTURa`M1%JLL@\(G1r'Y,JZZied^9i&Y,U@PJj"m./1mGe4!US!!$8ZMd93Z Wl#FfDaUQ@d7"GQU2IPu.fo^$lYrmT[[2k[LnYu5d5(6!KmmuXN`!BD.fo^$lYr[N7Oj:d5'9 .dU[hFH HS\!!'MC8%W4e7.K#NW^V$W)Qjp/1#e&j!8pbFl\\OP76g"1NEn7e?,RHY!5PEje.n`.MYB?! Th_?07GV6hBUGsT].W*#!!(qT1eg#r1b7&BcJG;jD4&it\u<4k)Pi;$+ohVQ'Z[=X1e/8YTSq B?73cmdmlRr>.quMrCLJ[ A^8]ied^9i)6*)MH1>.D^2A"jY&o7O6Pq@]6*@r3pIol#QOiW`=]7d+]7mL,hb#V(kFF$M?!V V:2iYFM5$V]-dh.P&Zusr_2'TC!.[_Qf7;Q+'eLnmhhGJiU5K5d@YD=K.fo^$Ha2s!DX31S+* 95pl1QU6Nk1#s!W[atZ)9*U>nm6j4,HEC_alK3@X,JO21!@2jf-i0@g2o5?mmpT7=0jM[h2Vu kb:AG(ksY@.KTU#X0J-Eg-ueTTSqBB`DDO+d/am:(qNdS`"`:Q^suQD'qHJ )I[EN-fG+K*,H_:P!3X>qY36j&oFpa?)I52L't`!b>S-r9>`FGCn[j_*Nql9fEOCTT)XWDfFV .[X!!$)1r:7M.2;j`!%d,emLmKWFfQ;*79gE)!5M\n9hLjR2+01QTSp<(!!%QB0mdbt91@6h:6T@5d 3!e?6K6=7!!&DMMJa5!5>7ek70!;f.q=_m,)Y9o,T9_ e!!'5SB"0%Zp].m#U0Xp[\0:nQJBgR='bSE&5SnE/!!!"7&m\R,'RN6_8[Ot0Z/$.e_\E1P!- I4,UD4eN6kf`sCUNA0?2SSWc57SQk2;*s!!%nT]Xe8DllC1FO6B[tied^9!".al&Q&t&Hb-0- ,heg#LarN,!9fBXY)"K\L8O3;/\4ap^N7A^&W'ujkTRF%Vt)2N!!'f2=%!`i7dipUgN6:G=/8 du!!$]Q0NUXV_ZX8pb7u8K79gE)!2(?,P=?q5:3Td($Ap6dM68@Nr,KgdUE?uQN@P&1!(;i%. i-l4778jmW"pV6/n8R"&HDg(*"-d#NRXpt`o%^<#RC\qhj2q'('L@oXj+,=/ !O[79gE)!2(>q>S0gi&7__/#OA+6D,,c7,-D1O!79"S'oBjD&OjT'(ILkTA*=JH&Q])8!;MQ[ ?JU2]7LS-r95Yo7>778kV(fi4L;AZrh`DCXgGZ#$/pe2MI hhh=[5k`@!!#9/KX*K@;)B/CmmL)+ied^9!"TaM.jBk:^mI^#RR,-S"-n,Pba,,/a&FOe?R;=+3BCO]X.'`e:7FJCcr6k lbZIZnIF%HrT7aQC(dM^o"]79gE)!8mkZ\g!k^;08fR]."I:r$cH^Mh/#tj,*g:!($4u-b`g> ]l/oIA_o_ZX]]cpJV]0,5T,.;Z#B@98As+ohVY2rFBopct$WD"Ol;0/dY[g"@ Q5?HeogVCicD.=(^\g5*N2s(^p^h1.fo\NKZCk+S+"e%\=+=5>qINV`W#f[5@86]- F0pF@\T5I98joDL.rSnB%3JhX0)%O1jJ< O4`tni(sC(?SipQ]HBFdO(+p;b-A`OF&;(4G[6G4P5,jtK]F^0DFn(#G3PkYFp$Ekj*uTALoP-+f;R+]s@\X`/LZaQJUPIW2T$"SO!!$scJ,,#kp"/6,?6/ga? VYn8]a\(J>rjQ%^p9M?/,B<-ZCRlACD\`5LC_4`eSeA[MB`D/XU?)km#fB.1 QMj0)!!8qHQr(q0Dnm&`RkN^U3QS-7a[X(]=n/OUV3I&nL;Bk]&`6Oq@GGHQf'EWs+Lie>_+^T@.2+@[P,,OhZ.F7PEIGbieA/LX0fo[@0:rV-pD!@Q8UP_p"N6l+Cn&6s3%Xp>"-DWg>hIHSn$NuSakNQ N(W)FRl%d'Q!]c%Af_HM5^ZJXp)o^HBR&*O'A5i&BLPC%el#..fWYeu)L6_",'m.fo\NKZ&6+ Bk:jBl=+V43.+hFiBDM5;dJ5Bi5%Sl'f!\HT"I1jICkq6Y?2q\&j0`:M3fk3rr2Y1RJl%T!e7 n_rH3eWWf-jSnY:Z0H("E9^\-j_P?D*+6b!JO?Pd]N!!$soDniFAg8/-@='6upbLHh4(#m"0: O0LKZrF0fcHU4@gTkX`85+uQFmI-+s8L:#s8H*+*uomoRr?fZosaL%rpMQ_BniI@K3)k.S@2j FI.lLXq2aBW;/@>J[]F+RHN3b1T0>K9[<44RC(XMM!!"tLjd3^XHES#LWJ**]KqbA2V79Y+j. 8F!@`ucNC1g:VWcZ3DF`gjerpP'UIVK.>hu'AFgptISnrmKhYBsG6OtTS[e>V83s80NoPLV`7 a,a;?jO&%l\qP8]1fp2-9`@Rf&HDgdbaWNcCY,T,s'dh7[%W`.e`gb7t['PUd e!IAb,JC@UU!JiGI4HdVMMbAm ]Od#t]pA[Y0Q3N`>LkD%_J!0d!!",MIf4%h98du\R[0T7?*Zji@oAIf`7S0h=QmG<6[ScSm@X F3BD,h%#lNZu>"q`gY'"H;B?l;H-XtAmIHLJ'QYL<.-nSGcgp_,6CY#F?"q)3&l-hd'(WP7CW G?Wm]h,Tg'na7.N@P&1!-IA`O*qftC=fYi>eR.XpTDj/LOsL?q9QJ>Ej[gse1$Xr-U`BrFN'q TY)If)jmVTo+1#mX>)9P/Xm-X2A#1UI.k40BJ'5FBFO@i]-cg%"qW.&*WB)R[#64`(YSdE:YJ .G'DbZ3j7$XN;`Sn_+g=h*JO$6lKe)0%5qHYg-9dD)N\pF%R\)2'ZjA@J*MntIJ.2;j`!5QF` qlWt!UfOQiA#u\.>;Ri\4dD9ejlIQZrHn7:92%?+lH$em"&%Nun'X/PHtq0+=@j2f;SrR8QpF/M0'`o03[jZ#1Fb`"`:Q!!"9OI,WO2n)hke$ ZgBS+6Maem+n]Xk%rbI/jZD5MkhUoDXN28rU(-4+35A3LarN,!!)f)F\>A#'<>/jFmIP3S8I" [j9P5t1GdQQ`Hth?A#cQWroIL)8)o.OTSp<(!!!"LT2.Z@?+[!$hIUuc5PIVDJ]u]a +KIq9&HDe2>fE6q^8k>cde,+l1d0aq*!W;*,-D1O!!$DLbgT!c&HDe2^]m=C1ZO2:\0:nQ!.Y M4WER4T!<<*"m"$%c)!"\1>S-r9!5O!+d)BCm79gE)!!'eI6sUUUFiE]%6Z+PQ<=]96!!!"r' 4"o1eJ0MJ!<<*"X@3hG&Q])8!!'5FdF(Hg&HDe2^m7AW(NDkD!!!#2@_=>e\i'dp"98E%YV*r ]@c1u5'`e:7!:7tDC/Gn?oK$4hz*lbEU1p.)a!!(p[N 7#V[=.sV&zgL,sm#,i;W70!;f!'=V>0&h`g!!!#E6#U&qaVD/&%(X&6!!!",,BVJTSm7 CU&HDe2^oln!Mmsr2!!%NOd7G-o70!;f!,&$]0(uY1#?M$.!!'5dHK\hIeKV.%!!!#W""-!8qB3Rmc:oz%OV<``"`:Q!!&Nb\@U>[S-r9!5Q;?VMhr.!!!"LWsP__\0:nQ!.`hg=Vq$F"jP#KR%;VR3`>h_o-^'\4]Qmu3-B(45b2%3*6kARaUb0k#Z9^"RhmKQd7$cg8 [U!!!"LW:H:ug6IYl^>@>ci&Pu)UM7jfV(V2g+gSCA6@tRZ6]%+kKXN!FXj8^5o_m/b0.c\]jgqdZ#lt$N>9p?MrDQR/mQcIIU3!S!!%ff?[qITE?j o:eL07$Dp2F(%;fnHF5hkOWtUb`,!TFNfqPLcZo#%4Z'[:8N#3^5T@V58A,lT0!/M9&r2%uki -G:o61;KGif,l$\$^LW.ipjR`mBEn@cpLkET;8S3+7F:a#M)czDW%S!HrmIq>?a6lYP,MIV9d ,=*r5>_':ucr:K<[X\6+`a[r5?3kZ+ZO8rB!!>>1P8/mP>4qnW:5!!'fRhKr$[F@_ob.kY*?( GCYekJZW6dM;X!44_0DVVhCO0a._ipMR6]ZcLEm#8cRL(R$5)?+]+ahY!<8li7"c!+7@mr2$9 )U8::]U,9kGB>hoUT'#0*Y$W8pn`&c4Wdaq^EU-YfPG;B&_#c?$L1gM`R-WAib^O^8!!!!QQ= 'PV4)dGA2MtG2<19<3++gA'AKsP2/E++U-4DMoe.pmq=N-CS,M[R !!!",/FU6HmFruu*>8&0Q9C8[g([]2s>F7f;z&.O*Z'5dViop1pBqaFYUMYs-[>^[a0F5O_*[5jYCdM4oHYEo-js7O@gs8H*+T,I\0!!& b05QA'nY0JP?ER,\gQ`'Oq(D_n&,#M10rc-OBFU:)V8%fa#.4M."1A8mE5;;ts!<<*"+F grestore grestore showpage %%EOF ================================================ FILE: examples/showcase/generated/asymptote/Deathstar.html ================================================ /tmp/tmpfkkrpwhe/out ================================================ FILE: examples/showcase/generated/asymptote/FiveVenn.asy ================================================ usepackage("amsmath"); texpreamble(" \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} "); size(6cm,5cm); path [] P ; path Ellipse = shift(1.2,.2)*scale(3.25,1.5)*unitcircle; pen [] Colourpen = { rgb(.45,.05,.05), rgb(.05,.45,.05), rgb(.05,.05,.40), rgb(.30,.30,0), rgb(.30,0,.30) }; picture pic; for (int k: sequence(5)) { P[k]=rotate(k*72)*Ellipse; fill(P[k],Colourpen[k]); for (int l: sequence(k)) { fill(pic, P[k], Colourpen[k]+Colourpen[l]); clip(pic,P[l]); add(pic); for (int m: sequence(l)) { fill(pic, P[k], Colourpen[k]+Colourpen[l]+Colourpen[m]); clip(pic,P[l]); clip(pic,P[m]); add(pic); for (int n: sequence(m)) { fill(pic, P[k], Colourpen[k]+Colourpen[l]+Colourpen[m]+Colourpen[n]); clip(pic,P[l]); clip(pic,P[m]); clip(pic,P[n]); add(pic); } } } } fill(pic, P[0], Colourpen[0]+Colourpen[1]+Colourpen[2]+Colourpen[3]+Colourpen[4]); for (int k: sequence(5)) {clip(pic,P[k]);} for (int k: sequence(5)) {draw(P[k],linewidth(0.4));} add(pic); ================================================ FILE: examples/showcase/generated/asymptote/FiveVenn.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 236 324 375 467 %%HiResBoundingBox: 236.47251 324.633858 374.52749 466.366142 %%Creator: Asymptote 2.79git2.79 %%CreationDate: 2022.03.24 02:49:37 %%Pages: 1 %%Page: 1 1 /Setlinewidth {0 exch dtransform dup abs 1 lt {pop 0}{round} ifelse idtransform setlinewidth pop} bind def gsave 300.63394 394.476514 translate newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath /Compatible .setblendmode 0.45 0.05 0.05 setrgbcolor 0.5 Setlinewidth 1 setlinecap 1 setlinejoin 10 setmiterlimit fill newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.05 0.45 0.05 setrgbcolor fill gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.05 0.05 0.4 setrgbcolor fill gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.3 0.3 0 setrgbcolor fill gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.3 0 0.3 setrgbcolor fill gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor fill grestore gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.05 0.7 setrgbcolor fill grestore gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.05 0.7 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.1 0.75 setrgbcolor fill grestore gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.05 0.7 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.1 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.4 0.5 0.75 setrgbcolor fill grestore gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.05 0.7 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.1 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.4 0.5 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.85 0.55 0.8 setrgbcolor fill grestore gsave newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.05 0.7 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.1 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.4 0.5 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.85 0.55 0.8 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.6 0.3 0.3 setrgbcolor fill grestore gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.05 0.7 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.1 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.4 0.5 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.85 0.55 0.8 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.6 0.3 0.3 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.333333333 0.333333333 setrgbcolor fill grestore gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.05 0.7 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.1 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.4 0.5 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.85 0.55 0.8 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.6 0.3 0.3 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.333333333 0.333333333 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.65 0.75 0.35 setrgbcolor fill grestore gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.05 0.7 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.1 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.4 0.5 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.85 0.55 0.8 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.6 0.3 0.3 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.333333333 0.333333333 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.65 0.75 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.727272727 0.363636364 setrgbcolor fill grestore gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.05 0.7 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.1 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.4 0.5 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.85 0.55 0.8 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.6 0.3 0.3 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.333333333 0.333333333 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.65 0.75 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.727272727 0.363636364 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.65 0.35 0.7 setrgbcolor fill grestore gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.05 0.7 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.1 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.4 0.5 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.85 0.55 0.8 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.6 0.3 0.3 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.333333333 0.333333333 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.65 0.75 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.727272727 0.363636364 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.65 0.35 0.7 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.363636364 0.681818182 setrgbcolor fill grestore gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.05 0.7 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.1 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.4 0.5 0.75 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.85 0.55 0.8 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.6 0.3 0.3 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.333333333 0.333333333 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.65 0.75 0.35 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.727272727 0.363636364 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.65 0.35 0.7 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.363636364 0.681818182 setrgbcolor fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.7 0.8 0.75 setrgbcolor fill grestore newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath 0 setgray 0.4 Setlinewidth stroke newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath stroke newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath stroke newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath stroke newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath stroke gsave newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip gsave newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath clip newpath 19.6225939 71.1102169 moveto 6.57500986 75.349634 -11.4483878 55.8691876 -20.6337914 27.5994221 curveto -29.819195 -0.670343411 -26.6882791 -27.0242429 -13.640695 -31.26366 curveto -0.593110971 -35.503077 17.4302867 -16.0226306 26.6156903 12.2471349 curveto 35.8010939 40.5169004 32.670178 66.8707999 19.6225939 71.1102169 curveto closepath 0.5 0.5 0.1 setrgbcolor 0.5 Setlinewidth fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.5 0.1 0.45 setrgbcolor 0.5 Setlinewidth fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.1 0.5 0.45 setrgbcolor 0.5 Setlinewidth fill grestore newpath -61.5661202 40.6364613 moveto -69.6299706 29.5375234 -56.6725013 6.37646464 -32.6248024 -11.0952113 curveto -8.57710354 -28.5668872 17.4544505 -33.7330121 25.518301 -22.6340741 curveto 33.5821514 -11.5351362 20.6246821 11.6259225 -3.42301681 29.0975985 curveto -27.4707157 46.5692744 -53.5022697 51.7353993 -61.5661202 40.6364613 curveto closepath 0.55 0.55 0.5 setrgbcolor 0.5 Setlinewidth fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.75 0.35 0.05 setrgbcolor 0.5 Setlinewidth fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.75 0.05 setrgbcolor 0.5 Setlinewidth fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.8 0.1 setrgbcolor 0.5 Setlinewidth fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.35 0.35 0.4 setrgbcolor 0.5 Setlinewidth fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.8 0.4 0.45 setrgbcolor 0.5 Setlinewidth fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.4 0.8 0.45 setrgbcolor 0.5 Setlinewidth fill grestore newpath -57.6725488 -45.9955026 moveto -49.6086983 -57.0944406 -23.5771443 -51.9283157 0.470554609 -34.4566398 curveto 24.5182535 -16.9849638 37.4757228 6.17609491 29.4118724 17.2750328 curveto 21.3480219 28.3739708 -4.68353213 23.2078459 -28.731231 5.73616998 curveto -52.7789299 -11.7355059 -65.7363992 -34.8965647 -57.6725488 -45.9955026 curveto closepath 0.85 0.85 0.5 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.75 0.05 0.35 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.45 0.35 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.5 0.4 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.35 0.05 0.7 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.8 0.1 0.75 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.4 0.5 0.75 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.85 0.55 0.8 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.6 0.3 0.3 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.333333333 0.333333333 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.65 0.75 0.35 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.727272727 0.363636364 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.65 0.35 0.7 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 1 0.363636364 0.681818182 setrgbcolor 0.5 Setlinewidth fill grestore newpath 25.9225248 -69.0632453 moveto 38.9701089 -64.8238282 42.1010248 -38.4699287 32.9156212 -10.2001632 curveto 23.7302175 18.0696023 5.70681992 37.5500487 -7.34076416 33.3106316 curveto -20.3883482 29.0712145 -23.5192641 2.71731504 -14.3338605 -25.5524505 curveto -5.14845687 -53.8222159 12.8749407 -73.3026623 25.9225248 -69.0632453 curveto closepath 0.7 0.8 0.75 setrgbcolor 0.5 Setlinewidth fill grestore newpath 73.6935502 3.31206967 moveto 73.6935502 17.0311114 49.5970085 28.1525922 19.872418 28.1525922 curveto -9.85217248 28.1525922 -33.9487141 17.0311114 -33.9487141 3.31206967 curveto -33.9487141 -10.4069721 -9.85217248 -21.5284529 19.872418 -21.5284529 curveto 49.5970085 -21.5284529 73.6935502 -10.4069721 73.6935502 3.31206967 curveto closepath 1 0.739130435 0.695652174 setrgbcolor 0.5 Setlinewidth fill grestore grestore showpage %%EOF ================================================ FILE: examples/showcase/generated/asymptote/FiveVenn.html ================================================ /tmp/tmp3fmtri31/out ================================================ FILE: examples/showcase/generated/asymptote/cflag.asy ================================================ usepackage("amsmath"); texpreamble(" \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} "); size(4cm,6cm); pen canadared=rgb(235/256,45/256,55/256); real flagwidth=4, flagheight=2; path flag_outline=scale(flagwidth,flagheight)*unitsquare; path cbar1=scale(1,2)*unitsquare, cbar2=shift(3,0)*cbar1; path mapleleafleft= (0,-102) --(-5,-102)--(-2,-56) {dir(87)}..{dir(190)} (-8,-53) --(-51,-61)--(-45,-45){dir(70)}..{dir(141)} (-46,-41)--(-94,-3) --(-82,1) {dir(25)}..{dir(108)} (-81,6) --(-90,34) --(-63,29) {dir(348)}..{dir(67)} (-59,30) --(-54,43) --(-33,20) {dir(313)}..{dir(101)} (-27,23) --(-38,76) --(-21,62) {dir(330)}..{dir(63)} (-16,67) --(0,100); path mapleleafright=reflect((0,0),(0,1))*reverse(mapleleafleft); path mapleleaf=mapleleafleft--mapleleafright--cycle; filldraw(flag_outline,white,black); fill(cbar1,canadared); fill(cbar2,canadared); fill(shift(2,1)*scale(.008)*mapleleaf,canadared); draw(flag_outline); ================================================ FILE: examples/showcase/generated/asymptote/cflag.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 248 367 363 424 %%HiResBoundingBox: 248.807087 367.028543 362.192913 423.971457 %%Creator: Asymptote 2.79git2.79 %%CreationDate: 2022.03.24 02:49:41 %%Pages: 1 %%Page: 1 1 /Setlinewidth {0 exch dtransform dup abs 1 lt {pop 0}{round} ifelse idtransform setlinewidth pop} bind def gsave 249.057087 367.278543 translate newpath 0 0 moveto 112.885827 0 lineto 112.885827 56.4429134 lineto 0 56.4429134 lineto 0 0 lineto closepath /Compatible .setblendmode 1 setgray 0.5 Setlinewidth 1 setlinecap 1 setlinejoin 10 setmiterlimit fill newpath 0 0 moveto 112.885827 0 lineto 112.885827 56.4429134 lineto 0 56.4429134 lineto 0 0 lineto closepath 0 setgray stroke newpath 0 0 moveto 28.2214567 0 lineto 28.2214567 56.4429134 lineto 0 56.4429134 lineto 0 0 lineto closepath 0.91796875 0.17578125 0.21484375 setrgbcolor fill newpath 84.6643701 0 moveto 112.885827 0 lineto 112.885827 56.4429134 lineto 84.6643701 56.4429134 lineto 84.6643701 0 lineto closepath fill newpath 56.4429134 5.19274803 moveto 55.3140551 5.19274803 lineto 55.9913701 15.5782441 lineto 56.0207842 16.1394982 55.321137 16.3762367 54.6367402 16.2555591 curveto 44.9285591 14.4493858 lineto 46.283189 18.0617323 lineto 46.4007061 18.3846078 46.3221702 18.7504262 46.0574173 18.9648189 curveto 35.220378 27.5441417 lineto 37.9296378 28.4472283 lineto 38.3114486 28.6252696 38.2988236 29.1347034 38.1554094 29.5760866 curveto 36.1234646 35.8976929 lineto 42.2192992 34.7688346 lineto 42.5806522 34.6920267 42.9899124 34.6825184 43.1223858 34.9946063 curveto 44.2512441 37.9296378 lineto 48.9924488 32.7368898 lineto 49.5360514 32.1539473 50.497044 32.6427003 50.3470787 33.4142047 curveto 47.8635906 45.3801024 lineto 51.7017087 42.2192992 lineto 52.2370957 41.9101934 52.5110872 42.7211432 52.8305669 43.3481575 curveto 56.4429134 50.798622 lineto 56.4429134 50.798622 lineto 60.0552598 43.3481575 lineto 60.3747396 42.7211432 60.6487311 41.9101934 61.1841181 42.2192992 curveto 65.0222362 45.3801024 lineto 62.538748 33.4142047 lineto 62.3887828 32.6427003 63.3497753 32.1539473 63.893378 32.7368898 curveto 68.6345827 37.9296378 lineto 69.7634409 34.9946063 lineto 69.8959144 34.6825184 70.3051745 34.6920267 70.6665276 34.7688346 curveto 76.7623622 35.8976929 lineto 74.7304173 29.5760866 lineto 74.5870032 29.1347034 74.5743782 28.6252696 74.956189 28.4472283 curveto 77.6654488 27.5441417 lineto 66.8284094 18.9648189 lineto 66.5636566 18.7504262 66.4851207 18.3846078 66.6026378 18.0617323 curveto 67.9572677 14.4493858 lineto 58.2490866 16.2555591 lineto 57.5646898 16.3762367 56.8650426 16.1394982 56.8944567 15.5782441 curveto 57.5717717 5.19274803 lineto 56.4429134 5.19274803 lineto 56.4429134 5.19274803 lineto closepath fill newpath 0 0 moveto 112.885827 0 lineto 112.885827 56.4429134 lineto 0 56.4429134 lineto 0 0 lineto closepath 0 setgray stroke grestore showpage %%EOF ================================================ FILE: examples/showcase/generated/asymptote/cflag.html ================================================ /tmp/tmpfzlq74lq/out ================================================ FILE: examples/showcase/generated/asymptote/eflag.asy ================================================ usepackage("amsmath"); texpreamble(" \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} "); size(4cm,6cm); pen euflagblue=rgb(31/256,68/256,186/256); pen euflagyellow=rgb(254/256,203/256,11/256); real flagheight=2.0, flagwidth=3; path flag_outline=shift(-flagwidth/2,-flagheight/2)*scale(flagwidth,flagheight)*unitsquare; filldraw(flag_outline,euflagblue); path unitstar=dir(90)--dir(234)--dir(18)--dir(162)--dir(306)--cycle; path star=scale(1/9)*unitstar; for(int k: sequence(12)) {fill(shift(2/3*dir(k*30))*star,euflagyellow);} ================================================ FILE: examples/showcase/generated/asymptote/eflag.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 248 357 363 434 %%HiResBoundingBox: 248.807087 357.621391 362.192913 433.378609 %%Creator: Asymptote 2.79git2.79 %%CreationDate: 2022.03.24 02:49:37 %%Pages: 1 %%Page: 1 1 /Setlinewidth {0 exch dtransform dup abs 1 lt {pop 0}{round} ifelse idtransform setlinewidth pop} bind def gsave 305.5 395.5 translate newpath -56.4429134 -37.6286089 moveto 56.4429134 -37.6286089 lineto 56.4429134 37.6286089 lineto -56.4429134 37.6286089 lineto -56.4429134 -37.6286089 lineto closepath /Compatible .setblendmode 0.12109375 0.265625 0.7265625 setrgbcolor 0.5 Setlinewidth 1 setlinecap 1 setlinejoin 10 setmiterlimit fill newpath -56.4429134 -37.6286089 moveto 56.4429134 -37.6286089 lineto 56.4429134 37.6286089 lineto -56.4429134 37.6286089 lineto -56.4429134 -37.6286089 lineto closepath 0 setgray stroke newpath 25.0857393 4.18095655 moveto 22.6282347 -3.3824649 lineto 29.0620653 1.29198663 lineto 21.1094133 1.29198663 lineto 27.5432439 -3.3824649 lineto 25.0857393 4.18095655 lineto closepath 0.9921875 0.79296875 0.04296875 setrgbcolor fill newpath 21.7248875 16.7238262 moveto 19.2673829 9.16040474 lineto 25.7012135 13.8348563 lineto 17.7485615 13.8348563 lineto 24.1823921 9.16040474 lineto 21.7248875 16.7238262 lineto closepath fill newpath 12.5428696 25.905844 moveto 10.085365 18.3424226 lineto 16.5191956 23.0168741 lineto 8.56654367 23.0168741 lineto 15.0003742 18.3424226 lineto 12.5428696 25.905844 lineto closepath fill newpath 1.79206827e-15 29.2666958 moveto -2.4575046 21.7032744 lineto 3.97632597 26.3777259 lineto -3.97632597 26.3777259 lineto 2.4575046 21.7032744 lineto 1.79206827e-15 29.2666958 lineto closepath fill newpath -12.5428696 25.905844 moveto -15.0003742 18.3424226 lineto -8.56654367 23.0168741 lineto -16.5191956 23.0168741 lineto -10.085365 18.3424226 lineto -12.5428696 25.905844 lineto closepath fill newpath -21.7248875 16.7238262 moveto -24.1823921 9.16040474 lineto -17.7485615 13.8348563 lineto -25.7012135 13.8348563 lineto -19.2673829 9.16040474 lineto -21.7248875 16.7238262 lineto closepath fill newpath -25.0857393 4.18095655 moveto -27.5432439 -3.3824649 lineto -21.1094133 1.29198663 lineto -29.0620653 1.29198663 lineto -22.6282347 -3.3824649 lineto -25.0857393 4.18095655 lineto closepath fill newpath -21.7248875 -8.36191309 moveto -24.1823921 -15.9253345 lineto -17.7485615 -11.250883 lineto -25.7012135 -11.250883 lineto -19.2673829 -15.9253345 lineto -21.7248875 -8.36191309 lineto closepath fill newpath -12.5428696 -17.5439309 moveto -15.0003742 -25.1073524 lineto -8.56654367 -20.4329009 lineto -16.5191956 -20.4329009 lineto -10.085365 -25.1073524 lineto -12.5428696 -17.5439309 lineto closepath fill newpath -4.35216579e-15 -20.9047827 moveto -2.4575046 -28.4682042 lineto 3.97632597 -23.7937527 lineto -3.97632597 -23.7937527 lineto 2.4575046 -28.4682042 lineto -4.35216579e-15 -20.9047827 lineto closepath fill newpath 12.5428696 -17.5439309 moveto 10.085365 -25.1073524 lineto 16.5191956 -20.4329009 lineto 8.56654367 -20.4329009 lineto 15.0003742 -25.1073524 lineto 12.5428696 -17.5439309 lineto closepath fill newpath 21.7248875 -8.36191309 moveto 19.2673829 -15.9253345 lineto 25.7012135 -11.250883 lineto 17.7485615 -11.250883 lineto 24.1823921 -15.9253345 lineto 21.7248875 -8.36191309 lineto closepath fill grestore showpage %%EOF ================================================ FILE: examples/showcase/generated/asymptote/eflag.html ================================================ /tmp/tmp3tfsnwuj/out ================================================ FILE: examples/showcase/generated/asymptote/image-rotational-solid.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 206 296 405 495 %%HiResBoundingBox: 206.01 296 404.99 495 %%Creator: Asymptote 2.79git2.79 %%CreationDate: 2022.03.24 02:49:40 %%Pages: 1 %%Page: 1 1 /Setlinewidth {0 exch dtransform dup abs 1 lt {pop 0}{round} ifelse idtransform setlinewidth pop} bind def gsave 206.01 296 translate gsave [ 198.98 0 0 199 0 0] concat /DeviceRGB setcolorspace << /ImageType 1 /Width 796 /Height 796 /BitsPerComponent 8 /Decode [0 1 0 1 0 1 ] /ImageMatrix [796 0 0 796 0 0] /DataSource currentfile 1 (~>) /SubFileDecode filter /ASCII85Decode filter /FlateDecode filter >> image Gb"-6l]5>lH02/kSF]P?@m3Ta@7K/L-%KARJcIQ*!ZA3Od3=P-bQ0$j#>#+_U)>dU[`hjN`5> 6SRl?1IX9RLh@jOT'I:`;[[@/06]qBooi4?j"@3S%jeZ$cIJ'XJrMgH.OhVF-$A'B+Jfq!=L/m;a Q&.a%2do]P&-P91">rWQ9#lIVIhPKZ5nF/b&C`1XXJ1GLN,+"f#_F0).SuR9"f?ko#_F0)P"Q %\^f1jJ5nF/b8h%%1eKmYt-4#2G#_J]NV-dF15nF/b&-PQmH[u7!+:*QA#_H="2m!-^5nF/b& -Q,D=9Uu%"@3U[7DLAYJfk>N+>72Z/-Dpq#_F0)Julp5Z4*gd+:*QA#dP5,F;p8L 5`/r402MMV#3=P]:\j,5S+&aOIa0d*>WKXVP!Y$H[cS05nIQY0NEls4Xe PVFT<-Z5nF10#Y`cc8ZXCFE.s%=&-P91j@*IVDQ@rn,D@Y>VV#TN0W?0#Jfr-'@&cDHn,HOc. A.@X5nF0E&X]RGWYnj1.0tMJ#kBK"'a-f6"@8-]^f1jJ5nF/bmK-.AW"@3S%61+eQ5nF/b&-TNO9Ed]n"@3U[/he"C5nF/bOLr;-&-P91"@;GW;t WlWO;]*4"$mJ$6%0!7lBV.^P^ugG"@3T0/cHkuqFCcgoh,.&"03OMJfr-<33Hu?7k1f?kq1.28;b>KR3`O+=ON&AL_lVI*!IYgn_S6# RW-&<41>#q%pNV<"K0u8Q7*:M>EIbiM=(<#`9o$-4pbfi$\k_TS+eZWU:+ne%o![YI"c;R3;i fZ;J/+eLH/Q?n/*>!`MAr"QcD=0bjia8mj+SJtRJoVLkI]"f?ko#g,YF.L7M*?n)G6TR>7"._ LcN6)=i\"[Vql*>JCG-<#cr$D7Pg\Htq562@RhTd%uXadGa7[.#5iTHjS;'e1%:r=S@mM#4Oi Z=#.Y('IM!T+kc\rS%QN;nu?Y$;Au#JZ1[ZdC/N0. lP?o8l4Sul+[jqHLf0*^\>G1rK%!K5=,d9?9bM@W4)h,Ppe=dY6:^P=-E$q*ncC\:JAO.+pM" RqqBZ!VPZ]/%P:>hk7d-_^f2Te9[tYEWH+:ebMX2,R.\BBe,R^MB.EJ=aaZiXas)>o4s@/1TR I5A-2.s!l=CkRLe#Oq_M83(:$;Au#JZ0hA6B]Vb "H[kCqEJ$!qb]52U8"Wrj:CRj21);[4OFj\jR*=Joo_bNhT *1d8.i=@J]+e=^Vt^jR*=JY9nKVq;d_s1TD.RlE_m>ak*!]1u_!mT"n;O$ ;Au#JZ5$J6qq\r9hgI(MZ7faWSF<6cJ\rKXpRj&U;0aA;W!ik\'cTM^XT'LKWfgkCQ`H59kCA BH;1t-ru+k&^f2Te9[tY9O/WJoRj()rpiQg6'dT(GPV3fRW_Nmpr/%IGNP&sMbATq[D;F[9P?r`!$2gV=4)8Dqa_kX aRD$*`08_Z(hW_g;6:DkRZk^DFao5?ob^o@mF[eGBQ8edYm=)'KjP>\]_-@cbo>^kKY]?`:HM h+m!(NZa`ecc@ReObU@rj9=+"_rW3(ZA6G+)1GsL[l%EWa)7)$%i"&?kih+.54cI6>7)96*4U #2mp2()X6t!##6BVh1+Ran^"[T[*9]\]sg.g4T+fJX_6Vg5Yb" Q1m9bg8p!%/%%:7?*J+oMX3\HtsK$VGa`$'*LW"']%mCMlF#9\tQ !?`(YZFOJrSpRrD_"&/8*4O'jYA&`O<6_@ra:$Hc>%;A27f&-Shpd],XnY7r9>/thu[?Z%.R+ :*SsMB\6t6O$@%,VW6%UpJj1g.g44+:'Gur5Qp'1\umJ,o%[Z%M5S2FReOjg H;^DcEeQ'$29kem0$If2E&Cd`2I2fe-5lsuM.jX@%#_F0I++^D3e#_J^_lJ=n::hoP,:(h\f\KM61+=Imgp6E(:L"F1fN$A'BKR`]1k,j? FB.52J>5u9E"bZ';M9qWg]++^C6#_Jd"/Q3BV9`QQ>'S35+#_Jd"!`L76#=5Op+iX8E`5nLu8##V$?#_Fl:VLfor@Nq$L+/4jmK:m)f9E d]n6kp31?oLAJ*sAHm+:+^qenB.*C4[R!?XP>hJflP>:PC&7"@3ZOW?;IuR,i2]!Lt8.AW"@3 S%61+eQ5nF/b&-TNO9Ed]n"@3U[/he"C5nF/bOLr;-&-P91"@;GW;aCrt5nF10$VU^i&-P91j =W,$"@3S%6'/^o<"K0u&-P;e!`MAr"@3S%\I2(75nF/b&EGGt'a-f6"@8-]^f1jJ5nF/bmK-< Q&-P91"M"n6"[N\&5nN*00GO^V&-P:\]>.AW"@3S%F\/dN9(4/nI.aPD&s?]ir\`%U+p3K@#_ F0);T]T/^A?BlpY=6Z+9Mb05nF/b:iE1+8tCa3ZB,J'#!ie'6#i\,9-C&t6\iLn>n@-)&>YO' R0nPBqsM).EFYqL]682=RO]r1^UjG=El$Q(0.o]iBsceN5SjPh&C_@b^aV9!Gm'gRT"-p$Ko5 -Z/"8F+=HJ#Ts-_r"3PN'k_?ZRl"^Snq#_F1t3+W.dpYL7@mFkf1.!)9FA)g#[<0fb4B=$A19 ^ZnO\0)'/TS*r_;eU-u1mBn:^3fKcH3ELJ;ji@eK1/&/X'nX%ceeV?qJfk?I;$;8Ue9'SrMtc**l.WOP!1EJSLJ4NX'(5=N>;3H-#_J_<6K=9NEF REcT&"25r+p]U:@]cQ5lmi*Fc"@5jceKcOrp`rG].30ciPsp5&4GF-N]W`1WR[GmBCWX_^6&R_UE&WX8,B0d(3AM3ESjW0s]O)H_;Bn3/q7Or77JefaBJflJDC(TJn:iY tro_8VhR0K$.\*sl229Gu05nF1pPqRr.&lcaBm(cR9!N%=jR\44d=YR-(#_F&X"er:HW+LRZ/ -8LFBR$njGfg(p5nF/VjUP.U'3$d'<#,M3l;H+sMaK&OPH9lpKHLPpi]5.%U,"*pAq6j3!_h/ '@#2csZ8OSGJ63?cog^WH<,jg\1;Hj)!N,-LYZ25R=[4MDK)-m21TGO99'="kVD8T7WV?*RZ6eJMm2.D-? +:-+U(4!U-R8NM[#FNXj^f5^f0<8K9=Pt\8JmulbU\YBrbm+K@au$n5I>AH8^`sWi$A+q(!_3 E?E.Fo]"&.7##e^T'.gU_N$QKo?_#^Dg%5:d(,3CA*Y94)X-dtt7E0PKqW@S*EeV?]'$8-]0\ :PiZaU"`Y;-j;tAJ&=M5"#m]@*2P)Y99e,1HZZ_4%P-X;1fV4ZS=QIO>#VO;=;h$>^"7=_B6&>cH0GN^hgKJRtVQpI]D"XCMY= [A.]FE2cYQ.inHma7f^f#e7PPsp5&q@NU1"Wb+)D$<3X;Wd`o'7AH`&dF`G,/@0+Ln:f%5$WZ ?+@o!p@k&Hj@9\X*?n.'7;tV<<$8dud"ksB9jO,l^,+QB&D(WU5K;hNH9\"p6.b"N="[PW#_3 i*J(-000('1;t6XUWs6/`/25mS)pDG8#>.2LRe,0Va.au$n5I0cp+4CDAZ:fBD3'd'8S?sAOC _dFtC!)rP6YR6g"gBrPnBtf8?<%Y>V7@7L;Q"bcJq@Ha4UX6BM5ZU_%PdrMK$Z'SjAf+3Q)IT R/"BN>kaQ$dtg+V$Yq;U7X5upgK<>J>+g;=)d:=^FniCrU'pPW-5uTVEX[SUc0U6@&WVR0."mZ^S'a nS>&7bt+TJ"V+%;]elAf+3Q)ITR/"BN?"PY=LJA-M'Go'u#Y:!pbb(1Ds6<2K\nl9eqoX@&2N BRm1Wga'2'MP_g@f[_7j0UU!>^f5^fXFbR30bk.Z'pO>39N*dPX[SUc0U6@&WVR0."m`C#.N4 PQeul^@lk^#7JqC#o1dqN$>(dat;jdiWWXjY\YRYHGU2fhhh9DFCSe\I:nuJA/'Feko&S;kRA K"sV4p4p&3ZOQFL+!uH_[>t5ejB"(dM*.,CCt0gj%OT;EC?27CE21,`\]u\Pp$+liQ%,Ij;%n @qrE<.YRW<[70@'("]DBaeR=o@JSd!U$l@#bqP6N0B@EN(i4s0hg,DQ9!Z3+X@.UW5O%_u06< :lOa?h(tWl$Y^"5@"4):"JGjO@-9.9XX02-";k(l0\=@.UW5mn?0FQ)n@q5t:.;4iIKW>(dbg a]&mlMEjlLYDagSa,.XN.g,Y6aT&h-PrqIQ"kGF8Cd-D^LoG'`3XNHr.UT't+l-c\A[Fdj`8`ViXo;052BV7@a](*cWB_;$:oca%hgN 2PYHb2uQshSDnc_lPhU;.eN&Ur6AV42]f$Xf*)J+%$Z*=%+7sq0P_6AO2eI#8K+-Ksff0(4)S /H3W.LV'4iDZfSAEBr*GKTV0mVM0`Ka#_X( 'oc83$Df0(4)W8RTPNGIFMQtk*re.>W$U&r)K7j*I=eM+sXIHkUS@]JTM%5b 2em$NYL75Y5)aK">/N@_0Dq$NUPFl^>;UGg!sH,'oj#un#[p\"HumeQ@#L*3\/EQqmMWR=(3q r9aq7C6E+c^Cg,kLPI.paSqH_WG>KR4o?b(fl'H-;]\JIp_qtp`>$\PT[0=bZ#7B>;CLr4edr keR8*Gq(8eh@&b=K]S_B#_BY@YQ7tu'$Cd*!AAqLmJRJ_`l@rImdO":YH@B5qI/*E/67HMK\M4hYRUHB$l@2cE6M-$"(n`BZso'FY`WH*IPDZls._Rb]0=FMq[\AIB<*SE3u#^O4ga :>.<]t^at5(#f_TbK)@)XM^LH4dlR[E4W3ik=tsPplf6q>?ZWk#GZr_WG>K3AVBZj8k1)2,K9 YIp_qtpqi[\V1DOgOqKnbZXp.-M*E\Z@2P>1)24r5'a:bEq,g/d9JllP'e:)n)YO*DmeQA<+Y fhs.)k3,me9m`BmjVD]?BLp;ajk1,Ie(JaAGIp_qtpo>PnVGns4@kdcl !NO^M)OS\0o"\5P<_!Ct_UqoAI&s(WVA]K9MNU%tNI$(]pO)aN@nMVV3Y+M1Q-JF`S#JfIB@s 0!%0`6k?(s7:^E8ks=Zn]JWt=nQe+nJ&qseHf9BZ"b`&[;5/\C= N.X\mN@Ad$.jscf4J]-W?jk?H]M`9U3pBXlKU\mWe&"%BJ8VXnoI$G`@?G6kkTY_Qf0H/b1YlIhd,O[lTlMZ.erS\!VWR8k0>b4Ff;qYDar_+'teA"lOOt&asUrOJ2el$[3UM44

    lWIS"=+',/T`&n\`Nh]F?f%,$)V/hiL)9`m&D=AeV7(0gO*H6H2MO8HA=mhe C4UK8[L5fM/D!FdmcR?QVfbd:;D;6g#9CeqrBTqjp5ZJdD/^>(MV&lo35PM0m8F^W_opWV0FA mQ)r[JX6sdf^-feU]!E+H;Nj:Ch07cAiAIj>+t-^I&,13jLD?Q-ZnVZ" C$!2[sjukD-#t[TM7WohH\U/$WO5Oj1orS ,UN5RGQn%f&IrTOZqWh#d;sB>kpBr2f\\2(Ef5E[Ng:6j9r&:6qq@APZ+s9-n-TN)jA?&N"1? 7XA_Q!qdAl8fTqU$]..f):*)GogGCTuj$P<7WY7LS<5&/LXTO"?ddKM(:l6K;fO9#ch3$qY):snIbo0B^3\K%/&EQFn&6^)6fVR!g/0\&d+>>h:^g \"Z'X>\pB@?p(+JYL4A8Je>4WN/]M63]-&Qq9_slB+R+f7hBqBuACfj&/ =9GRQW5Q*me^N_!@[N7qVDd7d3RAoh_Wl-/g0IH$8;]u5[6Hl5Ldn]=qE$eS1:snIbf77VTQ& 9BUR6F.3@B(MHqP+(gZ5?Q(Mg)_?C)-/dV=lZPa-(OP.T<2_NE]E(!4j[a,uo4edHBHrJ1BIj a4!C$+/UOIUqc"a/VU0u7(+CANn7=6_YT1#D&0Ro0th]AeC8Q:6<0:X7B<46$nD*9r)sOEpOm \351i%eN3&VPR&Yt\hZun5*W\p6S?49-CKk,!nMUd(S$$i^8I),u@&ag=Wr+nVT8,''WqZ`a(6:@-Q-H.WWN=+),d`U3;m!pp_!QiHf60pgdkWdTI.>_9(O`/-'pEa0WC F+l4=OlbH5TQ,oANJP&HUE17=gQ>=*!C$CbE+D0MEVQCR8fC57m#TKNB^P*RoFPa(hUWa"hjOe!`M)f/]m\?G$lSgRn_tdtaB]o!J_c5; QO^"t(9P$:BRn-MXhHYcGY9t3VJ#+Cb60]uiDQ8QgsUroE0]t"KSWjJ1i7nc?rJ6GrDru$Y>rmn.oGLI@9 Wa64nY=[h#XBgE%R&\.[o$A\Q^\G/C];l*63K1,*bA1C;(9;3=B>CMOPOs[1aN"9]Q%c`dhjm K2mXV;54+-KDQ#jGLGSe1q9qQ0LmhLR6jIZhNWTL\&VK>JH<#uj6Kk[BpKW1>=99_J=\Jb%h%VQ,ELoUf! WHL!'-oH1E>Wq>3BcbNKh-Ktn:NDNMa.kjtdaDq!>WMiD=8GpFkN5kBjQ31&g0Hm3[q7TjON@ Bo)%&Rct,ThK10M9KGKm9J`T"`Z\W/)DG%=e 5s@+/NQ`9X1(QZMB^3HFQS"K&K8?sBMV*%[JW,s:kmd(_oh.\NbmMFkT_O@!1s"Y`rhaDUe%= &(pX=/VugeR5C&N@Q$A@UL[T$O0NiN%Su2=/nno!DO;.9[Y/_6CGEU-rZ7R>:QKO;tY;.doXg YnbQC';N3J4&sLJOJd"hZ2W7;I+S'FkJuQcP-i9&VrCV5.._r'I1.dOoC4n?b.tO[_6uKnlq8 aprGJ#dYi7'/O0@?R68XM!Y3H93n)O.3H/OjM4<=DgF>#!6BV@CdBFnmNF<+RMBoT#nQR6$^- ;dcUNOk]BO*aLlio3k'd%Ao$?kL7WG.lgP]Z)B`_R=^WX/u.,n#,V_GR[*0\HDlk_LrM c?iGh5]1LGBPl-&*+:0.S)!BJ85*S9r9[(WI-CbQ\SWQRE@0ZJZ7q`RsdlY8?Yo sB,+fS$((ih"Y%AG(&CitMgU7dR8cD`4e04>A?,E[dBMecHa^2MWNo;7\M0;rl%*6BBPSMBF= PhkX)R.n@.1N!S[W$-24+M?"Y%AG(&Fk!MgU7dR8aDT*^+jk7/hD#WKKA0I">N5R7cA7WgtC` ._#OYH!/V;U&7NW?3RY&AG(.QK2pH0&hk&r&==q=A2='oPNq*!d?.3oLT^5BPq(8Al`l^5pLc X9^?V[ce0I8=\]FbLflM2p:faT31=]dq'j+HF-37%2$;m\3s8KVD'4@hbOid*Z9e$3D25VQnA fpud9BDb6m!o='@O>,-n:.cjj@Y6$qJ92#MiWf9Tc<00GM^02P V7Jih%F7Mp^X&h8#?FWgb42dR<'H&)4QMdmMH(dC 4mc1WoA,c-^;$oH'3J6SPOs[1W(@/iZ4P>]KM1@QXT"fOrV&B'in!Xo(D;7hY0f@?_?6IF')Em9[Z#"R[C$GK>:GUigG\J@2uW/mJS:U`qn9m+'Li2p""^RT7o$oO!*8MA<'gVLh BN.\SojN_sE55k1gqLd>%X&0r+IM72U0U:C2[puH6/[)^WMNWH73E=iY7 $[&S<>[ZoWp7_OT9*ttKW1"!\j;\j<`OX:MA<(BWU+`kdbUn%AYt>pEG@X3bHVd;=G^s#RmD;up$"s-W)0ai Q3Ms*Z0lN:kb+eYctfK#HJ),6UT)+8DjZCs;h:pL` L(E;p:G=G.POm#i=Cr$*oDBKA5Y!q^I2Pt%gcV1Gs=W(HCZ%lG1GRWmDEV@`;;S.Vgc9g:?fm*30E?'n?"VNdPmdh)ZD!m.XaLV%)\]]9M[nX;]/*\oPQr@6T!a<@qTYc1R$p-75`kJ>]:4>e6.< :^RnJ.Pc?tpYKI^'pu!o_]Kk(4Lt2Y9:sNFPDV%o.rGf/Xq"YlJ=`?AJ^Pr80GX8[C,?*kZAH (bV)-bOU=N:PFVT.oWlh8(&-3NIWYHlF5#^uW'IG3.nIds79LYA,`.8#7R8jtYr+5C<"GoET%&]KbOZO[lOgg8@+j'd&C<-sV>&167$SWn(-XGnk'ZD>c1QUdpf=!i"/_s2<0lO3MSt &JX%X8LWWH*f)ud-7[K!#Uqp?tb2qC<(4RkqMd'JhrS,7.%TF8]JrP:3E+lH&AOhCHVncS%sm5dbUfKb:l'c%0W:FAu!%<9=*]41Orl535]YhWE+1599Vt^= Qtq_q0#Pa.U;3MR*+Rf_,R9fQMHE!2bY')^U,\?r`f-3ikeZC[]6p]<%R?**r"`h:P!6j9]_p JVOC`3!!__h!2bW-r-"9=AVY(^N(29lOrIGJWPHjkU\ILti[!a/!N%WDZ##hcZ`!S"r"c_HG\ #(7N2[`C>H=cf9\#U)j2VP)ZB0mA_R6EG;ahP;]TPn:kB$HGW7%J^0WZJV7sq0`rM@7@R*%O3 /?'9/'J5t%\,80YI4Fb&YqYc`YH4bl0pO0Qa,_$1AK_Xabr+3Tq8+U8Qn%atX\Ghh((/WI5riU!PMdi\('1]]( MVICJJDcLpDrRWd$P%=OdnUd_k,\O-f!;5VbWh@7R0r_O[dnL9%Ni_6i*J(2+L&e*VR'br?/k u&!)QA)c<8W#[*;O(*`N#Ytl92DP]#7Q`f?1CJr-6%W(/cppdU=U<]6AVF!.q2e%:=!NH"`o07TKn\k6Y0@57Y9Q9;)G@rJc1Yeao77' !U^J;^Eik'%BY+lmY,CX,8U]2su1WfX;0:Xf=QaWcsN',X=3lVK.bF;gBpq!`Odl^42?Hd@eL JX9RE4*Lf0@Er.0WUM]'(RAi7:dbb=(ANatZ/4suPio,Z?Bqe;om<'3N;u*i$qTr38HV?:S,m :5.0U78IR;-UWX1k*kpm4^E^2Un<0NFe)>FSS:8IG\lVW,[3@G:t&<'sXt]6hJ/WmVQ1,A3kl b^MC`jY\_lOKbQ1*e*pW)r`E0+@]BYT<3Hn$b$#QS2)0*k,majS$8MIF:OIWRcj`i,TNG/@aej;[A<%UpjnG7+Mq]u*n<\^!lMjO G$;^DlSVU@j]>FJ`,Wp($8Hh\dr.WW<$W`8GD]UJZ69m5 BE#\"EgciF#7_a4h-Bk<8Df`DZlqX#g8A\,tb]c;_@atoEQ>d^]/Q3P' Q.W_N;qVQ^9]\$VnrEh3-ojnF25Zhi4@<8P;I/`=P:c"Jm*-#E:\Bk%8p/kfo@/=e\nY4[_,TJEI,I6t:k >TTaqn"$NRq3&b,`TTas0j0/R]C)M/$R$_^[@*YMh .&<,^M37MEh<&m^,jim/CCQC2LYA(0F\$]=/f97J0?Q"`)QW.i@b,h*eK5/ATQ_GlR[FIrLbj 0;LqgK%>:9I0on0NCgBAL\U=_[9*!Ab_:N<"W:^N-lrNjAEbDLJ+nr=7&ZrJ?M"tp`"d`F@)G J>A.NH+URUKk71N-4[YVXW@YeU/Y^-`mt j9j;eF.ag:6R&JuM.cAVaGr.fJ$KP,W\^;Un8H#anAX-i_@o;J5^9n,Jl8)cMltH.3lceN7SI jiLIZHYV08b._Nj'ppJJ!\r51UW3GR.PR-SiQG"jQ@JXfdm>3ci_T7*W0h>S9s&UDjbP4Z/23 @gCrBg5Q`fm+&CjJA/Sr$qSJ'4rYX@.&<`OlJe]db.3,nWFB3Tln9GLLbQ tgN8f6XQGe_7E=.bEXoI,ab(5J/R&W?d8H7&s(DOn]SP3%CfZrccP8_CD`?&5-bKJZ6Y<6?,\ !,:FdmC+GE]rP6JLrh=mXOD'fKa%CJh%)RRr=r6K*>-r#E+^Ys8L6BU-B:YDfqK^=D)Yk&>*pG`K)FGM&SQH&/XQ# Ohb5oBjYbF__Z#tG00<<&Pg7=@*\eYtVUN(5=-;_(-o2a,5ErPp]ocq=!!SZ83AWLEOFB"edLPsgb&MT",]Ic\BNY;A9ABKSEW&<=Smb_,l,fH&"P'[jPlZs;pt8EEjhu_9GOp4^&$]o=&7)tm"SLTPGq`"C=fVDlK)l^nO`B+.#"Wi+ Y2)5hLT`)MJ`>JF#V;iQ!Ip\XLKL/m?+WC/RCZ_tT<`@4T[@\5^/Mh0uQPm(*W4h<%mU.kE2NZ okMdP7$HV8(4U9GKdF,upoTWG,XlAuBj`mqj!!Yc9f@PpoFYWQJ,a9LY_aaJrLN11_pUP:D>O T-NkN2.hR?-p1F2^@^S(cTM1JI3=uu\(=n.U&8]`>'JqfLX*7$QH"F&nj=HX7tU[i\Rp:fqNL diQ;j\EUdh]uc&%-Se]J_h5GXRA1u!8,WCg%e9Jn1m"dV\[VG-)\;RPqYiBjm^8#q_a%h;+,P +-e6NuMjY@WC:DT=a9X!=A<-R57k/V36eTDNC-8;e@YCr ZKV":dAlIJpF+07'6:mnjj!N>c/Or)ThYb."CPR7]kGVPhXgWCg#R9LY_aP>snZA].PgPA6=V T?g@mM8,/T;_],NHTN!:Q1-50DEUuMS*ARC3rBb>3Egj&j;es\Wt;j?Sc8P-XXX^UP1(-43i* ?U@&d+(*)k+%A0o>%Ad_]:9VjSFP^P`j8]-Fr+BYTA`%6f-<7G 4U8"'5I>eJ8Q')^.A?*Jn`KPYP\/[sOe"hkhp_,e"fgDuHLLXjVGV;l( (gs@OiUU.QrM11K<"UV1RoWN+,QC?hOt,QCKW\:Pb=@u#/?;D8Pb]]BP bu5qAZ88r'Bf9Ib;l.WPn#dCY1VbHM0uq1HS=WB/Ko?#p=<`s&@2'`:Iia!sZ g?F9GCPcN0$??q*QC%+h3b-J%9:J$Bt7K1XY9nB:d;YQQ9IGj]J[F/J58!>FnX*0qg5LW^#gE /6jc4$(t?NSIdYV2lBs6dEueG%'aKs[csNIP+gh^T'B>09iYg1[Ve93n:=V@)Z=WFJUB3olL% ^f4mEX%YCK9idD88r'C1-RR%6HoerUB6^A1k[MUHiN\.knu[R5pgj*bTU.%>680,^nhD!J\f? p5T&2A`fDICIc>Zuf=lFJX;WrBJD&DeeQtk\WN4AlE*;%]e>X291iEW /*Sl>Uc*+jV+8YrS_V(8LQ lE(,u_@D<2$AA727%p4SJ9`+8gsHI2OYBQqC[O>a@r=>/H?:Y0/l/NYeQ:+3s]NSc_ornCsd3 e'=+QQKB[L=/tR@<@Lu!&MDit-;tMqstnWt;j?I?_3@Fel-KMJ&qK`Y=f?; "^$OkR]#Q(W+"RS>kQrQ#^qe2lVbEBU:[WC][;lFZC$A=+UpZlAWMX27Oi@2*%Xd .i5LS0U8D),pSiJLH*UW7M*O/TN7]Q&W!ENQ#$X*VM[.-*$VG9s4AgBm:b4C1h]\X;$NpJ.oD 1B1UVZ.*>5?%$;=H]^f7EpR\U%Q1B9 8TI32"9&bU`;g#1/8i`WNd?VUKAhC$'AZ@#2e7budh*#Fi;VoHk0DTp17N0aUdR:(&RJ&O;?n +]G?n-T7'"o[6_j-Cg>+*OhUj@@H1>cIq"@UeC8(=LeD;oI:VU?O5f]^Id.\h"F&>GX?r[<_+ JPojWopg0(JFHVC[]5Q?V0Oa:QjV7UQqBU,H\-:J;OU[h9VjSF=s$bW)-&cf,4l1N'#7';]E; )8X9Ft@BOm;*1L5^s(&n"N?/kb/eI]o5gBhCjl(aKaQi^3;WU'bbM@fM*LAQ%[]k06t;to;hYY)6Y\rC%9&6n@BEF5;IcAF?>!7H5C<(b6eB"R5#R7_0kOme%3[AIWhMYr9%PP>O0<+Knhm!1h897IO$"AG(P#YV2WSm ?$@$I()c=/q/iCR)*W5.#F\(`^2*B2p[HdWD>P)GG^]+AIEd]YkDAJp%K&CY)l9_9AsH:OIWR d#I/i6Bp);If"2oLN>rqV' D5Hd2\p;49\?Ljj4^-r!Pheh`WI"hsL)i11#IhY5V33%0*.r%1^0b6!*?Oa.-7N,n%Wo3]l-`Q>5P_BI;Jl$ %I5Z1qKl6?q4G;Y3:P%X6d%33eu?u.bXVbpJ7#n"`)I>DX%X8C'$3:)1DB?q[T`oHV7Lg=Hpq 7uIV[d>I,pt[2uV]0C/pB*djVik*MpPNOK$#pdGiLOCiTFM/&1a]Dg^XsDifHnAF88l=SqqnJ ,IT"s/f5s5A:>\X5d!j6\=l/F%7Fd*80X%-UD2hri@.\VG*hV8MHEA`*k-jTk+isPZ6>nF^o9XWjR/q.;IKiJZ?s"=,uq<4T3"9sGn8qEtW<.5"JML\THa>=0!OoH^Lnt4,WSt>r>o` "00SQ_HHV.\Y3Bu`<5p0FSD`VW_Y(F$I2g$<*JV^G%5=Zn`" hl\)6tn,)/n]9Xtt+*hCZ@b&&4<=lG[s82TOMt)o69Ef,;9GIW*^@IO JW#ruTW]'d/k<>pf$4!_t]nHWB.h]mHY*r>WRDJh\ao4)`^#&Cb!enRq$(L_5J>j_?rb.nE4i hrs*"=!#"mL87<95i!Gk8nFn$4pekC)oV(;Fkg]B;^As-t,F8,q8U%S+'?H%tO8'Q#BRAF!R$ cJgW dARQ38eFHGIL1.O?aqZ4g06o&]YcYG\DKLeC"`>SOUj1tuTa<4/-1ih@7d.s/.IQD1dAE+,bY Nj?&j]k0`j2CLcA2ok3ug40(noEXISk"k`2=]GS2(fR\IE:qu#rRu9DTkkV])C>Wf[9#h !:qQ!RDT]4n8BcP8A!o.US>!gsnGGd98msY!T0h7:/_HjXB]O(e9]ONSi_jn%22rlK%rUt+RJ4)dVusM(+2#QPWeOEPAYfXcXfBK7+]HMYapVI*W?=odWAJ>3cBYEKo %pX0/Gi@'g)][pa,G']NR[EkjkKYaR.Dd`CJZ0bdJZ3`fb(ZVcR%OB=RpZ% C3E)JnjrGJ+9(EX?o8:#]9_jQak?^d?Dm[A\XW$N43ZB cp;(ZCGobuKkUQLDLj"h/!S[,[\nT=D[@/6t/Oa?+=EK<\p>dO*D:6--2'XW,`*^c;+uCTTW`Ji:Xc\4U!)k n45&9C]QKStsiDpSnJdeAgZ1!"X<;bK*1Y6!hH@^Q;foDhr)]ad!#AuJ-!4:kq(UsNF6(.jRn MJ5-V>R&%N>I'9q2'a52lsV6@4Ht&79so48S*c]3f-2[hQIf"Y'igbUIJ))V]01sbpU$,j'nl ZV,!?_em$_JU<`,?IV-$g<9O(40\& t6-S&o8_5[K9c:6.QKgo=jA+K;g$tUFaDa[ElM`FbuD+BUHa`5UBkh*hnlV ;9]FNZ@*=^E_?A>m7s@WW`HWEbmB!$+AMN^WH_L%10$0"Rc@'k#u`:fkZLl_4#0fWX#th"et? b5ZaB6D\9WD_j&7bN?LFp]1Pmq:Xg*A(Bh*lAmS>IM9]\)#QYUZB;6`fk%uj]qS"c@<g8,"re;C="U6AePCd9[AmDu.[F)b,cdAN"f?l.eTn$,k4lfaTe$O_;Mgc5r@Q@ OUp>m35.T1KDgC6@^-^+oh!EclSW8"]aAK@DQ"dY[=f)@+qFmaPEM-]T?mShZP7K?<&VndO9GU(efB.Bb*O_KBX??Dd<9ZNN#:e[ nd::&OWdoXZk/q9I6F4,YZ1H<3=oDqCig0/JKb1l(5"4('@]aQ 5Cqs"=^@\<>@&b2UfTrk=AW#lYIY__QQPr6]LfMD$?QJ&"*fj)@&'?+qYnL[C57CDg5$Y@m:@ ,aoP?i[aXK%X][DX>72K$/>mQ+]B=]@Gl,r_.S>9]ZmS!Bs][Qb]ZTF36*n2=,+j% HDA?'(28p/N7Rf;7;JK$91rB"Uk`C^+"9Z?:rpmb_KZ3!siU2DZM;9-tL9N.:p#/JLV#] J'Cda*1jeg\C<:hDF4?H*gJ8h=62`W?gqk1O#nBZV4^@&XV[Irh9Xbb#]"jaCJ@&cLQ95q7F= A#CAZp^&M^1^!KqS:2W3h^@KHH/1\d@@A'J)KW,1Q5,(`9`2[S'W(/0b0NBPOSZ+0o9LWHk(O l#PnX1?(YB%$f/Og*OX5GXiq,,2)IYS&9WX.0YZXm1>(r#f*;_llqHLW>-GVqVb7U5Sn7/*/G ;urlEN+!!&dKl;MX+.AJ0BL\q5IRU9Qh-JLVAcmkh$[2]:,]o(hCBscDU%YLGnR/Mo\NsB-,F P>"f3h[-Ob;2D1l6"cH 9J.ZpMn/Oqh2X*ABdjQ2=jrO=J)!r.);XbLMr<2K1u3@V:BR[pJd?IHkfF8qZ;M[S=@&d+(,#_Xn<(s/m0r[@<2-o1/.RTDW=]4TZ/q8S^Sgm=J]Om6Q'Wk61mu 5G1LoQ3+&uIF4Ul(c+6");f;pBgd>cgkR*E*E4%at""1XdG94`jU9P;M0FY`;b-&f$Ca^/'Hm ^F3GdVW.P)8%<<9<*+NEZjY#p-hi*'^SugJWES9'03Nk*8l8_bj[`<)R;0j>C@RX8VTQiQC6k =7Da)cV2P334d2=9)e]`$_lmu=6eXB1-:Lmg+Ac4GEEl2(+UKK/qMIY+F9Qa&+5A^-m:L8?re "E!b-(lc6CHsi^V1Z/DqI&asXTp-INFn6'#-h7=L/GgJE__g5_YLuhoATWuhM&DuX6+:B)OFs (hLD[(70g"DZ)Wb/IYJsq0NBPOKrM`3<&CIeXeasc[@rUP'tAsL`0(`JRT=jdBCP($`De]7Q(3^EF-s)Gel9R\B2h#$ L?#DjoL!kuKt6`Coi-mRXNdeZQ0Qo^ZgXYgrBDn1W;B9pJuM@>r_2F9VP5f1aJ@h)2>+BkVM0 Ua]/PuJb9G]pWP'D9Cf1^"R7``DD/F58.H5Aq="u^OG\!h@SpBcPO.XUNWT=$kcV#mm`=$6,( +sP@Vc'(7ThEr9e,!l!rX;(/X9)=cU7@Xo4&*\&.Z$a9[PaUF/q."Q-rGlZk=,?T_D7DPEJ1& (<\fpqWTs7I>>AE9'!(+9gEAj=NL5O$::6omXdP'=OS27]jD]8<%sSUHVM\MS2:Urg^h3joH= "!cD2:f,3l@qWWc:/icTN3QVCG#[10#HcMSiC$c[AiZ#7I-TFBaZ8;DFCSCMYX%Z'&la^&Qeo qSQ-d^PGR[HtEQI#VCm:nkikMSKUdpK=<*?d0^gM@&nuF;osO7nkWIN+M7>&B(N,*A^jDL47aAb=n2bW#@=%.(bQUR&Uj3aA`;:B_P9j1_kS@WlF<#D b9jQZDZ)ODh@]YCnd/k%kg-q-hHVF2T$grQ%#5`FGkhCYOQ+=!a@7*]!#G8XpI,U5HQYehE)t H04d:e@]EkloUke+1c'clr?O_+HMnD1\5nk2VK*h10NBREMQ)3];fS0sDGnl!m?'7.j^Buh/J OW[51;YhIS^NA.YlAuHlFYqm2Pf7ik:$IV(#uXPVON=+SgS@kmpSY^Lm"Gh02isE+^Yk;lp ^&ekEKYNj5!e]^97TMp`#:8X8aaq)q*Uks`)K76;h8>V;O!KH,1BLfVU@2u['hj*lL^N"jeZi\ma [)(Wb:ABW$b.6JZ45UQ0Ch,?%X_-%3qbMJs%^.V:a2\F@Yn(WEu(QaAu;#VU?_?0NBPo`DeRU I;tWHa.spVbVpV'VgQ`r!bN.C=>>H'0i\U,iibD_FQQalVXbE]16pGk;n7iDm@ps`Iec[V/pO VtI6K#L^[ugI``JX$7-!>eu8l64uqT;mr84$6@RHiG`7AWREG+3F*s,(Vs':VsKR a3WZnNUBDpoD9j_%A97<1:]E)fi2@lD>f.,/C7/0"6T!f(7`q+Z*-fQ0QRas2i20o:+(:@o_? _>02cDZ)Ze;ljTnJ@Lj,1 `]FWEP#bVM_Z-qD2_D1hhVTWaTBB,?s0tVr"4Ojg]^rB/lbg'pGV#aU1^AMIJ=Uc1b)!.MYb` @O`C^MJeohD/Hq>67pFuNi)TpCYpL@^+X\\WKc<=1OnY-#c;V]C"c#'TnF(QmrPD\cRZ6QhZ=t&n5k989$P09'XP9%aCl'PGA? i'@7?n.M*VHjo7)%/1+#YZQ5WUB=h:$W4oq;JHU&F$qT9Z<4G_[g+BR'8e-&53g5&X]TlEaSR .9&HFZhq#=9iV6>i7]*0=jbYUk=%nm#i_Ob5%,8c;cW$lJ<&reRED!5TjSjlP4k84YJjs;$3l AA&$K8(dKM4h>MD,bOlVj1e<7)DKW@1U5ePdJu.SZ+aV3==%)Z;b)a%K*pU*4gDRGZQ2<&W\u ]qVb=j?YTSFh&knPs^HZpKJko!0!0*Y"LZ-;lNteP'fB]00T&@0U<.?n)qoLb%_hY 5&QfOK"uHs3-%n8._6dmGEAFKIKrQWM1gQ;bdQW&Qs[aU<+3Man'r:@k)4kSNUpdc; _3k/0sNDrM;EO,lKpK@MP7[R_1>>5#?BVWJ$O9*%+RHMO"LOA7'1X95[X!qHGkM;e7bM#/5 \g]J*?,-=\`pBd't;O.VbC6\6:aTJ7clM6>Ok(8FI=j%i`"HSI58;)L?i'i.jSX9)E)4!4f$>3?R_,M&K!`MOO$WC1.<`6 "01KhcYmT5>:>jcre=]kWZWW'Qtg20^f2*@`kkA?;noHFXbjb+K;iks0U7tJa'TOmWUi* bpe3!FCld/k'ppJ>/=>]ahmm/)<2DC9`2)D=VJ^4#DMQ^e@4FL,lJf6g9uDk=<-YdMMIWY2j#n0n<7,7! <.F[u[iTqd*G_;tR]/\%'e>cLGI5"XM/I*C>:9pWa&G)'l4O`T.WT1%V69u40U9Ck/eOJnrK* Hn9JuH?WNKuYb8XK@i]LCE,r-4S.XL7J`f5maW]2bCWelR>gjf@YRl5][Ji)REe\ZC"SXF2k% B,]@nulGC>>+jag+MnSlnhY_8N9dBE<@Xm:P5\D*0Jfg*'3'B_N"6"1QpeiQFF9p(DF5R;!qqYIC n6-QLA=WX:l_'g4m#=-Z#J19[6Ug9?"\G3od=Q^\iC-MbuuN'^O F^iRh!N'iTsT`os;KTAene_%X#Egi[m%DH0i;s%6q(V0].10NA8?0GSrX:O\%=LRG/S;Mhu[- qu2&XZcO-Gn3!O/X]]grf":n&6H"P9r:N`TH7^@?n,NYNk?dkZfc+_$(8rL;Vc#@q)fd2.S$P >'24++WYeVh'g\f(++/jp;"^-RGa"!dea]QoCd+V:T$*Bp[E_:uNpZGlg8$L[el"r#WH91KAM DZ_%g5i,)R[mumIf$9<)T!CWJ8]`l4u0L?bua+1KW^_s4l#%!`MCR;DK!G+2V!`ZX6.N9m6[G:hc1"*4ksuqMPZh[@ult@6^0[R$[ff<*i)>VUWMep3g_0.&fh^<0$3-M]&[bmHM *0qW,WkV`o40Wk-,J?hqj=o$)S:Q*o[HB%`N$55@G5/MjK?[:J,[RN`MY%H[;2eh-)UP8f?"GK.do/"VQuM@WQ;Hu>#FsSWN,7U K=>Q$^@"g;)ig63Z/bt'=Ebo3;n41QXLGUY;.D)]."g@EK;mqZ*N!lC1`ga9N$:Y]<>J9Y=

    o2Sn9U4 S2=NmJrP,]LhWjP]h:8PPF$o=sLVu&[Vaj/Ye9`C5imP?XJuadeQeT1!iE7=cW%%8qXp)PT":Y[&(3MBC-8VaKW,[M/\T)0qmL)NiC>pKB <(A7W9^MdQn$!BYm\Y`@klD*EdsgA-&n2#FJ,]I7/Jr]#7Ps>#YZ7.`mNl;4/nd8p0kGG-S&.cVud&$; >"_SuLe-^Rd+oc2-\;"fCrDDHK0o[l%NL5Gr?M$;IcCen;#B?M`,R"cK9qB:(/KMlL`1EK>n) jMOqao1F-Y1Mgo.Fe5RIO(L)2[2;gk'7W/RWh8Xln^@,(b"%UlT2.]+RVhglr&JV08XN,R5eX 7crcD27cV.n/I.ts"I&=1dBg0'ldD\a.ebq1eX]8VXfoFoPnn_21G)XMEN"sQEP5)B:ekuX<$;Atr VAdTMW_A;jZHE+T"dS?sL6TreY872X<`Mq_MHNqe.Vk/<,A9]:8t#J?4B'L#IrbJa5L\;F/Qs P^D/1$%nYb6pZ3`3"R&VN-ANErF7IASLaV*CMN!)n$!WI0t1A]RjIQ0KE'R.p?"X/\e lrSUGOGPreReOampMDKYjNLRN%pUKl@MC1/!"Yr)7f;mc6Di0QC n==s=fLh;L=s6(<3#\MWRt]!9P'o7gTJoIBqLf.iOR:[bc!T9l^Lidb:D;Tjur5N@Ts3P3AXY E?$)ft2de+HFHIeW_IWmK-VVNNdRe3B`U>GfiJ<"C_$qFq_$``0=f)GF]c0\+$]T:Oj9IaC9N QJ7kG>;f)Hc0h9(&6!FJV^O_>psPdVi@%`hcq4/_^KF50JZ4m]4f0.o8H38E<'$<06't:!Wp1 O%Tg+gMHHoJCr:nkk%c/8n\uaq+=SMWugt&cFosm,pEgTHZaT5cF;_8ukWbN;A[9Vc*lI6*;+ JtUbI#e%3?n*i$fi=m^%=pIm"3n(4WQIA7Wpb>u`aA`,@VS4Y:X;5:r75CCR;1^%0?FY\fWFY BF?L'ZWuSkHfY]GP[1J20E8-i=ctBA30E#To'fEDAAZFoP%Ho'iWSBl3ek&B!WmLj"Y>c%O<- kGlpQ2B*XSLPXD-'UK8pNIEp*\rUQo<'";P[C.s%l?##e=ss<(rf2^D)?hkGE!^-FCo]iK8O$A)gT1i7m:cN]hhS jNTE:3$i&`?d1/`%=W h%mo5u"AQC@B\.WNp5L*&R1ElkWO]OSE=Z`[]:(CL%+%DPCMgq)k/F\dXtKB-Wa2+fSFjEU%I oRcJLi$;:V;Wh8r`H_.amDHdEZBUVmik"j?@/SO-^#c?#VgP<'9X/&GN(T>,K2ST_qjXET_lG oL/FCLU+o[9$Z>Y;P,eO-2X@";>Y/C[%a3^!AeF&-.I"V3="Bg-g%bb*6U'e]#8/:si2h0a&; `=eSRW1='-Y(FVIJh1Ra(M_H*IpK-[6XEY:n#0%c;opQ?rVRGI9e*EJ^AH_M1)9)R/G.PDr@\ fts4Aj!@[0o&\!$M,?H)<2?(E$_>>nk4A)_E/!`P3^DHQd^EOij7$X9;L$!*Jj<:Y*Lk\o]f0 83j,(0*)-%;W#E#c8M4/(OUr$3=(*3&boD^'7oMW]"_Z,?*R757>0pL&iWDJ>llMdHAREIr]l 82<@<'Dc1:MVha-[PS`]cbrpQR+p35bU%<<%b3,V9Q>>OE8-CiFHE(OMRf;6tY04jFNm^,pVb 9\u\O@7#b3*XM?Sdoa5kum/B.[hf?Wj"bc8!j'DYal;jY9r&Qt1MMSGJ`%p+jlTdTq:VWWH*b>.S h?bGhIJon9;X:TD7T[G('#[$pseq2DP[77d=c42b*D-N7&L:mqELY6(,C;`ik?;[p@^<7W?qV (gH(D=,F:*oD6GWuf/1fXDL9<%D#"SaV's=$M*#bPj3G`5Fn>oj@_lC-j@FDnS#OVJs#4MH3W _m!dt9Ndble@abgoX[PeY%Dc#KJg['8hC+e,YkriI(X>6D/X-XLh:i;ou)?PY>Wh&n!3@hZ]nJ*AqW'cEPVeF`FWGjO/O%QE7)>;d!+.W`%=gVE/ mFOlknm9Vm$hg1A`"Chn#'J&CW@MCtX/5?6E,$9I>s&#JMT0U68BQ`1*@4I3rc[H4/>9REcE: &cf[h(Wnm]W&b4/Ql(\VR!5;<2GC+eWqeZc-Cdc@A[K\ePNLIYrW$d5+e_&l*>0Nm9I:`M*KD ;jV'[K(&"IgeN2t;6R,2&Q,-Gla+C;-KVG87nA8[<9NA,&@l#+YB;SKtQtj;6kdL?HT4I4B#p#m8qpM+L:eL=tJuLROArE\a [t[?JY:QQN%>j3\sE4ENI2ojRrq 9sba18[ZT;*&X>4f8*jX0O20Rm1RT(H=[:kC]q:)N9,,Sh =@K&rs"KGmcQth*A3J.4/T'"EqrQC(t6ld#"A#^[W2Z*u=X&L0^`jhdYG&I9U/JJ0&T;p[TVB R:iA]n^o.QamRFi%*MX/\RbWd7S1^X[^]Uj4mr93K<5EhO39gKLu&T4I5Q,Fq3@01sM`7I-q; `)8[4VJ)iQIa`iF0:9n/aAZKK"##e9fKf3L%TKE61H,&Yh>=n#HYW*npf!G>bZ(Y`#Y\eQ``, HgI&XKQ8n=rj8Mq4NIe7?ThLs]5`UC5N1[ui\]&`ojB`pRP7eq9'e+uf[\Ah;qQqBT;Q)Q,[2 )J&-Q,lqKF0!Q)L`h[?d@*5h 3*@\tr[MC[h-^qWO86nnHPVQ8&l;jJ&l(q30],I#Gts?WQfCl2"X+70#`%r-r9_&],X/\.VC78*h_=#@Y%OUL0m@6f?]<*OJ$G]Vg ,WD]g04Wm>;+VKKY'S"3@[W+u3LD9aR$L\dbZ*%5S3Cne2T'u^B@42&qV1a.q8ppaJ'Xae*8. ?L``/0-:nqp1>0g!T_drKdqmI25ZO@gm6.QWkoHU"UV0Y-)_^?pA>07P2[Inn('h`Y,=s1#N& Z)t#c9N.hjTJa!sV1esY?e_#E5Odt!#9(F<*!!%VP;W*7uhs'VK,OtWQ:=PRf@DrMOILWB0U.eb%eP\Us+1eYf]n>-] ^q93Ut^k\pQi"WH*7J0>]2hWOto\haIhf7O;&'1R0AJlgdJ9;EA$?MQ*3FK`:Zj<`K:"C0"Af W@ZP0W]>'!<@LU19rbP[?%#cB9lB^S0D"nfkfM#VQ6buZba,6JleFm%eI@^7\I)^o0,*>h;1a OO8QFG;[K"rgn!3#^Cg!aOA0*5,IOkb'mHg$*]XOYHm,-38JWK&!*Pjjau\ PX'AI-&bgChlTTJ&>NZW`J9eV?0],:Pdms#o`X\(!:-gK=@j9ou9m5[paNLW/e5qH6$$[%<.>]e=m1gm@+X`oD#SI$:T7%$Zoa&G)G8]s'Nb$F?[U#s(k.G5h?i bt3"mSAV;oU";f,(_,.b&"Y`[&?TDCM9#5Fb$IH/(H5%C<4*_Qcc<8`)NJbBeYg[j@iRCoDG" K?:i,nS'$niekO7,=!B=u\7A*i9\!gpg<*CkbAA,).`%W#B.EcoFb$GZX/T7$:B ,Bn2M6sf(t;!_W^8BSH)se9rMioW"/^+'P,[TRN`DK'Q*QR1h4)H/?Ih!5R[l\!Yf^ri9:5Jn [QZZK-iTQo=@Gp6NPo3$.e*HkR**mJG[-K[+YP6Q_s[S(%0`f3;lRLDFgk@].:^o+ih3GTW?0 Qh$Gf^&;,3_LZlp0Ob*R4;MKQ#CS>gU(.XH$I3;#3G-<9HiZm.*AD(T2UDjVhL[3!*aVDA+<@ &flX_Ib%>DjM7SFc<;%;,cj8aMH;E@q87jCfj[gr>3t`o$15*F6LD=f$[tV2ZGj^r.!BTQ)7, An'.2B]WG1;,OY/;Q]rRQDemKS>_5.'19=@A5#X>9(JJBYSS+srhB=c4@&fonVn*!^h7m[p9U 3Pro#k!qX<3hP;4:09[uu*/R/"]aR7br(,&q)DHcMbEp%_k+';^+@mBF`E>>o\n*J18:c;_6m I"SCT-XZX!;O8aK:ZD;oK$_1SM*nnZ_2A?+Q@r<3WDVBW?dC?N4>1"H3aF5MB'>`h^Vs!q"))E K0ESRJOl?qpGhFhd*He:WON=l?r]WT6Q&SZ72AQcJ]\n3]JGh88O`?Cj#\nEGjM!F8eRp!E;pkD:b>b?o]D5`sBV?uV9#+CLB= RbOVr'"AN`9%J4&\STWk_T1aI9*0Z-"^u)4=I2:g(L/BiM!'6>em>0i\^?^L8/o%crcc0NI12 K;gCK/T@,(%_%1uUacgPH2>P.i_tguo5*GMrm[Du4k5OdQ)TKMXXY-a3dC/;D;2c-;oOk,;qY TE8#A%!WG&!2Eqe%a:7(n^ET+JL;rs,9)s6\K:_(%U<+Wi:B=J:V.cI2rJ>n:'P,\ZX<8&"!2 oBH7q209bT'E0rA?&a4Pr2JPTUM;E="mW23AQj'IIV;![o4%)b"N+ H#B0bjjAo"W9E7?]f3R:;F7VQ(Q4n%Y]5..IgKqM,k7e&]#XoLd[q1aJ>pC;9$EBp]dfm_IkbV4M=q4j<,>JJ]m\i5`g?L#g efrfX=@/GidhG1'iVi6MIDd5XLp6PO\&P'nUtOVE?UK`MtLo5*Ip/pVKn\-I jfo,=s\)R4&AiEm#j#[lSXL,lT'-a2_elkd(;eZC/(rD_ul%[RnbDj?$Y;]qQRn[gAJZ_9=c/ 0=?#;73?l;pV*/s,Z^26;jI$DWX2X4WgNA#<'"o^4&`i^j'SE)G50;[h]=>;12GL@Oc XB/,a<.>2jIf'2qIDOZZR]Gj,`4V>T9i0U5Rp.ZGb"LT)Qu9\E+Is4XGXmo=R[UOB_PeZHkaF ZEA0`E&8-;jDKmMUGH;W5)@ejdiB8AED*9$V,ZF%mS=n9!nK+[ntEX<[Ohf:nWhs*R1CC9O7R XN1+CZm_/6??Ni-KCu.Le;on.Q(lH(aYqL31h%@ha'@S%dBYAHC-E@$TAYj]_`Ka-9?NXjh^K -V_W?a_4VM_?<9I7M)8#C;`WJ7/'08`=YCqP)3Q`i>t]8h(EVJ=C1cVto8VNS+aQqB8T+n(YC DN1?SWCXt_0uh)cWoCd<"UE`NoLs7s(&j@n*mmfQK7;)kEcOd..i)4=I+2cT ,2(WW1j)Ba020pi(]mXh"dl;4VW)egXWBHR,F*[WWp;?=FU^-.LBjl\X ];C5>?)lEP1roCWqZqG<-+&9FVgo125sbpC#o5;6\hU/9TuPu9DjXD/jUJg=k0L'WL=1tV@lC KQqF`.,\AO>&:MU+56&LC-D87Ur&)tRe_R@-NN_$VC#;Y/WK>VW1Y;P]> s@f3l`bH@B.g7lIA2Ni^4bK`Di"#B`5]]<0DOm%9!]>T7"6G6oMNp6Fq:jBDRp#lYBh#Ee]3I Wp;F*po#*$X/a9@b'Y:u.Z*.='i.j@55:-q;]Rs4k\*l%hO?7A7&Q;)4'eD1AG;"s2eKp+o(? Hce\.1G``Bp'Ag@tGWKo^t?!o/4B>,LcEh*Q(&5;-:$Ti2S4ImA`?`D>)-;tA+=]IR_l.]-EW q_In<"uA=;irapG*thMkO[VKpU3iiHS\]F3Xs?o+fK``[K$ED^hj\U[WhD=L24:[<X!N#os=\`8,Y9B =h)LOA+s's=DK&NOg,d04TRGgDrl=N^)^oBG7i8:E0NU8/KLuZ`ZK'gU.#";N ,2B$opA@gK^AT,`MV]7LWR3b9`EsH%pb,CIqDGlJMS'kC/",.4`Bt!m!O(FA<+3c`ZdSNG"Q-a0/(I@^MU/H:=B,Kup?_U,`9cj*l(=XXVFmfJ9Vk*W^+-*spSRkR r8mF=gsKO[jUg(YiG63Vh'b%'E+h#W2]k$2ad<"fX,n]-OTub,%PUoDBGM3MRuaN?aC@1J;q< `EU/Kh"V\5W%XD(\>>'-5%dm$2;9U/YH0NF+6Gc^IO;XsLYecm(aWO.E,\FO7><=$+WiPD50< 0+*uFRl7mq'tII<($%._VeAE-`.e?.&)/Ec9V:8ae5\@A(!(U2V.M(NdnE9K)X-PLts0U9i2JZ6.Zn2hSi-m`Q\)0:PG=/ oIYQ,K^!mW\-ffqSPI>3Q`gWYB$c<'42%T)Rp51H../I*E^no\PO6SPDQJE7%JZ.K>FSYDRTZ Q-S%Zb>\uEJN[JB0KfQ%h\rU/LT0Q!^+_!)UD]@sWfq(KKiM^#<'s$R9&=e"9N?u@A1C&L5MZ 'YK=t=j1Y9nl;Vt3;4W^YNo>$>2-IkrcE3W(68]!,c-%BmtN4l\o76].P?'iB,OpKZ,+Si.e) RXB_4nn,_&4=a^S4P!:qs@]G7/WHLu5ij%D@'o`[gs-X#ef@<)mpXu;Pr<)lQk5V9:Dm '!(Ob`pe`AaoJ82J=uZUMueWAHh+2Es+mXW\%#951P\`GD>bk@-KiIOis8REGGVk:`TE Edi`X>KrmQAl2;Jed$?FfMf709C4.F4b#hf..e@1/\HngoHee*Cd7J:a;lN9hVJ4/#t87%;Nrb3/N id\R@1L:3(I!XY)H-!%JT:O:<8hQ:uY8jb;[XmdE\0R_*K]1?Cl1lC!TSM+0GoC@&+u5_I+>6 I7D\\2VqMd9Z>aAc-<.$4S1RcQsh_e*\5d3R&Y.*%C<),qgX3s8l;0R[8]5?LoGJ9Bue/acK*L3L9CKdZk!YXaX`/(b#CuD.N4V%k:lj XW!H+TGg]^[m_Wm^ZsLMr2qW3TQMR+*\prZH,%^jsb?F5o_n[KmP]E1#O-Su_9JrXEV.Vt 9f7.7ZQ2]gF.c$k7^f7-Y:Snbm<:pde&m674H249WDem'+88b\2HTt36qh^[iPtBLI9?k);[Q g2@ZqMb`5,5"ToH.u.F3g+TohHjT7,c0@rl]q\8aq4Mim7Vd(NZ?1^V5g5q$2h&r9G>p.PeT*+cQnf)aGjf;:-N2]e&Lt8.k.`fTtlt`e.t]e^0T(6(R;9[D1*=abKDeRaG(LR&Uk"@]K&GQ/am67B;Z`RCFTrkUpZ)$\- DY@EcHK]pA_:\ua>An[@&cTs'9&pqLs*Ll5`8iPef(9a?B/cLWNf+X&5s$8LT3mJ[ tg.ErgifhYtEdF5+"&0]#H9$<*dFWcskGYf Xi\P6@_^^f7.$%oYnBWC"r,lkT`aAp6jhREF^)P(pj2`qc//Gc-9-#3K7uct 9Qg$=$RW0K7V,Q_T[_AI>9olL]]\,%-',b(/@/aP>8]O2=+C$!.8Q5aWSV0cOaY1FP6@_^^f7 .$%o`!EWEP"^3`X`0MNNOjRdVhSIX^6hh;5bkbO;E.:N[XaqT?dR>O>0uj,G:E2>1M*2f7Sa$EX^@g+Xg>"PPBr]d"s&9`#WY?m j.b5kF/$46kjgBcF)q!&B.W'l(_CAkF55!Ln$pcb%b4&C=YmaHsBS"`NUF`9?)"reATIqoHrm @5>k$,iVKqloRD$jiW`4GR691t1%cGJrqZ5f8Pp@.r7S&ePXSa'g&0L/Vo'%#M(?^FQ(/nctr3[Z)OJ&=PT"9`#@:@!CaI6+ZW=m*24GK iDf,bVC'ZXj"50poL-(5?)D<\8`Oeo_gQi:l"BW$/tCG8#=E]9!k"fqKka#cZ/"^oLENB>@,4I;5X5:mrq+rr:9(V)-T#f'9`JRj.q\Si.am<3`:VQ)]<$u= YNPJL.R&Uj3B<%(>eaDlZ?:U$:!D320#8D,W1KAb[000t.P_L+6M/k;8fup>JM7`#R&m5T97H !-T=$od)f'49FMi3UN,Zb=34dqUXB^+=C_IbW6-1TMfWf$*@$aZSAI/JtANR(lfLhA3Xja\MR .POjOb0*cE8ZLSWA5JG(#Y56dnd08HREG,KX]D#F3Z/YA;=0o&a2UF%qU,hn:>/o;b_o\5.KU -aK6.Z1]19M=VJ:k]!RIi2qR+iqa(;N=pkk]CDR<%WH[Y'PNR#-&5#\#)WA^9G.RQL0WY1S`W Br\GUmK-=t@u-4N_q.&E,A"r n_,OD^/KET,7@(\\>IV4;oZdnWc;+&h^PATX\$8"pAXTPnCq"nKl@Vfc WSC9H'=$Qlb(WsCPYTT:m9Ym0?Mng8QAdV"lnodUsgSl>X$gRf73Hj4*8Z3;OGU^M \7'%H!k;gI7d2pH,tAZ$EFV;a\:f!3,i-@1\>ONO/]]leb#`=^f7-Y(K9iNWJ8_BfgoX'mhkn qA=.,hb(]\)$0-LR)gp1=`)N^W2t),%*/3R779P2= sS^*AS_!_@!:R3g_D(#K(NncVUN#;sgd]@2u6r0NBRE`Df,p.`\=@5Pps`3YD'aq9GGKPWuDH s"5o&T0$u+'ZX'+&2eRuXo-1)]CAT?bReS24r&0;KIWjn7AG)H_,P6rE:?kCh=bcr#hgMX3n= %nC;]L@AM@+5b/.,%IK#jkP#Oa1I#af_,gTFJbX-;Wn*cQ\\[8S[-)dsoS;aJ`<4\iK'J?#&h S,^$pNMqO:IStBQqG;b'Y\>!'j',dg?O_naJ78[@LK&2&H,;1IV`e2"\]Y=,FE5u):+VKcj8a6B(B^8rl[/eO^ )]WZr?U?Wj=J2L.A6N9N?tU0\(_9I`-=GNR,H$!_cUh<)@;td-Ar;+8k(mA`r"M-Jg`0P:=Ye fZJ(OM7JtP#+1:f7PN@X7(6,!74;Lpht$XtI-u1`pAU*;jS#6AF`+)1adX=.hKWdJkNYcAJZ2 7=*iAe8Dmt#\j6_.J4`28%@k)tml>;Y=&7nr*MlV&-=P7ognDDoK25,],KJsCIWggE0`0^Ja7 j69\Gr!phV-BpjXsl)*-(Z3]q9")g>[I=;@;!1kA,JF=\X@3MH2d!E?iT/1TDAYWWX&nee_+T =h=^SnXtLA.NR5j^bT%L;dirG)#aBAZokqEp^\0TD:`6c@_H4Sn#7>t[UQF]i%%58b']BX(@& j!Qpuo>cNAG?7o$:YP*m+8qTW1eHg#/g1O"q):p" ^9uQU4eT@JjQ.mGQ%f9;OZ?#-J5)!%$uhY8Lngg3`o"P#UKS%/rJjRB^LDdFs%[\;VV5urY0\4QhocWG#4.rJS"'SKHiA)7T`HBa?C-R?M$Yi?1?'c HT52ke;7WP]Xm$YNWKIbADFW%(1)!e2:h> dhYdO?oJZ:QP;[+GcT7N\bZ,aD/LH72_B=fFK#IrB=h4sea=kjO6nCDSR38T#M]:_+HJ0NF'q ?n/'7<&)/O\E-VX#oB>^:Lmb;#9gX/^FI+IGd!`0e[oWQYJ)a](r*.SlqI2!(-j,!8DRot+ Wn@S(GW./X7.JnClX)dk-cpn+M#dI?D<<-9J'Pu"LYYXhiL9!i4^#\T\(X5nG/k;)#Wk _SC&n%_OP0/ufpl\T.VAcT,8RAupKd)+L9eOpNr3q,Y#,5:` aAd:a\8mo>QhS.>i3QL3)m4"W8s6/3(fF@A.PV5`_oiO]YCCNf],uR&FGcQe>"P_kV@'qo`k1_!g+ h,P9F3LTG)GebH0\G[&7SL6IF$aLs)4Nc^TojDRVaXBWM3"c.PFEE;+g_Ica$$GU k>X57fc9uBkHH2D1JT6bq+XLps R#7()>csOiP[AC<4Pq-7D5^Fl)$]VuGesA+?,T?n*o$1"FriYO*&'3m9Cu<9Zt(cbu'>/A7WT Mj:8feh/=]D&p:H"Q(7tH@VtCbp5?EMKW"a`@&Cn`DMP*_GmWZepRfkfO`=*hV*g><0^mlo-` Q/<<,sSM3"W^P>i$h$;4:aXu-HLq6VlArGkk*>)(A7?.W;^hIXR/O3F-%^f5tQF[QsE$.5Jt[^(sU<@h)!f`T,k-DD#N!)n`2M5ecaHgU^NJ),Hfe.&;?4C_g_Hp7?Vo9Yq r3bW9,s'-LA.JXnGohi]C.Lp;VF(R!X'sXAF'@8Hk6GZ7P1TY#EP$*/P[iG7?XZ-Z>2HBF&Vf kslXA!DOML/Qi^4*IoLEb)N"jf;m`;"VMb,3LoH+O IffPO@>tn(\(s9M4)Mr)'H$/#pL>TT7@jN=F8t'=s'G?X@=L6 5Zb[?9MO<0Q$*N%^a%(rJ+V8ke;>j\A_H16kXub"Yf##:"bui]f$0FVtX.6e>*U5& 8$!]3*Gg9LUqBs)e41L^Pa1&oh+*WkoA$="6ds6h>="A"Y *G#ubA?C:nDT gpa6LoNHh@bsU7nqo$ceA#6J(8%T.;i-?sWEsoIl79oah47D;VA_MYF,6]Z(H)d USP)'H*DAn>*EA>Emic%_k.t5OZ$#ikk/s\O;qX!rNV`*([!Gf;W=Fpdens&WpVm>mbH=^V6Ar@SW@:+AhX(9 @O/F*V;-Eb2nGc'H2ZCHb)5B3kf'u,V@'.?q(F:-Q6q*n;6m2MGH!-K8M3'"+tJ$&B672iQqC &*9]_J6C,/dJ8S&qs8#;:3)E9%DT8"VV2Q"p\M>g%VWnu\%Vg@Ou3>:)J)mg;Q-/qg*%MP-ie &f`fe]siqa1""!qGh4/$;;`m.]2c1;DjlBRAB+B:UU%rW3/WlZMKj-%q$jrdE>MD#Ob7[]"uW jaAYgK\%J\_q/r1>gmLK0QDlcc+0+7kWWH+UM2J8pP>k8RZ:?<&MLEa`.B4XnQFY[1>I,.F'N ta=MAq9AY8bXAqd[)L9I4872M^CD?3aUnYj*Q6I<;N1:oXjr,pj8%3r@]ZkF]?HPGG4Har[8G aF.uR^=Gf>UrkPR"f?$J6nHrketGAmH5+dL-SUf\VU?6$A#f/roqCRq.n@IVAh&#)CAmH?SGq p]@&f/0@B,ZcqN7O809D23_;^Fp0&QO3W6P[pKq;uCoF^*uYn7X8TbuB[%PqE$H;cR3T0dSST:m.i*<.`GQ k_.dVH0=>7&"inDiYH8_Q%f9;Z+-7b+de/cs-mr_(Aj5LaNA=i/Z.f-mPoF*\(0@n!Q+"ca;O,X<^/"@XkVcS3Xn0miS#U3EWmF@VCNK13q3q(i#bM2_qkpEJoDcI !?M(+Ia*(d0eH=&'pYs-'5.YZGfG"16b^L/N,=4:?VZg[\++^_=smP&!h^(3$7q;a'PhtpS9@ J.]iD`^isoi3kW.P\msePMEdUu#a:YA&:9kFAa\PBG"ee?rio^f2;9fQs*:`to6]01"83c?S2 [Fe,L*o[X&p^\lYrWX;EGVDtH!n^NhAP)?'l<&P_Ulb08I0U8"LR-IoUrE$*H'eN6^b__6/F)qD:5o02NtGqeU4qf 4:;=e%c/AQ%f9;E>bgEW>*?7R4?fCnm/,ud7RMDXQl[_9Rs*Q'ZsCQ+90U2>6`[eJ#ufMCjIT 0q\8c@!AKcglceX)eu/nBPAq;P<&DUHW<2IMU^JIYkNZ"g@]HF=X3AMY#<#(cm7fH)(p=X6=5Q9u`s7YdEpKqM6W_0&hE4/G/O ?s(K.0qUB;kt[F^f9\#0/ZF'jlfYcAL\X3p-67'Yh?sp[6K/mVQ.F21@f(XQ_(qfb44kSn,:l ">COm$<&/)N$I;F0Kg.9A1]g@ik\[DbWcicpONc@UE`g%Sh34h^#;0&bLh1C%3@s'em`AH%K:Q.n ZrmN:>l8Qu4tr7`4IPK2Vlr;TQ+*(R]ZUOZ@Mb8ZWUs;J#'H)+."\FU#V_O2A#27<]Wc`<A3L5lV8p0(q3,A(0!?AO>$1l)dWh"=:KD1`d>kVO:= S:$JJZ2c4@&au=R1X`DhUa`S9)/<@0U3::o_VPi;j#][s?%qVc@Za$s Cb&$KXM[*1CCP\t$5\3F'N%$bc#q)]%WOY%&_B6=2qO'rgJ>me\"]J!\2@YFQEWQhHe`FI[<] OId"B.a)LoH?fh&$#LQqI@>J!mi-8RMNsBa?C-YJ" C*fi#fY:]&.lgPMDld=r-.Yf=,5G(9;\@alV@!ib&sujXAP*ST9[u3WAj[ZB!.q2EeRbc;Wa@ ojZqQa]5UJ0D-X$5>[8+Hu4.-(In_+AJM@/d/K4]mA^E2+3c8_]d*>b?f.POl0\kLXYos6s0< *:sk!crF_)&P^+jD2Jn#r!*t]jNq'2,s7T6-E6<1)41H%G"8 (,5G(9;\@b'[6JE_nMU2%%>P,DI#M[;C>]K$]3cRP's/f]3N@Q$YS&]kY"T#ngmi=`$V[B?^f 7u?m_=*iEA;QLd_+V`"?0C1GF3_C94=hDgiYGSJZ5BoA1C+"Y9$^oVTK/cgiIPRmXYcIK9 Z?ERQn$ZG^6U8I%^Z00M+m$!WiE<29GK/&,Ia-.Sh2&<9t* IWM5!PV+SM?X?V.X;cU`Vf387Y;ankbe]Q%LO!^hU3i:'3V6\CkC"!-N8jeid<,0UUD25r,K% ?cH(EUj"T,ZR:O<8"<^Huh+@O&h-\?n0#j.#=kZ3IT1@Fp#c* ##bh32^O7T3n;]IWYuqLDQ4%;'eNpa:FB.*XQ`ED]fO.l2m`Nt79EVZK=^1F;mAD(hAB20N\: rk:f3+f9Y192;`R=FQ)Zli&53h<(L@r.h6/i?M+j`hPJ]=<-_Gi2Ymq6.[%gG/;\`:/$U(5aP T=*RR%U/fLRC3R8XQLr*h??3C1RQB'rdruDZZ2nWQ\iHf#dN?9Vinr__a;0i*m;L9qFJ$8"h' &.O?:!W%)B!(C6lE?AcWoSa'0JjdE,P>^V$hC$_]2;h'iS,hWN,po56OnRW6&$,_I&R5q\(qU_m"`a]'UI*mMqXV9-K?WZK`)VU@gP*-602Kg-49d%F,t$=G>!PJL4MmS2#9EX,cAQ 2%r2:o^NqrW?)Qb.j@E*nG#%dR,#pF&PX;:;:p-0e+Ts+*l'aN/dEMZjETB#V]8QHfQbYANJGAjN!q/c8TT9Vj+.55-2QqAJmjj3>TF&PjAN]Y$U,gi>8Mbj$_/Ql5d)T!sXPs?0Z 0.u)Gs$`os*FHTIg6l9;_mH!"j@nZ\X"p'b?Xc\TPK(_c<:f&O0NEE9;DPmAKM;)`h,r2I"fe /D0NBViO/OOGa6*pd$pe/*!'X(W"qmOTp7qo/`i ON-r=%RVWnAQ.PYV_BI_M?Wad?BC4Fc!k8W.),:('(3g#&6DU&\(;QS=RfTK*ET14C3iaJk<) %PKOZ+s>NHj3NkH8no[8PJ&PWiC!8##dsHS#Op*Ti?)3m16/E3h:dQ*1f=Y<@h'/W2U/"%Y:U Z^a#l%h=8$="B1HDlWBRTS#QNg7>RG4eF'#0F&VH:W7/>gjn)Hf^RqNL[<6"nU;0`.i"8uNme EkLGY(WW%]?LZX@uW:[PKU;KXdFBm2ekW2q@nX3j"mF?.%X2hOequa^AL+_XN%gMr+""K(+ql U)d!A95^VAV5h=1&RmmrJc#^Db/]u\DU,KUQY7D,b!5gMVmE =bP+/GNh5MkX-0aBq*DZ5mJ >o!:.POkUpm=\."b5oPRpp8ML.8n5[a$uGL8j=$er,?q/]r&ikYOKD'<>j`$>ig^0ib?$9nM-;&%OWK"c*Qo+@bj-Y1aneek3g,&L>MfC^@^T`^d,sK9on_[&V4T]pkN4l7Ijrs"WHt=25rDAr&lJLnT:ns?F.h)0 "&("Wj0Th%8_M3>Pm-)%X,l6[of.Z>qWGaqqKX<6DU+OZ^f7\gALan(g@&di6+ &N3=Encu\)YaH&W_1nc`L+dVe"NUZ@&c2?[T&5AQ-9gIM)->qDX($9nO8sjBMeF3cc^+PRAq0 #h\mC&Y)?n)d.-gu"rVn*^DBqiu15'$p!V0;g99l!G8h#XobfuQBZ+s\ 6oHB`W%]*dMOUq<9U5D%iMF:'"gq=?RAuLG=N]Du=N6M/*5GMTdA.f/1I'q!8%klO0NHkE0GR $PT;XF]LZ:F+`0e\$!+,Lp;,I)7_,R6VWN+'GYbIYeAtI]A7fBK^US&BKNdBJ.!E8dsQqH"&0 o*qE.U92%CRr>d?J]Ym;X;YRhY3B38K:D]o4BJ%LVZqh:5V'%Of9N ce[$qEP#QGlJ,@R.>,jP% /u\[q_c/TaJP)Nq^EKI(CYo7n8Qr%=[(Kh.9\7WelB?UQnWTWgB[ll ;#+a,i_,i.I2lOD4.W]TjD3u.1QtGnX+U6SNSWln? fDOOr_1$a_WD4,'DS_T,!b!/B?$VVid?n,S@,ot98rpt%^j(9bdWAl`'Wp2?>M48+qgdL*Sc8 pKS4)2:r6)j9#OV^I9NB"7J*k8n9gM\._)K[o*9H(g FH`]TO);##,Wa^qWBrC@O5XIr;D[?.<8_i-Le`(nVF$H':[SQtMlFY#2de*]!N+9V9r?W.GYe /=Co44oV!9\ij+o0=Q"NLWW%^f?Wk9->8,mSTXW]S!3=i H%C%R*%YQ2NFatm$YBD@k&b'\E0Xh2OUS`mdqIE0Tn"3f&>8,mSTX'1:p56_I)'h0rq4`j(C) FhI6ARl?l9Z,aEn7.Y(6j.^;(k#+/$&3r$]X$<.Ko>H05QYpQI@Q>.TZ4C!,JG]2b@!Qc:o#PU9+MrEK:0p_l^EJ^f50s_,PLgf2=J7LOH=)k$TZ3`D:\?n,SLjW2XY!fV#rj@n)*.O:treA\HNmsWG7e^i\XjX-t,8V; R8l\]IST/fj#jhHk)lsl[c31?g-SqF"QrKMLcHhkun%jbj'/W&79bNOFb*D_"b)r@1/*BIJ+,'_%bf4$RO@Qms`d0<( ?M;cS6A=t!;MW!ZN@Wufp.XdlKJEta8BB^9R6)/SqCUB%?kSHi(JK]fhK=ZP:)h@F'F!*.E%K 6?g"8I6pAgr)AkD&j$!*X,XtmL5"],r8;R":u2c9@.[a%@!%I-CK42%BhVNQ,:1o;`H4ASqDS& ;AQBU#L?DYq6KD-T4[0br)Bjd;NP2^p'MrogXg@Y=M=VpCdPr\5Td61*\neGrOi)`q\fS$ohp $MD+>97M:'R#8dBjTb#E2I[@mFLtAqD`Bt/7+D]iHs1$r<5#`i.RDSk\_g/$QbOoH l4L?BljJ'lj'quaq+nccu8R&[[OTFJpR2&,K+*_Q%ftW_HBj$68H0+m^V=&FB3; O.?LX#FQ+"iec&UC1ce9D)Qb4d5-NV;"'$Okt,!.WG&DdLKR(i`GNLi&+%'c!gO5lYM"C^rD= b;kt-!/_gN/UAqsO,2Ocl.WV-/^rY"lfW28@(Q1,Ylh79Mqn>@b5a&JmO2r.>%ESD&S-^JYP+ j)R*%?T+rq-Y[lDtQ39)K2-jp%[h$b6se1:I2\Z-EMknJ_dk>+q.uga0J`ZK6f!$9m7;G+'M$ +#,iU,r3uCOm;IQW#0e5LU2%+u5-;;S',BZonG+:n3OHB2]SQ1o1nnm)8ur^4VBWCM%Q(*lO$ `J+CQN7=@A0*eWl&;2q;!ZC+`%Q-;)QZ?TA3YkM$e.ZZ'`Oi/CIY!,l@h\g;n9f:a?l-4<2G8CV/!jW>FK:AqiID$8E:m DW[=e/gdH<3g:Cmh6!\pR=*rj&Uiq?."iGRrqdSg^f\tq[/p2r&(M06FZ*B&e9!f ?*BPH!i9TY$85joM?B[s*uF&%,/`VB?BA-EKbZWh,\.r'aiArq/%7Wg"iohGGEc]Pa9T16k!7 FQ"Gfm3qgg >jS2s*"S4gq8$oH1P$,D;hZ@VGcjCoR_t"HBV/(=jZ]"r#;`TpGDuU7V!LSa#H;@Kgd:(B909:e7rPAk18KiR`e]GQTd*gL6r0DWI;k$L7la2^ECi1 FnjB@YC>r@TIHgU%?]1;X-K*?S,:bnQ`JUgI:+N6+i[K_/QM805%c(OR?9j5k)NeFFBbc04)E 50^MiT7D0nNHckPO`X&c9dR@"dkp&P7>U:[LlHRk(ZE:k1S!N,Gc1N?8Q;jFcN(Dknn.^]c@1 10c,FO1^Y!BJ6$/dS%/pqO6IhQOBWV`D?3>.M,jPe3jBSu%OL9tag3X.je8Ehi;\CNJ,TVL$F 5TIFP`Z=Ggp&6sV]CTB\nGs`.jMXIcNDW)+OW[_dW(Bfl/nqkr'0c(rV7 *To0L`ZOLC%,f!8=oK6kpR%p4ab=i3\1PSBK7EYQ;gZ6i4*>T\po(S:b'6'.EqdoM"">t`u@A IX@.>beO2[_B/T&m+rd9\#r6dIJA_Wqo3d9Z8+9qjK7mIVTU9\?>A4'2tPQ#]e"W[K9\k"&,O 7;OFINWetO*FrsQbVW.4#53I;'f8#t/TbJ,<&/6U:aq<#^U'aT5'Wb!i3;abQ.0q+0i6&IA23tYE)q7MnWl3)G$p3-SFUM%^R2ik=QiFj#]*9Hp #PCcbc3FtCN#Ec@aids'Cr03<5/@OqF'1k_HH&fQ^KdbXW]JqK;YJG3T5)tCJ>r==c3L4.4Gm %8nNd_q7akBG+5J;(LWib>=Y$uN=*bEa=:%kt)@/$^T[2!qqkFj=$A-4W"':[>$\G?7">0^V& n!1\T0jV'8jQ8cRPS3"WAFaF8kFQ4`-gEF]jpBt.3F=r;@lg+6K.4m:V9kWgD-)J6\)/#"IMe .CeN=@^9o,>lN>Ia;@kYcH,A*=HtrPm]fU3+:[>2"R_5XZNlrfAhd1X@%I1Jn!DK=5RR^>.WO T(eH00<4>c4A;#G)$o+K/Oj_UX4&m5fMm(15T28+UUsK`!6KWAI$7Lak(nCXc$XF-Ja4"dFV3 .B/'&+MQ87=7sR1FQ'Fe_l5+>Q)5*PjVtI7n(M7^Y<7)Dok/0&!_Pc*jQ2ThlB;%NjZ>75GhCF7'&g$A'C;$KWe$/pFX;D!kL`9SJi41'X+<O;HatLlJ YO=nR]7Q0=EPC[93E&A@lM^U?n,/2%Amn57&<-_3!t813@HM6eYK8K.mH,"GkTM4\Y2D,66O' CWhN=el8Ft*',6U,&-P9NV'B$AiuNq%'4<:i@?7A@3daOU;d"\rKICdR"@8,:KSWW,(-md&^f 7>N*`9>UDbUa@%CME&U*'_nZD`IZZ*hFiciRc)#+/"_fH[D>7O/XGFU9P))lf6t!)X:16$u9r A.>BA!*Tu>]mb9KAJIn8-d5Zu0NDDnCZ88L5p6[@5nKh^M2;%",4GnQ-jYEtZ:%,ac-g$K.Of\Nl7bo>IIJ9tAZmIZR*%P5Da$`k]E:Gc&-P^0KTrn&m *W,3AbMu]Yh&O%K-mmR$q),29NC8HH7O2Hq@!W:Jfk=+^\gC?IZj.ddrtpP Q/5oh:r),1*2=jSjPrf47JY4+kJtQ<.T[aEUX\*'/4oW\R9?M7*WH,sS]'7Si\H@b&G>?)QTI /S1"@3SeX'X-sA?CPTHi03oe!&g,-Fd%*(;WsDd;3[Z:,`3G+:*Rllk3^.DM$'<[O>'b"B5+d oDF._;X/+9,,_:]Dur3h&-P;Q1rNQ;\E,uZhBJ^VpJlu]&o>!MAb/Hp<0A2dRcb28Ochpj!Lt 8h['@<3gmnmfA3(gVe-&&K"@:EbNk5kY(aUIN'*LT4"DNr.G6,U e0G6n_Jfk>NVQC+4.ili#5mWDP5nF/bOGl`G9Ip01&-P91"@3S%5nF/b&-P91"@3S%5nF/b&- P91"@3S%5nF/b&-P91"@3S%5nF/b&-P91"@3S%5nF/b&-P91"@3S%5nF/b&-P91"@3S%5nF/b &-P91"@3S%5nF/b&-P9teUIRS.qRZ~> grestore grestore showpage %%EOF ================================================ FILE: examples/showcase/generated/asymptote/image-washer.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 206 296 405 495 %%HiResBoundingBox: 206.01 296 404.99 495 %%Creator: Asymptote 2.79git2.79 %%CreationDate: 2022.03.24 02:49:36 %%Pages: 1 %%Page: 1 1 /Setlinewidth {0 exch dtransform dup abs 1 lt {pop 0}{round} ifelse idtransform setlinewidth pop} bind def gsave 206.01 296 translate gsave [ 198.98 0 0 199 0 0] concat /DeviceRGB setcolorspace << /ImageType 1 /Width 796 /Height 796 /BitsPerComponent 8 /Decode [0 1 0 1 0 1 ] /ImageMatrix [796 0 0 796 0 0] /DataSource currentfile 1 (~>) /SubFileDecode filter /ASCII85Decode filter /FlateDecode filter >> image Gb"0W:TGf)IGjY]G`iljYJ@3qBc4&tDgI\22a\?T18(JbC;AI1paBPVK.m=Y$"O[Q0jY83JtX ">15e.:fM&s",Qol3i_4tdGH&HJ.-S$Wgd-K^V0[J.Prr^g-!0EoMGH1]DQlrF0!&c"$!!"os3h>^,mUR%45`"jKf#T<@J.T!n!+6JG$34HImDUPX"T\-O :X%:(*j:jm<`KU4TFLsCFA::K6O2>;oqn^'e#fW,'`]e*)-:ZLl)6X'rW@[9()1=qj8!:6FWU fO&cc;[9i\Wi0C7B,;Iri3!%V`_Jh8GuX"")TTrACMcQl3g!)[I1K$Ad.:M5.W&4f`bXo6gGG LQX92GI10htI?Uqp8<]CL;m6i_OO_#6<^>H>f#cFX%!5`G"!.]$W$323=V?-`'Vl9Xr_J(J"J8 gqa!$If/!WWM(WTnSSjlj/T!6V"7C=E13^\_+1]KZBuVu%pSh31f:eY[\SHbTZuC>JKgh,1QV $I@;'BIWuffBoOA606d'%o!3-S*R6.Gdc0j;ZT-/D-=EM>R=+.!"^d?VWsdY+8rVJ!4C"ZWS4 horUu-2590Xa_"It6?Dfeg!'"#V:";?ig5CI*D`p]@# V-j9r5.'d1;/'A'q35VTP7GCPBFM.hpE2.Z<"sqtY9AnB7o1b*U.aKtPkb[.uMPmgELt_QWpl YPlc8r6>NhHk7O*cED'`Q\B5AWE@4$[6ia7Q+6N$`&XT;]gMeER]K^p9ZR2hZD6"WUf0@=s,R)QU:GYWMcBi,G,7?QQBcnkMtTlugdOI-UY#0E6&o;f,#^ItaFlWrG` Ar]9EA2r2r?$Tnnd9;SWYjmcLtn+?SG<__%/ea8g:C)Z )#Z`VS`VO(h;A1eY+tj&bqD/Ys&W,t]32_Fo"C-]dT$&5Gcd'OqLk*b9fK+eqB,+bO$A*VSTh Z$)GR1mMlG`YX/bE.FT4_U-Z>,(92jrQpr=nOb'9gsIC8=T?aoaB0;VQ)1TN?4WAIV hb':S)81sB'Ph/VY=4=PM=#K*KON2WLji8L08lOh%QcCTq9';bJRc'Y1LO^(.;roO#a"+dTo: ;In2;K:![0^`6]#'l=]Ic11fZZ@2?DPnGr8,`R&14Qo"%CM6$XIM6-;%71t;` qT_hW.o/$.%p^^9!WD]mr4'.oE%eE?XjS06`Q1DLX2$)1mWLs5/23 hnX9%AA&]D:Q_In)ZlYLl[FUm`dpC:\Jo$&GJWl8S`pH:q25XT(][N2X\oT:rDG!F0BS#0oI. o6l+Fo?O@4N2B3mh5$Ki1puLm'46Fi#Ci>ml*F?jd(4G4C'*&Cl,p-.p.MQ]b/iN'gRY4A_mQ @6\XMqkD$!>Z[8U.-QSmm*>S[OieiQT+J]j/C=s`9Fng+Gf=MLrk0?)c!6XT\1TrEp6o"%CM! F4Zs`j2J@18UE>+=Wa/=XdG$SZ>Hbn0UkP/?db1!+jMVYpI,%C5qA>C'&q]1f_&MX6J?@aU;b ^^pZ)M*%=t85l?i9m?DRO[E6\oY99j(KomW%r3>=.A=QeU^GkRUAp[$6Z@I9pK`Vh7;6-AMb,e<8gR5C(k,D;ZT9DVl]#)F1_mfRXu6=4BI\Nr=.=__1_iit5t%\!?l_rF e?#X6r?KJ8-7G%S!bunipnk^VeKgZX<14/mg$5G49u):V!bsW5p8=@075P`U\SL*dVj`-)1_g !U3)'PV&5H.)!//g#!!(t7'`^KY9a(M.:/_/nK[Wm#!9#aL!'iM<"TT*/;ZQlOdo6;IiA;8L5 WDIA!"_n(!<@f%;ucpW1_g!U3)'PV&5H.)!//g#!!(t7'`^KY9a(M.:/_/nK[Wm#!9#aL!'iM <"TT*/;ZQlOdo6;IiA;8L5WDIA!"_n(!<@f%;ucpW1_g!U3)'PV&5H.)!//g#!!(t7'`^KY9a (M.:/_/nK[Wm#!9#aL!'iM<"TT*/;ZQlOdo6;IiA;8L5WDIA!"_n(!<@f%;ucpW1_g!U3)'PV &5H.)!//g#!!(t7'`^KY9a(M.:/_/nK[Wm#!9#aL!'iM<"TT*/;ZQlOdo6;IiA;8L5WDIA!"_ n(!<@f%;ucpW1_g!U3)'PV&5H.)!//g#!!(t7'`^KY9a(M.:/_/nK[Wm#!9#aL!'iM<"TT*/; ZQlOdo6;IiA;8L5WDIA!"_n(!<@f%;ucpW1_g!U3)'PV&5H.)!//g#!!(t7'`^KY9a(M.:/_/ nK[Wm#!9#aL!'iM<"TT*/;ZQlOdo6;IiA;8L5WDIA!"_n(!<@f%;ucpW1_g!U3)'PV&5H.)!/ /g#!!(t7'`^KY9a(M.:/_/nK[Wm#!9#aL!'iM<"TT*/;ZQlOdo6;IiA;8L5WDIA!"_n(!<@f% ;ucpW1_g!U3)'PV&5H.)!//g#:q#u+q)&,!Rbn8k##,93)cY9omdD7dmQR9*G@_LS%%7OO\#> a5NiW;<5uU&n-GjJ22;K7EkQ%+$<3Vj/f1h\@+=W`d2KWam4am2%r;$+EIn3K=7&?kjO^tMlR 1DN0I!?L#k)X7,J>b:>$tNO9e"`lB@ae<+C!R1GMo'1N2/+Oj@qdDb_n[[@QfOuab fJHT^/t;.3TS-6PUT"6&do:H.SGb;Ugqt61-L,7oJCl\YSHc-pVb\nA$6MtG&=]PsQ;ppbUT" 6&do=l'WiBej'i:Lnq0\X5q3,='4drB_<`SgOV?4oh2:_[(rS<1i^XQ6L`i?&1d8WBIg:6F7< V)i,Lo:>K)FdX+2:,;BcDmo>d8W@?G&F=r$Y0]QdQpg^af;B9d8W@?2K,V[QPCNh>qA^(XhoC&i]BN\=M3LU;R6/_M9D=r ,)<3uk1.SWp_BI]YZRYoVe=&k:\ar!hVe3Hrp)TR?hNMZblTW(JAS*K*pV?1M*WCW+N 4us5 9NG.rO/;u79iEd=]=d*)-SJS#0XDa+$+0V?2QJ;mCpS4Yc:uq_,Z[o:NMZc59iDXbK2n26dSp4CdT"09?WB,cdo6=DdT"0Ipb.?K;uf;Ko?4=lgWfQn^58k-Rbtg T-T?Nj=O'Y6'Ll"%);@3$5+DPhC$1o*XcSZ['sO]!Ho)S"OJRqY@/T(C92eQ;A]Un:nBk3#FR r-s,:,,:)bb[V`2ZF.!I;;F9M2;B\QN:6CI_E*RL2UAF>]n\9[/3cq9kSWI/<3_-Z?]K:%Pt/ s)uXOro*;Id<-G0.SU'dD^(\]WM\3[Phs0CJ+B^[]m0SUDOTIBppY&T'3bgJd'Pm_l\sZ4qA^[ uk0nXK%:!9a)g[c)8h@8M[E=?-iK_R7!]a['cnB/ZYm=7T2TbG0$Rsm3J+N:5qtjF!dVsgYAe aZo$;VUT#AMQNacs5#!T!WbSG;%aH7VeKG0IZ"JjI\dY^H.a.A>+eu"Z+Ya>HdV4"a<=1P^T4 0Xd2@6MF.a+i,s3XebR*?"R1nV-R!orY9`WVUd[CoUKCLpgT<`T$XVLnaT+tBC]jO8hsJ(:.IY!0"[$#os#;*K<7F. [(8IkOT>8C&]Y^tSg1N5WHtN%,b(Ze1Gh-5\ZbPcPn>pTp'pb`NB/C@2lV_KF1905/Po#[Q0q -7t;-CO*Q/fW-7T30ZFm"'3b,h0$S'!K?lWJX4(sl>b1cnW Bj;'nob9eQbV4d>; qAVQ%cDZUJ5(l(3o-A9)Ca3)aNie br8#D\i&sq;irIW2.qgBikP:G5n[']:%Q$trkUCg]8@-*6`.q#X0/XDHoAZuX&#?Ns7D00e]+A`8A`f>Wk"lsSX[_XaJ>Ylo]4-=]-V _uo+)\d?oRDPpun`RWF!muhg5(V],uLmf(3LleQ/HE30KN+D'm-!T1j[!ii4Q+](u!q%mU!3_i+7r:)d:7r8m*+s2sq?HtfUa`7=Kn.LmStb+:W P1gNi1p$EU*n9enAKU)Gpi]J$\k=)Zh:^a=qS3k#S0Xb'Jdp-2`1XusBL.@8e$X?KZ'qP$gf-4ZF[&RYkt+>YI_g6Y6m,+U'`l:YP'!)Op#\dFOa(=u.\p19 i[djK)H`/WHf'elJ5s+;RmicHV06;c*%!4.>GheY+j(=^>M8i?,e(_nX5Gq&-96<]&>LY,XVu e5WM+]pOs\4&:)h>o&ZPg5`%6j"e!-( 8h92f\;7:coD=oBq<`9L(lnR'A*?nl5hWE.VjKBV6IftoIbQf%EQ&:$"X^5G$HUPB]WiGEnQ)8$3V5`9_77UKMj[iCIB\ a#2X1h3s-+!;M<@qK\APlKsMU1+[.4M[HF=FVlUI8(Q1fX`l-J#T==rLI62V$jUX/a%Z8lP8C RbD2]P^;d]*E=%QQ(L(7K`/W"5-Kl(*'@t92=j'enZpSB[7d3j;Z6?t%AnWdf;4^lWfO%"gW^ fWdI4-Zj]-2*iXT3nc!4I!>?72m?7FB'41TdU\NQ^cH_W$dU["MO$F+Jop!%EhS:$W(LTd`K/ LsOqWTG]u$8ki9bWjqL;G'I05uSM3;.#%4]K0L7=]K$7F$5L9i_5F;11D:@ jfR8]Fc!X/\0qWrpO;;jD:nlBI`@0l9WV.@/F^[@=_>8h$o@?<&:UufL??G)d;,df<`SB8X>E q.*;0Q]bqhO4`Bp#NX!ZgUJMY-$<`LT5Q)6$'D23P/:VWd&'\h#7gbqC"FtB],<`O4`.V`!uW cD@IVps5?BiF;t?[[=qCoXA.'PhD4(:Y5`ql[',>?+CaPQ[6;t//[@=G uY,sHb?GU>S6Z%t8_! E4U`]98gJ$4`P[[.OMWdO]e.dbe<:"/T5VT^Lb$.m=b A*5pQ);]Vo0,$#c869JMH3cWXf?jDh&">3P?"&$".)%e]7=$d*#FN#9[C3/7>?,O m<'T3u*)KQ[D@gTD$U2RgU`@PoN)4F"Z'CC5TB4.ZtHaa_L M=?Zo0:dtQt8ROTn@C3m%bVplDpdo7T-if_i&OY'9rdRGlm9 eNM:=&fD_e]b,C<2gF.'6C^U;H%*p;iuWHATd*C<67l-79QIdOs$\MAop24VT=Xl+rd:A#An9 ceW=I;Q=pq>j6)CI"T;EfNQOBkN3FL+4Wp-VUM8#1&p5]DXUn9W:p]r>VV5YlZ?t&a)*,r -^Wi`6IZH=Qk*X3^Pc_$9J`C*XiRTkB$EbR!10tOUcnAG7*Wj^s&M6-9)*aSOuWZlMb+&jjh; &i;!;(`o#T=jo,--(N8o^.F+r8.5HeX-="+7ARo=`lp!O+(.F/bZmM9Ufc.<,.12s5CMkd7ct;Rr9QLhk;KB0TK:o"1f[fKV$ecQUo>chA6,P>Wg_Qt2= jT[2>Hq'qnZWhn#r5V+7K5H'2BY)4^OV-J+r_BGNYj#5.aU5J+c]sA^305g."n9#>IXThRm1F ACW&G4`ALn[8g5AUF(.Ybr"D/(0!4WptjmmI.*uXr5mRjp%Q5nMl*&6hu<.IIXX;lrhWu7nbQ 4/-]b\ab'Q"Gn8h&b75Zn:-+gIeMS6%TB@>m^WB^FKlTb5a?[h$smb4D7M5;Phg4C66k)VFfF R@D"rfs)dS&tgcL@S+S(<'Jq_SYi-/@p'P\WZ%t+#'[r]NV'.Kp)j=o]:VdcQT!'cAP H`YYa+cSr<*idUoC<0799B3DgqJrYMTO+4gsZ/KX^P[^[a#kGJa7CVAP<"AQ*m,D5)OFB1XDJ W04$P()L-HkAU=H`.d^(45o"Ln8%ot*S*rS2:^0:4S#pk8Muk^.=H;8+&,0mH4R`>\@_ddh0F =iPZ/?6gf2W"c6csmQ;mg&0:c9\.]RMQSR9*gptbmeh4)fV`hLADl$/gf?HEaDQ`PGnCQ;m@2VP6hnXf?7tQ,hl^%fX&EUk2Z)("K=!GYM+6Zgh$qM-2^:W?/.@QKWhj6s6*-G+'YW+i'(=g_&^BI\hGWg[!NaYhV$)_s5EVEZ.P*+q]@Be%b*XB!e7 9f6k?2jNLBW#`V:08n4W*2LiZ`glp*m@Ui)>G\=WZ%CU->i/MPQ(p1dK4A@#f#H..Mc+Cp7=T qH'tc<9WiEM,4=b?u<"I]PK6=5pRouSe?tU^bWe.t^Dcp"%37GE,;e[]o0JfclDmTR[.VP*\W XMk%%KhP#e"Yp,'(TdSq9SUGS5H&s>!L&9+\bh8ElL9a*+Cj`*;IVXd#>8iG" qq;HGj$TLD?7ZRN*s2j4[Uo@7fWI0ehR..3BGLVM:("H8;0O.V+jl_E^OJYX4VXd#>H31G<[/ ?iYBI]B'>ZH4:(E\,)?One69pH^%U]01/2b6g#7I.6O;o.UR>ZGLrQA',$BEM\:mSJgdT"uUXf7c ==][]^2jFmg;R6>mT;I3!BI_2\RXlK3ss7r$j?h8 bDZMRU?V#KuUp!.!P?1(D<5'^7A5tLU< BbGZVZ"6De.2I!2&15958ai2<@ql6:WB64Wk,IoA1olC^2US`XoX_2,2X/_FZjdA)l(KD=NpsJ.je%P*\s2@2UC[1$oiO1QXbWNMZH; ui3W>ti<1\_NeWflK1U:W84k#;:Emp&dC9a*<`D?d/A17QFL@5YNoA/.TO/?B=QWK*jMG"Wm1 rDcj(a+(Fab+gYP>?09=Q98V+r_;giXaGmL Q_ocU$FC)U>rO]hhBN 92_WLWfRec1_hZ)UEuRUd.Udo=h+gU!7`0@'U^#8sYD`gb,Mh[ZC;=&6&hA/,j.<)b$djd(jC u\0ap0;>dSuI.q)[;Y)"77Pb$n@.dSuf@8!-fWMF)#,MDBE[mIe7eIoS@ BWr'-#eWFCm[B/ZN>'CHIDDW*i\9q%/?_;Of<2I@0)E-.1k][fJC8.d^(KS\9*,$foYkr_'jW qO>qY#uBJ,,]oF[?$rponfP?3?SdE`S/A3s4WT>] ;Zh5#2kf*a'&Q%?bAp!NekOB,:C>[LS^.oN+@a@ppGWW&^!Wd6J"*kq0^kKc?B<#MWO@C:20( KS\9P\;PPOm77m5=qrV/qWBIqk#dsWN#G2X/9NO@AU%rK;Kgpf4le'oi-DN?<)sg2[+&-%'^T'AdDj_+4NC_'ZN -/2DdN*`ef<'(<&C0U`>[[Frc,>?P948Q.?Q;+_k:R**(@?EUVY,p4!MR_)97FP 4`VX(2!;_$rjJ+_.UTDY>-Ij(G3qVf%NN4PVG7T8ifCR;,ee`uDYb4;QMR]:Ne=&MpGE12P]o ;I!(^!i2Fo#@]pfr))jWZ=gQOKsa#Q<+gM<0`VE]?TZ1HMOLco&P1BIt)\1s6B%Dl`-p$2c3U ^FWk_da-F@gKr1lkr6meX[E6'a;r+YEWVO=.Wp9C$Di:K%b-b==om0Z.bbC:eI?cT_9s';nUW_-30gWd$E+;d;#Q<3o42k$a3M`T!QC>82!S?/^XX((]#G@"9`.d"b/3Ou[_FfZ^b/oNPP`Ap+F.-iQ0f<*4h)htC51EOWD ;qQqKk7[<$P'@B?#n. XNnS,`?CG'g-#:ie5>B+_k,b\"Lo[:_oa:"?YuK;O1tBE/,"bAm2JXs?h0eDSG#M[FZ+]D-.c X2VrLYSYZGKLB>LQQ`)AH.Y7-UZ&e#(V1a*cM*[]7bT`%pjM)%'JMV;G7)#u<+;'gP\d'OFV% ;+F@\N,OVa^57o5I9'@:MWeZTXYPm:9P9R-;H^>?Wm/I1-lo_e`*Z2Dg1OE^WS#>;[8e)WJsj nbM)AI>>"_erF.#h)$gKLA'\"9^]pO[U;r'sm%]_'R`SSa$'.dVtM%s,q'N-Z9m&=`_V8e3TF-^X_5,jcK9Y)60fAe^(jf8 ZWArQ.1Vk*k.cmj/WD022RZgqn(0<(^'g%p"<#.8SV0;lDNkMI@<2Xdp.9bfFMQ*kmNbq -$iU8sBQRRj:miH-ZD'NCNbE(]dfKVP]M1_n-CFsbk&X*ZV:T(,O5\uO1X,\ge*-*@TBCTY!3D?U6sW_V>/&$CR]\$D'[8Pt" KU1_j#[rYb7cWk:nQ[l3NYe,B4a9sq.`p@"X(F"Noh;soid8p-jLs(Ns'1?Zs5%bIl-;)=>=B h-e>mL?(hhk&2_8>aRLE_WfhaZlWuiiT4;'j5Q4BL_/sF<+=fGr4'r;HgPFdSuW0f28B?<%$P &8lLk]R;le`AHjs*^:*71rL.JM(HIa:UXQ&=o.Qoa^QoY";LO[.eGRe/Jl8T^@o]A)W5>:jQ+ksb1mKfmbdEH\qK-Y9bu[o6MX&Dm?KiuHd:b #9pFP^1RSp/lq5R%c;6QJ4.t(te)GOf:R#m?..AcmL>ubSgGU]l#,aOi<9f4[`*WAMJ*>M%B6 !R([apQ>I)GN(E9i-91OfV_B3bgb2*rfq(QnkSCXK]pNd8].9.VRss* Y-+22nCf,;U?;o/fQ4"l!clV5[j4lW.+#X6@r1AlqkQ&Z)6HfOS!YW?@r2/$-q4E`Q;hBWLar.9Di(l?YU^Wr*`?6\RpmNnRe6W_-4+@0.)mrQsX=G%/!\%999*0'kD,dAZZ4iXVEa_lJRM]:C=*u+if) $$Au.#ZDL!)U:'j.Q/GB(1e(F20r*^7<g5sG@iOdbSF56Q3p=hEgIPe1&tP?dW#AA6e7 *-ED-(Ct2q?=`dR\>rU>nI4"gH"069F#\^X6$82NJ2sBGTE'f2MaT2-'<=;u'ZLSf#M>QD K&U(=WdLNCCednp%Jm-*VQZH2!ao6$$>RppH>f#cFX%!5`G"!.]$W$ 323=V?-`'Vl9Xr_J(J"J8gqa!$If/!WWM(W;qHrS^6KJL$$/*s"2Vt!'k]s;sOA]^?q?N5O>" BRL0&99@HQ.Y7+H0D.p=gFnnO;do6<47_58(ek>D&Y^b;=.KCS9m3ZRo!S-;VSqhib$38/dbp ?Bi:YWEs1_g"PMlp9%(-bdRXb7E>Ma$C!$DZMRk"-3WrN$PRL0$chotssO'=Qn kf[C?^+P_K!W[7\Ic]^a[dNMN>!%^Edkjc&!#/gT;iRC+L!Wd!5jfED]P7mnQtn/OJ/&<=RL0 %&@)\%&c"sER`sBu$CA%;TDh%8m#*Lgq[7SVfe8i[$U&](r%r$dJ CR]PeE($_nG^t2WKqGG!!%2nJ*DT'`H90sU:JrVGA^L`!3$mLSCGcL"5SVn'`_(1mT%h^\A,D XW@Y"KJ;eTR9GMn-1oI;mquHfn>4Fod/+d1L<)WetjltAle<7ANWcFL7!%>`KX/btiAP!%*Uo +#q^PQ&rnZuq1cr:!1^?4dTp1^OB=/n(l!0FoT]sLR64^M8k\P*/,UbA9%e`4<>ZD7O%'%FV! kFDEKZ$/U2a+'Nb!6@M(@q`$adV^`8ftB,/$38/p`2[R](T6Ol2jMQc!'n]\=&_/oEqs40Dna l@L8LH_OpV31_P!lO9<%n00Xt#WW;lp!(p'_WquHf!E36)jW;lq\do6;Ii2*$9$34J5VOd/Dn!f-us#6k-PSF26*)/EKh;.anWn"OY6WO3fgse74BKO>L!\EQEt!!%(^a+%,i!!%*4?^[qo&lht4!!"h JpJI8gAQ8m60ZUT5kj=tAD(;S9!.YC)YF3c9;,%2o0]D/R.9EML!,fB99YUB7!8s_7CFH55!. \ch028OA1_g#+ZoPVB2&-,,9s.Fr!/,Ei$324(S2HP.!W]aPX&K*"KQEss!+:NP/,e@Jr!*5+ eEN77J)g;7!+:qdMZt[\9a(O$<.!9LYG:O\c]os[JGGWdC@^V0:Rq@a!"?6&Um(iZzzzzzzz!!!#O`;^(?*jP,~> grestore grestore showpage %%EOF ================================================ FILE: examples/showcase/generated/asymptote/usflag.asy ================================================ usepackage("amsmath"); texpreamble(" \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} "); size(4cm,6cm); pen usflagred=rgb(178/256,34/256,52/256); pen usflagblue=rgb(60/256,59/256,110/256); currentpen=linewidth(0.2pt); real flagheight=2.0, flagwidth=3.8, unionheight=7/13*flagheight, unionwidth=2/5*flagwidth; path flag_outline=scale(flagwidth,flagheight)*unitsquare; path union_outline=scale(unionwidth,unionheight)*unitsquare; path stripe=scale(flagwidth,1/13*flagheight)*unitsquare; path unitstar=dir(90)--dir(234)--dir(18)--dir(162)--dir(306)--cycle; path star=scale(0.0616)*unitstar; pair union_origin=(0,6/13*flagheight); real starhshift=unionwidth/12, starvshift=unionheight/10; filldraw(flag_outline,white,black); for (int k: sequence(13)) if (k%2==0) fill(shift(0,k/13*flagheight)*stripe,usflagred); fill(shift(union_origin)*union_outline, usflagblue); for (int i: sequence(1,11)) for (int j: sequence(1,9)) if ((i+j)%2==0) fill(shift(union_origin+(i*starhshift,j*starvshift))*star,white); draw(flag_outline); ================================================ FILE: examples/showcase/generated/asymptote/usflag.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 248 365 363 426 %%HiResBoundingBox: 248.807087 365.543203 362.192913 425.456797 %%Creator: Asymptote 2.79git2.79 %%CreationDate: 2022.03.24 02:49:37 %%Pages: 1 %%Page: 1 1 /Setlinewidth {0 exch dtransform dup abs 1 lt {pop 0}{round} ifelse idtransform setlinewidth pop} bind def gsave 249.057087 365.793203 translate newpath 0 0 moveto 112.885827 0 lineto 112.885827 59.413593 lineto 0 59.413593 lineto 0 0 lineto closepath /Compatible .setblendmode 1 setgray 0.5 Setlinewidth 1 setlinecap 1 setlinejoin 10 setmiterlimit fill newpath 0 0 moveto 112.885827 0 lineto 112.885827 59.413593 lineto 0 59.413593 lineto 0 0 lineto closepath 0 setgray stroke newpath 0 0 moveto 112.885827 0 lineto 112.885827 4.57027639 lineto 0 4.57027639 lineto 0 0 lineto closepath 0.6953125 0.1328125 0.203125 setrgbcolor fill newpath 0 9.14055278 moveto 112.885827 9.14055278 lineto 112.885827 13.7108292 lineto 0 13.7108292 lineto 0 9.14055278 lineto closepath fill newpath 0 18.2811056 moveto 112.885827 18.2811056 lineto 112.885827 22.8513819 lineto 0 22.8513819 lineto 0 18.2811056 lineto closepath fill newpath 0 27.4216583 moveto 112.885827 27.4216583 lineto 112.885827 31.9919347 lineto 0 31.9919347 lineto 0 27.4216583 lineto closepath fill newpath 0 36.5622111 moveto 112.885827 36.5622111 lineto 112.885827 41.1324875 lineto 0 41.1324875 lineto 0 36.5622111 lineto closepath fill newpath 0 45.7027639 moveto 112.885827 45.7027639 lineto 112.885827 50.2730403 lineto 0 50.2730403 lineto 0 45.7027639 lineto closepath fill newpath 0 54.8433167 moveto 112.885827 54.8433167 lineto 112.885827 59.413593 lineto 0 59.413593 lineto 0 54.8433167 lineto closepath fill newpath 0 27.4216583 moveto 45.1543307 27.4216583 lineto 45.1543307 59.413593 lineto 0 59.413593 lineto 0 27.4216583 lineto closepath 0.234375 0.23046875 0.4296875 setrgbcolor fill newpath 3.76286089 32.4507905 moveto 2.68724993 29.1404003 lineto 5.50323598 31.1863339 lineto 2.0224858 31.1863339 lineto 4.83847185 29.1404003 lineto 3.76286089 32.4507905 lineto closepath 1 setgray fill newpath 3.76286089 38.8491774 moveto 2.68724993 35.5387873 lineto 5.50323598 37.5847209 lineto 2.0224858 37.5847209 lineto 4.83847185 35.5387873 lineto 3.76286089 38.8491774 lineto closepath fill newpath 3.76286089 45.2475643 moveto 2.68724993 41.9371742 lineto 5.50323598 43.9831078 lineto 2.0224858 43.9831078 lineto 4.83847185 41.9371742 lineto 3.76286089 45.2475643 lineto closepath fill newpath 3.76286089 51.6459513 moveto 2.68724993 48.3355611 lineto 5.50323598 50.3814948 lineto 2.0224858 50.3814948 lineto 4.83847185 48.3355611 lineto 3.76286089 51.6459513 lineto closepath fill newpath 3.76286089 58.0443382 moveto 2.68724993 54.7339481 lineto 5.50323598 56.7798817 lineto 2.0224858 56.7798817 lineto 4.83847185 54.7339481 lineto 3.76286089 58.0443382 lineto closepath fill newpath 7.52572178 35.6499839 moveto 6.45011082 32.3395938 lineto 9.26609688 34.3855274 lineto 5.78534669 34.3855274 lineto 8.60133274 32.3395938 lineto 7.52572178 35.6499839 lineto closepath fill newpath 7.52572178 42.0483709 moveto 6.45011082 38.7379807 lineto 9.26609688 40.7839144 lineto 5.78534669 40.7839144 lineto 8.60133274 38.7379807 lineto 7.52572178 42.0483709 lineto closepath fill newpath 7.52572178 48.4467578 moveto 6.45011082 45.1363677 lineto 9.26609688 47.1823013 lineto 5.78534669 47.1823013 lineto 8.60133274 45.1363677 lineto 7.52572178 48.4467578 lineto closepath fill newpath 7.52572178 54.8451448 moveto 6.45011082 51.5347546 lineto 9.26609688 53.5806882 lineto 5.78534669 53.5806882 lineto 8.60133274 51.5347546 lineto 7.52572178 54.8451448 lineto closepath fill newpath 11.2885827 32.4507905 moveto 10.2129717 29.1404003 lineto 13.0289578 31.1863339 lineto 9.54820758 31.1863339 lineto 12.3641936 29.1404003 lineto 11.2885827 32.4507905 lineto closepath fill newpath 11.2885827 38.8491774 moveto 10.2129717 35.5387873 lineto 13.0289578 37.5847209 lineto 9.54820758 37.5847209 lineto 12.3641936 35.5387873 lineto 11.2885827 38.8491774 lineto closepath fill newpath 11.2885827 45.2475643 moveto 10.2129717 41.9371742 lineto 13.0289578 43.9831078 lineto 9.54820758 43.9831078 lineto 12.3641936 41.9371742 lineto 11.2885827 45.2475643 lineto closepath fill newpath 11.2885827 51.6459513 moveto 10.2129717 48.3355611 lineto 13.0289578 50.3814948 lineto 9.54820758 50.3814948 lineto 12.3641936 48.3355611 lineto 11.2885827 51.6459513 lineto closepath fill newpath 11.2885827 58.0443382 moveto 10.2129717 54.7339481 lineto 13.0289578 56.7798817 lineto 9.54820758 56.7798817 lineto 12.3641936 54.7339481 lineto 11.2885827 58.0443382 lineto closepath fill newpath 15.0514436 35.6499839 moveto 13.9758326 32.3395938 lineto 16.7918187 34.3855274 lineto 13.3110685 34.3855274 lineto 16.1270545 32.3395938 lineto 15.0514436 35.6499839 lineto closepath fill newpath 15.0514436 42.0483709 moveto 13.9758326 38.7379807 lineto 16.7918187 40.7839144 lineto 13.3110685 40.7839144 lineto 16.1270545 38.7379807 lineto 15.0514436 42.0483709 lineto closepath fill newpath 15.0514436 48.4467578 moveto 13.9758326 45.1363677 lineto 16.7918187 47.1823013 lineto 13.3110685 47.1823013 lineto 16.1270545 45.1363677 lineto 15.0514436 48.4467578 lineto closepath fill newpath 15.0514436 54.8451448 moveto 13.9758326 51.5347546 lineto 16.7918187 53.5806882 lineto 13.3110685 53.5806882 lineto 16.1270545 51.5347546 lineto 15.0514436 54.8451448 lineto closepath fill newpath 18.8143045 32.4507905 moveto 17.7386935 29.1404003 lineto 20.5546796 31.1863339 lineto 17.0739294 31.1863339 lineto 19.8899154 29.1404003 lineto 18.8143045 32.4507905 lineto closepath fill newpath 18.8143045 38.8491774 moveto 17.7386935 35.5387873 lineto 20.5546796 37.5847209 lineto 17.0739294 37.5847209 lineto 19.8899154 35.5387873 lineto 18.8143045 38.8491774 lineto closepath fill newpath 18.8143045 45.2475643 moveto 17.7386935 41.9371742 lineto 20.5546796 43.9831078 lineto 17.0739294 43.9831078 lineto 19.8899154 41.9371742 lineto 18.8143045 45.2475643 lineto closepath fill newpath 18.8143045 51.6459513 moveto 17.7386935 48.3355611 lineto 20.5546796 50.3814948 lineto 17.0739294 50.3814948 lineto 19.8899154 48.3355611 lineto 18.8143045 51.6459513 lineto closepath fill newpath 18.8143045 58.0443382 moveto 17.7386935 54.7339481 lineto 20.5546796 56.7798817 lineto 17.0739294 56.7798817 lineto 19.8899154 54.7339481 lineto 18.8143045 58.0443382 lineto closepath fill newpath 22.5771654 35.6499839 moveto 21.5015544 32.3395938 lineto 24.3175404 34.3855274 lineto 20.8367903 34.3855274 lineto 23.6527763 32.3395938 lineto 22.5771654 35.6499839 lineto closepath fill newpath 22.5771654 42.0483709 moveto 21.5015544 38.7379807 lineto 24.3175404 40.7839144 lineto 20.8367903 40.7839144 lineto 23.6527763 38.7379807 lineto 22.5771654 42.0483709 lineto closepath fill newpath 22.5771654 48.4467578 moveto 21.5015544 45.1363677 lineto 24.3175404 47.1823013 lineto 20.8367903 47.1823013 lineto 23.6527763 45.1363677 lineto 22.5771654 48.4467578 lineto closepath fill newpath 22.5771654 54.8451448 moveto 21.5015544 51.5347546 lineto 24.3175404 53.5806882 lineto 20.8367903 53.5806882 lineto 23.6527763 51.5347546 lineto 22.5771654 54.8451448 lineto closepath fill newpath 26.3400262 32.4507905 moveto 25.2644153 29.1404003 lineto 28.0804013 31.1863339 lineto 24.5996512 31.1863339 lineto 27.4156372 29.1404003 lineto 26.3400262 32.4507905 lineto closepath fill newpath 26.3400262 38.8491774 moveto 25.2644153 35.5387873 lineto 28.0804013 37.5847209 lineto 24.5996512 37.5847209 lineto 27.4156372 35.5387873 lineto 26.3400262 38.8491774 lineto closepath fill newpath 26.3400262 45.2475643 moveto 25.2644153 41.9371742 lineto 28.0804013 43.9831078 lineto 24.5996512 43.9831078 lineto 27.4156372 41.9371742 lineto 26.3400262 45.2475643 lineto closepath fill newpath 26.3400262 51.6459513 moveto 25.2644153 48.3355611 lineto 28.0804013 50.3814948 lineto 24.5996512 50.3814948 lineto 27.4156372 48.3355611 lineto 26.3400262 51.6459513 lineto closepath fill newpath 26.3400262 58.0443382 moveto 25.2644153 54.7339481 lineto 28.0804013 56.7798817 lineto 24.5996512 56.7798817 lineto 27.4156372 54.7339481 lineto 26.3400262 58.0443382 lineto closepath fill newpath 30.1028871 35.6499839 moveto 29.0272762 32.3395938 lineto 31.8432622 34.3855274 lineto 28.362512 34.3855274 lineto 31.1784981 32.3395938 lineto 30.1028871 35.6499839 lineto closepath fill newpath 30.1028871 42.0483709 moveto 29.0272762 38.7379807 lineto 31.8432622 40.7839144 lineto 28.362512 40.7839144 lineto 31.1784981 38.7379807 lineto 30.1028871 42.0483709 lineto closepath fill newpath 30.1028871 48.4467578 moveto 29.0272762 45.1363677 lineto 31.8432622 47.1823013 lineto 28.362512 47.1823013 lineto 31.1784981 45.1363677 lineto 30.1028871 48.4467578 lineto closepath fill newpath 30.1028871 54.8451448 moveto 29.0272762 51.5347546 lineto 31.8432622 53.5806882 lineto 28.362512 53.5806882 lineto 31.1784981 51.5347546 lineto 30.1028871 54.8451448 lineto closepath fill newpath 33.865748 32.4507905 moveto 32.7901371 29.1404003 lineto 35.6061231 31.1863339 lineto 32.1253729 31.1863339 lineto 34.941359 29.1404003 lineto 33.865748 32.4507905 lineto closepath fill newpath 33.865748 38.8491774 moveto 32.7901371 35.5387873 lineto 35.6061231 37.5847209 lineto 32.1253729 37.5847209 lineto 34.941359 35.5387873 lineto 33.865748 38.8491774 lineto closepath fill newpath 33.865748 45.2475643 moveto 32.7901371 41.9371742 lineto 35.6061231 43.9831078 lineto 32.1253729 43.9831078 lineto 34.941359 41.9371742 lineto 33.865748 45.2475643 lineto closepath fill newpath 33.865748 51.6459513 moveto 32.7901371 48.3355611 lineto 35.6061231 50.3814948 lineto 32.1253729 50.3814948 lineto 34.941359 48.3355611 lineto 33.865748 51.6459513 lineto closepath fill newpath 33.865748 58.0443382 moveto 32.7901371 54.7339481 lineto 35.6061231 56.7798817 lineto 32.1253729 56.7798817 lineto 34.941359 54.7339481 lineto 33.865748 58.0443382 lineto closepath fill newpath 37.6286089 35.6499839 moveto 36.552998 32.3395938 lineto 39.368984 34.3855274 lineto 35.8882338 34.3855274 lineto 38.7042199 32.3395938 lineto 37.6286089 35.6499839 lineto closepath fill newpath 37.6286089 42.0483709 moveto 36.552998 38.7379807 lineto 39.368984 40.7839144 lineto 35.8882338 40.7839144 lineto 38.7042199 38.7379807 lineto 37.6286089 42.0483709 lineto closepath fill newpath 37.6286089 48.4467578 moveto 36.552998 45.1363677 lineto 39.368984 47.1823013 lineto 35.8882338 47.1823013 lineto 38.7042199 45.1363677 lineto 37.6286089 48.4467578 lineto closepath fill newpath 37.6286089 54.8451448 moveto 36.552998 51.5347546 lineto 39.368984 53.5806882 lineto 35.8882338 53.5806882 lineto 38.7042199 51.5347546 lineto 37.6286089 54.8451448 lineto closepath fill newpath 41.3914698 32.4507905 moveto 40.3158589 29.1404003 lineto 43.1318449 31.1863339 lineto 39.6510947 31.1863339 lineto 42.4670808 29.1404003 lineto 41.3914698 32.4507905 lineto closepath fill newpath 41.3914698 38.8491774 moveto 40.3158589 35.5387873 lineto 43.1318449 37.5847209 lineto 39.6510947 37.5847209 lineto 42.4670808 35.5387873 lineto 41.3914698 38.8491774 lineto closepath fill newpath 41.3914698 45.2475643 moveto 40.3158589 41.9371742 lineto 43.1318449 43.9831078 lineto 39.6510947 43.9831078 lineto 42.4670808 41.9371742 lineto 41.3914698 45.2475643 lineto closepath fill newpath 41.3914698 51.6459513 moveto 40.3158589 48.3355611 lineto 43.1318449 50.3814948 lineto 39.6510947 50.3814948 lineto 42.4670808 48.3355611 lineto 41.3914698 51.6459513 lineto closepath fill newpath 41.3914698 58.0443382 moveto 40.3158589 54.7339481 lineto 43.1318449 56.7798817 lineto 39.6510947 56.7798817 lineto 42.4670808 54.7339481 lineto 41.3914698 58.0443382 lineto closepath fill newpath 0 0 moveto 112.885827 0 lineto 112.885827 59.413593 lineto 0 59.413593 lineto 0 0 lineto closepath 0 setgray 0.199252802 Setlinewidth stroke grestore showpage %%EOF ================================================ FILE: examples/showcase/generated/asymptote/usflag.html ================================================ /tmp/tmpuzanunpi/out ================================================ FILE: examples/showcase/generated/latex-image/image-building-parabola.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.90.1 (http://poppler.freedesktop.org) %%Creator: XeTeX output 2022.03.23:2315 %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%BoundingBox: 131 579 328 732 %%HiResBoundingBox: 131.48 579.92792 327.88 731.1175 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin %%EndSetup pdfStartPage %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 131.48 579.92792 196.4 151.18958 re W q q [1 0 0 1 72 720] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1.00009 0 0.013] cm q [1 0 0 1 60.387 -147.009] cm q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.3985 w q q Q q Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 60.387 -147.009] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 60.387 -147.009] cm Q Q Q Q q Q q Q q Q q Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 60.387 -147.009] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q q [1 0 0 1 60.387 -147.009] cm q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.3985 w q q 0 0 194.2676 161.39636 re W q /DeviceRGB {} CS [0.6196 0.0471 0.0588] SC /DeviceRGB {} cs [0.6196 0.0471 0.0588] sc /DeviceRGB {} cs [0.8859 0.7141 0.7176] sc 32.37793 10.08727 43.17058 80.69818 re f 32.37793 10.08727 43.17058 80.69818 re S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 69.07292 18.15709 m 64.75586 18.15709 l 64.75586 13.11345 l 69.07292 13.11345 l 69.07292 18.15709 l 64.75586 18.15709 l 66.91438 18.15709 l 66.91438 13.11345 l 66.91438 15.63525 l 64.75586 15.63525 l 69.07292 15.63525 l f 69.07292 18.15709 m 64.75586 18.15709 l 64.75586 13.11345 l 69.07292 13.11345 l 69.07292 18.15709 l 64.75586 18.15709 l 66.91438 18.15709 l 66.91438 13.11345 l 66.91438 15.63525 l 64.75586 15.63525 l 69.07292 15.63525 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 43.17058 18.15709 m 38.85352 18.15709 l 38.85352 13.11345 l 43.17058 13.11345 l 43.17058 18.15709 l 38.85352 18.15709 l 41.01204 18.15709 l 41.01204 13.11345 l 41.01204 15.63525 l 38.85352 15.63525 l 43.17058 15.63525 l f 43.17058 18.15709 m 38.85352 18.15709 l 38.85352 13.11345 l 43.17058 13.11345 l 43.17058 18.15709 l 38.85352 18.15709 l 41.01204 18.15709 l 41.01204 13.11345 l 41.01204 15.63525 l 38.85352 15.63525 l 43.17058 15.63525 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [0.6] sc 49.64616 10.08727 8.63411 9.07855 re f 49.64616 10.08727 8.63411 9.07855 re S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 53.96321 10.08727 m 53.96321 19.16582 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 43.17058 28.24435 m 38.85352 28.24435 l 38.85352 23.20071 l 43.17058 23.20071 l 43.17058 28.24435 l 38.85352 28.24435 l 41.01204 28.24435 l 41.01204 23.20071 l 41.01204 25.72253 l 38.85352 25.72253 l 43.17058 25.72253 l f 43.17058 28.24435 m 38.85352 28.24435 l 38.85352 23.20071 l 43.17058 23.20071 l 43.17058 28.24435 l 38.85352 28.24435 l 41.01204 28.24435 l 41.01204 23.20071 l 41.01204 25.72253 l 38.85352 25.72253 l 43.17058 25.72253 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 43.17058 38.33163 m 38.85352 38.33163 l 38.85352 33.288 l 43.17058 33.288 l 43.17058 38.33163 l 38.85352 38.33163 l 41.01204 38.33163 l 41.01204 33.288 l 41.01204 35.8098 l 38.85352 35.8098 l 43.17058 35.8098 l f 43.17058 38.33163 m 38.85352 38.33163 l 38.85352 33.288 l 43.17058 33.288 l 43.17058 38.33163 l 38.85352 38.33163 l 41.01204 38.33163 l 41.01204 33.288 l 41.01204 35.8098 l 38.85352 35.8098 l 43.17058 35.8098 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 43.17058 48.4189 m 38.85352 48.4189 l 38.85352 43.37526 l 43.17058 43.37526 l 43.17058 48.4189 l 38.85352 48.4189 l 41.01204 48.4189 l 41.01204 43.37526 l 41.01204 45.89708 l 38.85352 45.89708 l 43.17058 45.89708 l f 43.17058 48.4189 m 38.85352 48.4189 l 38.85352 43.37526 l 43.17058 43.37526 l 43.17058 48.4189 l 38.85352 48.4189 l 41.01204 48.4189 l 41.01204 43.37526 l 41.01204 45.89708 l 38.85352 45.89708 l 43.17058 45.89708 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 43.17058 58.50618 m 38.85352 58.50618 l 38.85352 53.46254 l 43.17058 53.46254 l 43.17058 58.50618 l 38.85352 58.50618 l 41.01204 58.50618 l 41.01204 53.46254 l 41.01204 55.98434 l 38.85352 55.98434 l 43.17058 55.98434 l f 43.17058 58.50618 m 38.85352 58.50618 l 38.85352 53.46254 l 43.17058 53.46254 l 43.17058 58.50618 l 38.85352 58.50618 l 41.01204 58.50618 l 41.01204 53.46254 l 41.01204 55.98434 l 38.85352 55.98434 l 43.17058 55.98434 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 43.17058 68.59344 m 38.85352 68.59344 l 38.85352 63.5498 l 43.17058 63.5498 l 43.17058 68.59344 l 38.85352 68.59344 l 41.01204 68.59344 l 41.01204 63.5498 l 41.01204 66.07162 l 38.85352 66.07162 l 43.17058 66.07162 l f 43.17058 68.59344 m 38.85352 68.59344 l 38.85352 63.5498 l 43.17058 63.5498 l 43.17058 68.59344 l 38.85352 68.59344 l 41.01204 68.59344 l 41.01204 63.5498 l 41.01204 66.07162 l 38.85352 66.07162 l 43.17058 66.07162 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 43.17058 78.68073 m 38.85352 78.68073 l 38.85352 73.63708 l 43.17058 73.63708 l 43.17058 78.68073 l 38.85352 78.68073 l 41.01204 78.68073 l 41.01204 73.63708 l 41.01204 76.15889 l 38.85352 76.15889 l 43.17058 76.15889 l f 43.17058 78.68073 m 38.85352 78.68073 l 38.85352 73.63708 l 43.17058 73.63708 l 43.17058 78.68073 l 38.85352 78.68073 l 41.01204 78.68073 l 41.01204 73.63708 l 41.01204 76.15889 l 38.85352 76.15889 l 43.17058 76.15889 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 56.12175 28.24435 m 51.80469 28.24435 l 51.80469 23.20071 l 56.12175 23.20071 l 56.12175 28.24435 l 51.80469 28.24435 l 53.96321 28.24435 l 53.96321 23.20071 l 53.96321 25.72253 l 51.80469 25.72253 l 56.12175 25.72253 l f 56.12175 28.24435 m 51.80469 28.24435 l 51.80469 23.20071 l 56.12175 23.20071 l 56.12175 28.24435 l 51.80469 28.24435 l 53.96321 28.24435 l 53.96321 23.20071 l 53.96321 25.72253 l 51.80469 25.72253 l 56.12175 25.72253 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 56.12175 38.33163 m 51.80469 38.33163 l 51.80469 33.288 l 56.12175 33.288 l 56.12175 38.33163 l 51.80469 38.33163 l 53.96321 38.33163 l 53.96321 33.288 l 53.96321 35.8098 l 51.80469 35.8098 l 56.12175 35.8098 l f 56.12175 38.33163 m 51.80469 38.33163 l 51.80469 33.288 l 56.12175 33.288 l 56.12175 38.33163 l 51.80469 38.33163 l 53.96321 38.33163 l 53.96321 33.288 l 53.96321 35.8098 l 51.80469 35.8098 l 56.12175 35.8098 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 56.12175 48.4189 m 51.80469 48.4189 l 51.80469 43.37526 l 56.12175 43.37526 l 56.12175 48.4189 l 51.80469 48.4189 l 53.96321 48.4189 l 53.96321 43.37526 l 53.96321 45.89708 l 51.80469 45.89708 l 56.12175 45.89708 l f 56.12175 48.4189 m 51.80469 48.4189 l 51.80469 43.37526 l 56.12175 43.37526 l 56.12175 48.4189 l 51.80469 48.4189 l 53.96321 48.4189 l 53.96321 43.37526 l 53.96321 45.89708 l 51.80469 45.89708 l 56.12175 45.89708 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 56.12175 58.50618 m 51.80469 58.50618 l 51.80469 53.46254 l 56.12175 53.46254 l 56.12175 58.50618 l 51.80469 58.50618 l 53.96321 58.50618 l 53.96321 53.46254 l 53.96321 55.98434 l 51.80469 55.98434 l 56.12175 55.98434 l f 56.12175 58.50618 m 51.80469 58.50618 l 51.80469 53.46254 l 56.12175 53.46254 l 56.12175 58.50618 l 51.80469 58.50618 l 53.96321 58.50618 l 53.96321 53.46254 l 53.96321 55.98434 l 51.80469 55.98434 l 56.12175 55.98434 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 56.12175 68.59344 m 51.80469 68.59344 l 51.80469 63.5498 l 56.12175 63.5498 l 56.12175 68.59344 l 51.80469 68.59344 l 53.96321 68.59344 l 53.96321 63.5498 l 53.96321 66.07162 l 51.80469 66.07162 l 56.12175 66.07162 l f 56.12175 68.59344 m 51.80469 68.59344 l 51.80469 63.5498 l 56.12175 63.5498 l 56.12175 68.59344 l 51.80469 68.59344 l 53.96321 68.59344 l 53.96321 63.5498 l 53.96321 66.07162 l 51.80469 66.07162 l 56.12175 66.07162 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 56.12175 78.68073 m 51.80469 78.68073 l 51.80469 73.63708 l 56.12175 73.63708 l 56.12175 78.68073 l 51.80469 78.68073 l 53.96321 78.68073 l 53.96321 73.63708 l 53.96321 76.15889 l 51.80469 76.15889 l 56.12175 76.15889 l f 56.12175 78.68073 m 51.80469 78.68073 l 51.80469 73.63708 l 56.12175 73.63708 l 56.12175 78.68073 l 51.80469 78.68073 l 53.96321 78.68073 l 53.96321 73.63708 l 53.96321 76.15889 l 51.80469 76.15889 l 56.12175 76.15889 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 69.07292 28.24435 m 64.75586 28.24435 l 64.75586 23.20071 l 69.07292 23.20071 l 69.07292 28.24435 l 64.75586 28.24435 l 66.91438 28.24435 l 66.91438 23.20071 l 66.91438 25.72253 l 64.75586 25.72253 l 69.07292 25.72253 l f 69.07292 28.24435 m 64.75586 28.24435 l 64.75586 23.20071 l 69.07292 23.20071 l 69.07292 28.24435 l 64.75586 28.24435 l 66.91438 28.24435 l 66.91438 23.20071 l 66.91438 25.72253 l 64.75586 25.72253 l 69.07292 25.72253 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 69.07292 38.33163 m 64.75586 38.33163 l 64.75586 33.288 l 69.07292 33.288 l 69.07292 38.33163 l 64.75586 38.33163 l 66.91438 38.33163 l 66.91438 33.288 l 66.91438 35.8098 l 64.75586 35.8098 l 69.07292 35.8098 l f 69.07292 38.33163 m 64.75586 38.33163 l 64.75586 33.288 l 69.07292 33.288 l 69.07292 38.33163 l 64.75586 38.33163 l 66.91438 38.33163 l 66.91438 33.288 l 66.91438 35.8098 l 64.75586 35.8098 l 69.07292 35.8098 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 69.07292 48.4189 m 64.75586 48.4189 l 64.75586 43.37526 l 69.07292 43.37526 l 69.07292 48.4189 l 64.75586 48.4189 l 66.91438 48.4189 l 66.91438 43.37526 l 66.91438 45.89708 l 64.75586 45.89708 l 69.07292 45.89708 l f 69.07292 48.4189 m 64.75586 48.4189 l 64.75586 43.37526 l 69.07292 43.37526 l 69.07292 48.4189 l 64.75586 48.4189 l 66.91438 48.4189 l 66.91438 43.37526 l 66.91438 45.89708 l 64.75586 45.89708 l 69.07292 45.89708 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 69.07292 58.50618 m 64.75586 58.50618 l 64.75586 53.46254 l 69.07292 53.46254 l 69.07292 58.50618 l 64.75586 58.50618 l 66.91438 58.50618 l 66.91438 53.46254 l 66.91438 55.98434 l 64.75586 55.98434 l 69.07292 55.98434 l f 69.07292 58.50618 m 64.75586 58.50618 l 64.75586 53.46254 l 69.07292 53.46254 l 69.07292 58.50618 l 64.75586 58.50618 l 66.91438 58.50618 l 66.91438 53.46254 l 66.91438 55.98434 l 64.75586 55.98434 l 69.07292 55.98434 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 69.07292 68.59344 m 64.75586 68.59344 l 64.75586 63.5498 l 69.07292 63.5498 l 69.07292 68.59344 l 64.75586 68.59344 l 66.91438 68.59344 l 66.91438 63.5498 l 66.91438 66.07162 l 64.75586 66.07162 l 69.07292 66.07162 l f 69.07292 68.59344 m 64.75586 68.59344 l 64.75586 63.5498 l 69.07292 63.5498 l 69.07292 68.59344 l 64.75586 68.59344 l 66.91438 68.59344 l 66.91438 63.5498 l 66.91438 66.07162 l 64.75586 66.07162 l 69.07292 66.07162 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} cs [1] sc 69.07292 78.68073 m 64.75586 78.68073 l 64.75586 73.63708 l 69.07292 73.63708 l 69.07292 78.68073 l 64.75586 78.68073 l 66.91438 78.68073 l 66.91438 73.63708 l 66.91438 76.15889 l 64.75586 76.15889 l 69.07292 76.15889 l f 69.07292 78.68073 m 64.75586 78.68073 l 64.75586 73.63708 l 69.07292 73.63708 l 69.07292 78.68073 l 64.75586 78.68073 l 66.91438 78.68073 l 66.91438 73.63708 l 66.91438 76.15889 l 64.75586 76.15889 l 69.07292 76.15889 l S Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0 10.08727 m 194.2676 10.08727 l S Q q /DeviceRGB {} CS [0 0.5019 0.6] SC /DeviceRGB {} cs [0 0.5019 0.6] sc 64.75586 90.78545 m 64.75586 90.78545 70.32567 106.52785 72.46489 111.78343 c 74.60411 117.03903 78.0347 124.5511 80.17392 128.66418 c 82.31314 132.77727 85.74374 138.45714 87.88297 141.42769 c 90.02219 144.39825 93.45277 148.24588 95.592 150.07391 c 97.73122 151.90193 101.1618 153.91737 103.30103 154.60287 c 105.44025 155.28839 108.87083 155.4716 111.01006 155.0146 c 113.14928 154.5576 116.57988 152.90855 118.7191 151.30904 c 120.85832 149.70952 124.28891 146.2283 126.42813 143.48627 c 128.56735 140.74423 131.99794 135.43088 134.13716 131.5463 c 136.27638 127.66173 139.70697 120.51599 141.84619 115.48888 c 143.98541 110.46176 147.41602 101.48392 149.55524 95.31429 c 151.69446 89.14465 155.12505 78.3345 157.26427 71.02237 c 159.40349 63.71024 162.83408 51.0681 164.9733 42.61345 c 167.11252 34.1588 172.68233 10.0871 172.68233 10.0871 c S Q Q q /DeviceRGB {} CS [0 0.5019 0.6] SC /DeviceRGB {} cs [0 0.5019 0.6] sc /DeviceRGB {} CS [0 0.5019 0.6] SC /DeviceRGB {} cs [0 0.5019 0.6] sc 66.74841 90.78545 m 66.74841 91.88593 65.85634 92.778 64.75586 92.778 c 63.6554 92.778 62.7633 91.88593 62.7633 90.78545 c 62.7633 89.68498 63.6554 88.7929 64.75586 88.7929 c 65.85634 88.7929 66.74841 89.68498 66.74841 90.78545 c h f 66.74841 90.78545 m 66.74841 91.88593 65.85634 92.778 64.75586 92.778 c 63.6554 92.778 62.7633 91.88593 62.7633 90.78545 c 62.7633 89.68498 63.6554 88.7929 64.75586 88.7929 c 65.85634 88.7929 66.74841 89.68498 66.74841 90.78545 c h S 74.45744 111.78343 m 74.45744 112.88391 73.56535 113.77599 72.46489 113.77599 c 71.36443 113.77599 70.47234 112.88391 70.47234 111.78343 c 70.47234 110.68297 71.36443 109.79088 72.46489 109.79088 c 73.56535 109.79088 74.45744 110.68297 74.45744 111.78343 c h f 74.45744 111.78343 m 74.45744 112.88391 73.56535 113.77599 72.46489 113.77599 c 71.36443 113.77599 70.47234 112.88391 70.47234 111.78343 c 70.47234 110.68297 71.36443 109.79088 72.46489 109.79088 c 73.56535 109.79088 74.45744 110.68297 74.45744 111.78343 c h S 82.16647 128.66418 m 82.16647 129.76466 81.27438 130.65674 80.17392 130.65674 c 79.07344 130.65674 78.18137 129.76466 78.18137 128.66418 c 78.18137 127.56372 79.07344 126.67163 80.17392 126.67163 c 81.27438 126.67163 82.16647 127.56372 82.16647 128.66418 c h f 82.16647 128.66418 m 82.16647 129.76466 81.27438 130.65674 80.17392 130.65674 c 79.07344 130.65674 78.18137 129.76466 78.18137 128.66418 c 78.18137 127.56372 79.07344 126.67163 80.17392 126.67163 c 81.27438 126.67163 82.16647 127.56372 82.16647 128.66418 c h S 89.87552 141.42769 m 89.87552 142.52817 88.98343 143.42024 87.88297 143.42024 c 86.78249 143.42024 85.89041 142.52817 85.89041 141.42769 c 85.89041 140.32722 86.78249 139.43513 87.88297 139.43513 c 88.98343 139.43513 89.87552 140.32722 89.87552 141.42769 c h f 89.87552 141.42769 m 89.87552 142.52817 88.98343 143.42024 87.88297 143.42024 c 86.78249 143.42024 85.89041 142.52817 85.89041 141.42769 c 85.89041 140.32722 86.78249 139.43513 87.88297 139.43513 c 88.98343 139.43513 89.87552 140.32722 89.87552 141.42769 c h S 97.58455 150.07391 m 97.58455 151.17438 96.69246 152.06647 95.592 152.06647 c 94.49152 152.06647 93.59944 151.17438 93.59944 150.07391 c 93.59944 148.97343 94.49152 148.08136 95.592 148.08136 c 96.69246 148.08136 97.58455 148.97343 97.58455 150.07391 c h f 97.58455 150.07391 m 97.58455 151.17438 96.69246 152.06647 95.592 152.06647 c 94.49152 152.06647 93.59944 151.17438 93.59944 150.07391 c 93.59944 148.97343 94.49152 148.08136 95.592 148.08136 c 96.69246 148.08136 97.58455 148.97343 97.58455 150.07391 c h S 105.29358 154.60287 m 105.29358 155.70335 104.40149 156.59543 103.30103 156.59543 c 102.20055 156.59543 101.30847 155.70335 101.30847 154.60287 c 101.30847 153.50241 102.20055 152.61032 103.30103 152.61032 c 104.40149 152.61032 105.29358 153.50241 105.29358 154.60287 c h f 105.29358 154.60287 m 105.29358 155.70335 104.40149 156.59543 103.30103 156.59543 c 102.20055 156.59543 101.30847 155.70335 101.30847 154.60287 c 101.30847 153.50241 102.20055 152.61032 103.30103 152.61032 c 104.40149 152.61032 105.29358 153.50241 105.29358 154.60287 c h S 113.00261 155.0146 m 113.00261 156.11507 112.11052 157.00716 111.01006 157.00716 c 109.90958 157.00716 109.0175 156.11507 109.0175 155.0146 c 109.0175 153.91412 109.90958 153.02205 111.01006 153.02205 c 112.11052 153.02205 113.00261 153.91412 113.00261 155.0146 c h f 113.00261 155.0146 m 113.00261 156.11507 112.11052 157.00716 111.01006 157.00716 c 109.90958 157.00716 109.0175 156.11507 109.0175 155.0146 c 109.0175 153.91412 109.90958 153.02205 111.01006 153.02205 c 112.11052 153.02205 113.00261 153.91412 113.00261 155.0146 c h S 120.71165 151.30904 m 120.71165 152.40952 119.81956 153.30159 118.7191 153.30159 c 117.61862 153.30159 116.72655 152.40952 116.72655 151.30904 c 116.72655 150.20857 117.61862 149.31648 118.7191 149.31648 c 119.81956 149.31648 120.71165 150.20857 120.71165 151.30904 c h f 120.71165 151.30904 m 120.71165 152.40952 119.81956 153.30159 118.7191 153.30159 c 117.61862 153.30159 116.72655 152.40952 116.72655 151.30904 c 116.72655 150.20857 117.61862 149.31648 118.7191 149.31648 c 119.81956 149.31648 120.71165 150.20857 120.71165 151.30904 c h S 128.42068 143.48627 m 128.42068 144.58673 127.5286 145.47882 126.42813 145.47882 c 125.32765 145.47882 124.43558 144.58673 124.43558 143.48627 c 124.43558 142.3858 125.32765 141.49371 126.42813 141.49371 c 127.5286 141.49371 128.42068 142.3858 128.42068 143.48627 c h f 128.42068 143.48627 m 128.42068 144.58673 127.5286 145.47882 126.42813 145.47882 c 125.32765 145.47882 124.43558 144.58673 124.43558 143.48627 c 124.43558 142.3858 125.32765 141.49371 126.42813 141.49371 c 127.5286 141.49371 128.42068 142.3858 128.42068 143.48627 c h S 136.12971 131.5463 m 136.12971 132.64677 135.23763 133.53885 134.13716 133.53885 c 133.03668 133.53885 132.1446 132.64677 132.1446 131.5463 c 132.1446 130.44583 133.03668 129.55374 134.13716 129.55374 c 135.23763 129.55374 136.12971 130.44583 136.12971 131.5463 c h f 136.12971 131.5463 m 136.12971 132.64677 135.23763 133.53885 134.13716 133.53885 c 133.03668 133.53885 132.1446 132.64677 132.1446 131.5463 c 132.1446 130.44583 133.03668 129.55374 134.13716 129.55374 c 135.23763 129.55374 136.12971 130.44583 136.12971 131.5463 c h S 143.83875 115.48888 m 143.83875 116.58934 142.94666 117.48143 141.84619 117.48143 c 140.74571 117.48143 139.85364 116.58934 139.85364 115.48888 c 139.85364 114.3884 140.74571 113.49632 141.84619 113.49632 c 142.94666 113.49632 143.83875 114.3884 143.83875 115.48888 c h f 143.83875 115.48888 m 143.83875 116.58934 142.94666 117.48143 141.84619 117.48143 c 140.74571 117.48143 139.85364 116.58934 139.85364 115.48888 c 139.85364 114.3884 140.74571 113.49632 141.84619 113.49632 c 142.94666 113.49632 143.83875 114.3884 143.83875 115.48888 c h S 151.54779 95.31429 m 151.54779 96.41475 150.6557 97.30684 149.55524 97.30684 c 148.45476 97.30684 147.56268 96.41475 147.56268 95.31429 c 147.56268 94.2138 148.45476 93.32173 149.55524 93.32173 c 150.6557 93.32173 151.54779 94.2138 151.54779 95.31429 c h f 151.54779 95.31429 m 151.54779 96.41475 150.6557 97.30684 149.55524 97.30684 c 148.45476 97.30684 147.56268 96.41475 147.56268 95.31429 c 147.56268 94.2138 148.45476 93.32173 149.55524 93.32173 c 150.6557 93.32173 151.54779 94.2138 151.54779 95.31429 c h S 159.25682 71.02237 m 159.25682 72.12285 158.36473 73.01492 157.26427 73.01492 c 156.16379 73.01492 155.27171 72.12285 155.27171 71.02237 c 155.27171 69.9219 156.16379 69.02982 157.26427 69.02982 c 158.36473 69.02982 159.25682 69.9219 159.25682 71.02237 c h f 159.25682 71.02237 m 159.25682 72.12285 158.36473 73.01492 157.26427 73.01492 c 156.16379 73.01492 155.27171 72.12285 155.27171 71.02237 c 155.27171 69.9219 156.16379 69.02982 157.26427 69.02982 c 158.36473 69.02982 159.25682 69.9219 159.25682 71.02237 c h S 166.96585 42.61345 m 166.96585 43.71391 166.07376 44.606 164.9733 44.606 c 163.87282 44.606 162.98074 43.71391 162.98074 42.61345 c 162.98074 41.51297 163.87282 40.6209 164.9733 40.6209 c 166.07376 40.6209 166.96585 41.51297 166.96585 42.61345 c h f 166.96585 42.61345 m 166.96585 43.71391 166.07376 44.606 164.9733 44.606 c 163.87282 44.606 162.98074 43.71391 162.98074 42.61345 c 162.98074 41.51297 163.87282 40.6209 164.9733 40.6209 c 166.07376 40.6209 166.96585 41.51297 166.96585 42.61345 c h S 174.67488 10.0871 m 174.67488 11.18758 173.78279 12.07965 172.68233 12.07965 c 171.58185 12.07965 170.68977 11.18758 170.68977 10.0871 c 170.68977 8.98663 171.58185 8.09454 172.68233 8.09454 c 173.78279 8.09454 174.67488 8.98663 174.67488 10.0871 c h f 174.67488 10.0871 m 174.67488 11.18758 173.78279 12.07965 172.68233 12.07965 c 171.58185 12.07965 170.68977 11.18758 170.68977 10.0871 c 170.68977 8.98663 171.58185 8.09454 172.68233 8.09454 c 173.78279 8.09454 174.67488 8.98663 174.67488 10.0871 c h S Q Q Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 60.387 -147.009] cm Q Q Q Q q Q q Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%EOF ================================================ FILE: examples/showcase/generated/latex-image/image-building-parabola.tex ================================================ \documentclass[12pt]{article} \usepackage{geometry} \geometry{letterpaper,total={408pt,9.0in}} %% Custom Page Layout Adjustments (use latex.geometry) \usepackage{amsmath,amssymb} \usepackage{tikz} \usepackage{pgfplots} \usetikzlibrary{positioning} \usepgfplotslibrary{fillbetween} \usepackage{pstricks} \usepackage{phaistos} \usepackage{xcolor} \ifdefined\tikzset \tikzset{ampersand replacement = \amp} \fi \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} \begin{document} \pagestyle{empty} \resizebox{\width}{\height}{ \definecolor{ruby}{HTML}{9e0c0f} \definecolor{turquoise}{HTML}{008099} \begin{tikzpicture} \begin{axis}[ axis x line=none, axis y line=none, xmin=-3,xmax=6, ymin=-10, ymax=150, grid=none ] \addplot[color=ruby, fill=ruby!30] coordinates{(-1.5,0)(-1.5,80)(0.5,80)(0.5,0)(-1.5,0)}; \addplot[color=black,fill=white] coordinates{(0.2,8)(0,8)(0,3)(0.2,3)(0.2,8)(0,8)(0.1,8)(0.1,3)(0.1,5.5)(0,5.5)(0.2,5.5)}; \addplot[color=black,fill=white] coordinates{(-1,8)(-1.2,8)(-1.2,3)(-1,3)(-1,8)(-1.2,8)(-1.1,8)(-1.1,3)(-1.1,5.5)(-1.2,5.5)(-1,5.5)}; \addplot[color=black,fill=black!40] coordinates{(-0.3,9)(-0.3,0)(-0.7,0)(-0.7,9)(-0.3,9)}; \addplot[color=black] coordinates{(-0.5,0)(-0.5,9)}; \foreach \x in {0,...,2} \foreach \y in {0,...,5} {\addplot[color=black,fill=white] coordinates{(0.6*\x-1,18+10*\y)(0.6*\x-1.2,18+10*\y)(0.6*\x-1.2,13+10*\y)(0.6*\x-1,13+10*\y)(0.6*\x-1,18+10*\y)(0.6*\x-1.2,18+10*\y)(0.6*\x-1.1,18+10*\y)(0.6*\x-1.1,13+10*\y)(0.6*\x-1.1,15.5+10*\y)(0.6*\x-1.2,15.5+10*\y)(0.6*\x-1,15.5+10*\y)};} \addplot[color=black] coordinates{(-3,0)(6,0)}; \addplot[mark=*, samples=15, variable=\t, domain=0:5, smooth, -, color=turquoise] ({t}, {-16*t^2+64*t+80}); \end{axis} \end{tikzpicture} } \end{document} ================================================ FILE: examples/showcase/generated/latex-image/image-gaussian-sum-proof.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.90.1 (http://poppler.freedesktop.org) %%Creator: XeTeX output 2022.03.23:2315 %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%BoundingBox: 135 570 435 732 %%HiResBoundingBox: 135.32 570.33374 434.92 731.1175 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin %%BeginResource: font QLBTNG+CMMI12 %!FontType1-1.0: QLBTNG+CMMI12003.002 12 dict begin /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \(c\) 1997, 2009 American Mathematical Society \(\), with Reserved Font Name CMMI12.) readonly def /FullName (CMMI12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /isFixedPitch false def /ItalicAngle -14.04 def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /QLBTNG+CMMI12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-31 -250 1026 750] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 107 /k put dup 110 /n put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF6 F95CB8F8CEBD4396C74A303DCB3A46C281B472F99892DCADA5FC6E4C2524AE72 569652A7D664B73CC839B5405D299F805DA5E9FE5C41F969093CFD7B26C9805B 6EC2DA5C4EA81C285458F5CCCDC02F82AC0E127BDB8F9E0A94383740D13431F8 554EF5B7648E7C56F5F38740D67CB57E0007961013F2F16CDB5BA3F5C1414F66 AECF5AFFA42AA51168B07908FD53D54A2CFEF17624741ECA22F7626685779284 56899ED3A87EB156921AFFE08F658C5379DF758C777CCB51DFBDA39A6D5A2A69 807BC97310A8AF1387EE2FDA5CD976F4AF9B2FA6EE99C852696D32CAA771EC9A FAF67CC02D5C15B131BBD34A67D80AAE3E564144E0A3A4D60817F7828C81FB77 85405DCBDC816070D1DFBE75904D700DB911679FF27A87F86B5129899F596734 9FD023B88E6A87FB9D92B592BEC58F3B2D1AB05ADCF2D27EEC4C29B7A1B93721 19EF276959CDB26D9D8C197EEB64D68473E9C160DA49E02C4F3592E4B59FF4FB 6AABB8A2059D28FA6BE2055F4E5A41510609F9D8FF0A39DC4F971E5A2779B392 CCEE6AEF7966B720213DFF06FDBB88846EB4F24C481D319A1FEC6DFE773F13AC FC6EC3DDE015157EB4294D261130436BE4F2C8E9D4AEB1551853C5FF17456628 DF11477A8F97BA6E7C730C9A59F57DFF73BF2A436B3FC0A7A1022F0DA3382AD7 390FD833CEBFE5195B356107561694DF948DD0198C3355573733AA9DE22409B2 9E2E63707D26B57E4002D15044BD03B52EBEEA661FFC33B9F2967DCD0DE94BE5 7FBD3C3918545974942108D935469EC62267033C02DE3135CFEB244EFE7BE256 6B8AD9589C74119264DAE09F944EF4215CA919CDDF77B4C1CCED4527E386ED00 F19083DFE2FBF5DB0384565B0B19B52056CF06849BB35B586FCB8A6E8DDF43CA C93D89C7A618C1513F0E4778770529811EF73DF011EAAA4E949F5398BEBB5F68 8291850D3F4B6942B6DF3AC600EFAFB691D8AEAA46C7CF5700EBE38E6C4108E0 783A8EA1F62276C2C59F9FD8C35EB54C4FD5540A63126992763A0AFBEE5CB08C EE088CED6A557359E8B5330E84169622D8A9F43C6D3BE23F062873285BED40E6 5E68D3D90A771E7E062B8E7DFC7611C3AEFC7D7259677BEC88C17F1C83E333D9 0C77320A12E6 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F15_0 /QLBTNG+CMMI12 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont %%BeginResource: font IWZFZI+CMEX10 %!FontType1-1.0: IWZFZI+CMEX10003.002 12 dict begin /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \(c\) 1997, 2009 American Mathematical Society \(\), with Reserved Font Name CMEX10.) readonly def /FullName (CMEX10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /isFixedPitch false def /ItalicAngle 0 def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /IWZFZI+CMEX10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-24 -2960 1454 772] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /parenleftbig put dup 1 /parenrightbig put dup 80 /summationtext put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF6 F88E0EEDCEC117F47331582B284EFD293832F1E76DEBD75D6F0A97DBD8069165 0089C16EE84B8D38202565E2C8CB90418069398CB8BF65B84E0C5EA652EC3CA4 8DD518AE213F41B9BD6A1357D8129E946E4D9D82D6C1AD2CFD36161FB9A5E663 0919C0D7688B53A31CDE97B0DAFE2986E037411E06F2FB90E98996FE8855DF2F 941DFB981689246E2ADC3D5BEE0A94D5B2EB390E861407D2CCB3C07D5FC548B7 1019C9F9ECF3190F010616E16177AE79C4DF907534D8E1793E27B3B7862EE781 853423D117260459426E0A49A10677B3F63FD6C44D606B46E1EFA24239EC9E30 A40365E229626BB809F59159A2C3FF49A90AE91585B27FF99F5C16554605FC48 13EA075F6C199C362C6B8E3EDDCD3C675B0C152860DD909B75DD02DD36392DB6 2E11DDEE9081882ABCBC549E79A2CACA917F3424F04CD246FF3DDF92BDB07F74 B03EEC2A1B3849E51D4E3924663A03A754CB77E3CE3F014C0371CB1293E62FA3 F66A75A5E5F0668F28F604E02E877A4B2263539921F3F85B2F8C5F537A3426FA 2A27AA0C78BD6D52A714B04EF971934EABE6BCDE2802F753ED8C3CDEE5259A8D 0DA4F3D399EB4063F42E293AE4EB08725C0B2BB207EC3F8C054B973B4ADAA3E6 80087F5EE0DF2EE11E269E8CF12DCBD19BA9E35B4AF0BB7F79C71E76C1717E02 33A28C838FF43F0E70C9AB725E0344018AB56C4BC0C1979F61ABDC9078DA81D7 01E471BB3B33B5A0CC677C26F4C426B0035CD6297E926291C203516D14C1C7D1 3A47A0743E38B4CF0D0B84ED6F3C40ADA63F7B45643B136A77C4477BD07DC856 8E700FD9435DA6AF742183ECED2CFCC6B99EDF5FBC148079F5C34DB1C78C3903 A562FBD8745A0F5FA3399E22B0550C34C9CFA35F796DD56E5A424B4789287D3E 352C9A0F437C990DC44A3A70D1F63F1C6CC393C899E5FDC78E4BBB6CDD4D8116 A9F68C4C17542308F09379D9844760966B2C3BFB961715CAFE94154420D2262F 5D112B2062AED83FD3807CAD3567599EBA5CE673B1A26C8009F4DA 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F20_0 /IWZFZI+CMEX10 1 1 [ /parenleftbig/parenrightbig/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /summationtext/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont %%BeginResource: font ZZDDUJ+CMR17 %!FontType1-1.0: ZZDDUJ+CMR17003.002 12 dict begin /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \(c\) 1997, 2009 American Mathematical Society \(\), with Reserved Font Name CMR17.) readonly def /FullName (CMR17) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /isFixedPitch false def /ItalicAngle 0 def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /ZZDDUJ+CMR17 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-33 -250 945 749] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 43 /plus put dup 49 /one put dup 50 /two put dup 61 /equal put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF5 CCB914A848C8A20E9504E76E0E15D6FE273055B678E306DE5C9C2AC731C8E619 46C9379C438862EA00EFA22BE1C5CFA195B0B4FFD19DF45AEF25BC18A2057789 F38B681977E9318A38753EB2A3F34BEF36D543328303B7021BD9DEA71D7DBFEF 5BCC58D21D07D7316F8EBB118B7C8B43AA6786DA852E032F10A26E28EF583D9E 06B3C6E414223880FCAEDAF9D971653CB8EE1131BCB8F77148BEA6F335A06EE7 C4271886A4309E598F947B9AD9C090704CA37107E3E9F4D2AA3347DC83F9E339 14B285CFC2D45AA28147D465EB5E31E1D545EE1C4DF722F4FF69E4E436B53E86 9954C99896DDD984CB3C66C2146F1FF42E324755D16F79F874102D9DE56820BE B48ADBCB0E89CA15C251E847098DD1B99F8DECB863CDE3E7F3142CFD9CD86E75 0691994185B62A5E908C8BFC7A29EF7862071650CBBD6CD70C70A84AAFC49785 9CDAB9F5526FA6CC43B25EBC0EED6B4A3A48CECF8E904175A2FAA6A5FDF2C75B A51217F50A07AFCD3E35FCF2F2A16888AF85EEE9BEC482A9488C8EBAF33409EC A8865B8BD3DAB00E14E8C9CAD09D5F5DE9EE699D0823ED9638F52043241BD3C0 C6E21B0A05A7D97AFC84E2BD3A48FA3748A7EE0108BEEF6830EBB9843B1D6E2A E727C0349BD02D7F1A4B68462BABEA9504595664FC5791FA042B338B5ADBC803 289C8FD8A3122187B3FE77E3C12EA6A9D62DB5DF62DE8F469A236F5FC035C00A 080414B7F540914490F157D56C231E2616674D4A82D5B3667A602DBC7FDCC2DC BEC8C669F423ACEFA208EF03965DFF21462ADF7C98DACFB2DA042A8CD156965B 192073F10A2503C70B3CE99C8953D13025EB6725BCED3728C7D2656E3468562C AD33E10074A0821DE3E5BF97FFDC0EE5669361157A5182CCA3F6460BD2746B73 412E27E8C826200B63AC9B855B84CB6A4501514EA5A98A725438D9C941B8FD58 0EE7AA32551F01297D984EB7DD73A90A3E86C4E9A5443D1EA542F46EBF19BF46 0DA61DDBBA46A9D5E72CAF1C548B56F2AC5D89469839B3427A9BFC2A88E9205B DCA23A5E3E6E151D3199A2955E7248BA237D944077B8618978F1D4ED5FB27961 375E856E3BA21B9DC339696C0431144999 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F25_0 /ZZDDUJ+CMR17 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont %%EndSetup pdfStartPage %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 135.32 570.33374 299.6 160.78376 re W q q [1 0 0 1 72 720] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1.00003 0 0 1 -0.001 0] cm q [1 0 0 1 142.436 28.772] cm q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.3985 w q q [2.98883 2.98883] 0 d -77.95372 -159.5693 m 106.30052 -159.5693 l S Q q 1.19553 w -42.5202 -171.84387 m 0 -98.19649 l 42.5202 -171.84387 l S Q q 19.84267 -24.5491 m 19.84267 -21.41801 17.30447 -18.87984 14.17339 -18.87984 c 11.0423 -18.87984 8.50412 -21.41801 8.50412 -24.5491 c 8.50412 -27.68019 11.0423 -30.21838 14.17339 -30.21838 c 17.30447 -30.21838 19.84267 -27.68019 19.84267 -24.5491 c h W [1 0 0 1 14.17337 -24.54909] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc0_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc0_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc0_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc0_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc0_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc0_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc0_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc0_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 5.66927 -49.09824 m 5.66927 -45.96715 3.13109 -43.42896 0 -43.42896 c -3.13109 -43.42896 -5.66927 -45.96715 -5.66927 -49.09824 c -5.66927 -52.22932 -3.13109 -54.7675 0 -54.7675 c 3.13109 -54.7675 5.66927 -52.22932 5.66927 -49.09824 c h W [1 0 0 1 0 -49.09822] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc1_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc1_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc1_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc1_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc1_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc1_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc1_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc1_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 34.01608 -49.09824 m 34.01608 -45.96715 31.47789 -43.42896 28.3468 -43.42896 c 25.21571 -43.42896 22.67754 -45.96715 22.67754 -49.09824 c 22.67754 -52.22932 25.21571 -54.7675 28.3468 -54.7675 c 31.47789 -54.7675 34.01608 -52.22932 34.01608 -49.09824 c h W [1 0 0 1 28.34679 -49.09822] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc2_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc2_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc2_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc2_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc2_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc2_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc2_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc2_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q -8.50412 -73.64735 m -8.50412 -70.51627 -11.0423 -67.97809 -14.17339 -67.97809 c -17.30447 -67.97809 -19.84267 -70.51627 -19.84267 -73.64735 c -19.84267 -76.77846 -17.30447 -79.31664 -14.17339 -79.31664 c -11.0423 -79.31664 -8.50412 -76.77846 -8.50412 -73.64735 c h W [1 0 0 1 -14.17337 -73.64734] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc3_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc3_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc3_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc3_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc3_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc3_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc3_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc3_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 19.84267 -73.64735 m 19.84267 -70.51627 17.30447 -67.97809 14.17339 -67.97809 c 11.0423 -67.97809 8.50412 -70.51627 8.50412 -73.64735 c 8.50412 -76.77846 11.0423 -79.31664 14.17339 -79.31664 c 17.30447 -79.31664 19.84267 -76.77846 19.84267 -73.64735 c h W [1 0 0 1 14.17337 -73.64734] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc4_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc4_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc4_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc4_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc4_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc4_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc4_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc4_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 48.18947 -73.64735 m 48.18947 -70.51627 45.65129 -67.97809 42.5202 -67.97809 c 39.38911 -67.97809 36.85092 -70.51627 36.85092 -73.64735 c 36.85092 -76.77846 39.38911 -79.31664 42.5202 -79.31664 c 45.65129 -79.31664 48.18947 -76.77846 48.18947 -73.64735 c h W [1 0 0 1 42.5202 -73.64734] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc5_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc5_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc5_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc5_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc5_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc5_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc5_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc5_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q -22.67754 -98.19649 m -22.67754 -95.0654 -25.21571 -92.5272 -28.3468 -92.5272 c -31.47789 -92.5272 -34.01608 -95.0654 -34.01608 -98.19649 c -34.01608 -101.32758 -31.47789 -103.86577 -28.3468 -103.86577 c -25.21571 -103.86577 -22.67754 -101.32758 -22.67754 -98.19649 c h W [1 0 0 1 -28.34679 -98.19647] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc6_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc6_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc6_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc6_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc6_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc6_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc6_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc6_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 5.66927 -98.19649 m 5.66927 -95.0654 3.13109 -92.5272 0 -92.5272 c -3.13109 -92.5272 -5.66927 -95.0654 -5.66927 -98.19649 c -5.66927 -101.32758 -3.13109 -103.86577 0 -103.86577 c 3.13109 -103.86577 5.66927 -101.32758 5.66927 -98.19649 c h W [1 0 0 1 0 -98.19647] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc7_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc7_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc7_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc7_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc7_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc7_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc7_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc7_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 34.01608 -98.19649 m 34.01608 -95.0654 31.47789 -92.5272 28.3468 -92.5272 c 25.21571 -92.5272 22.67754 -95.0654 22.67754 -98.19649 c 22.67754 -101.32758 25.21571 -103.86577 28.3468 -103.86577 c 31.47789 -103.86577 34.01608 -101.32758 34.01608 -98.19649 c h W [1 0 0 1 28.34679 -98.19647] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc8_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc8_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc8_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc8_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc8_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc8_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc8_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc8_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 62.36288 -98.19649 m 62.36288 -95.0654 59.8247 -92.5272 56.69362 -92.5272 c 53.56252 -92.5272 51.02434 -95.0654 51.02434 -98.19649 c 51.02434 -101.32758 53.56252 -103.86577 56.69362 -103.86577 c 59.8247 -103.86577 62.36288 -101.32758 62.36288 -98.19649 c h W [1 0 0 1 56.69362 -98.19647] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc9_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc9_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc9_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc9_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc9_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc9_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc9_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc9_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q -36.85092 -122.74562 m -36.85092 -119.61452 -39.38911 -117.07634 -42.5202 -117.07634 c -45.65129 -117.07634 -48.18947 -119.61452 -48.18947 -122.74562 c -48.18947 -125.87671 -45.65129 -128.41489 -42.5202 -128.41489 c -39.38911 -128.41489 -36.85092 -125.87671 -36.85092 -122.74562 c h W [1 0 0 1 -42.5202 -122.7456] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc10_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc10_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc10_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc10_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc10_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc10_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc10_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc10_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q -8.50412 -122.74562 m -8.50412 -119.61452 -11.0423 -117.07634 -14.17339 -117.07634 c -17.30447 -117.07634 -19.84267 -119.61452 -19.84267 -122.74562 c -19.84267 -125.87671 -17.30447 -128.41489 -14.17339 -128.41489 c -11.0423 -128.41489 -8.50412 -125.87671 -8.50412 -122.74562 c h W [1 0 0 1 -14.17337 -122.7456] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc11_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc11_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc11_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc11_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc11_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc11_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc11_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc11_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 19.84267 -122.74562 m 19.84267 -119.61452 17.30447 -117.07634 14.17339 -117.07634 c 11.0423 -117.07634 8.50412 -119.61452 8.50412 -122.74562 c 8.50412 -125.87671 11.0423 -128.41489 14.17339 -128.41489 c 17.30447 -128.41489 19.84267 -125.87671 19.84267 -122.74562 c h W [1 0 0 1 14.17337 -122.7456] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc12_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc12_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc12_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc12_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc12_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc12_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc12_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc12_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 48.18947 -122.74562 m 48.18947 -119.61452 45.65129 -117.07634 42.5202 -117.07634 c 39.38911 -117.07634 36.85092 -119.61452 36.85092 -122.74562 c 36.85092 -125.87671 39.38911 -128.41489 42.5202 -128.41489 c 45.65129 -128.41489 48.18947 -125.87671 48.18947 -122.74562 c h W [1 0 0 1 42.5202 -122.7456] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc13_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc13_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc13_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc13_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc13_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc13_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc13_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc13_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 76.53629 -122.74562 m 76.53629 -119.61452 73.9981 -117.07634 70.867 -117.07634 c 67.73592 -117.07634 65.19774 -119.61452 65.19774 -122.74562 c 65.19774 -125.87671 67.73592 -128.41489 70.867 -128.41489 c 73.9981 -128.41489 76.53629 -125.87671 76.53629 -122.74562 c h W [1 0 0 1 70.86699 -122.7456] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc14_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc14_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc14_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc14_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc14_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc14_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc14_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc14_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q -51.02434 -147.29474 m -51.02434 -144.16365 -53.56252 -141.62547 -56.69362 -141.62547 c -59.8247 -141.62547 -62.36288 -144.16365 -62.36288 -147.29474 c -62.36288 -150.42583 -59.8247 -152.96402 -56.69362 -152.96402 c -53.56252 -152.96402 -51.02434 -150.42583 -51.02434 -147.29474 c h W [1 0 0 1 -56.69362 -147.29472] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc15_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc15_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc15_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc15_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc15_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc15_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc15_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc15_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q -22.67754 -147.29474 m -22.67754 -144.16365 -25.21571 -141.62547 -28.3468 -141.62547 c -31.47789 -141.62547 -34.01608 -144.16365 -34.01608 -147.29474 c -34.01608 -150.42583 -31.47789 -152.96402 -28.3468 -152.96402 c -25.21571 -152.96402 -22.67754 -150.42583 -22.67754 -147.29474 c h W [1 0 0 1 -28.34679 -147.29472] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc16_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc16_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc16_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc16_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc16_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc16_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc16_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc16_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 5.66927 -147.29474 m 5.66927 -144.16365 3.13109 -141.62547 0 -141.62547 c -3.13109 -141.62547 -5.66927 -144.16365 -5.66927 -147.29474 c -5.66927 -150.42583 -3.13109 -152.96402 0 -152.96402 c 3.13109 -152.96402 5.66927 -150.42583 5.66927 -147.29474 c h W [1 0 0 1 0 -147.29472] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc17_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc17_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc17_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc17_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc17_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc17_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc17_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc17_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 34.01608 -147.29474 m 34.01608 -144.16365 31.47789 -141.62547 28.3468 -141.62547 c 25.21571 -141.62547 22.67754 -144.16365 22.67754 -147.29474 c 22.67754 -150.42583 25.21571 -152.96402 28.3468 -152.96402 c 31.47789 -152.96402 34.01608 -150.42583 34.01608 -147.29474 c h W [1 0 0 1 28.34679 -147.29472] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc18_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc18_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc18_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc18_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc18_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc18_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc18_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc18_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 62.36288 -147.29474 m 62.36288 -144.16365 59.8247 -141.62547 56.69362 -141.62547 c 53.56252 -141.62547 51.02434 -144.16365 51.02434 -147.29474 c 51.02434 -150.42583 53.56252 -152.96402 56.69362 -152.96402 c 59.8247 -152.96402 62.36288 -150.42583 62.36288 -147.29474 c h W [1 0 0 1 56.69362 -147.29472] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc19_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc19_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc19_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc19_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc19_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc19_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc19_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc19_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 90.7097 -147.29474 m 90.7097 -144.16365 88.17151 -141.62547 85.04042 -141.62547 c 81.90933 -141.62547 79.37115 -144.16365 79.37115 -147.29474 c 79.37115 -150.42583 81.90933 -152.96402 85.04042 -152.96402 c 88.17151 -152.96402 90.7097 -150.42583 90.7097 -147.29474 c h W [1 0 0 1 85.0404 -147.29472] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.162 mul 0.9595 add 1 index 1 exp -0.162 mul 0.9595 add 2 index 1 exp -0.00901 mul 0.99776 add 4 3 roll pop } /xpdfFunc20_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.2865 mul 0.7975 add 1 index 1 exp -0.2865 mul 0.7975 add 2 index 1 exp -0.29925 mul 0.98875 add 4 3 roll pop } /xpdfFunc20_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.146 mul 0.511 add 1 index 1 exp -0.146 mul 0.511 add 2 index 1 exp -0.197 mul 0.6895 add 4 3 roll pop } /xpdfFunc20_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.365 mul 0.365 add 1 index 1 exp -0.365 mul 0.365 add 2 index 1 exp -0.4925 mul 0.4925 add 4 3 roll pop } /xpdfFunc20_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc20_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc20_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc20_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc20_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q -65.19774 -171.84387 m -65.19774 -168.71278 -67.73592 -166.17459 -70.867 -166.17459 c -73.9981 -166.17459 -76.53629 -168.71278 -76.53629 -171.84387 c -76.53629 -174.97496 -73.9981 -177.51314 -70.867 -177.51314 c -67.73592 -177.51314 -65.19774 -174.97496 -65.19774 -171.84387 c h W [1 0 0 1 -70.86699 -171.84386] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.024 mul 0.994 add 1 index 1 exp -0.13201 mul 0.967 add 2 index 1 exp -0.23999 mul 0.94 add 4 3 roll pop } /xpdfFunc21_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.298 mul 0.97 add 1 index 1 exp -0.28899 mul 0.83499 add 2 index 1 exp -0.28001 mul 0.70001 add 4 3 roll pop } /xpdfFunc21_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.192 mul 0.672 add 1 index 1 exp -0.156 mul 0.546 add 2 index 1 exp -0.12 mul 0.42 add 4 3 roll pop } /xpdfFunc21_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.48 mul 0.48 add 1 index 1 exp -0.39 mul 0.39 add 2 index 1 exp -0.3 mul 0.3 add 4 3 roll pop } /xpdfFunc21_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc21_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc21_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc21_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc21_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q -36.85092 -171.84387 m -36.85092 -168.71278 -39.38911 -166.17459 -42.5202 -166.17459 c -45.65129 -166.17459 -48.18947 -168.71278 -48.18947 -171.84387 c -48.18947 -174.97496 -45.65129 -177.51314 -42.5202 -177.51314 c -39.38911 -177.51314 -36.85092 -174.97496 -36.85092 -171.84387 c h W [1 0 0 1 -42.5202 -171.84386] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.024 mul 0.994 add 1 index 1 exp -0.13201 mul 0.967 add 2 index 1 exp -0.23999 mul 0.94 add 4 3 roll pop } /xpdfFunc22_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.298 mul 0.97 add 1 index 1 exp -0.28899 mul 0.83499 add 2 index 1 exp -0.28001 mul 0.70001 add 4 3 roll pop } /xpdfFunc22_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.192 mul 0.672 add 1 index 1 exp -0.156 mul 0.546 add 2 index 1 exp -0.12 mul 0.42 add 4 3 roll pop } /xpdfFunc22_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.48 mul 0.48 add 1 index 1 exp -0.39 mul 0.39 add 2 index 1 exp -0.3 mul 0.3 add 4 3 roll pop } /xpdfFunc22_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc22_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc22_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc22_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc22_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q -8.50412 -171.84387 m -8.50412 -168.71278 -11.0423 -166.17459 -14.17339 -166.17459 c -17.30447 -166.17459 -19.84267 -168.71278 -19.84267 -171.84387 c -19.84267 -174.97496 -17.30447 -177.51314 -14.17339 -177.51314 c -11.0423 -177.51314 -8.50412 -174.97496 -8.50412 -171.84387 c h W [1 0 0 1 -14.17337 -171.84386] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.024 mul 0.994 add 1 index 1 exp -0.13201 mul 0.967 add 2 index 1 exp -0.23999 mul 0.94 add 4 3 roll pop } /xpdfFunc23_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.298 mul 0.97 add 1 index 1 exp -0.28899 mul 0.83499 add 2 index 1 exp -0.28001 mul 0.70001 add 4 3 roll pop } /xpdfFunc23_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.192 mul 0.672 add 1 index 1 exp -0.156 mul 0.546 add 2 index 1 exp -0.12 mul 0.42 add 4 3 roll pop } /xpdfFunc23_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.48 mul 0.48 add 1 index 1 exp -0.39 mul 0.39 add 2 index 1 exp -0.3 mul 0.3 add 4 3 roll pop } /xpdfFunc23_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc23_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc23_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc23_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc23_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 19.84267 -171.84387 m 19.84267 -168.71278 17.30447 -166.17459 14.17339 -166.17459 c 11.0423 -166.17459 8.50412 -168.71278 8.50412 -171.84387 c 8.50412 -174.97496 11.0423 -177.51314 14.17339 -177.51314 c 17.30447 -177.51314 19.84267 -174.97496 19.84267 -171.84387 c h W [1 0 0 1 14.17337 -171.84386] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.024 mul 0.994 add 1 index 1 exp -0.13201 mul 0.967 add 2 index 1 exp -0.23999 mul 0.94 add 4 3 roll pop } /xpdfFunc24_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.298 mul 0.97 add 1 index 1 exp -0.28899 mul 0.83499 add 2 index 1 exp -0.28001 mul 0.70001 add 4 3 roll pop } /xpdfFunc24_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.192 mul 0.672 add 1 index 1 exp -0.156 mul 0.546 add 2 index 1 exp -0.12 mul 0.42 add 4 3 roll pop } /xpdfFunc24_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.48 mul 0.48 add 1 index 1 exp -0.39 mul 0.39 add 2 index 1 exp -0.3 mul 0.3 add 4 3 roll pop } /xpdfFunc24_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc24_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc24_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc24_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc24_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 48.18947 -171.84387 m 48.18947 -168.71278 45.65129 -166.17459 42.5202 -166.17459 c 39.38911 -166.17459 36.85092 -168.71278 36.85092 -171.84387 c 36.85092 -174.97496 39.38911 -177.51314 42.5202 -177.51314 c 45.65129 -177.51314 48.18947 -174.97496 48.18947 -171.84387 c h W [1 0 0 1 42.5202 -171.84386] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.024 mul 0.994 add 1 index 1 exp -0.13201 mul 0.967 add 2 index 1 exp -0.23999 mul 0.94 add 4 3 roll pop } /xpdfFunc25_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.298 mul 0.97 add 1 index 1 exp -0.28899 mul 0.83499 add 2 index 1 exp -0.28001 mul 0.70001 add 4 3 roll pop } /xpdfFunc25_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.192 mul 0.672 add 1 index 1 exp -0.156 mul 0.546 add 2 index 1 exp -0.12 mul 0.42 add 4 3 roll pop } /xpdfFunc25_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.48 mul 0.48 add 1 index 1 exp -0.39 mul 0.39 add 2 index 1 exp -0.3 mul 0.3 add 4 3 roll pop } /xpdfFunc25_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc25_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc25_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc25_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc25_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 76.53629 -171.84387 m 76.53629 -168.71278 73.9981 -166.17459 70.867 -166.17459 c 67.73592 -166.17459 65.19774 -168.71278 65.19774 -171.84387 c 65.19774 -174.97496 67.73592 -177.51314 70.867 -177.51314 c 73.9981 -177.51314 76.53629 -174.97496 76.53629 -171.84387 c h W [1 0 0 1 70.86699 -171.84386] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.024 mul 0.994 add 1 index 1 exp -0.13201 mul 0.967 add 2 index 1 exp -0.23999 mul 0.94 add 4 3 roll pop } /xpdfFunc26_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.298 mul 0.97 add 1 index 1 exp -0.28899 mul 0.83499 add 2 index 1 exp -0.28001 mul 0.70001 add 4 3 roll pop } /xpdfFunc26_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.192 mul 0.672 add 1 index 1 exp -0.156 mul 0.546 add 2 index 1 exp -0.12 mul 0.42 add 4 3 roll pop } /xpdfFunc26_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.48 mul 0.48 add 1 index 1 exp -0.39 mul 0.39 add 2 index 1 exp -0.3 mul 0.3 add 4 3 roll pop } /xpdfFunc26_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc26_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc26_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc26_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc26_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 104.88309 -171.84387 m 104.88309 -168.71278 102.34491 -166.17459 99.21382 -166.17459 c 96.08273 -166.17459 93.54454 -168.71278 93.54454 -171.84387 c 93.54454 -174.97496 96.08273 -177.51314 99.21382 -177.51314 c 102.34491 -177.51314 104.88309 -174.97496 104.88309 -171.84387 c h W [1 0 0 1 99.21382 -171.84386] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.024 mul 0.994 add 1 index 1 exp -0.13201 mul 0.967 add 2 index 1 exp -0.23999 mul 0.94 add 4 3 roll pop } /xpdfFunc27_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.298 mul 0.97 add 1 index 1 exp -0.28899 mul 0.83499 add 2 index 1 exp -0.28001 mul 0.70001 add 4 3 roll pop } /xpdfFunc27_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.192 mul 0.672 add 1 index 1 exp -0.156 mul 0.546 add 2 index 1 exp -0.12 mul 0.42 add 4 3 roll pop } /xpdfFunc27_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.48 mul 0.48 add 1 index 1 exp -0.39 mul 0.39 add 2 index 1 exp -0.3 mul 0.3 add 4 3 roll pop } /xpdfFunc27_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc27_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc27_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc27_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc27_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 79.328 -57.558] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceRGB {} CS [0.1 0.1 0.95] SC /DeviceRGB {} cs [0.1 0.1 0.95] sc [1 0 0 1 0 0] Tm 0 0 Td 154.181 52.32 Td /F15_0 20.6625 Tf (n) [12.077231 0] Tj 147.137 47.363 Td /F20_0 24.7871 Tf (P) [26.165263 0] Tj 142.436 4.095 Td /F15_0 20.6625 Tf (k) [10.523411 0] Tj 153.652 4.095 Td /F25_0 20.6625 Tf (=1) [14.872867 0 9.475823 0] Tj 182.133 28.772 Td /F15_0 24.7871 Tf (k) [12.62407 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 202.474 28.772 Td /F25_0 24.7871 Tf (=) [17.841755 0] Tj /DeviceRGB {} CS [0.9 0.45 0] SC /DeviceRGB {} cs [0.9 0.45 0] sc [1 0 0 1 0 0] Tm 0 0 Td 227.201 48.85 Td /F20_0 24.7871 Tf (\000) [11.359928 0] Tj 238.562 39.771 Td /F15_0 20.6625 Tf (n) [12.077231 0] Tj 250.639 39.771 Td /F25_0 20.6625 Tf (+1) [14.872867 0 9.475823 0] Tj 252.038 20.225 Td (2) [9.475823 0] Tj 274.989 48.85 Td /F20_0 24.7871 Tf (\001) [11.359928 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceRGB {} CS [0.1 0.1 0.95] SC /DeviceRGB {} cs [0.1 0.1 0.95] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 5.66927 -98.19649 m 5.66927 -95.0654 3.13109 -92.5272 0 -92.5272 c -3.13109 -92.5272 -5.66927 -95.0654 -5.66927 -98.19649 c -5.66927 -101.32758 -3.13109 -103.86577 0 -103.86577 c 3.13109 -103.86577 5.66927 -101.32758 5.66927 -98.19649 c h W [1 0 0 1 0 -98.19647] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.53999 mul 0.865 add 1 index 1 exp -0.53999 mul 0.865 add 2 index 1 exp -0.03 mul 0.9925 add 4 3 roll pop } /xpdfFunc28_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.25501 mul 0.32501 add 1 index 1 exp -0.25501 mul 0.32501 add 2 index 1 exp -0.2975 mul 0.9625 add 4 3 roll pop } /xpdfFunc28_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.02 mul 0.07 add 1 index 1 exp -0.02 mul 0.07 add 2 index 1 exp -0.19001 mul 0.665 add 4 3 roll pop } /xpdfFunc28_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.05 mul 0.05 add 1 index 1 exp -0.05 mul 0.05 add 2 index 1 exp -0.47499 mul 0.47499 add 4 3 roll pop } /xpdfFunc28_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc28_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc28_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc28_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc28_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q -36.85092 -171.84387 m -36.85092 -168.71278 -39.38911 -166.17459 -42.5202 -166.17459 c -45.65129 -166.17459 -48.18947 -168.71278 -48.18947 -171.84387 c -48.18947 -174.97496 -45.65129 -177.51314 -42.5202 -177.51314 c -39.38911 -177.51314 -36.85092 -174.97496 -36.85092 -171.84387 c h W [1 0 0 1 -42.5202 -171.84386] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.06001 mul 0.985 add 1 index 1 exp -0.33 mul 0.9175 add 2 index 1 exp -0.6 mul 0.85 add 4 3 roll pop } /xpdfFunc29_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.295 mul 0.92499 add 1 index 1 exp -0.2725 mul 0.5875 add 2 index 1 exp -0.25 mul 0.25 add 4 3 roll pop } /xpdfFunc29_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.17999 mul 0.62999 add 1 index 1 exp -0.09001 mul 0.315 add 2 index 1 exp 0 mul 0 add 4 3 roll pop } /xpdfFunc29_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.45 mul 0.45 add 1 index 1 exp -0.22499 mul 0.22499 add 2 index 1 exp 0 mul 0 add 4 3 roll pop } /xpdfFunc29_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc29_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc29_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc29_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc29_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q q 48.18947 -171.84387 m 48.18947 -168.71278 45.65129 -166.17459 42.5202 -166.17459 c 39.38911 -166.17459 36.85092 -168.71278 36.85092 -171.84387 c 36.85092 -174.97496 39.38911 -177.51314 42.5202 -177.51314 c 45.65129 -177.51314 48.18947 -174.97496 48.18947 -171.84387 c h W [1 0 0 1 42.5202 -171.84386] cm [1 0 0 1 0 0] cm [0.22679 0 0 0.22679 0 0] cm q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 142.436 28.772] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 92.436 -21.228] cm q [1 0 0 1 0 0] cm 0 0 100 100 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceRGB {} cs /x0 40.00052 def /x1 50.00064 def /dx 10.00012 def /y0 60.00076 def /y1 50.00064 def /dy -10.00012 def /r0 0 def /r1 50.00064 def /dr 50.00064 def /t0 0 def /t1 50.00064 def /dt 50.00064 def /n 3 def /encl true def /a1 0 def /a2 360 def /func { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.06001 mul 0.985 add 1 index 1 exp -0.33 mul 0.9175 add 2 index 1 exp -0.6 mul 0.85 add 4 3 roll pop } /xpdfFunc30_0 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.295 mul 0.92499 add 1 index 1 exp -0.2725 mul 0.5875 add 2 index 1 exp -0.25 mul 0.25 add 4 3 roll pop } /xpdfFunc30_1 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.17999 mul 0.62999 add 1 index 1 exp -0.09001 mul 0.315 add 2 index 1 exp 0 mul 0 add 4 3 roll pop } /xpdfFunc30_2 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse 0 index 1 exp -0.45 mul 0.45 add 1 index 1 exp -0.22499 mul 0.22499 add 2 index 1 exp 0 mul 0 add 4 3 roll pop } /xpdfFunc30_3 exch def { dup 0 lt { pop 0 } { dup 50.00064 gt { pop 50.00064 } if } ifelse dup 9.00009 lt { 0 sub 0.11111 mul 0 add xpdfFunc30_0 } { dup 18.00021 lt { 9.00009 sub 0.11111 mul 0 add xpdfFunc30_1 } { dup 25.00032 lt { 18.00021 sub 0.142855 mul 0 add xpdfFunc30_2 } { 25.00032 sub 0.039999 mul 0 add xpdfFunc30_3 } ifelse } ifelse } ifelse } def 0 1 0 radialSH 0 radialCol sc 40.00052 60.00076 0 0 360 arc h f* Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 142.436 28.772] cm Q Q Q Q Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%+ font QLBTNG+CMMI12 %%+ font IWZFZI+CMEX10 %%+ font ZZDDUJ+CMR17 %%EOF ================================================ FILE: examples/showcase/generated/latex-image/image-gaussian-sum-proof.tex ================================================ \documentclass[12pt]{article} \usepackage{geometry} \geometry{letterpaper,total={408pt,9.0in}} %% Custom Page Layout Adjustments (use latex.geometry) \usepackage{amsmath,amssymb} \usepackage{tikz} \usepackage{pgfplots} \usetikzlibrary{positioning} \usepgfplotslibrary{fillbetween} \usepackage{pstricks} \usepackage{phaistos} \usepackage{xcolor} \ifdefined\tikzset \tikzset{ampersand replacement = \amp} \fi \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} \begin{document} \pagestyle{empty} \resizebox{\width}{\height}{ { \definecolor{summand}{rgb}{0.1, 0.1, 0.95} \definecolor{pair}{rgb}{0.9, 0.45, 0} \huge \begin{tikzpicture} \draw [dashed] (0.5-0.5*6.5,-0.866025*6.5) -- (7-0.5*6.5,-0.866025*6.5); \draw [very thick] (2-0.5*7,-0.866025*7) -- (2-0.5*4,-0.866025*4) -- (5-0.5*7,-0.866025*7); \foreach \x in {1,...,6} \foreach \y in {1,...,\x} \shade[ball color=summand!30] (\y-0.5*\x,-0.866025*\x) circle (0.2cm); \foreach \y in {1,...,7} \shade[ball color=pair!40] (\y-0.5*7,-0.866025*7) circle (0.2cm); \node at (2.5,-0.5) [anchor=north west]{$\color{summand}\sum\limits_{k=1}^nk\color{black}=\color{pair}\binom{n+1}{2}$}; \shade[ball color=summand] (2-0.5*4,-0.866025*4) circle (0.2cm); \shade[ball color=pair] (2-0.5*7,-0.866025*7) circle (0.2cm); \shade[ball color=pair] (5-0.5*7,-0.866025*7) circle (0.2cm); \end{tikzpicture} } } \end{document} ================================================ FILE: examples/showcase/generated/latex-image/image-implicitly-defined-curve.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.90.1 (http://poppler.freedesktop.org) %%Creator: XeTeX output 2022.03.23:2315 %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%BoundingBox: 123 524 366 736 %%HiResBoundingBox: 123.8 524.76136 365.32 735.43489 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin %%BeginResource: font OWIGFN+CMSY10 %!FontType1-1.0: OWIGFN+CMSY10003.002 12 dict begin /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \(c\) 1997, 2009 American Mathematical Society \(\), with Reserved Font Name CMSY10.) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /isFixedPitch false def /ItalicAngle -14.04 def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /OWIGFN+CMSY10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-29 -960 1116 775] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /minus put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF6 FCC85D7215D6A753D1600581E5546F14F3D65234054555B96FD9B9668401E43D DAC0F02F812EB053F8E70788172E1CEFDE15EF41FC327A1B4488DC9CE002C7AB D3F3F73476C713CC9F115984E4E692F942E2B7B0C31BE8E40ABCBDA71B68EC65 9576CD50435DCBFC0FCF66B6B1A59C43A1CEDBB8E2B23C02C62E02886B2EA345 C51B0E22860BD89B19F40FE6A64CBC103B28CC542CFC9DCF7965DAE07EA5F142 9C40F87BE010EACE6DA600DA48B29E516AF6FF7626EF6D645DB3A1D89BB83D16 6322E851DF9669F701B330C92390ACF5271FC4ED3404A1E9E0D9A71FFF797EA1 92CFE925F3E7F2917E5D63A58913E86BEFB82DEE4B29F90F9D9025AB6C9D6FB4 74F955694CE206CF15D0EB5B4EC46CEAE9562934D2F2A41D8F91428C285A5646 AAF4273C49DC086BBD712E6E854C35327FC77ABF96D670850990B498DBD17033 3013A4008635B23F7CCDCD8A087934D2FF449D6F2B90C31AAD0EF5F5AFB312E0 FD496FBF5177999EBA15A448E6BBA45F5460FA0E 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F7_0 /OWIGFN+CMSY10 1 1 [ /minus/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont %%BeginResource: font CNXUVF+CMR10 %!FontType1-1.0: CNXUVF+CMR10003.002 12 dict begin /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \(c\) 1997, 2009 American Mathematical Society \(\), with Reserved Font Name CMR10.) readonly def /FullName (CMR10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /isFixedPitch false def /ItalicAngle 0 def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /CNXUVF+CMR10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-40 -250 1009 750] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 48 /zero put dup 49 /one put dup 50 /two put dup 52 /four put dup 54 /six put dup 56 /eight put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF6 FA6B0AF338BD4E48F07258C8AB349EE790EF474E6D540CD5017BDA227D234CDE C5B56DC44D44AB50DFB075E5E1022F04510349EA668084E7A051605C83646AF5 902E437867493A954EAEF35981EA89706F0AC717DFC491968979A7EF87F475E4 8F22A3A7D7750B755878A9B88483EDC2409C0D58BE116764B583FF78D1FBF3AD 289831C79680B7183956FD64718B7BBE2D8DF65EB9DAA46A90706B45496ACFE9 78439069B8944845B613846CACD0BD317E15DCE9A145DE8422B266E8CBC8A5CD 07CACD5E0FA463C120BA209A233883345CC16C7ADA020E9DF7F7FE743B732243 88F14566F41A69F9C092E078B741533D1E39573218CE940A0B2B28AC3B6B328A E9A743E33C8C7A3BAF9AE51808EE1C9465B0F491CE6C85AEDA62767AB8A69D86 DAC68CE4DF29AF3F22F1FE2C22A9BE52777EE86B0963076C036AA316519C04E1 1173EAC9977A31AA8E35658572E5239D6D7BA798583E84268E6864DC3ADBD7CB D03EF93B4EE9635B813A13A65612E211A5A7BF4EA95C0C794EC23ED8ACA2AF11 C2CE5F4AFE416E93283B29010F72D5613B8357B02F5A769CF2C9BE02B818CFF1 848779642524E34B8FAA798DB586875841CD456D75CE01B416794CF8FAEE5DE8 FB73F28EF759A9F9DA7EEE354EE6F578B522799A217BD90768E3D53E2AC01904 B4FC711F57A64EAB38098C7A1C727BCB1A1FD0A35701BB16BFF863B96C7D870B DCD62344F12F41188AE456D036C6ECD53A516C84AD87F8D21421D643FD4B2FF7 09F785C2A65A9FC4F18F23C9EBB3F99AD6B3EB6E57AA76449FB55E7B2DF592A6 7C3DE3A52E819C5EF03C8B878C60EE2CC7D91FF9B254680C3F7E337572B50387 C0E5AFBE223BEBD5A1853EC61B182D0569D31EFB3F3841C1535A426326A94D34 62C2FBBE9A941B23925DADBDB07320F748837F665A7AA8F4C2B2CB2F7097EACE 0E7197F0948744C6D268B24DF848BD75BBCC874DA05E5B2439A4AD40A373FFBE D6EC6C968240816306BA0FF419328C1AD57290F77DCC618A7300006370DC255A 23D67A6C88E51A697A43B5EE44B4982D6B26CD391448D2DF8DF5967018590C15 B3B913D79E5168C006950D7C10480AD5A2CF65A67E20FAB30BAA303394ACA633 BC3DA04EB1F4F71106FAD0F9F56DA0BD9B9E0BC4964EB50936D50BF0EEED1BE5 5EA2A549605BA19DBC4228AC7B9796C15FAF58BD5EE15E309EC6F2A9586E22AF 6B787375E8961E285F4AB8AC14BBC5E67CDE876AD397E3A33CA7EDF4433798CC 230F5DB5D5DCB3261B0D700AAB715279EAA9A3205A5906997F9B6EA3DD899CE7 3E81DE8AA4985A311B8E6F2A8A7F082AC09F035ED371760103034E4CAB72C76F DF91931259E6ED5183F6AED470EB0817D8882D34D1E4A98434EBFC216775268C 0224AC4F5A3F903F2C31D12C9604E262D969E15E2C891BEBB535699709C16BB3 A34E54C860351B2897647CF13CB6ED7427204938E0C80F4F7EE44C5DDEBCE15C 56DA5FBEB3BF72F8412B92738050D50DE395A24B30B0C1B95C657B39B79E7452 B9CEDC9A72E526DFF66FA49FEE02F1C2047A83D806288A4A4655AA8F09EB8C8E 372E359E03A30A20998E85487F0B132DBCBFE4677E0ED991B725AFEF14571BBF D54DCC42DC48DA 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F12_0 /CNXUVF+CMR10 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont %%BeginResource: font UNXGZS+CMMI12 %!FontType1-1.0: UNXGZS+CMMI12003.002 12 dict begin /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \(c\) 1997, 2009 American Mathematical Society \(\), with Reserved Font Name CMMI12.) readonly def /FullName (CMMI12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /isFixedPitch false def /ItalicAngle -14.04 def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /UNXGZS+CMMI12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-31 -250 1026 750] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 120 /x put dup 121 /y put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF6 F95CB8F8CEBD4396C74A303DCB3A46C281B472F99892DCADA5FC6E4C2524AE72 569652A7D664B73CC839B5405D299F805DA5E9FE5C41F969093CFD7B26C9805B 6EC2DA5C4EA81C285458F5CCCDC02F82AC0E127BDB8F9E0A94383740D13431F8 554EF5B7648E7C56F5F38740D67CB57E0007961013F2F16CDB5BA3F5C1414F66 AECF5AFFA42AA51168B07908FD53D54A2CFEF17624741ECA22F7626685779284 56899ED3A87EB156921AFFE08F658C5379DF758C777CCB51DFBDA39A6D5A2A69 807BC97310A8AF1387EE2FDA4F5D42C3E58C41911DCB0FC5EE8F46ECCEF5C075 05521206F702D8881449A147D69FDD3D944095A74B6E1F29EFDD56C32DEB618B 2758D0DC792DF98B452F414B024D650A9AF099970874268CF84629A882B117FF 5FEDAC17EA58ADE2BE25B84C2DF4E83CB4E6CE24F7C167CD5B708212EAB4ABC9 64EA89F08396E45C4F7B364A5DB9454DF68A7A50AB000A903D9DB6B0E5DDA6C9 5C6939973123F19EF5104A2F5FBC2D2E8944159CDD9D0ED97FEB8AD151DD88C3 E0B0A5187FB3E4251E43F54BD496DF4D93477A28605259957616123B41DE79F6 770536CDEDE60317CD11F24C201E4CA936E468A8FFDADBA6D05CBB75E16CB6D1 F77C20003F7BDFF60C92B23F00FC8FD2758090688D709B109BB52FC5626B230E 6D3D3854EF6CAFA13E4B45EF94822526C6A08024C323824BA08888B609EB26D1 DDAC35918625B38ACE3ED915E5E53A3B9A791CD31C03C5A8DEFF4197DD30A797 1B9D473B797BB11F3CA50CB56DE9A2C1863ACA9F3BFCF7A9054818BA26A8C0A7 96ACE57DB1AD3541D99E61E6ADFF8101F23D6E52F11A116CDCF92BA1CB780880 B27240426B63B53D18F72ABAB46A39CEA9F91E4A94102C3BAD969A067EA20893 B5EDB87452FFD4975293595992C57B07A201D78994479FB42E6298B64EB37FEA C4FA62F59172943CE274EFE7D64BFD87E46B2E92136E732A1FAB5D3DB00C86C3 B8838403D9D59F39A7EA2AE4A35B0448467DD2E38F3EEEB9D4FB37C321DA930A 4E3B3FBA90D56CFAAD 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F17_0 /UNXGZS+CMMI12 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont %%BeginResource: font QIFWWR+CMR12 %!FontType1-1.0: QIFWWR+CMR12003.002 12 dict begin /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \(c\) 1997, 2009 American Mathematical Society \(\), with Reserved Font Name CMR12.) readonly def /FullName (CMR12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /isFixedPitch false def /ItalicAngle 0 def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /QIFWWR+CMR12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-34 -251 988 750] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 40 /parenleft put dup 41 /parenright put dup 52 /four put dup 61 /equal put dup 99 /c put dup 111 /o put dup 115 /s put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF6 F95CB8F8CEBD4396C74A37E2724CD63F484F47C6447F507C11793B061A71C2EB 7D651F93505835EBF9032E361AE5C694F562A11D768CB4FB2540B4281CECEE7D 3A31CE697DC0DEFB6C96B38A970EDFE1B25B852DF4F12D7FA0932E9DE6181BBE DCD1306A9EB0AFEF37E8FCBE25FB1A843A2D67AB2CEB0D8AAC217FEAE0C1F3A9 6EA27594AD85747780D7B015C4E8064EEDC329E82E9BF096E7CE83A8493E591B ED192F9E0BBC812B8A27B7C34952D4D896884F29DFEB29B79256454542DF3112 4025128FD9396DB4FF2F8889181195E2A3D5FBF1E595A8480D10FEA58DF1839D C0870F22B952146A006B4C3320189F800105B2815AEC32B5A1D09812868CF6B3 134435ED1F6538514481429FB47758AF72FAF06D4A79053FEE5484662376D733 B2254C967457FCF0D257A453E3BF78C16AE34F2CA28EED422CA9DE52778FE6C1 E144E4F9CFC0402F12B29C4854DBDD43C32F00B0D1621453BD3EC0D53932403E E812C3952F694FBFE12BE95645399DC1E0391C9DF8E0AFB8970DF859341A3F1E 560449BAACCF3D46A46E622DC48584ECDE07FE00EB2E78B54A116426946963DF E5DEB03AE0FB6546A85C42711228D6B111CF2615220DC5BD793FCE854F9DFCE9 3CF63F95E95AD48D69911E47FB2A86595809471FF37A3DB909FFF1796FA2927C E37A30879F3836E47753E580064A16FB2E02B4D2BF47390EDA535E9EA0BC07F1 7E385D65E7A26013280B62754EE89C986903BBB45DF26A72B7C13D0B88E4DC8D B3E3B7FE367A77E146578D51411ECE4537B0F56D9E7DAA938EE497CD7EB7A4A7 D0BD836303ABD264BD0E89C8F32A98D446BC7FA0820983E60E1BF65ABDAA225E D7AB778ABC9D73A35D41A50C4A38D0B91114063EB0C67D165BC7C23581329DD6 0F3A3594F9442897E8A77E391923621C95AF476C809782B455FCEE7B92115E62 3EACC5BD262BF3BE49F679BFEC6509CBCFA65E429ED3178927F755EADDDD7AE2 EBB624536952F5A3115B4A4F9CD130409051C10F55CB364C405EFB15713F2075 F47339B3F3E794F2E3A0C5E0A7304C1A2AFDC0807AA847E0391C87B0F5FBD642 7B3B66C5EDAE26DCF5BB75E18203077B71CA5399B3908506E8B532DB3A6F48B9 F3639AA8C6C6039F98480C87A558001753334550C08B4D8A54C00E927EF7910A B6F06AF19B580E83CDBF85BE58F7144007BF0873AC2041AE24D8EBECF303CFC7 978B5EB427636A202912E147B8E5600AFEC5E556B337DC90B02B9B503954FE2B 5250CE506814E1E4A9EBE7A00129CB694241238612EA83D913A803AFBF3B12CF 1F140A87925F4963EA1A36B80DB7B6B12359A2624E29C4B5F4928019EAF6E13F 714A5475F87FE242D7BFE58DB0D02348091920EF946985A219BD96E0DFD65067 152508D9182E9919CCADCA5EBAC1A63DFA6F830747E0F9044D8823DA0A50E502 B1F685E041F7ACCEFFF35E72F3183E661209CB8F121569322401314A090FCA32 3EA60833F9D4044D3AFB907B570543CD3ADAF9B0718221638BD088E8963A4750 2968954C61B83E9D2E0B5DB6C1ACB0A2D56F6918058A420FE8F0C9151F39F9A1 59AD9FF9C3CBD70D2C1E5675E463942EC0659B4853057B2E926243CFA48E3FAB AC8C1F6FA9C9AF0704D5E64B03A5E1C3F6DC93241EA4AB80223A5CE9B0A328CE 2C8B7672F4E344D25F1F48D6F2122EF06803B0158C365C2018C2DEA908DC71E6 AAB4B7E8D3C48E400C71DDBA096944CF8454324C028E4C3E780813F1811C81E1 11FBA3157D325528085C6A 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F22_0 /QIFWWR+CMR12 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont %%EndSetup pdfStartPage %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 123.8 524.76136 241.52 210.67353 re W q q [1 0 0 1 72 720] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1.00002 0 0 1.00006 -0.001 0.012] cm q [1 0 0 1 52.792 -192.038] cm q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.3985 w q q Q q Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.792 -192.038] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.792 -192.038] cm Q Q Q Q q Q q Q q Q q Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.792 -192.038] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 -0.199 -5.341] cm q [1 0 0 1 52.045 -186.697] cm q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.3985 w q /DeviceRGB {} CS [1 0 0] SC /DeviceRGB {} cs [1 0 0] sc [] 0 d q q q 0.3985 w /DeviceGray {} CS [0.75] SC /DeviceGray {} cs [0.75] sc [] 0 d /DeviceGray {} CS [0.8] SC /DeviceGray {} cs [0.8] sc 0.9461 0 m 0.9461 206.22824 l 18.024 0 m 18.024 206.22824 l 35.10191 0 m 35.10191 206.22824 l 52.17981 0 m 52.17981 206.22824 l 69.2577 0 m 69.2577 206.22824 l 86.33562 0 m 86.33562 206.22824 l 103.41351 0 m 103.41351 206.22824 l 120.49142 0 m 120.49142 206.22824 l 137.56932 0 m 137.56932 206.22824 l 154.64723 0 m 154.64723 206.22824 l 171.72513 0 m 171.72513 206.22824 l 188.80302 0 m 188.80302 206.22824 l 205.88094 0 m 205.88094 206.22824 l 222.95883 0 m 222.95883 206.22824 l 240.03674 0 m 240.03674 206.22824 l S /DeviceGray {} CS [0.75] SC /DeviceGray {} cs [0.75] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q q q 0.3985 w /DeviceGray {} CS [0.75] SC /DeviceGray {} cs [0.75] sc [] 0 d /DeviceGray {} CS [0.8] SC /DeviceGray {} cs [0.8] sc 0.9461 0 m 240.03674 0 l 0.9461 14.12521 m 240.03674 14.12521 l 0.9461 28.25044 m 240.03674 28.25044 l 0.9461 42.37566 m 240.03674 42.37566 l 0.9461 56.50089 m 240.03674 56.50089 l 0.9461 70.6261 m 240.03674 70.6261 l 0.9461 84.75133 m 240.03674 84.75133 l 0.9461 98.87654 m 240.03674 98.87654 l 0.9461 113.00177 m 240.03674 113.00177 l 0.9461 127.127 m 240.03674 127.127 l 0.9461 141.25221 m 240.03674 141.25221 l 0.9461 155.37744 m 240.03674 155.37744 l 0.9461 169.50266 m 240.03674 169.50266 l 0.9461 183.62788 m 240.03674 183.62788 l 0.9461 197.7531 m 240.03674 197.7531 l S /DeviceGray {} CS [0.75] SC /DeviceGray {} cs [0.75] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q q q 0.19925 w /DeviceGray {} CS [0.5] SC /DeviceGray {} cs [0.5] sc 0.9461 55.08318 m 0.9461 57.9186 l 18.024 55.08318 m 18.024 57.9186 l 35.10191 55.08318 m 35.10191 57.9186 l 52.17981 55.08318 m 52.17981 57.9186 l 69.2577 55.08318 m 69.2577 57.9186 l 86.33562 55.08318 m 86.33562 57.9186 l 103.41351 55.08318 m 103.41351 57.9186 l 120.49142 55.08318 m 120.49142 57.9186 l 137.56932 55.08318 m 137.56932 57.9186 l 154.64723 55.08318 m 154.64723 57.9186 l 171.72513 55.08318 m 171.72513 57.9186 l 188.80302 55.08318 m 188.80302 57.9186 l 205.88094 55.08318 m 205.88094 57.9186 l 222.95883 55.08318 m 222.95883 57.9186 l 240.03674 55.08318 m 240.03674 57.9186 l S /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q 0.19925 w /DeviceGray {} CS [0.5] SC /DeviceGray {} cs [0.5] sc 52.17981 54.37456 m 52.17981 58.6272 l 86.33562 54.37456 m 86.33562 58.6272 l 154.64723 54.37456 m 154.64723 58.6272 l 188.80302 54.37456 m 188.80302 58.6272 l S /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q q q 0.19925 w /DeviceGray {} CS [0.5] SC /DeviceGray {} cs [0.5] sc 119.07399 0 m 121.90887 0 l 119.07399 14.12521 m 121.90887 14.12521 l 119.07399 28.25044 m 121.90887 28.25044 l 119.07399 42.37566 m 121.90887 42.37566 l 119.07399 56.50089 m 121.90887 56.50089 l 119.07399 70.6261 m 121.90887 70.6261 l 119.07399 84.75133 m 121.90887 84.75133 l 119.07399 98.87654 m 121.90887 98.87654 l 119.07399 113.00177 m 121.90887 113.00177 l 119.07399 127.127 m 121.90887 127.127 l 119.07399 141.25221 m 121.90887 141.25221 l 119.07399 155.37744 m 121.90887 155.37744 l 119.07399 169.50266 m 121.90887 169.50266 l 119.07399 183.62788 m 121.90887 183.62788 l 119.07399 197.7531 m 121.90887 197.7531 l S /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q 0.19925 w /DeviceGray {} CS [0.5] SC /DeviceGray {} cs [0.5] sc 118.36546 0 m 122.61737 0 l 118.36546 28.25044 m 122.61737 28.25044 l 118.36546 84.75133 m 122.61737 84.75133 l 118.36546 113.00177 m 122.61737 113.00177 l 118.36546 141.25221 m 122.61737 141.25221 l 118.36546 169.50266 m 122.61737 169.50266 l 118.36546 197.7531 m 122.61737 197.7531 l S /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q 1.40439 56.50089 m 239.57846 56.50089 l S q [-1 0 0 -1 1.40439 56.50089] cm q 0.31879 w [] 0 d 1 J 1 j -1.19551 1.59401 m -1.09587 0.99626 0 0.09961 0.29886 0 c 0 -0.09961 -1.09587 -0.99626 -1.19551 -1.59401 c S Q Q q [1 0 0 1 239.57846 56.50089] cm q 0.31879 w [] 0 d 1 J 1 j -1.19551 1.59401 m -1.09587 0.99626 0 0.09961 0.29886 0 c 0 -0.09961 -1.09587 -0.99626 -1.19551 -1.59401 c S Q Q 120.49142 0.45827 m 120.49142 205.76996 l S q [0 -1 1 0 120.49142 0.45827] cm q 0.31879 w [] 0 d 1 J 1 j -1.19551 1.59401 m -1.09587 0.99626 0 0.09961 0.29886 0 c 0 -0.09961 -1.09587 -0.99626 -1.19551 -1.59401 c S Q Q q [0 1 -1 0 120.49142 205.76996] cm q 0.31879 w [] 0 d 1 J 1 j -1.19551 1.59401 m -1.09587 0.99626 0 0.09961 0.29886 0 c 0 -0.09961 -1.09587 -0.99626 -1.19551 -1.59401 c S Q Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 45.815 43.77] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F7_0 9.9626 Tf (\000) [7.74891 0] Tj 59.793 -186.697 Td /F12_0 9.9626 Tf (4) [4.9813 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 79.971 43.77] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F7_0 9.9626 Tf (\000) [7.74891 0] Tj 59.793 -186.697 Td /F12_0 9.9626 Tf (2) [4.9813 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 152.157 43.77] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F12_0 9.9626 Tf (2) [4.9813 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 186.312 43.77] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F12_0 9.9626 Tf (4) [4.9813 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 103.72 -2.795] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F7_0 9.9626 Tf (\000) [7.74891 0] Tj 59.793 -186.697 Td /F12_0 9.9626 Tf (4) [4.9813 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 103.72 25.455] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F7_0 9.9626 Tf (\000) [7.74891 0] Tj 59.793 -186.697 Td /F12_0 9.9626 Tf (2) [4.9813 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 111.469 81.541] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F12_0 9.9626 Tf (2) [4.9813 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 111.469 109.792] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F12_0 9.9626 Tf (4) [4.9813 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 111.469 138.042] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F12_0 9.9626 Tf (6) [4.9813 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 111.469 166.292] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F12_0 9.9626 Tf (8) [4.9813 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 106.488 194.543] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F12_0 9.9626 Tf (10) [4.9813 0 4.9813 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q 0.9461 0 239.09064 206.22824 re W q 120.49142 113.00133 m 120.52731 112.97165 l 120.63522 112.88246 l 120.81583 112.7338 l 121.0703 112.5269 l 121.40012 112.2663 l 121.80708 111.96262 l 122.29283 111.63602 l 122.85785 111.32045 l 123.50032 111.06721 l 124.21434 110.9468 l 124.98802 111.04456 l 125.80333 111.45044 l 126.6374 112.23808 l 127.4686 113.4401 l 128.28372 115.02753 l 129.08298 116.89702 l 129.88307 118.8755 l 130.71681 120.72646 l 131.63525 122.16391 l 132.70895 122.86345 l 134.0412 122.47217 l 135.79288 120.61504 l 138.24971 116.8817 l 142.01813 110.73715 l S Q q 142.01913 110.73543 m 142.35472 110.207 l 142.70396 109.66267 l 143.06822 109.10052 l 143.44838 108.52124 l 143.84631 107.92262 l 144.26335 107.30424 l 144.70088 106.6652 l 145.1613 106.00334 l 145.64632 105.31877 l 146.15984 104.60764 l 146.7043 103.86891 l 147.28357 103.10048 l 147.90247 102.29915 l 148.56749 101.45937 l 149.28613 100.57709 l 150.06915 99.64456 l 150.92664 98.65707 l 151.88026 97.59796 l 152.95753 96.44968 l 154.1962 95.18925 l 155.67105 93.7667 l 157.52757 92.08876 l 160.1347 89.92645 l 167.26266 84.98358 l S Q q 181.8781 85.07541 m 177.71895 87.17442 l 175.90341 88.20232 l 174.68182 88.94041 l 173.65613 89.59027 l 172.75287 90.18636 l 171.99307 90.70802 l 171.34001 91.17247 l 170.70387 91.63695 l 170.1386 92.0626 l 169.59842 92.4797 l 169.11424 92.86427 l 168.64291 93.24664 l 168.21921 93.59982 l 167.83376 93.92874 l 167.43617 94.27306 l 167.07227 94.59535 l 166.71173 94.92021 l 166.38179 95.22426 l 166.05219 95.53242 l 165.74701 95.82387 l 165.4449 96.11667 l 165.17471 96.38484 l 164.9013 96.65912 l 164.62755 96.93729 l S Q q 164.62772 96.93723 m 161.2007 100.85313 l 158.80672 104.17157 l 156.96384 107.15788 l 155.48422 109.90599 l 154.25578 112.48024 l 153.22174 114.90361 l 152.3441 117.19019 l 151.59267 119.35397 l 150.94917 121.39757 l 150.39568 123.33197 l 149.92741 125.1442 l 149.5329 126.83987 l 149.20586 128.41785 l 148.94218 129.87146 l 148.73827 131.19865 l 148.59344 132.38995 l 148.50276 133.44835 l 148.46861 134.36058 l 148.48875 135.1267 l 148.56407 135.74031 l 148.69557 136.1954 l 148.88583 136.48476 l 149.13686 136.60425 l 149.45299 136.54521 l S Q q 149.45299 136.54523 m 149.70863 136.40082 l 149.99828 136.16783 l 150.32532 135.84244 l 150.69028 135.4273 l 151.09587 134.9186 l 151.54587 134.3111 l 152.04626 133.60216 l 152.6013 132.7901 l 153.21268 131.87022 l 153.89409 130.84323 l 154.6421 129.70294 l 155.4772 128.43672 l 156.40625 127.04678 l 157.44287 125.52837 l 158.6093 123.86075 l 159.92601 122.04561 l 161.43228 120.0526 l 163.16226 117.8761 l 165.19283 115.47696 l 167.60594 112.8248 l 170.5809 109.82373 l 174.37563 106.39198 l 179.6117 102.26927 l 188.06697 96.80193 l S Q q 188.06697 96.80193 m 188.46829 96.57404 l 188.9089 96.326 l 189.3256 96.09232 l 189.79184 95.83429 l 190.24611 95.58667 l 190.6833 95.35127 l 191.23322 95.05798 l 191.74725 94.78978 l 192.30742 94.49904 l 192.81804 94.2397 l 193.47212 93.90912 l 194.03398 93.63109 l 194.75296 93.27931 l 195.38144 92.97969 l 196.19434 92.59557 l 196.89624 92.27153 l 197.75868 91.88051 l 198.63477 91.49188 l 199.57918 91.08104 l 200.69609 90.60855 l 201.84714 90.13234 l 203.25606 89.56715 l 204.78624 88.97447 l 206.78777 88.22844 l S Q q 236.73729 85.2294 m 221.526 89.57655 l 215.66656 91.63542 l 211.7045 93.18602 l 208.62022 94.49446 l 206.12001 95.62924 l 203.88965 96.70178 l 202.02132 97.65048 l 200.32037 98.55528 l 198.78506 99.40709 l 197.39151 100.21414 l 196.08505 100.99753 l 194.90155 101.73515 l 193.80515 102.4414 l 192.77536 103.12517 l 191.778 103.80939 l 190.89166 104.43607 l 190.03777 105.05655 l 189.22656 105.66072 l 188.46147 106.24805 l 187.71346 106.83382 l 187.01668 107.39465 l 186.35065 107.94203 l 185.71191 108.47926 l 185.07834 109.02434 l S Q q 185.07834 109.02434 m 179.23598 114.69702 l 175.15437 119.5268 l 172.09572 123.78041 l 169.71335 127.57748 l 167.81941 130.99103 l 166.29436 134.05902 l 165.06987 136.79527 l 164.093 139.21674 l 163.32622 141.33656 l 162.74556 143.14766 l 162.3374 144.65103 l 162.08636 145.84386 l 161.99072 146.72137 l 162.04196 147.27573 l 162.2452 147.50192 l 162.60211 147.39265 l 163.1264 146.93584 l 163.82658 146.12212 l 164.72661 144.94296 l 165.85033 143.37833 l 167.23364 141.41602 l 168.93459 139.0226 l 171.0164 136.18753 l 173.60199 132.85374 l S Q q 173.60199 132.85374 m 174.31073 131.97435 l 175.0485 131.07956 l 175.83064 130.14763 l 176.66063 129.1789 l 177.54869 128.1699 l 178.48457 127.12813 l 179.49045 126.04164 l 180.57147 124.90373 l 181.72424 123.72905 l 182.96408 122.50513 l 184.3013 121.22926 l 185.76144 119.88753 l 187.34286 118.49126 l 189.07626 117.02594 l 191.00949 115.46266 l 193.1374 113.82932 l 195.56418 112.06996 l 198.31543 110.19427 l 201.50557 108.16553 l 205.31737 105.92508 l 210.00012 103.41624 l 216.01837 100.53459 l 224.5966 96.97212 l 240.03674 91.80386 l S Q q 239.97354 97.40813 m 227.44519 102.28452 l 219.39809 106.09955 l 213.4806 109.3528 l 208.78587 112.26228 l 204.98433 114.87839 l 201.74808 117.31332 l 198.98146 119.5717 l 196.55469 121.70139 l 194.42506 123.70245 l 192.51576 125.60925 l 190.80115 127.42244 l 189.24193 129.15984 l 187.84325 130.80557 l 186.54532 132.40076 l 185.36523 133.92305 l 184.27739 135.38219 l 183.28345 136.77934 l 182.35953 138.12126 l 181.50221 139.41875 l 180.71664 140.65233 l 179.98058 141.84508 l 179.306 142.97774 l 178.68095 144.06526 l 178.09688 145.1093 l S Q q 178.09688 145.10931 m 177.0466 147.08284 l 176.15341 148.86958 l 175.402 150.47023 l 174.78206 151.89146 l 174.27657 153.13164 l 173.88377 154.19435 l 173.59688 155.07426 l 173.40901 155.7754 l 173.32361 156.2951 l 173.33044 156.63205 l 173.43974 156.78441 l 173.64638 156.7505 l 173.9538 156.52682 l 174.36879 156.11052 l 174.89137 155.50208 l 175.5335 154.69197 l 176.302 153.67882 l 177.21056 152.4594 l 178.27109 151.0303 l 179.50752 149.37596 l 180.94037 147.49107 l 182.60034 145.36992 l 184.53355 142.98672 l 186.78784 140.33499 l S Q q 186.78784 140.335 m 187.58195 139.43463 l 188.41365 138.50725 l 189.29828 137.54488 l 190.22562 136.55219 l 191.21101 135.52509 l 192.25278 134.46321 l 193.3543 133.36574 l 194.5378 132.22087 l 195.78789 131.04358 l 197.14558 129.80498 l 198.56818 128.54646 l 200.1291 127.21121 l 201.79248 125.84315 l 203.60274 124.40535 l 205.5889 122.89352 l 207.73389 121.33047 l 210.11282 119.67918 l 212.76845 117.9264 l 215.73488 116.0798 l 219.11801 114.09688 l 223.01689 111.9668 l 227.57158 109.66505 l 233.07408 107.12303 l 240.01794 104.23245 l S Q q 240.00258 110.34631 m 236.83633 111.84276 l 233.92625 113.295 l 231.29115 114.67926 l 228.94122 115.97386 l 226.69888 117.2618 l 224.66492 118.48456 l 222.77097 119.66739 l 221.05293 120.78374 l 219.40663 121.89082 l 217.85767 122.96774 l 216.40263 124.01286 l 215.03297 125.0307 l 213.74019 126.02063 l 212.54132 126.96494 l 211.3766 127.90889 l 210.26996 128.83002 l 209.21454 129.73154 l 208.20865 130.61336 l 207.24716 131.47604 l 206.32837 132.32005 l 205.45056 133.1464 l 204.60863 133.95645 l 203.80424 134.75104 l 203.02722 135.52983 l S Q q 203.02722 135.52986 m 199.13687 139.70662 l 195.97063 143.47566 l 193.35771 146.8837 l 191.18712 149.95581 l 189.37343 152.71986 l 187.86374 155.18855 l 186.61365 157.3742 l 185.59409 159.27748 l 184.7829 160.90651 l 184.15613 162.267 l 183.70528 163.35612 l 183.42691 164.17104 l 183.30565 164.71474 l 183.34834 164.98541 l 183.54645 164.98 l 183.91022 164.69629 l 184.44304 164.13034 l 185.15689 163.2757 l 186.06374 162.12599 l 187.17892 160.68216 l 188.52977 158.92908 l 190.1573 156.84802 l 192.09052 154.44104 l 194.39946 151.67706 l S Q q 194.39946 151.67708 m 195.17139 150.7806 l 195.9843 149.8508 l 196.8416 148.8862 l 197.74844 147.88696 l 198.70822 146.85 l 199.72606 145.76947 l 200.79684 144.66202 l 201.93253 143.50961 l 203.15189 142.30493 l 204.4498 141.05656 l 205.82628 139.77 l 207.29669 138.43591 l 208.88835 137.03204 l 210.57906 135.59248 l 212.4269 134.07474 l 214.4028 132.51323 l 216.55804 130.87543 l 218.93185 129.14812 l 221.53453 127.33984 l 224.38312 125.46234 l 227.59036 123.45732 l 231.18184 121.34511 l 235.2942 119.07825 l 240.05724 116.64052 l S Q q 240.02307 123.28209 m 226.26854 132.23354 l 217.22919 139.6034 l 210.7208 145.91359 l 205.8297 151.37143 l 202.06572 156.09825 l 199.12834 160.1794 l 196.86209 163.63191 l 195.12698 166.509 l 193.84955 168.81413 l 192.97858 170.55888 l 192.48332 171.74478 l 192.34328 172.36987 l 192.55504 172.43362 l 193.12373 171.92744 l 194.06133 170.84616 l 195.41559 169.16907 l 197.22926 166.8843 l 199.58772 163.96288 l 202.60197 160.37259 l 206.4445 156.0705 l 211.3971 150.9675 l 217.93622 144.93013 l 226.8526 137.7931 l 240.03162 129.07837 l S Q q 240.04356 136.21646 m 230.20157 143.60294 l 222.9964 149.9788 l 217.4905 155.55132 l 213.19882 160.41812 l 209.80544 164.6558 l 207.11055 168.32095 l 204.99287 171.43361 l 203.34828 174.02905 l 202.13403 176.09932 l 201.29381 177.66194 l 200.81221 178.71783 l 200.66705 179.26454 l 200.85661 179.30383 l 201.38603 178.82619 l 202.26895 177.82742 l 203.52759 176.30379 l 205.21661 174.22935 l 207.38379 171.5957 l 210.12137 168.376 l 213.55574 164.53494 l 217.85938 160.02922 l 223.33968 154.77211 l 230.45602 148.65508 l 240.03331 141.49516 l S Q q 240.05724 149.1628 m 232.9699 155.20667 l 227.42128 160.54597 l 223.01007 165.25137 l 219.43738 169.41483 l 216.53925 173.064 l 214.19446 176.22856 l 212.3193 178.92801 l 210.85571 181.17216 l 209.76445 182.95897 l 208.99936 184.31279 l 208.56046 185.22017 l 208.42554 185.68819 l 208.58778 185.71272 l 209.05742 185.29514 l 209.84471 184.42235 l 210.96844 183.09723 l 212.45593 181.30667 l 214.35156 179.03554 l 216.71858 176.2681 l 219.62865 172.99007 l 223.20303 169.16884 l 227.61427 164.75203 l 233.08432 159.70421 l 240.03162 153.90578 l S Q q 240.04698 162.14226 m 235.09097 166.8897 l 230.99911 171.16061 l 227.62622 174.96173 l 224.81007 178.35457 l 222.48065 181.3401 l 220.5628 183.93933 l 219.01213 186.15083 l 217.78764 187.99535 l 216.86201 189.47057 l 216.21306 190.58578 l 215.83223 191.33665 l 215.7161 191.72267 l 215.85101 191.74557 l 216.24722 191.40381 l 216.90643 190.69263 l 217.84741 189.60934 l 219.08727 188.14363 l 220.6482 186.29929 l 222.5763 184.05087 l 224.91083 181.39793 l 227.71332 178.3286 l 231.0879 174.7992 l 235.13708 170.80243 l 240.04185 166.28796 l S Q q 239.9855 175.20073 m 236.71849 178.68584 l 233.93138 181.8424 l 231.54901 184.6867 l 229.47406 187.28654 l 227.76796 189.52771 l 226.34196 191.48488 l 225.17043 193.16171 l 224.21407 194.59224 l 223.5207 195.68738 l 223.01007 196.55359 l 222.71461 197.12773 l 222.61557 197.43268 l 222.71461 197.46762 l 223.02544 197.21 l 223.54631 196.67172 l 224.2448 195.89345 l 225.20116 194.78757 l 226.42906 193.35175 l 227.8602 191.69394 l 229.55603 189.748 l 231.55585 187.50597 l 234.01677 184.82303 l 236.7612 181.94331 l 239.95988 178.73146 l S Q q 239.98209 188.26198 m 238.15987 190.41797 l 236.44867 192.51382 l 235.00218 194.35242 l 233.74011 196.00705 l 232.58565 197.56659 l 231.6713 198.85135 l 230.86539 200.01482 l 230.25793 200.93411 l 229.79033 201.67775 l 229.44673 202.26154 l 229.25119 202.65009 l 229.18356 202.86761 l 229.25032 202.90463 l 229.44963 202.76306 l 229.80263 202.41655 l 230.27568 201.91354 l 230.9028 201.21237 l 231.66139 200.34906 l 232.62834 199.2322 l 233.70255 197.99939 l 234.98338 196.53572 l 236.41621 194.92534 l 238.14963 193.00449 l 240.00429 191.00044 l S Q q 240.05553 201.34506 m 239.29794 202.3431 l 238.58324 203.3017 l 237.97646 204.13524 l 237.41425 204.92145 l 236.99516 205.53223 l 236.56787 206.15767 l 236.23024 206.67093 l 235.95546 207.10559 l 235.7314 207.4758 l 235.58112 207.75049 l 235.48666 207.95236 l 235.45866 208.067 l 235.48991 208.10341 l 235.57753 208.06549 l 235.72475 207.94905 l 235.94487 207.73782 l 236.21777 207.45831 l 236.5689 207.07924 l 236.97006 206.63689 l 237.4363 206.11496 l 237.99353 205.48172 l 238.59673 204.79683 l 239.27403 204.02646 l 240.06065 203.13092 l S Q q 167.26575 84.98167 m 168.03629 84.52095 l S Q q 240.05211 66.9856 m 236.11224 67.3708 l 232.36705 67.76361 l 228.78581 68.16579 l 225.37024 68.57666 l 222.08957 68.99864 l 218.94553 69.43051 l 215.91591 69.8753 l 212.9973 70.33228 l 210.18797 70.80173 l 207.4555 71.28888 l 204.81015 71.79138 l 202.22626 72.3145 l 199.72264 72.85594 l 197.26854 73.42168 l 194.85202 74.01547 l 192.45769 74.6438 l 190.0873 75.30905 l 187.7254 76.01894 l 185.3328 76.79 l 182.88213 77.64066 l 180.32043 78.60106 l 177.53674 79.73718 l 174.27998 81.2065 l 168.04825 84.51253 l S Q q 181.8781 85.07541 m 183.30394 84.42723 l S Q q 183.30394 84.42723 m 188.9721 82.13751 l 192.05125 81.05559 l 194.75638 80.1806 l 197.07556 79.48274 l 199.26666 78.86229 l 201.37236 78.2991 l 203.47806 77.76367 l 205.50522 77.27438 l 207.55115 76.80334 l 209.53902 76.3666 l 211.58495 75.93752 l 213.566 75.53958 l 215.56923 75.15437 l 217.70909 74.75912 l 219.7482 74.39883 l 221.8146 74.04866 l 224.0228 73.68904 l 226.14386 73.35822 l 228.43231 73.01477 l 230.63365 72.69829 l 232.86745 72.38994 l 235.22076 72.0769 l 237.55362 71.77942 l 240.07602 71.4697 l S Q q 206.78777 88.22813 m 219.20682 84.25034 l S Q q 239.21016 79.54918 m 239.00864 79.58963 l 238.43141 79.70401 l 237.63559 79.86241 l 236.87221 80.0166 l 236.28642 80.13673 l 235.87485 80.22221 l 235.24638 80.35303 l 234.64523 80.47992 l 233.98091 80.62158 l 233.53517 80.7175 l 232.66762 80.90594 l 231.97939 81.05783 l 231.27066 81.2163 l 230.51923 81.38559 l 229.77463 81.55678 l 228.96342 81.74522 l 228.12662 81.94228 l 227.24368 82.15422 l 226.62376 82.3051 l 225.6025 82.55699 l 224.49585 82.83588 l 223.22354 83.16312 l 221.68823 83.56856 l 219.21194 84.24821 l S Q q 188.72618 56.58084 m 188.69714 56.62253 l 188.67665 56.67299 l 188.67154 56.73212 l 188.6869 56.79996 l 188.73471 56.8763 l 188.82864 56.96095 l 188.97723 57.05365 l 189.20094 57.1539 l 189.51346 57.26117 l 189.9336 57.37471 l 190.48862 57.4935 l 191.19907 57.61635 l 192.10588 57.74174 l 193.24841 57.86783 l 194.66588 57.99245 l 196.41977 58.11311 l 198.58867 58.22676 l 201.27332 58.32999 l 204.6001 58.41899 l 208.73634 58.4896 l 213.91437 58.53732 l 220.48424 58.55713 l 228.9361 58.54398 l 240.04356 58.49255 l S Q q 0.94098 51.98997 m 8.83951 51.53392 l 15.36156 51.07843 l 20.78038 50.6262 l 25.29407 50.18039 l 29.04268 49.74461 l 32.15256 49.32175 l 34.69716 48.91571 l 36.7431 48.52992 l 38.34158 48.1682 l 39.52167 47.8342 l 40.30896 47.53201 l 40.71028 47.26573 l 40.73079 47.03957 l 40.3619 46.85767 l 39.59169 46.7237 l 38.38087 46.6427 l 36.68672 46.61887 l 34.44783 46.65623 l 31.5702 46.75975 l 27.9309 46.93385 l 23.35915 47.18279 l 17.60048 47.51215 l 10.31161 47.92554 l 0.9444 48.42856 l S Q q 0.93585 38.94551 m 5.26169 38.16876 l 8.9266 37.4439 l 12.06041 36.76692 l 14.73138 36.13847 l 16.98567 35.56187 l 18.86081 35.0392 l 20.40466 34.56993 l 21.62915 34.15767 l 22.57869 33.79836 l 23.24472 33.49855 l 23.64604 33.25832 l 23.79633 33.07649 l 23.68533 32.95773 l 23.31303 32.90135 l 22.68285 32.90848 l 21.76747 32.98254 l 20.5669 33.12227 l 19.04698 33.3305 l 17.18378 33.60928 l 14.93974 33.95895 l 12.26363 34.38269 l 9.09227 34.8819 l 5.34195 35.45927 l 0.95123 36.11017 l S Q q 0.94952 25.79329 m 2.58046 25.29004 l 4.05257 24.81512 l 5.34026 24.37956 l 6.47421 23.97847 l 7.45619 23.61287 l 8.28448 23.28674 l 8.98639 22.99394 l 9.54652 22.74022 l 9.98715 22.52097 l 10.29112 22.34125 l 10.47557 22.19781 l 10.53876 22.0929 l 10.4807 22.02481 l 10.30138 21.99562 l 9.99397 22.00587 l 9.55849 22.05551 l 8.99834 22.14386 l 8.3084 22.2706 l 7.46986 22.44012 l 6.48618 22.64993 l 5.36415 22.89769 l 4.06624 23.19006 l 2.59412 23.52516 l 0.94098 23.90028 l S Q q 120.49142 113.00133 m 120.46742 113.02118 l 120.39548 113.08066 l 120.27594 113.17932 l 120.10928 113.3161 l 119.89616 113.48878 l 119.63731 113.69331 l 119.33351 113.92282 l 118.98549 114.16699 l 118.59349 114.4109 l 118.15727 114.63437 l 117.67567 114.81123 l 117.14606 114.90898 l 116.56395 114.88914 l 115.92223 114.70703 l 115.21042 114.31352 l 114.41373 113.65681 l 113.51184 112.6851 l 112.4759 111.35046 l 111.26917 109.61626 l 109.84215 107.46881 l 108.13641 104.93498 l 106.0973 102.12654 l 103.73218 99.33116 l 101.28459 97.19336 l S Q q 101.28459 97.19336 m 100.79121 96.91272 l 100.33931 96.73495 l 99.93732 96.66821 l 99.59456 96.72443 l 99.31601 96.9073 l 99.10391 97.21791 l 98.95772 97.65393 l 98.87097 98.205 l 98.8392 98.8646 l 98.85371 99.62125 l 98.90666 100.46243 l 98.98982 101.37714 l 99.0969 102.35683 l 99.2214 103.39075 l 99.35803 104.47021 l 99.5013 105.58699 l 99.64851 106.73378 l 99.79573 107.90385 l 99.94072 109.09149 l 100.08144 110.29076 l 100.21535 111.49625 l 100.34189 112.70236 l 100.45921 113.90431 l 100.56664 115.09805 l S Q q 100.56664 115.09853 m 100.70667 116.8625 l 100.8199 118.58192 l 100.90358 120.24004 l 100.95601 121.82318 l 100.97496 123.31581 l 100.95857 124.70274 l 100.90427 125.96954 l 100.8105 127.1009 l 100.67336 128.08122 l 100.49046 128.89621 l 100.25734 129.52997 l 99.96907 129.96608 l 99.62016 130.18993 l 99.20381 130.18648 l 98.71146 129.93993 l 98.13217 129.43318 l 97.45195 128.64813 l 96.65442 127.56848 l 95.71684 126.17482 l 94.60934 124.4458 l 93.28699 122.34578 l 91.69193 119.84567 l 89.73003 116.88892 l 87.24416 113.38522 l S Q q 87.24416 113.38522 m 86.80988 112.80188 l 86.35986 112.20836 l 85.88681 111.59375 l 85.39154 110.96135 l 84.8763 110.31665 l 84.32811 109.64183 l 83.75497 108.95206 l 83.14632 108.23415 l 82.50266 107.49213 l 81.82841 106.73633 l 81.10193 105.93997 l 80.31975 105.10493 l 79.47849 104.23367 l 78.5766 103.32993 l 77.59753 102.38132 l 76.50882 101.36307 l 75.32002 100.29724 l 73.9712 99.13869 l 72.44359 97.89124 l 70.65007 96.50592 l 68.50047 94.95213 l 65.73795 93.10724 l 61.79005 90.7343 l 52.75822 86.24657 l S Q q 30.81706 85.03926 m 42.77672 89.46748 l 46.98813 91.39456 l 49.97334 92.91113 l 52.29251 94.1919 l 54.22061 95.33003 l 55.8362 96.34372 l 57.28098 97.29974 l 58.56181 98.18979 l 59.7197 99.0298 l 60.77512 99.82852 l 61.74344 100.59073 l 62.65369 101.33238 l 63.48538 102.0357 l 64.26242 102.7148 l 64.98824 103.37114 l 65.67477 104.00986 l 66.32373 104.63046 l 66.9351 105.23468 l 67.51918 105.82384 l 68.08275 106.40771 l 68.60875 106.97017 l 69.1211 107.52994 l 69.61464 108.07838 l 70.08257 108.61491 l S Q q 70.07574 108.60715 m 74.04977 113.71193 l 76.9052 118.14856 l 79.06897 122.09866 l 80.75114 125.64694 l 82.0832 128.8408 l 83.1301 131.69182 l 83.94641 134.21649 l 84.55951 136.40758 l 84.9933 138.26881 l 85.26823 139.79375 l 85.38266 140.9673 l 85.34338 141.78337 l 85.15382 142.22754 l 84.80373 142.28801 l 84.28627 141.95016 l 83.57924 141.19667 l 82.66386 140.01326 l 81.50769 138.37494 l 80.05608 136.25412 l 78.25093 133.62614 l 75.97957 130.44316 l 73.0695 126.61401 l 69.24918 122.04324 l 63.93623 116.48375 l S Q q 63.93623 116.48375 m 63.26337 115.8403 l 62.55463 115.17447 l 61.79466 114.47478 l 61.0125 113.77368 l 60.19106 113.0532 l 59.31837 112.30415 l 58.40642 111.54149 l 57.42955 110.745 l 56.40318 109.93227 l 55.28458 109.07025 l 54.10107 108.18797 l 52.84584 107.28055 l 51.4557 106.3113 l 49.98187 105.31909 l 48.35095 104.26561 l 46.55264 103.15182 l 44.52037 101.95119 l 42.27292 100.69153 l 39.66171 99.30865 l 36.5484 97.7635 l 32.7793 96.03203 l 27.8267 93.95638 l 20.613 91.2879 l 0 85.36601 l S Q q 1.11688 90.96199 m 15.1959 95.62552 l 23.01245 98.82312 l 28.58498 101.4524 l 32.90227 103.73503 l 36.42032 105.78244 l 39.40895 107.67134 l 41.96552 109.41103 l 44.23859 111.06514 l 46.21278 112.59465 l 48.02477 114.07779 l 49.64032 115.47426 l 51.1278 116.82335 l 52.48721 118.11789 l 53.75098 119.37297 l 54.91397 120.57729 l 56.00185 121.7489 l 57.00774 122.87532 l 57.94702 123.96753 l 58.83337 125.03436 l 59.66164 126.06424 l 60.45235 127.0784 l 61.18669 128.0525 l 61.88518 129.00581 l 62.5495 129.94064 l S Q q 62.5495 129.94066 m 64.99849 133.63882 l 66.971 136.96014 l 68.56606 139.92287 l 69.86226 142.55997 l 70.89891 144.8789 l 71.71523 146.88223 l 72.33003 148.57236 l 72.7621 149.95265 l 73.02852 151.01949 l 73.12756 151.76991 l 73.06609 152.20053 l 72.84578 152.30386 l 72.45468 152.0749 l 71.89113 151.50584 l 71.13628 150.59048 l 70.17479 149.31512 l 68.9725 147.66856 l 67.49527 145.62991 l 65.69698 143.19023 l 63.49222 140.30962 l 60.78535 136.95778 l 57.40224 133.07085 l 53.06787 128.54881 l 47.32968 123.26785 l S Q q 47.32968 123.26785 m 46.4997 122.5635 l 45.65263 121.86064 l 44.75946 121.13155 l 43.82701 120.3877 l 42.84674 119.6223 l 41.83571 118.85236 l 40.74104 118.03738 l 39.62073 117.22394 l 38.43552 116.38657 l 37.15295 115.50278 l 35.8021 114.60117 l 34.38805 113.68501 l 32.83737 112.71062 l 31.21667 111.72617 l 29.42691 110.67628 l 27.48515 109.57973 l 25.42386 108.46284 l 23.09955 107.25641 l 20.59764 106.01735 l 17.72343 104.6648 l 14.54695 103.25131 l 10.78297 101.67732 l 6.45201 99.9899 l 1.02295 98.04047 l S Q q 0.97855 103.87164 m 6.96948 106.4194 l 11.83669 108.70667 l 15.92513 110.79855 l 19.48929 112.76826 l 22.55135 114.58336 l 25.27016 116.29732 l 27.70377 117.92516 l 29.93925 119.50137 l 31.9408 120.9859 l 33.80228 122.43341 l 35.48787 123.80449 l 37.06929 125.14677 l 38.52943 126.43404 l 39.88715 127.67952 l 41.15602 128.88568 l 42.35147 130.06415 l 43.46666 131.20044 l 44.51695 132.30414 l 45.5126 133.3843 l 46.44505 134.42755 l 47.33652 135.44984 l 48.18018 136.44682 l 48.97258 137.40858 l 49.73083 138.35349 l S Q q 49.73083 138.35353 m 50.99802 139.98647 l 52.16785 141.56203 l 53.22498 143.04733 l 54.20866 144.47743 l 55.10696 145.83917 l 55.93353 147.13605 l 56.69179 148.37025 l 57.392 149.54634 l 58.0341 150.65837 l 58.62502 151.71844 l 59.15955 152.71078 l 59.64969 153.6498 l 60.09712 154.5343 l 60.50357 155.36362 l 60.86392 156.12814 l 61.19011 156.84264 l 61.4753 157.49878 l 61.72635 158.099 l 61.94325 158.64595 l 62.12256 159.13135 l 62.27115 159.56767 l 62.38557 159.94328 l 62.46924 160.26442 l 62.51877 160.52654 l S Q q 62.51877 160.52658 m 62.53073 160.84616 l 62.45387 161.00087 l 62.2831 160.98868 l 62.01839 160.80937 l 61.65634 160.46103 l 61.19524 159.93988 l 60.62312 159.24394 l 59.94171 158.36885 l 59.13564 157.31586 l 58.19806 156.07356 l 57.11191 154.64363 l 55.86522 153.02051 l 54.43237 151.18706 l 52.7912 149.15053 l 50.89897 146.8822 l 48.72325 144.38618 l 46.19058 141.62352 l 43.21733 138.57678 l 39.70612 135.22769 l 35.46909 131.50871 l 30.22617 127.34811 l 23.52992 122.63542 l 14.48717 117.16066 l 0.97514 110.451 l S Q q 0.93074 116.79466 m 3.5556 118.17953 l 5.9653 119.50888 l 8.18542 120.78801 l 10.29454 122.05095 l 12.2124 123.24655 l 14.00388 124.40427 l 15.66383 125.51485 l 17.3016 126.64424 l 18.77373 127.69627 l 20.17754 128.73099 l 21.51302 129.7409 l 22.80753 130.7499 l 24.0064 131.71077 l 25.1472 132.65013 l 26.25214 133.57974 l 27.29218 134.48021 l 28.28441 135.36078 l 29.25955 136.24295 l 30.16127 137.07832 l 31.05273 137.92462 l 31.89127 138.73618 l 32.7127 139.54915 l 33.48633 140.32933 l 34.23947 141.1038 l S Q q 34.23947 141.10382 m 38.18788 145.42943 l 41.39 149.3106 l 44.02682 152.80261 l 46.18718 155.90025 l 47.96669 158.64688 l 49.42685 161.05946 l 50.60352 163.14066 l 51.52744 164.8912 l 52.21909 166.32265 l 52.7024 167.43237 l 52.97905 168.2183 l 53.05933 168.6863 l 52.9449 168.82878 l 52.63237 168.64417 l 52.11833 168.13144 l 51.3891 167.28049 l 50.42761 166.0858 l 49.21849 164.54459 l 47.72418 162.64066 l 45.91393 160.36867 l 43.72282 157.70108 l 41.08942 154.63118 l 37.8873 151.10585 l 33.9816 147.09697 l S Q q 33.9816 147.09698 m 33.21309 146.34456 l 32.42067 145.5826 l 31.58897 144.7939 l 30.72655 143.989 l 29.84532 143.18326 l 28.918 142.34961 l 27.94286 141.48854 l 26.91646 140.59752 l 25.85422 139.69589 l 24.76465 138.79155 l 23.58969 137.83401 l 22.37033 136.86351 l 21.10315 135.8787 l 19.75911 134.85852 l 18.35359 133.82205 l 16.86272 132.74644 l 15.30179 131.65414 l 13.62985 130.5153 l 11.85547 129.34264 l 9.94444 128.12038 l 7.95146 126.88628 l 5.79109 125.59671 l 3.4685 124.25961 l 0.93414 122.85612 l S Q q 0.92049 129.73135 m 12.55565 137.87633 l 20.68645 144.77698 l 26.69275 150.72034 l 31.30548 155.89792 l 34.9038 160.39587 l 37.73361 164.27919 l 39.94862 167.58356 l 41.64444 170.32077 l 42.90138 172.51608 l 43.75868 174.17259 l 44.25395 175.29675 l 44.3974 175.88272 l 44.19931 175.93216 l 43.6494 175.43863 l 42.73232 174.39111 l 41.4156 172.78159 l 39.65659 170.5938 l 37.3818 167.80461 l 34.48882 164.38437 l 30.83243 160.29794 l 26.18211 155.47472 l 20.17581 149.82658 l 12.15433 143.1765 l 0.95465 135.28993 l S Q q 0.9444 142.69827 m 9.29549 149.39235 l 15.63823 155.24463 l 20.60277 160.39977 l 24.54092 164.91959 l 27.70206 168.88023 l 30.22958 172.29956 l 32.24135 175.22057 l 33.79715 177.63713 l 34.96187 179.57661 l 35.76624 181.03903 l 36.23247 182.02167 l 36.3742 182.5299 l 36.19661 182.56064 l 35.69281 182.10822 l 34.85428 181.16881 l 33.65541 179.73524 l 32.06204 177.7936 l 30.01782 175.33426 l 27.46126 172.33717 l 24.2711 168.7595 l 20.3244 164.5843 l 15.38547 159.7463 l 9.10251 154.15053 l 0.94098 147.69423 l S Q q 0.93074 155.64943 m 6.89775 161.05034 l 11.68297 165.8478 l 15.57332 170.11334 l 18.76347 173.88979 l 21.38835 177.21938 l 23.5265 180.10837 l 25.24625 182.57114 l 26.59712 184.6184 l 27.61325 186.25864 l 28.31856 187.49083 l 28.73186 188.3231 l 28.86165 188.74948 l 28.70964 188.7717 l 28.27417 188.38882 l 27.55005 187.59702 l 26.51001 186.38501 l 25.13695 184.74632 l 23.40697 182.68729 l 21.25343 180.1769 l 18.62173 177.19928 l 15.42303 173.73561 l 11.54465 169.76816 l 6.80382 165.24014 l 0.93585 160.09122 l S Q q 0.89487 168.59816 m 5.07211 172.81747 l 8.41255 176.45601 l 11.3568 179.86569 l 13.72379 182.77632 l 15.79533 185.45782 l 17.43483 187.69356 l 18.83862 189.68996 l 19.94356 191.34398 l 20.7428 192.6154 l 21.33028 193.61539 l 21.66159 194.26445 l 21.77602 194.61917 l 21.65305 194.6401 l 21.29784 194.33997 l 20.71548 193.72466 l 19.88379 192.78319 l 18.77542 191.48701 l 17.37845 189.84422 l 15.67067 187.85292 l 13.705 185.61319 l 11.26627 182.9073 l 8.44159 179.89041 l 5.0243 176.40654 l 0.96829 172.49728 l S Q q 0.95976 181.68047 m 3.52145 184.55606 l 5.74158 187.17043 l 7.71407 189.59473 l 9.27158 191.59973 l 10.72319 193.52838 l 11.91013 195.1698 l 12.88867 196.57721 l 13.69441 197.77902 l 14.27626 198.70067 l 14.72336 199.45 l 14.96193 199.92181 l 15.04527 200.18379 l 14.9587 200.21446 l 14.70543 200.01869 l 14.26738 199.57495 l 13.68057 198.93584 l 12.88014 198.02287 l 11.9067 196.9 l 10.701 195.49977 l 9.30403 193.89467 l 7.62527 191.99237 l 5.72792 189.88919 l 3.47876 187.4606 l 1.02979 184.90775 l S Q q 0.95465 194.77126 m 2.24915 196.38437 l 3.44647 197.91258 l 4.46587 199.25452 l 5.3891 200.4998 l 6.16068 201.57277 l 6.84428 202.54648 l 7.39388 203.35844 l 7.85274 204.05942 l 8.19156 204.60754 l 8.43391 205.0309 l 8.5847 205.33456 l 8.62842 205.49637 l 8.57736 205.53142 l 8.42844 205.4367 l 8.17671 205.20595 l 7.82883 204.84953 l 7.36705 204.3465 l 6.81526 203.7312 l 6.13608 202.95786 l 5.36227 202.07433 l 4.44263 201.0213 l 3.43127 199.87154 l 2.25034 198.53775 l 0.96489 197.10889 l S Q q 0.92816 208.06232 m 1.19203 208.44069 l 1.41386 208.76733 l 1.61214 209.06496 l 1.80887 209.36139 l 1.96259 209.60323 l 2.09682 209.82011 l 2.21123 210.01218 l 2.30551 210.17828 l 2.39192 210.3347 l 2.44162 210.44318 l 2.47133 210.52596 l 2.48175 210.58296 l 2.47269 210.61551 l 2.43854 210.61452 l 2.38644 210.59026 l 2.31319 210.53842 l 2.21567 210.4554 l 2.0992 210.34769 l 1.96378 210.21516 l 1.80734 210.05658 l 1.63177 209.87299 l 1.43607 209.66426 l 1.1968 209.4006 l 0.95566 209.13564 l S Q q 188.72618 56.58084 m 188.91916 56.42198 l S Q q 188.91916 56.42198 m 188.98747 56.38193 l 189.08652 56.3338 l 189.21631 56.27773 l 189.38539 56.21388 l 189.6057 56.14249 l 189.88406 56.06381 l 190.23586 55.97826 l 190.66794 55.88625 l 191.20418 55.78842 l 191.85997 55.68556 l 192.6541 55.57858 l 193.60533 55.46844 l 194.75296 55.3566 l 196.12262 55.24438 l 197.75356 55.13351 l 199.70215 55.02606 l 202.02986 54.92413 l 204.80502 54.83017 l 208.13692 54.74696 l 212.16048 54.67749 l 217.05159 54.625 l 223.06471 54.59317 l 230.54826 54.58557 l 240.04185 54.60664 l S Q q 240.03674 45.47539 m 233.98091 44.75479 l 228.91731 44.06662 l 224.69736 43.41743 l 221.15883 42.8058 l 218.20605 42.2347 l 215.7605 41.70616 l 213.77434 41.22443 l 212.18951 40.79022 l 210.9804 40.40677 l 210.11795 40.07492 l 209.58342 39.79796 l 209.36993 39.57814 l 209.47412 39.41779 l 209.90448 39.31949 l 210.66786 39.2849 l 211.78305 39.31668 l 213.28079 39.4178 l 215.20546 39.59065 l 217.59467 39.83597 l 220.52353 40.15833 l 224.08257 40.5585 l 228.40668 41.0415 l 233.64107 41.60747 l 240.02307 42.26044 l S Q q 240.03674 32.38959 m 237.1796 31.69887 l 234.68451 31.05382 l 232.52075 30.45795 l 230.66096 29.91112 l 229.06078 29.4106 l 227.70992 28.95944 l 226.59985 28.55922 l 225.70155 28.20769 l 225.0133 27.90793 l 224.52829 27.65941 l 224.23456 27.46286 l 224.13208 27.31909 l 224.22089 27.22847 l 224.50267 27.19188 l 224.97914 27.21048 l 225.65884 27.28503 l 226.54861 27.41591 l 227.65355 27.60324 l 228.99588 27.84879 l 230.59267 28.15408 l 232.46951 28.52017 l 234.64523 28.94649 l 237.14032 29.43141 l 240.03674 29.98474 l S Q q 240.03674 19.1081 m 239.42365 18.86516 l 238.86348 18.63625 l 238.36311 18.42493 l 237.91737 18.23033 l 237.52458 18.05089 l 237.18814 17.8885 l 236.90465 17.74371 l 236.6724 17.61426 l 236.49478 17.50365 l 236.36668 17.40915 l 236.29155 17.33188 l 236.26593 17.27151 l 236.28815 17.22757 l 236.36668 17.20227 l 236.49136 17.19289 l 236.6724 17.20229 l 236.90125 17.2275 l 237.18303 17.27132 l 237.52116 17.3328 l 237.90712 17.41064 l 238.35286 17.50693 l 238.85495 17.62155 l 239.4168 17.75441 l 240.03844 17.9053 l S Q q 30.81706 85.03926 m 28.97093 84.46336 l S Q q 28.97093 84.46336 m 25.06863 83.32333 l 22.98514 82.75226 l 21.5301 82.3687 l 20.02725 81.98445 l 18.69858 81.65416 l 17.42628 81.34642 l 16.2479 81.06728 l 15.46402 80.88634 l 14.20538 80.59967 l 13.14998 80.36525 l 12.1492 80.14716 l 11.15698 79.93454 l 10.3492 79.76472 l 9.39796 79.56783 l 8.4638 79.37796 l 7.58427 79.20221 l 6.68427 79.02448 l 5.94138 78.88083 l 5.06358 78.7124 l 4.2114 78.55205 l 3.34384 78.39058 l 2.49506 78.23474 l 1.78804 78.10808 l 0.95123 77.95863 l S Q q 52.75822 86.24657 m 45.18642 83.25607 l S Q q 0.88121 73.17674 m 2.54971 73.4195 l 4.20116 73.66702 l 5.76036 73.90746 l 7.55013 74.191 l 9.1708 74.45615 l 10.78981 74.7285 l 12.3234 74.99509 l 13.9236 75.28078 l 15.52892 75.57559 l 17.14961 75.88327 l 18.76518 76.19934 l 20.3893 76.52681 l 21.94168 76.85135 l 23.59651 77.20767 l 25.4341 77.61678 l 27.06332 77.99316 l 28.81383 78.41309 l 30.60358 78.859 l 32.46678 79.34196 l 34.43246 79.87302 l 36.56035 80.47575 l 38.75829 81.13066 l 41.4583 81.98236 l 45.18642 83.25546 l S Q q 0.94098 60.79326 m 14.66136 61.51508 l 25.59634 62.28035 l 34.47685 63.08748 l 41.79645 63.9338 l 47.883 64.8144 l 52.99443 65.72472 l 57.28781 66.65639 l 60.89978 67.6003 l 63.91061 68.54184 l 66.37495 69.4627 l 68.33209 70.34068 l 69.78372 71.14572 l 70.70934 71.84079 l 71.06796 72.38356 l 70.78448 72.72812 l 69.7598 72.83264 l 67.87439 72.66888 l 64.94896 72.2235 l 60.7939 71.5104 l 55.08305 70.55342 l 47.35017 69.38731 l 36.82164 68.0488 l 22.17393 66.57219 l 0.9461 64.9871 l S Q q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 127.445 25.262] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F17_0 11.9552 Tf (x) [6.651873 0] Tj 60.689 -186.697 Td /F22_0 11.9552 Tf (cos\() [5.202903 0 5.853266 0 4.617098 0 4.55254 0] Tj 80.915 -186.697 Td /F17_0 11.9552 Tf (xy) [6.651873 0 5.707412 0] Tj 93.703 -186.697 Td /F22_0 11.9552 Tf (\)) [4.55254 0] Tj -277 TJm (=) [9.10508 0] Tj -278 TJm (4) [5.853266 0] Tj 122.512 -186.697 Td /F7_0 11.9552 Tf (\000) [9.298755 0] Tj 134.467 -186.697 Td /F17_0 11.9552 Tf (y) [5.707412 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 229.25 60.697] cm /DeviceRGB {} CS [1 0 0] SC /DeviceRGB {} cs [1 0 0] sc /DeviceRGB {} CS [1 0 0] SC /DeviceRGB {} cs [1 0 0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F17_0 11.9552 Tf (x) [6.651873 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 52.045 -186.697] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 124.693 196.944] cm /DeviceRGB {} CS [1 0 0] SC /DeviceRGB {} cs [1 0 0] sc /DeviceRGB {} CS [1 0 0] SC /DeviceRGB {} cs [1 0 0] sc [1 0 0 1 0 0] Tm 0 0 Td 52.045 -186.697 Td /F17_0 11.9552 Tf (y) [5.707412 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.045 -186.697] cm Q Q Q Q Q Q Q Q Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 52.792 -192.038] cm Q Q Q Q q Q q Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%+ font OWIGFN+CMSY10 %%+ font CNXUVF+CMR10 %%+ font UNXGZS+CMMI12 %%+ font QIFWWR+CMR12 %%EOF ================================================ FILE: examples/showcase/generated/latex-image/image-implicitly-defined-curve.tex ================================================ \documentclass[12pt]{article} \usepackage{geometry} \geometry{letterpaper,total={408pt,9.0in}} %% Custom Page Layout Adjustments (use latex.geometry) \usepackage{amsmath,amssymb} \usepackage{tikz} \usepackage{pgfplots} \usetikzlibrary{positioning} \usepgfplotslibrary{fillbetween} \usepackage{pstricks} \usepackage{phaistos} \usepackage{xcolor} \ifdefined\tikzset \tikzset{ampersand replacement = \amp} \fi \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} \begin{document} \pagestyle{empty} \resizebox{\width}{\height}{ \begin{tikzpicture}[ declare function={ c(\x)= cos(\x^2*180/3.14159265359); sp(\x)=sqrt(4+\x^2*c(\x)); sm(\x)=sqrt(4-\x^2*c(\x)); m(\x)= 2+sm(\x); o(\x)= 2-sm(\x); p(\x)= 2+sp(\x); q(\x)= 2-sp(\x); f(\x)= \x^2/m(\x); g(\x)= m(\x)/c(\x); h(\x)= -\x^2/p(\x); k(\x)= p(\x)/c(\x); } ] \begin{axis}[ xmin = -7, xmax = 7, ymin = -4, ymax = 10.6, xtick = {-4,-2,...,4}, ytick = {-4,-2,...,10}, minor xtick = {-7,-6,...,7}, minor ytick = {-4,-3,...,10}, variable = v, color = red, mark = none, solid, axis lines = center, axis line style = {<->}, xlabel = {$x$}, ylabel = {$y$}, yticklabel style={inner sep=0.333ex}, scale only axis, tick label style={font=\footnotesize, color = black}, grid = minor, grid style = {solid,gray!40}, ] \addplot[domain=0:2.2] ({f(v)},{m(v)}); \addplot[domain=2.2:2.3499859792] ({f(v)},{m(v)}); \addplot[domain=2.6965731707:2.72] ({f(v)},{m(v)}); \addplot[domain=2.72:3.1] ({f(v)},{m(v)}); \addplot[domain=3.1:3.36] ({f(v)},{m(v)}); \addplot[domain=3.36:3.369] ({f(v)},{m(v)}); \addplot[domain=3.7207600255:3.75] ({f(v)},{m(v)}); \addplot[domain=3.75:4.1] ({f(v)},{m(v)}); \addplot[domain=4.1:4.1826819343] ({f(v)},{m(v)}); \addplot[domain=4.5013070528:4.6] ({f(v)},{m(v)}); \addplot[domain=4.6:4.8] ({f(v)},{m(v)}); \addplot[domain=4.8:4.8632109381] ({f(v)},{m(v)}); \addplot[domain=5.1649321939:5.2] ({f(v)},{m(v)}); \addplot[domain=5.2:5.4] ({f(v)},{m(v)}); \addplot[domain=5.4:5.4596904128] ({f(v)},{m(v)}); \addplot[domain=5.7524607477:5.9970858912] ({f(v)},{m(v)}); \addplot[domain=6.2854560605:6.4899313929] ({f(v)},{m(v)}); \addplot[domain=6.7769950285:6.9475348363] ({f(v)},{m(v)}); \addplot[domain=7.2357791015:7.3762238487] ({f(v)},{m(v)}); \addplot[domain=7.6680608384:7.7804196739] ({f(v)},{m(v)}); \addplot[domain=8.0787873209:8.1630812697] ({f(v)},{m(v)}); \addplot[domain=8.4729783943:8.525239357] ({f(v)},{m(v)}); \addplot[mark=none] coordinates {({f(2.3499859792)},{m(2.3499859792)}) ({g(2.3499859793)},{o(2.3499859793)})}; \addplot[domain=2.2795725971:2.3499859793] ({g(v)},{o(v)}); \addplot[mark=none] coordinates {({f(2.6965731707)},{m(2.6965731707)}) ({g(2.696573171)},{o(2.696573171)})}; \addplot[domain=2.696573171:2.7240684007] ({g(v)},{o(v)}); \addplot[mark=none] coordinates {({f(3.369)},{m(3.369)}) ({g(3.3697995683)},{o(3.3697995683)})}; \addplot[domain=3.36795:3.3697995683] ({g(v)},{o(v)}); \addplot[domain=0.15:0.9934229315] ({g(v)},{o(v)}); \addplot[domain=1.4952570458:2.0001872665] ({g(v)},{o(v)}); \addplot[domain=2.9496641015:3.178782971] ({g(v)},{o(v)}); \addplot[domain=3.9009258917:4.0194955921] ({g(v)},{o(v)}); \addplot[domain=0:1.8] ({h(v)},{p(v)}); \addplot[domain=1.8:2.2] ({h(v)},{p(v)}); \addplot[domain=2.2:2.8] ({h(v)},{p(v)}); \addplot[domain=2.8:2.89] ({h(v)},{p(v)}); \addplot[domain=3.2571424315:3.3] ({h(v)},{p(v)}); \addplot[domain=3.3:3.75] ({h(v)},{p(v)}); \addplot[domain=3.75:3.7971078497] ({h(v)},{p(v)}); \addplot[domain=4.1295834659:4.2] ({h(v)},{p(v)}); \addplot[domain=4.2:4.5] ({h(v)},{p(v)}); \addplot[domain=4.5:4.5356939968] ({h(v)},{p(v)}); \addplot[domain=4.844517562:4.9] ({h(v)},{p(v)}); \addplot[domain=4.9:5] ({h(v)},{p(v)}); \addplot[domain=5:5.170055092] ({h(v)},{p(v)}); \addplot[domain=5.4665876095:5.5] ({h(v)},{p(v)}); \addplot[domain=5.5:5.7] ({h(v)},{p(v)}); \addplot[domain=5.7:5.7347036241] ({h(v)},{p(v)}); \addplot[domain=6.0248230446:6.2484075213] ({h(v)},{p(v)}); \addplot[domain=6.5357897386:6.7226893127] ({h(v)},{p(v)}); \addplot[domain=7.0100484639:7.1651804638] ({h(v)},{p(v)}); \addplot[domain=7.4549045114:7.5811656127] ({h(v)},{p(v)}); \addplot[domain=7.8758321028:7.9743147713] ({h(v)},{p(v)}); \addplot[domain=8.2775481783:8.3468023025] ({h(v)},{p(v)}); \addplot[domain=8.6671994161:8.6968286602] ({h(v)},{p(v)}); \addplot[mark=none] coordinates {({g(0.15)},{o(0.15)}) ({k(0.15)},{q(0.15)})}; \addplot[domain=0.15:0.9690222774] ({k(v)},{q(v)}); \addplot[domain=2.3375568425:2.6564493594] ({k(v)},{q(v)}); \addplot[domain=3.4567020839:3.6249982793] ({k(v)},{q(v)}); \addplot[domain=4.3047344897:4.3734360266] ({k(v)},{q(v)}); \addplot[mark=none] coordinates {({h(3.2571424315)},{p(3.2571424315)}) ({k(3.2571424316)},{q(3.2571424316)})}; \addplot[domain=3.2571424316:3.2608706576] ({k(v)},{q(v)}); \addplot[mark=none] coordinates {({h(2.89)},{p(2.89)}) ({k(2.89)},{q(2.89)})}; \addplot[domain=2.8754877926:2.89] ({k(v)},{q(v)}); \addplot[domain=1.4584452866:2.0506909475] ({k(v)},{q(v)}); \addplot[mark=none] coordinates {(3,-2)} node[black] {$x \cos(x y) = 4 - y$}; \end{axis} \end{tikzpicture} } \end{document} ================================================ FILE: examples/showcase/generated/latex-image/image-parametrized-surface.eps ================================================ [File too large to display: 42.8 MB] ================================================ FILE: examples/showcase/generated/latex-image/image-parametrized-surface.tex ================================================ \documentclass[12pt]{article} \usepackage{geometry} \geometry{letterpaper,total={408pt,9.0in}} %% Custom Page Layout Adjustments (use latex.geometry) \usepackage{amsmath,amssymb} \usepackage{tikz} \usepackage{pgfplots} \usetikzlibrary{positioning} \usepgfplotslibrary{fillbetween} \usepackage{pstricks} \usepackage{phaistos} \usepackage{xcolor} \ifdefined\tikzset \tikzset{ampersand replacement = \amp} \fi \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} \begin{document} \pagestyle{empty} \resizebox{\width}{\height}{ \begin{tikzpicture} \begin{axis}[ compat=1.9, x={(-0.2cm,-0.1cm)}, y={(.375cm,0.0cm)}, z={(0cm,0.375cm)}, xlabel={}, ylabel={}, zlabel={}, xmin = -4, xmax = 4, ymin = -4, ymax = 4.5, zmin = -4, zmax = 4.5, xtick = {10}, ytick = {10}, ztick = {10}, samples = 10, samples y = 10, axis lines = center, ] \addplot3[surf, shader = faceted interp, domain = -2:0, y domain = -2:0,] ({x+y}, {x^2}, {y^2}); \addplot3[<->, domain = -2:2, samples y= 0] ({-1+x}, {1^2}, {x^2}); \addplot3[<->>, domain = -2:2, samples y= 0] ({-1.5+x}, {x^2}, {1.5^2}); \addplot3[surf, shader = faceted interp, domain = 0:2, y domain = -2:0,] ({x+y}, {x^2}, {y^2}); \addplot3[<->, domain = -2:2, samples y= 0] ({1.2+x}, {1.2^2}, {x^2}); \addplot3[surf, shader = faceted interp, domain = -2:0, y domain = 0:2,] ({x+y}, {x^2}, {y^2}); \addplot3[<->, domain = 0:2, samples y= 0] ({-1+x}, {1^2}, {x^2}); \addplot3[<->>, domain = -2:2, samples y= 0] ({0.9+x}, {x^2}, {0.9^2}); \addplot3[surf, shader = faceted interp, domain = 0:2, y domain = -2:0,] ({(x+y)*(abs(x^2-y^2)/(x^2-y^2)+1)/2}, {x^2}, {y^2*(abs(x^2-y^2)/(x^2-y^2)+1)/2 + x^2*(abs(y^2-x^2)/(y^2-x^2)+1)/2}); \addplot3[->>, domain = 1.5:2, samples y= 0] ({-1.5+x}, {x^2}, {1.5^2}); \addplot3[surf, shader = faceted interp, domain = 0:2, y domain = 0:2,] ({x+y}, {x^2}, {y^2}); \addplot3[->>, domain = 0.1:2, samples y= 0] ({0.9+x}, {x^2}, {0.9^2}); \addplot3[<->>, domain = -2:2, samples y= 0] ({2+x}, {x^2}, {2^2}); \addplot3[<->>, domain = -2:2, samples y= 0] ({-2+x}, {x^2}, {2^2}); \addplot3[<->, domain = -2:2, samples y= 0] ({2+x}, {2^2}, {x^2}); \addplot3[<->, domain = -2:2, samples y= 0] ({-2+x}, {2^2}, {x^2}); \addplot3[->, domain = 0:2, samples y= 0] ({1.2+x}, {1.2^2}, {x^2}); \addplot3[mark=none] coordinates {(0, 1, -2)} node {$r(u,v)=(u+v,u^2,v^2)$}; \end{axis} \end{tikzpicture} } \end{document} ================================================ FILE: examples/showcase/generated/latex-image/worksheet-midpoints-of-quadrilateral.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.90.1 (http://poppler.freedesktop.org) %%Creator: XeTeX output 2022.03.23:2314 %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%BoundingBox: 123 618 241 736 %%HiResBoundingBox: 123.8 618.30466 241 735.9146 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin %%EndSetup pdfStartPage %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 123.8 618.30466 117.2 117.60994 re W q q [1 0 0 1 72 720] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1.00003 0 0.003] cm q [1 0 0 1 53.389 -99.787] cm q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.3985 w q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 1.59404 w 0 0 m 113.38766 0 l 90.71013 90.71013 l 45.35506 113.38766 l 0 0 l S /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [2.98883 2.98883] 0 d 1.19553 w 56.69382 0 m 102.04889 45.35506 l 68.0326 102.04889 l 22.67752 56.69382 l 56.69382 0 l S /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%EOF ================================================ FILE: examples/showcase/generated/latex-image/worksheet-midpoints-of-quadrilateral.tex ================================================ \documentclass[12pt]{article} \usepackage{geometry} \geometry{letterpaper,total={408pt,9.0in}} %% Custom Page Layout Adjustments (use latex.geometry) \usepackage{amsmath,amssymb} \usepackage{tikz} \usepackage{pgfplots} \usetikzlibrary{positioning} \usepgfplotslibrary{fillbetween} \usepackage{pstricks} \usepackage{phaistos} \usepackage{xcolor} \ifdefined\tikzset \tikzset{ampersand replacement = \amp} \fi \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} \begin{document} \pagestyle{empty} \resizebox{\width}{\height}{ \begin{tikzpicture}[xscale=0.8, yscale=0.8] \draw[style={black, ultra thick}] (0,0) -- (5,0) -- (4,4) -- (2,5) -- (0,0); \draw[style={black, dashed, very thick}] (2.5, 0) -- (4.5, 2) -- (3, 4.5) -- (1, 2.5) -- (2.5, 0); \end{tikzpicture} } \end{document} ================================================ FILE: examples/showcase/generated/latex-image/worksheet-triangle-cyclic-medians-copy.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.90.1 (http://poppler.freedesktop.org) %%Creator: XeTeX output 2022.03.23:2315 %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%BoundingBox: 128 630 264 734 %%HiResBoundingBox: 128.12 630.7771 263.56 733.51605 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin %%BeginResource: font WJTTVM+CMMI12 %!FontType1-1.0: WJTTVM+CMMI12003.002 12 dict begin /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \(c\) 1997, 2009 American Mathematical Society \(\), with Reserved Font Name CMMI12.) readonly def /FullName (CMMI12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /isFixedPitch false def /ItalicAngle -14.04 def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /WJTTVM+CMMI12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-31 -250 1026 750] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 65 /A put dup 66 /B put dup 67 /C put dup 77 /M put dup 80 /P put dup 126 /vector put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF6 F95CB8F8CEBD4396C74A303DCB3A46C281B472F99892DCADA5FC6E4C2524AE72 569652A7D664B73CC839B5405D299F805DA5E9FE5C41F969093CFD7B26C9805B 6EC2DA5C4EA81C285458F5CCCDC02F82AC0E127BDB8F9E0A94383740D13431F8 554EF5B7648E7C56F5F38740D67CB57E0007961013F2F16CDB5BA3F5C1414F66 AECF5AFFA42AA51168B07908FD53D54A2CFEF17624741ECA22F7626685779280 1CDB4E854995AC7EC9568E01A81AC3E0871CAA7B9B97ED69C06767E2F9CBF6BA 37EE0F6542F1CF06D3BB45F72F0C8606A583416C0A4E0BE47DE004AFD54B7384 3333A15D247A858696D6C7A89D76211A7398CBD8EE7DEDA431F9CFCC9EEA8D3B 263BA229B14CB5B43558716E0C5D8A33FAC2CD7552B2E1423B2121DA3B0349D8 F70CF4704F18A9BDDCE6F3649EE603B1E8F15AB47448A32E884D7C809DA69537 E21A971FE4214D1ECC56E2E6633738BA4E4544AE4EFFF373F873C0837A7AAFC3 DD4070D9372824C6E1F92975DB672C15F0B784F6B8989DB013009A897F452E76 2AF573C31A6B13CDEC7740737E7BD257B2501A47D51A087EB12974BA00D53F3F F452910BB0D46D8FE2B6D19E07E15410093A22E72CCD74A98533FB2A647089E3 9E60E43856DC48D29267A652AA9B2501DF49E9E4B70E9C686AAA5306D97DE438 A3138AF5D01F6A273659EDB0C57DFA2E0693A5D6A5A933227D0AA3F9CFD4E144 F3500DCB1D670D9946B0DB5F702A0B26527B62F9B4E6392BF6D0B99F0C0FB254 0180FE2842835170FE28B86A5FD9CC58A7A894FCECAE9FED1553EC0516FD3BF3 14E1E12EF69001D808EBEAF0DF86FB39C8987D2B21CA32869CF252342F4B7A39 E371783525F28D042C9A1F0928956982C08389B359F9DD169A5BB4EB99F1ED8C 3F52710F16959080C1AD7566EE9B06383CEC5E539A8F8520A305CB7FF56F99A5 D11DDDD9B9126B55C3A23C1507EF08561BE1BB6C63B9D31C256FDDEA0AF2AC74 2D2C9358086138023E648A190E5B96626D3EEF5FA99C54FC8F34C53BB9156C7D 4194637494B650598EED19BA285B496436CFE33E73D505E67F18D42CFE6ED5C5 AEB43812E881BE63A805B896EF777E68B950F7580EEC6CFB67DF5322937DF7CA 5058FCDD4706795FFB53A1586BC17A959CE58D5AC61A4040BE17E8DA5A44548A ACBA6B7C873B917217E932FC3CB27810928B1EB7B4102D2587ABD3836A100656 B8039B480EBBF19351F376F169D246996D7D8CE44AFE979392309C37A7C51C7C A26BD01A079E2E9862F811D82FAFA2D4828A6BA7B92E2975AA336F72E4F623CA 8AB9F63ECD1E34B9F012E1795603E3AB71327B3CA9037DAD19C14CD8CD2B7848 EFB20FDE00C8D5DD84EBC65775638724017D01DDC0E65637AB1249492A94B0C2 3CA53594D7AA80018090D1C06E28B77D52130DCC8C275D82E6A6630CEDB34CDB 0AF54197D75853CBF6AC1AF4BF55A12447B82895DAF0EC0C2E4B2C8C14CCF18D 5AF1B77E8C169D5B9FF084D5BF10CE0231A56E3886860960BF0AE59C64430D5B 62F412EAE5F25C2BDAF43F68D7D833E559D50EF4D5655B9A8762750DC87B0892 09FD308685201AA98E802092F3369990F279A445538DB77E8CB59AA158C63724 E531780B80F24C47CA3D67823F4D6D350F27D30D49B5A07AA0628C1128C28790 8C5864FDDC8CD9255A038C6BDD3963BE9C9139985C51C18A5C6DA03BC0BE1F33 A0924BF226D0BAADFDC52B2C2BB2CD6CC88079E2F7E36C4C232628F916296E06 827170DE48490B6CE049DCE6296BD4E781FEF831B8ED9991DD00ACF493747B01 E0AFE8735B56767B792D9095248520ECD320C57390960E6895676861B7F98EB7 28E9523A749570C0C980FFD55FE157979F82EA18018ACF3ECAED45A9F2A4A093 042B8292AC81DA977B4D511A859B26F2E26EE2004E3CF57236ED4EDB7A1A8863 B773E4E1C1C09FFC11428BAE775B302B3315FA4D745FBDC43358324DDE36A75A CF908F630BA9D86A021C93D56C8925 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F7_0 /WJTTVM+CMMI12 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/vector/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont %%BeginResource: font YDMGVX+CMR8 %!FontType1-1.0: YDMGVX+CMR8003.002 12 dict begin /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \(c\) 1997, 2009 American Mathematical Society \(\), with Reserved Font Name CMR8.) readonly def /FullName (CMR8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /isFixedPitch false def /ItalicAngle 0 def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /YDMGVX+CMR8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-36 -250 1070 750] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 49 /one put dup 50 /two put dup 51 /three put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF6 F95CB8F8CEBD4396C74A37E2724CD63F484F47C6447F507C11793B061A71C2EB 7D651F93505835EBF9032E361AE5C694F562A11D768CB4FB2540B4281CECEE7D 3A31CE697DC0DEFB6C96B38A970EDFE1B25B852DF4F12D7FA0932E9C23309A9B 5CEBA0ACEF0E3995BA632D87588518DDCFAD1F932C2AC298854B8BE70E7DD281 1D3EFD74AAF10F1EAD0973929C21B1810FBCC69541899C362724B7EFAE962F89 3A1B0CF3FDDD78525A09CE879C0E37FBFFE7EC63524D43EF6909157ACE7282BD 8DB134CEB68F1D3E7FB10B417C6E8E3371D5B1373A70F9EAD42A4A9B9393FBFF DA7CA62FEE95179ED829A8B8017B258F94A2996BDD52C6B6280012FC72DE816F FEE42C853DEF7E65E798E746AD78D178977835165DE6B82F895DE65C5A37E550 0687153CA8964477F9C6961568440F70217EE7FCA7DCDD4765399E931D6E5E1B 4BA6BF22458A8AFF9926085C2884A1FD7DCC0F0701850F8F4BB88D7A27AEEE98 FD528C1A38AE6B349705CC4B7C893A43C61DFA20379A5EAA573190499BDD3816 8CA18E492440922F4D24470DC9960DE10A4B44AA931F6E42421D14F8A2E69723 5CC9D0C971A21577FC4D517205AC812DC86B68510B66F6035446498C71B1CB2C E173844092957E86C3AD5F60F03FCB47B605FD8FDACF0BE6DBA31421BD7A90FC 23E3B3508083F18A87186DA8B22BC94DD27F8476F4DEBB33D98A0CA935C23105 1E557467F00708B83BD148F0194A1770E347968938F8021552A9325D5A75D759 EB8E64029DCACA87CD525D22BAB65601FA3BA89ABCBA8E003852B136E12250D2 E4AF15E6B8456B7B6C6526C30C221637F5C27DFAB6C87B73D7763519D65E2278 FDC91C1C1474F90BC324962FB4E1764BB6F4B64F10B7CD5573156689B6E4A530 5AB5404EF937EDFCD34B373DD496318A394AC06EFC946B4D82422BA0D0726E3E 0EF9614FBD9DF05881BFC8B1884005AF2A62616DE4996736EAF9DE60A824058C 8D6C24A36370201EB772518EAD77E0777CE65466568EC08AA63B4D6F91F8CAE7 8F5A604C0EFE969F7DDD4003AE7D70D781F81C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F12_0 /YDMGVX+CMR8 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont %%EndSetup pdfStartPage %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 128.12 630.7771 135.44 102.73895 re W q q [1 0 0 1 72 720] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1.00009 0 0 1 -0.004 0] cm q [1 0 0 1 62.419 -72.571] cm q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.3985 w q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.79701 w 0 0 m 97.7966 0 l 122.89815 0 l S q [1 0 0 1 122.89815 0] cm q 4.66248 0 m 3.28098 0.25902 1.0361 1.0361 -0.51805 1.94269 c -0.51805 -1.94269 l 1.0361 -1.0361 3.28098 -0.25902 4.66248 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 93.409 -15.927] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 64.586 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (A) [8.775117 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.79701 w 127.56062 0 m 62.50475 65.05586 l 45.81706 81.74356 l S q [-0.7071 0.7071 -0.7071 -0.7071 45.81708 81.74355] cm q 4.66248 0 m 3.28098 0.25902 1.0361 1.0361 -0.51805 1.94269 c -0.51805 -1.94269 l 1.0361 -1.0361 3.28098 -0.25902 4.66248 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 68.892 71.443] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 64.296 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (B) [8.893473 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.79701 w 42.5202 85.04042 m 9.77945 19.55956 l 2.08493 4.17 l S q [-0.44717 -0.89438 0.89438 -0.44717 2.08493 4.17001] cm q 4.66248 0 m 3.28098 0.25902 1.0361 1.0361 -0.51805 1.94269 c -0.51805 -1.94269 l 1.0361 -1.0361 3.28098 -0.25902 4.66248 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 -5.842 25.947] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 64.165 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (C) [8.374618 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.59776 w [2.98883 2.98883] 0 d 42.5202 85.04042 m 49.60645 56.69339 l 62.78003 4.00128 l S q [0.24252 -0.97012 0.97012 0.24252 62.78001 4.00128] cm q 4.1245 0 m 2.9024 0.22913 0.91655 0.91655 -0.45827 1.71854 c -0.45827 -1.71854 l 0.91655 -0.91655 2.9024 -0.22913 4.1245 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 41.578 51.818] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 65.835 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (M) [11.325161 0] Tj 73.743 -74.364 Td /F12_0 7.9701 Tf (1) [4.234514 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.59776 w [2.98883 2.98883] 0 d 0 0 m 28.34636 14.17317 l 81.35162 40.67584 l S q [0.89436 0.44717 -0.44717 0.89436 81.35162 40.67583] cm q 4.1245 0 m 2.9024 0.22913 0.91655 0.91655 -0.45827 1.71854 c -0.45827 -1.71854 l 0.91655 -0.91655 2.9024 -0.22913 4.1245 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 20.318 9.298] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 65.835 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (M) [11.325161 0] Tj 73.743 -74.364 Td /F12_0 7.9701 Tf (2) [4.234514 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.59776 w [2.98883 2.98883] 0 d 127.56062 0 m 92.12668 14.17317 l 25.08942 40.9885 l S q [-0.92844 0.37137 -0.37137 -0.92844 25.08943 40.9885] cm q 4.1245 0 m 2.9024 0.22913 0.91655 0.91655 -0.45827 1.71854 c -0.45827 -1.71854 l 0.91655 -0.91655 2.9024 -0.22913 4.1245 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 84.098 9.298] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 65.835 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (M) [11.325161 0] Tj 73.743 -74.364 Td /F12_0 7.9701 Tf (3) [4.234514 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} cs [0] sc q /DeviceGray {} cs [0] sc 59.51122 28.34636 m 59.51122 29.90262 58.24963 31.1642 56.69339 31.1642 c 55.13713 31.1642 53.87555 29.90262 53.87555 28.34636 c 53.87555 26.7901 55.13713 25.52852 56.69339 25.52852 c 58.24963 25.52852 59.51122 26.7901 59.51122 28.34636 c h f 59.51122 28.34636 m 59.51122 29.90262 58.24963 31.1642 56.69339 31.1642 c 55.13713 31.1642 53.87555 29.90262 53.87555 28.34636 c 53.87555 26.7901 55.13713 25.52852 56.69339 25.52852 c 58.24963 25.52852 59.51122 26.7901 59.51122 28.34636 c h S Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [0.5 0 0 0.5 87.903 -7.939] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 59.46 35.932] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 62.419 -72.571 Td /F7_0 11.9552 Tf (P) [7.544927 0] Tj Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%+ font WJTTVM+CMMI12 %%+ font YDMGVX+CMR8 %%EOF ================================================ FILE: examples/showcase/generated/latex-image/worksheet-triangle-cyclic-medians-copy.tex ================================================ \documentclass[12pt]{article} \usepackage{geometry} \geometry{letterpaper,total={408pt,9.0in}} %% Custom Page Layout Adjustments (use latex.geometry) \usepackage{amsmath,amssymb} \usepackage{tikz} \usepackage{pgfplots} \usetikzlibrary{positioning} \usepgfplotslibrary{fillbetween} \usepackage{pstricks} \usepackage{phaistos} \usepackage{xcolor} \ifdefined\tikzset \tikzset{ampersand replacement = \amp} \fi \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} \begin{document} \pagestyle{empty} \resizebox{\width}{\height}{ \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node {$\vec{M}_{1}$} -- (1.5,0); \draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node {$\vec{M}_{2}$} -- (2,1); \draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node {$\vec{M}_{3}$} -- (0.5,1); \node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; \node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; \end{tikzpicture} } \end{document} ================================================ FILE: examples/showcase/generated/latex-image/worksheet-triangle-cyclic-medians.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.90.1 (http://poppler.freedesktop.org) %%Creator: XeTeX output 2022.03.23:2314 %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%BoundingBox: 128 630 264 734 %%HiResBoundingBox: 128.12 630.7771 263.56 733.51605 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin %%BeginResource: font DTNDPG+CMMI12 %!FontType1-1.0: DTNDPG+CMMI12003.002 12 dict begin /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \(c\) 1997, 2009 American Mathematical Society \(\), with Reserved Font Name CMMI12.) readonly def /FullName (CMMI12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /isFixedPitch false def /ItalicAngle -14.04 def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /DTNDPG+CMMI12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-31 -250 1026 750] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 65 /A put dup 66 /B put dup 67 /C put dup 77 /M put dup 80 /P put dup 126 /vector put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF6 F95CB8F8CEBD4396C74A303DCB3A46C281B472F99892DCADA5FC6E4C2524AE72 569652A7D664B73CC839B5405D299F805DA5E9FE5C41F969093CFD7B26C9805B 6EC2DA5C4EA81C285458F5CCCDC02F82AC0E127BDB8F9E0A94383740D13431F8 554EF5B7648E7C56F5F38740D67CB57E0007961013F2F16CDB5BA3F5C1414F66 AECF5AFFA42AA51168B07908FD53D54A2CFEF17624741ECA22F7626685779280 1CDB4E854995AC7EC9568E01A81AC3E0871CAA7B9B97ED69C06767E2F9CBF6BA 37EE0F6542F1CF06D3BB45F72F0C8606A583416C0A4E0BE47DE004AFD54B7384 3333A15D247A858696D6C7A89D76211A7398CBD8EE7DEDA431F9CFCC9EEA8D3B 263BA229B14CB5B43558716E0C5D8A33FAC2CD7552B2E1423B2121DA3B0349D8 F70CF4704F18A9BDDCE6F3649EE603B1E8F15AB47448A32E884D7C809DA69537 E21A971FE4214D1ECC56E2E6633738BA4E4544AE4EFFF373F873C0837A7AAFC3 DD4070D9372824C6E1F92975DB672C15F0B784F6B8989DB013009A897F452E76 2AF573C31A6B13CDEC7740737E7BD257B2501A47D51A087EB12974BA00D53F3F F452910BB0D46D8FE2B6D19E07E15410093A22E72CCD74A98533FB2A647089E3 9E60E43856DC48D29267A652AA9B2501DF49E9E4B70E9C686AAA5306D97DE438 A3138AF5D01F6A273659EDB0C57DFA2E0693A5D6A5A933227D0AA3F9CFD4E144 F3500DCB1D670D9946B0DB5F702A0B26527B62F9B4E6392BF6D0B99F0C0FB254 0180FE2842835170FE28B86A5FD9CC58A7A894FCECAE9FED1553EC0516FD3BF3 14E1E12EF69001D808EBEAF0DF86FB39C8987D2B21CA32869CF252342F4B7A39 E371783525F28D042C9A1F0928956982C08389B359F9DD169A5BB4EB99F1ED8C 3F52710F16959080C1AD7566EE9B06383CEC5E539A8F8520A305CB7FF56F99A5 D11DDDD9B9126B55C3A23C1507EF08561BE1BB6C63B9D31C256FDDEA0AF2AC74 2D2C9358086138023E648A190E5B96626D3EEF5FA99C54FC8F34C53BB9156C7D 4194637494B650598EED19BA285B496436CFE33E73D505E67F18D42CFE6ED5C5 AEB43812E881BE63A805B896EF777E68B950F7580EEC6CFB67DF5322937DF7CA 5058FCDD4706795FFB53A1586BC17A959CE58D5AC61A4040BE17E8DA5A44548A ACBA6B7C873B917217E932FC3CB27810928B1EB7B4102D2587ABD3836A100656 B8039B480EBBF19351F376F169D246996D7D8CE44AFE979392309C37A7C51C7C A26BD01A079E2E9862F811D82FAFA2D4828A6BA7B92E2975AA336F72E4F623CA 8AB9F63ECD1E34B9F012E1795603E3AB71327B3CA9037DAD19C14CD8CD2B7848 EFB20FDE00C8D5DD84EBC65775638724017D01DDC0E65637AB1249492A94B0C2 3CA53594D7AA80018090D1C06E28B77D52130DCC8C275D82E6A6630CEDB34CDB 0AF54197D75853CBF6AC1AF4BF55A12447B82895DAF0EC0C2E4B2C8C14CCF18D 5AF1B77E8C169D5B9FF084D5BF10CE0231A56E3886860960BF0AE59C64430D5B 62F412EAE5F25C2BDAF43F68D7D833E559D50EF4D5655B9A8762750DC87B0892 09FD308685201AA98E802092F3369990F279A445538DB77E8CB59AA158C63724 E531780B80F24C47CA3D67823F4D6D350F27D30D49B5A07AA0628C1128C28790 8C5864FDDC8CD9255A038C6BDD3963BE9C9139985C51C18A5C6DA03BC0BE1F33 A0924BF226D0BAADFDC52B2C2BB2CD6CC88079E2F7E36C4C232628F916296E06 827170DE48490B6CE049DCE6296BD4E781FEF831B8ED9991DD00ACF493747B01 E0AFE8735B56767B792D9095248520ECD320C57390960E6895676861B7F98EB7 28E9523A749570C0C980FFD55FE157979F82EA18018ACF3ECAED45A9F2A4A093 042B8292AC81DA977B4D511A859B26F2E26EE2004E3CF57236ED4EDB7A1A8863 B773E4E1C1C09FFC11428BAE775B302B3315FA4D745FBDC43358324DDE36A75A CF908F630BA9D86A021C93D56C8925 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F7_0 /DTNDPG+CMMI12 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/vector/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont %%BeginResource: font KRKITJ+CMR8 %!FontType1-1.0: KRKITJ+CMR8003.002 12 dict begin /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \(c\) 1997, 2009 American Mathematical Society \(\), with Reserved Font Name CMR8.) readonly def /FullName (CMR8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /isFixedPitch false def /ItalicAngle 0 def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /KRKITJ+CMR8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-36 -250 1070 750] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 49 /one put dup 50 /two put dup 51 /three put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF6 F95CB8F8CEBD4396C74A37E2724CD63F484F47C6447F507C11793B061A71C2EB 7D651F93505835EBF9032E361AE5C694F562A11D768CB4FB2540B4281CECEE7D 3A31CE697DC0DEFB6C96B38A970EDFE1B25B852DF4F12D7FA0932E9C23309A9B 5CEBA0ACEF0E3995BA632D87588518DDCFAD1F932C2AC298854B8BE70E7DD281 1D3EFD74AAF10F1EAD0973929C21B1810FBCC69541899C362724B7EFAE962F89 3A1B0CF3FDDD78525A09CE879C0E37FBFFE7EC63524D43EF6909157ACE7282BD 8DB134CEB68F1D3E7FB10B417C6E8E3371D5B1373A70F9EAD42A4A9B9393FBFF DA7CA62FEE95179ED829A8B8017B258F94A2996BDD52C6B6280012FC72DE816F FEE42C853DEF7E65E798E746AD78D178977835165DE6B82F895DE65C5A37E550 0687153CA8964477F9C6961568440F70217EE7FCA7DCDD4765399E931D6E5E1B 4BA6BF22458A8AFF9926085C2884A1FD7DCC0F0701850F8F4BB88D7A27AEEE98 FD528C1A38AE6B349705CC4B7C893A43C61DFA20379A5EAA573190499BDD3816 8CA18E492440922F4D24470DC9960DE10A4B44AA931F6E42421D14F8A2E69723 5CC9D0C971A21577FC4D517205AC812DC86B68510B66F6035446498C71B1CB2C E173844092957E86C3AD5F60F03FCB47B605FD8FDACF0BE6DBA31421BD7A90FC 23E3B3508083F18A87186DA8B22BC94DD27F8476F4DEBB33D98A0CA935C23105 1E557467F00708B83BD148F0194A1770E347968938F8021552A9325D5A75D759 EB8E64029DCACA87CD525D22BAB65601FA3BA89ABCBA8E003852B136E12250D2 E4AF15E6B8456B7B6C6526C30C221637F5C27DFAB6C87B73D7763519D65E2278 FDC91C1C1474F90BC324962FB4E1764BB6F4B64F10B7CD5573156689B6E4A530 5AB5404EF937EDFCD34B373DD496318A394AC06EFC946B4D82422BA0D0726E3E 0EF9614FBD9DF05881BFC8B1884005AF2A62616DE4996736EAF9DE60A824058C 8D6C24A36370201EB772518EAD77E0777CE65466568EC08AA63B4D6F91F8CAE7 8F5A604C0EFE969F7DDD4003AE7D70D781F81C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F12_0 /KRKITJ+CMR8 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont %%EndSetup pdfStartPage %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 128.12 630.7771 135.44 102.73895 re W q q [1 0 0 1 72 720] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1.00009 0 0 1 -0.004 0] cm q [1 0 0 1 62.419 -72.571] cm q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.3985 w q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.79701 w 0 0 m 97.7966 0 l 122.89815 0 l S q [1 0 0 1 122.89815 0] cm q 4.66248 0 m 3.28098 0.25902 1.0361 1.0361 -0.51805 1.94269 c -0.51805 -1.94269 l 1.0361 -1.0361 3.28098 -0.25902 4.66248 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 93.409 -15.927] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 64.586 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (A) [8.775117 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.79701 w 127.56062 0 m 62.50475 65.05586 l 45.81706 81.74356 l S q [-0.7071 0.7071 -0.7071 -0.7071 45.81708 81.74355] cm q 4.66248 0 m 3.28098 0.25902 1.0361 1.0361 -0.51805 1.94269 c -0.51805 -1.94269 l 1.0361 -1.0361 3.28098 -0.25902 4.66248 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 68.892 71.443] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 64.296 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (B) [8.893473 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.79701 w 42.5202 85.04042 m 9.77945 19.55956 l 2.08493 4.17 l S q [-0.44717 -0.89438 0.89438 -0.44717 2.08493 4.17001] cm q 4.66248 0 m 3.28098 0.25902 1.0361 1.0361 -0.51805 1.94269 c -0.51805 -1.94269 l 1.0361 -1.0361 3.28098 -0.25902 4.66248 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 -5.842 25.947] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 64.165 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (C) [8.374618 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.59776 w [2.98883 2.98883] 0 d 42.5202 85.04042 m 49.60645 56.69339 l 62.78003 4.00128 l S q [0.24252 -0.97012 0.97012 0.24252 62.78001 4.00128] cm q 4.1245 0 m 2.9024 0.22913 0.91655 0.91655 -0.45827 1.71854 c -0.45827 -1.71854 l 0.91655 -0.91655 2.9024 -0.22913 4.1245 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 41.578 51.818] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 65.835 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (M) [11.325161 0] Tj 73.743 -74.364 Td /F12_0 7.9701 Tf (1) [4.234514 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.59776 w [2.98883 2.98883] 0 d 0 0 m 28.34636 14.17317 l 81.35162 40.67584 l S q [0.89436 0.44717 -0.44717 0.89436 81.35162 40.67583] cm q 4.1245 0 m 2.9024 0.22913 0.91655 0.91655 -0.45827 1.71854 c -0.45827 -1.71854 l 0.91655 -0.91655 2.9024 -0.22913 4.1245 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 20.318 9.298] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 65.835 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (M) [11.325161 0] Tj 73.743 -74.364 Td /F12_0 7.9701 Tf (2) [4.234514 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.59776 w [2.98883 2.98883] 0 d 127.56062 0 m 92.12668 14.17317 l 25.08942 40.9885 l S q [-0.92844 0.37137 -0.37137 -0.92844 25.08943 40.9885] cm q 4.1245 0 m 2.9024 0.22913 0.91655 0.91655 -0.45827 1.71854 c -0.45827 -1.71854 l 0.91655 -0.91655 2.9024 -0.22913 4.1245 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 84.098 9.298] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 65.835 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (M) [11.325161 0] Tj 73.743 -74.364 Td /F12_0 7.9701 Tf (3) [4.234514 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} cs [0] sc q /DeviceGray {} cs [0] sc 59.51122 28.34636 m 59.51122 29.90262 58.24963 31.1642 56.69339 31.1642 c 55.13713 31.1642 53.87555 29.90262 53.87555 28.34636 c 53.87555 26.7901 55.13713 25.52852 56.69339 25.52852 c 58.24963 25.52852 59.51122 26.7901 59.51122 28.34636 c h f 59.51122 28.34636 m 59.51122 29.90262 58.24963 31.1642 56.69339 31.1642 c 55.13713 31.1642 53.87555 29.90262 53.87555 28.34636 c 53.87555 26.7901 55.13713 25.52852 56.69339 25.52852 c 58.24963 25.52852 59.51122 26.7901 59.51122 28.34636 c h S Q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [0.5 0 0 0.5 87.903 -7.939] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 59.46 35.932] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 62.419 -72.571 Td /F7_0 11.9552 Tf (P) [7.544927 0] Tj Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%+ font DTNDPG+CMMI12 %%+ font KRKITJ+CMR8 %%EOF ================================================ FILE: examples/showcase/generated/latex-image/worksheet-triangle-cyclic-medians.tex ================================================ \documentclass[12pt]{article} \usepackage{geometry} \geometry{letterpaper,total={408pt,9.0in}} %% Custom Page Layout Adjustments (use latex.geometry) \usepackage{amsmath,amssymb} \usepackage{tikz} \usepackage{pgfplots} \usetikzlibrary{positioning} \usepgfplotslibrary{fillbetween} \usepackage{pstricks} \usepackage{phaistos} \usepackage{xcolor} \ifdefined\tikzset \tikzset{ampersand replacement = \amp} \fi \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} \begin{document} \pagestyle{empty} \resizebox{\width}{\height}{ \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node {$\vec{M}_{1}$} -- (1.5,0); \draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node {$\vec{M}_{2}$} -- (2,1); \draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node {$\vec{M}_{3}$} -- (0.5,1); \node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; \node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; \end{tikzpicture} } \end{document} ================================================ FILE: examples/showcase/generated/latex-image/worksheet-triangle-cyclic-vectors.eps ================================================ %!PS-Adobe-3.0 EPSF-3.0 %Produced by poppler pdftops version: 0.90.1 (http://poppler.freedesktop.org) %%Creator: XeTeX output 2022.03.23:2315 %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%BoundingBox: 128 630 264 734 %%HiResBoundingBox: 128.12 630.7771 263.56 733.51605 %%DocumentSuppliedResources: (atend) %%EndComments %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2011 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { /setpagedevice where { pop 2 dict begin /Policies 1 dict dup begin /PageSize 6 def end def { /Duplex true def } if currentdict end setpagedevice } { pop } ifelse } def /pdfSetupPaper { % Change paper size, but only if different from previous paper size otherwise % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size % so we use the same when checking if the size changes. /setpagedevice where { pop currentpagedevice /PageSize known { 2 copy currentpagedevice /PageSize get aload pop exch 4 1 roll sub abs 5 gt 3 1 roll sub abs 5 gt or } { true } ifelse { 2 array astore 2 dict begin /PageSize exch def /ImagingBBox null def currentdict end setpagedevice } { pop pop } ifelse } { pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfPatternCS false def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Tp { /pdfPatternCS exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /xyshow where { pop /xyshow2 { dup length array 0 2 2 index length 1 sub { 2 index 1 index 2 copy get 3 1 roll 1 add get pdfTextMat dtransform 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put } for exch pop xyshow } def }{ /xyshow2 { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval show moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval show moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /cshow where { pop /xycp { 0 3 2 roll { pop pop currentpoint 3 2 roll 1 string dup 0 4 3 roll put false charpath moveto 2 copy get 2 index 2 index 1 add get pdfTextMat dtransform rmoveto 2 add } exch cshow pop pop } def }{ /xycp { currentfont /FontType get 0 eq { 0 2 3 index length 1 sub { currentpoint 4 index 3 index 2 getinterval false charpath moveto 2 copy get 2 index 3 2 roll 1 add get pdfTextMat dtransform rmoveto } for } { 0 1 3 index length 1 sub { currentpoint 4 index 3 index 1 getinterval false charpath moveto 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get pdfTextMat dtransform rmoveto } for } ifelse pop pop } def } ifelse /Tj { fCol 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 4 2 roll pdfTextRender 1 and 0 eq { 2 copy xyshow2 } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 3 index 3 index moveto 2 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse xycp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 4 2 roll moveto xycp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { pop pop pop pop } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { 0.001 mul pdfFontSize mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def /Tclip* { pdfTextClipPath cvx exec eoclip newpath /pdfTextClipPath [] def } def % Level 2/3 image operators /pdfImBuf 100 string def /pdfImStr { 2 copy exch length lt { 2 copy get exch 1 add exch } { () } ifelse } def /skipEOD { { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfIm { image skipEOD } def /pdfImM { fCol imagemask skipEOD } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin %%BeginResource: font YGQSIE+CMMI12 %!FontType1-1.0: YGQSIE+CMMI12003.002 12 dict begin /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \(c\) 1997, 2009 American Mathematical Society \(\), with Reserved Font Name CMMI12.) readonly def /FullName (CMMI12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /isFixedPitch false def /ItalicAngle -14.04 def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /YGQSIE+CMMI12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /FontBBox [-31 -250 1026 750] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 65 /A put dup 66 /B put dup 67 /C put dup 126 /vector put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF6 F95CB8F8CEBD4396C74A303DCB3A46C281B472F99892DCADA5FC6E4C2524AE72 569652A7D664B73CC839B5405D299F805DA5E9FE5C41F969093CFD7B26C9805B 6EC2DA5C4EA81C285458F5CCCDC02F82AC0E127BDB8F9E0A94383740D13431F8 554EF5B7648E7C56F5F38740D67CB57E0007961013F2F16CDB5BA3F5C1414F66 AECF5AFFA42AA51168B07908FD53D54A2CFEF17624741ECA22F7626685779282 F94CF731BE27385E5E72D45F4B1DB660026AB862C3D2D82DFE08374FC83EC6D6 7D95B5E0CE0B6B598F7135D8C8A3F56DFC15EDB95FB0329D4E8DAC86D935D45D D394D8D57B7E5801A1EF2CC03DBCEBC08D4432717FA1C8230743AD0C976B5FC1 BF3ABE08DE7FA1B5ABBA67B17D416D6CFF0F2B693D4D525D4D0C67B283250E5E 1FDAB58F0B7C1B88F41C172701B60566CD49937F0691025D5BECEB6FEF70485C DC79746A1BED4DF8DB30D87EB18EFEC99B3AAB041F8E6F4495AE8C783183EFEE 98827EAC3D76ABAD63D7713CC2A45A788C69DBE08E674318930C9E4609DC6148 75F7DB354D0F455B53F2582C2803FD9C0BF9D387B45A297643E5440E51BC2300 8C79903128AEA88799D13E3AB6329ECAB526BC6E49CAC3E1A05D9ECA610DAF2F D6B80358877F71E59563AD1DDACF37579A6EB2AE469A066B6636EFAB6D7509D6 D2D9A5A90030E082E38D5559A70D5CB1E71215AD31DC9711004FB55807F34CFF CD25E2A3D30A23D1572C2A9DA26105A2E7270D3803156E305E4DD8BEEBC05346 DB1F2DEA869658EF85E03DA5BF833D93786DBF07187C7B3C23957C662E9934BA C05F716F0DFA9F05DEEA54F420E5AD5E0F795E64FB1B359A7DF550AAFC940BA0 384A856C4BB2C4EA7AFEFDABAE5095B291BCFA8DA61A03B7D0CEF32422669341 F0327424B3427FE95A8464B9EFE732504172CADD4B7C8C20150F20726DB8D4BF 2BFAC51E856D3194B8622128052947D40290DE9BF9970BA8FEC400FBE85CFDBA CB79F75428BDF3DF6F26C1072E7A034EB49F3290CA348C462AAC9E4C00D989EE F6A860B38EF58B2075CD15480FF8B82B1EE8B4CA009031FA775881239BDFE355 3DE229403611C7D330E15BFA726D1FE8FE1F4869342400E7910F1F94AE1478E2 FAA1CB5CD7B6B5EDE4D895DC9BB8EB75B3C8B67FA83B755CA8943B41D429AA41 9E4BD93612139CD18121C944269AE148D4F1A76DCB0A0DB3959FB62F166BFEED 7F954DC080F0F06EB2E89E94645EFF9AB05805E3D75CFAD8A42CD2C0332D5903 BEB12701BE8634456DC4FF1847C360131E5075830C2270F7FC6B7D16FF99679E 15163E3DE15D5215273A894378FD986DA50EBDEF6D6ECD5DC25DFC1964FB3F60 85475CACBA52F627CC5A10CD366FAB28 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F7_0 /YGQSIE+CMMI12 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/vector/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont %%EndSetup pdfStartPage %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer 128.12 630.7771 135.44 102.73895 re W q q [1 0 0 1 72 720] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1.00009 0 0 1 -0.004 0] cm q [1 0 0 1 62.419 -72.571] cm q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.3985 w q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.79701 w 0 0 m 97.7966 0 l 122.89815 0 l S q [1 0 0 1 122.89815 0] cm q 4.66248 0 m 3.28098 0.25902 1.0361 1.0361 -0.51805 1.94269 c -0.51805 -1.94269 l 1.0361 -1.0361 3.28098 -0.25902 4.66248 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 93.409 -15.927] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 64.586 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (A) [8.775117 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.79701 w 127.56062 0 m 62.50475 65.05586 l 45.81706 81.74356 l S q [-0.7071 0.7071 -0.7071 -0.7071 45.81708 81.74355] cm q 4.66248 0 m 3.28098 0.25902 1.0361 1.0361 -0.51805 1.94269 c -0.51805 -1.94269 l 1.0361 -1.0361 3.28098 -0.25902 4.66248 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 68.892 71.443] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 64.296 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (B) [8.893473 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc 0.79701 w 42.5202 85.04042 m 9.77945 19.55956 l 2.08493 4.17 l S q [-0.44717 -0.89438 0.89438 -0.44717 2.08493 4.17001] cm q 4.66248 0 m 3.28098 0.25902 1.0361 1.0361 -0.51805 1.94269 c -0.51805 -1.94269 l 1.0361 -1.0361 3.28098 -0.25902 4.66248 0 c f Q Q q q q [-1 0 0 -1 0 0] cm q Q q [1 0 0 1 62.419 -72.571] cm [-1 0 0 -1 0 0] cm q Q 0 J [] 0 d /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 -5.842 25.947] cm /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc [1 0 0 1 0 0] Tm 0 0 Td 64.165 -69.549 Td /F7_0 11.9552 Tf (~) [5.853266 0] Tj 62.419 -72.571 Td (C) [8.374618 0] Tj /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q /DeviceGray {} CS [1] SC /DeviceGray {} cs [1] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [1 0 0 1 62.419 -72.571] cm Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q Q Q Q /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%+ font YGQSIE+CMMI12 %%EOF ================================================ FILE: examples/showcase/generated/latex-image/worksheet-triangle-cyclic-vectors.tex ================================================ \documentclass[12pt]{article} \usepackage{geometry} \geometry{letterpaper,total={408pt,9.0in}} %% Custom Page Layout Adjustments (use latex.geometry) \usepackage{amsmath,amssymb} \usepackage{tikz} \usepackage{pgfplots} \usetikzlibrary{positioning} \usepgfplotslibrary{fillbetween} \usepackage{pstricks} \usepackage{phaistos} \usepackage{xcolor} \ifdefined\tikzset \tikzset{ampersand replacement = \amp} \fi \newcommand{\order}[1]{\left\lvert#1\right\rvert} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} \begin{document} \pagestyle{empty} \resizebox{\width}{\height}{ \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \end{tikzpicture} } \end{document} ================================================ FILE: examples/showcase/generated/webwork/answer-type-variety.xml ================================================

    Consider the function f defined by f(x)={\sqrt{x}}\text{.}

    1. The exact value of f(12) is and a decimal approximation for this is .

    2. The domain of this function, in interval notation, is .

    3. The graph of y={\sqrt{x}} intersects the graph of y=6-x at .

    4. \frac{d}{dx}{\sqrt{x}}={} .

    5. The formula for f(x)^2\text{,} including its restricted domain, is .

    6. f is a

      • ?

      • power

      • exponential

      • linear

      • quadratic

      function.

    7. Which is true of the word radical?

      • It shares ancestry with "radius", as in the radius of a circle.

      • It shares ancestry with "radish", a vegetable.

      • It shares ancestry with "radler", a mixture of beer and grapefruit soda.

    2\sqrt{3}

    3.4641

    \left[0,\infty \right)

    \left(4,2\right)

    \frac{1}{2\sqrt{x}}

    x, x\ge 0

    \text{power}

    \text{Choice 2}

    = 0"); ############################################################ # Body ############################################################ BEGIN_PGML Consider the function [`f`] defined by [`f(x)=[$f]\text{.}`] a. The exact value of [`f(12)`] is [_]{$a}{10} and a decimal approximation for this is [_]{$b}{10}. a. The domain of this function, in interval notation, is [_]{$domain}{10}. a. The graph of [`y=[$f]`] intersects the graph of [`y=6-x`] at [_]{$point}{10}. a. [`\frac{d}{dx}[$f]={}`] [_]{$derivative}{10}. a. The formula for [`f(x)^2\text{,}`] including its restricted domain, is [_]{$restricted}{20}. a. [`f`] is a [_]{$popup}{5} function. a. Which is true of the word "radical"? [_]{$radio}{5} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]> ================================================ FILE: examples/showcase/generated/webwork/images/string-answers-image-1.tex ================================================ \documentclass{standalone} \usepackage[svgnames]{xcolor} \usepackage{tikz} \usepackage{pgfplots} \usetikzlibrary{positioning} % for worksheet \usepackage{pstricks} \usepackage{phaistos} \usepackage{xcolor} \begin{document} \begin{tikzpicture} \draw[fill=red, opacity=0.5] (0,0) circle (2cm) node[below left=1.5cm, opacity=1] {Has a Bill} node[below left, opacity=1] {Duck}; \draw[fill=green, opacity=0.5] (60:2cm) circle (2cm) node [above=2.1cm, opacity=1] {Is Venemous} node[above=0.5cm, opacity=1] {Jellyfish}; \draw[fill=blue, opacity=0.5] (0:2cm) circle (2cm) node [below right=1.5cm, opacity=1] {Has Fur} node[below right, opacity=1] {Beaver}; \end{tikzpicture} \end{document} ================================================ FILE: examples/showcase/generated/webwork/open-problem-library.xml ================================================

    Find the prime factorization of 35.

    35={}

    5\cdot 7

    After checking to see if small prime numbers divide 35, we find that 5 is one divisor. So 35=5\cdot7.

    Since both 5 and 7 are prime, the prime factorization of 35 is 5\cdot7.

    ================================================ FILE: examples/showcase/generated/webwork/pg/PreTeXt_Showcase/6_1-Answer_Type_Variety.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:26:17-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(6.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "parserPopUp.pl", "parserRadioButtons.pl", "contextForm.pl", "contextLimitedRadical.pl", "contextRestrictedDomains.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context("Numeric"); $f = Formula("sqrt(x)"); $derivative = Formula("1/(2sqrt(x))"); $popup = PopUp(['?','power','exponential','linear','quadratic'],1); $radio = RadioButtons([ 'It shares ancestry with "radius", as in the radius of a circle.', 'It shares ancestry with "radish", a vegetable.', 'It shares ancestry with "radler", a mixture of beer and grapefruit soda.', ],1); Context("LimitedRadical"); $a = Formula("2sqrt(3)"); Context("LimitedNumeric"); $b = Real(sqrt(12)); Context("Interval"); $domain = Interval("[0,inf)"); Context("Point"); $point = Point("(4,2)"); Context("RestrictedDomains"); $restricted = Formula("x, x >= 0"); ############################################################ # Body ############################################################ BEGIN_PGML Consider the function [`f`] defined by [`f(x)=[$f]\text{.}`] a. The exact value of [`f(12)`] is [_]{$a}{10} and a decimal approximation for this is [_]{$b}{10}. a. The domain of this function, in interval notation, is [_]{$domain}{10}. a. The graph of [`y=[$f]`] intersects the graph of [`y=6-x`] at [_]{$point}{10}. a. [`\frac{d}{dx}[$f]={}`] [_]{$derivative}{10}. a. The formula for [`f(x)^2\text{,}`] including its restricted domain, is [_]{$restricted}{20}. a. [`f`] is a [_]{$popup}{5} function. a. Which is true of the word "radical"? [_]{$radio}{5} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/showcase/generated/webwork/pg/PreTeXt_Showcase/6_2-Special_Feedback.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:26:17-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(6.2) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "bizarroArithmetic.pl", "contextForm.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context()->operators->set( '*' => {class => 'bizarro::BOP::multiply', isCommand => 1}, ' *' => {class => 'bizarro::BOP::multiply', isCommand => 1}, '* ' => {class => 'bizarro::BOP::multiply', isCommand => 1}, ); $given = Formula("x^2 x^5"); $answer = Formula("x^7"); $special = Formula("x^10"); $evaluator = $answer -> cmp( checker=>sub{ my ( $correct, $student, $ansHash ) = @_; Value::Error("When multiplying powers with the same base, you do not multiply the exponents.") if ($special == $student); return 0 if $ansHash->{isPreview} || $correct != $student; Context()->flags->set(bizarroMul=>1); delete $correct->{test_values}; delete $student->{test_values}; my $OK = ($correct == $student); Context()->flags->set(bizarroMul=>0); Value::Error( "Your answer is equivalent to the correct answer, but not in the expected form. Maybe it needs to be simplified, factored, expanded, have its denominator rationalized, etc." ) unless $OK; return $OK; } ); ############################################################ # Body ############################################################ BEGIN_PGML Simplify the expression [`[$given]\text{.}`] [_]{$evaluator}{10} END_PGML ############################################################ # Hint ############################################################ #Set value of $showHint in PGcourse.pl for course-wide attempt threshhold for revealing hints BEGIN_PGML_HINT Add the exponents. END_PGML_HINT ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION To simplify the product of two powers of the same base, add the exponents. [```\newcommand{\amp}{&} \begin{aligned} [$given]\amp=x^{2+5}\\ \amp=[$answer] \end{aligned} ```] END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/showcase/generated/webwork/pg/PreTeXt_Showcase/6_3-String_Answers.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:26:17-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(6.3) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGlateximage.pl", "contextArbitraryString.pl", "PTXSC.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context("ArbitraryString"); $platypus = Compute("platypus")->cmp(checker => sub { my ($correct,$student,$ans) = @_; $correct = $correct->value; $student = $student->value; $student = lc($student); $student =~ s/ +/ /; $student =~ s/^ //; $student =~ s/ $//; return ($student eq $correct); }); $image_1 = createLaTeXImage(); $image_1->addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw[fill=red, opacity=0.5] (0,0) circle (2cm) node[below left=1.5cm, opacity=1] {Has a Bill} node[below left, opacity=1] {Duck}; \draw[fill=green, opacity=0.5] (60:2cm) circle (2cm) node [above=2.1cm, opacity=1] {Is Venemous} node[above=0.5cm, opacity=1] {Jellyfish}; \draw[fill=blue, opacity=0.5] (0:2cm) circle (2cm) node [below right=1.5cm, opacity=1] {Has Fur} node[below right, opacity=1] {Beaver}; \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML This Venn Diagram groups animals by certain characteristics. >> [@image(insertGraph($image_1), width=>300)@]* << Name an animal that belongs in the center region. Spelling counts! [_]{$platypus}{30} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/showcase/generated/webwork/pg/PreTeXt_Showcase/6_5-Structured_with_Tasks.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:26:17-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(6.5) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "scaffold.pl", "contextFiniteSolutionSets.pl", "contextForm.pl", "contextFraction.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); COMMENT('This problem is scaffolded with multiple parts'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context("Fraction"); $quadratic = Formula("2 x^2 - 7 x - 15")->reduce; $x1 = Fraction(5,1); $x2 = Fraction(-3,2); Context()->flags->set(reduceConstants=>0,reduceConstantFunctions=>0); Context("FiniteSolutionSets"); $solutions = Formula("-3/2,5"); ############################################################ # Body ############################################################ BEGIN_PGML This problem has multiple parts that must be completed in order. Try answering the second part with various things you might expect a user to enter. END_PGML ############################################################ # Scaffold ############################################################ Scaffold::Begin(numbered => 1,is_open => "correct_or_first_incorrect",can_open => always,); ############################################################ # Section ############################################################ Section::Begin("Identify Coefficients"); BEGIN_PGML Consider the equation [```[$quadratic] = 0```] Identify the coefficients for the quadratic equation using the standard form from Subsection[$NBSP]*1.1. [`a=`] [_]{2}{4}, [`b=`] [_]{-7}{4}, [`c=`] [_]{-15}{4} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Take the coefficient of [`x^2`] for the value of [`a\text{,}`] the coefficient of [`x`] for [`b\text{,}`] and the constant for [`c\text{.}`] _In this case_, they are [`a = 2\text{,}`] [`b = -7\text{,}`] [`c = -15\text{.}`] END_PGML_SOLUTION Section::End(); ############################################################ # Section ############################################################ Section::Begin("Use the Quadratic Formula"); BEGIN_PGML Use the quadratic formula to find the solution set to [```[$quadratic]=0```] [_]{$solutions}{30} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Recall that the quadratic formula is given in Subsection[$NBSP]*1.1. You already identified [`a = 2\text{,}`] [`b = -7\text{,}`] and [`c = -15\text{,}`] and the results from using these in the quadratic formula are [`-\frac{3}{2}`] and [`5\text{.}`] END_PGML_SOLUTION Section::End(); Scaffold::End(); ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/showcase/generated/webwork/pg/PreTeXt_Showcase/6_6-Units_in_Answers.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:26:17-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(6.6) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "parserNumberWithUnits.pl", "contextCurrency.pl", "contextPercent.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ $newUnits = [ {name=>'gallons',conversion=>{factor=>0.00378541,m=>3}}, {name=>'gallon',conversion=>{factor=>0.00378541,m=>3}}, {name=>'gal',conversion=>{factor=>0.00378541,m=>3}}, ]; Context()->flags->set(tolType=>'absolute',tolerance=>0.1); $volume = NumberWithUnits("20/2.78 gal", {newUnit=>$newUnits}); Context("Percent"); Context()->flags->set(tolerance=>0.01); $increase = Percent(352/278-1); Context("Currency"); $cost = Currency(3.52*1.028); ############################################################ # Body ############################################################ BEGIN_PGML a. The average cost of gasoline in the United States in 2010 was \$2.78 per gallon. How much gasoline would \$20 get you in 2010, on average? [_]{$volume}{10} a. In 2011, the average cost was \$3.52 per gallon. What percent increase was that from 2010? [_]{$increase}{10} a. In 2012, the cost had risen 2.8% from the 2011 cost. What was the cost of a gallon of gasoline in 2012? [_]{$cost}{10} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/showcase/generated/webwork/pg/PreTeXt_Showcase/def/setPreTeXt_Showcase.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = PreTeXt_Showcase/header/PreTeXt_Showcase.pg screenHeaderFile = PreTeXt_Showcase/header/PreTeXt_Showcase.pg description = PreTeXt Showcase problemListV2 problem_start source_file = PreTeXt_Showcase/6_1-Answer_Type_Variety.pg problem_id = 1 problem_end problem_start source_file = PreTeXt_Showcase/6_2-Special_Feedback.pg problem_id = 2 problem_end problem_start source_file = PreTeXt_Showcase/6_3-String_Answers.pg problem_id = 3 problem_end problem_start source_file = Library/PCC/BasicAlgebra/NumberBasics/FactorInteger10.pg problem_id = 4 problem_end problem_start source_file = PreTeXt_Showcase/6_5-Structured_with_Tasks.pg problem_id = 5 problem_end problem_start source_file = PreTeXt_Showcase/6_6-Units_in_Answers.pg problem_id = 6 problem_end ================================================ FILE: examples/showcase/generated/webwork/pg/PreTeXt_Showcase/header/PreTeXt_Showcase.pg ================================================ # Header file for problem set PreTeXt_Showcase # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Article of PreTeXt Showcase."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/showcase/generated/webwork/pg/PreTeXt_Showcase/macros/PTXSC.pl ================================================ ############################################################################# # This macro library supports WeBWorK problems from the PreTeXt project named # PreTeXt Showcase ############################################################################# # Return a string containing the latex-image-preamble contents. # To be used by LaTeXImage objects as in: # $image->addToPreamble(latexImagePreamble()) sub latexImagePreamble { return <<'END_LATEX_IMAGE_PREAMBLE' \usepackage{tikz} \usepackage{pgfplots} \usetikzlibrary{positioning} % for worksheet \usepackage{pstricks} \usepackage{phaistos} \usepackage{xcolor} END_LATEX_IMAGE_PREAMBLE } ================================================ FILE: examples/showcase/generated/webwork/special-feedback.xml ================================================

    Simplify the expression {x^{2}x^{5}}\text{.}

    Add the exponents.

    x^{7}

    To simplify the product of two powers of the same base, add the exponents.

    \begin{aligned} {x^{2}x^{5}}\amp=x^{2+5}\\ \amp={x^{7}} \end{aligned}

    operators->set( '*' => {class => 'bizarro::BOP::multiply', isCommand => 1}, ' *' => {class => 'bizarro::BOP::multiply', isCommand => 1}, '* ' => {class => 'bizarro::BOP::multiply', isCommand => 1}, ); $given = Formula("x^2 x^5"); $answer = Formula("x^7"); $special = Formula("x^10"); $evaluator = $answer -> cmp( checker=>sub{ my ( $correct, $student, $ansHash ) = @_; Value::Error("When multiplying powers with the same base, you do not multiply the exponents.") if ($special == $student); return 0 if $ansHash->{isPreview} || $correct != $student; Context()->flags->set(bizarroMul=>1); delete $correct->{test_values}; delete $student->{test_values}; my $OK = ($correct == $student); Context()->flags->set(bizarroMul=>0); Value::Error( "Your answer is equivalent to the correct answer, but not in the expected form. Maybe it needs to be simplified, factored, expanded, have its denominator rationalized, etc." ) unless $OK; return $OK; } ); ############################################################ # Body ############################################################ BEGIN_PGML Simplify the expression [`[$given]\text{.}`] [_]{$evaluator}{10} END_PGML ############################################################ # Hint ############################################################ #Set value of $showHint in PGcourse.pl for course-wide attempt threshhold for revealing hints BEGIN_PGML_HINT Add the exponents. END_PGML_HINT ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION To simplify the product of two powers of the same base, add the exponents. [```\newcommand{\amp}{&} \begin{aligned} [$given]\amp=x^{2+5}\\ \amp=[$answer] \end{aligned} ```] END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/showcase/generated/webwork/string-answers.xml ================================================

    This Venn Diagram groups animals by certain characteristics.

    Name an animal that belongs in the center region. Spelling counts!

    {\text{platypus}}

    cmp(checker => sub { my ($correct,$student,$ans) = @_; $correct = $correct->value; $student = $student->value; $student = lc($student); $student =~ s/ +/ /; $student =~ s/^ //; $student =~ s/ $//; return ($student eq $correct); }); $image_1 = createLaTeXImage(); $image_1->addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw[fill=red, opacity=0.5] (0,0) circle (2cm) node[below left=1.5cm, opacity=1] {Has a Bill} node[below left, opacity=1] {Duck}; \draw[fill=green, opacity=0.5] (60:2cm) circle (2cm) node [above=2.1cm, opacity=1] {Is Venemous} node[above=0.5cm, opacity=1] {Jellyfish}; \draw[fill=blue, opacity=0.5] (0:2cm) circle (2cm) node [below right=1.5cm, opacity=1] {Has Fur} node[below right, opacity=1] {Beaver}; \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML This Venn Diagram groups animals by certain characteristics. >> [@image(insertGraph($image_1), width=>300)@]* << Name an animal that belongs in the center region. Spelling counts! [_]{$platypus}{30} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/showcase/generated/webwork/structured-with-tasks.xml ================================================

    This problem has multiple parts that must be completed in order. Try answering the second part with various things you might expect a user to enter.

    Identify Coefficients

    Consider the equation

    {2x^{2}-7x-15} = 0

    Identify the coefficients for the quadratic equation using the standard form from Subsection1.1.

    a= , b= , c=

    2

    -7

    -15

    Take the coefficient of x^2 for the value of a\text{,} the coefficient of x for b\text{,} and the constant for c\text{.} In this case, they are a = 2\text{,} b = -7\text{,} c = -15\text{.}

    Use the Quadratic Formula

    Use the quadratic formula to find the solution set to

    {2x^{2}-7x-15}=0

    \frac{-3}{2}, 5

    Recall that the quadratic formula is given in Subsection1.1.

    You already identified a = 2\text{,} b = -7\text{,} and c = -15\text{,} and the results from using these in the quadratic formula are -\frac{3}{2} and 5\text{.}

    reduce; $x1 = Fraction(5,1); $x2 = Fraction(-3,2); Context()->flags->set(reduceConstants=>0,reduceConstantFunctions=>0); Context("FiniteSolutionSets"); $solutions = Formula("-3/2,5"); ############################################################ # Body ############################################################ BEGIN_PGML This problem has multiple parts that must be completed in order. Try answering the second part with various things you might expect a user to enter. END_PGML ############################################################ # Scaffold ############################################################ Scaffold::Begin(numbered => 1,is_open => "correct_or_first_incorrect",can_open => always,); ############################################################ # Section ############################################################ Section::Begin("Identify Coefficients"); BEGIN_PGML Consider the equation [```[$quadratic] = 0```] Identify the coefficients for the quadratic equation using the standard form from Subsection[$NBSP]*1.1. [`a=`] [_]{2}{4}, [`b=`] [_]{-7}{4}, [`c=`] [_]{-15}{4} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Take the coefficient of [`x^2`] for the value of [`a\text{,}`] the coefficient of [`x`] for [`b\text{,}`] and the constant for [`c\text{.}`] _In this case_, they are [`a = 2\text{,}`] [`b = -7\text{,}`] [`c = -15\text{.}`] END_PGML_SOLUTION Section::End(); ############################################################ # Section ############################################################ Section::Begin("Use the Quadratic Formula"); BEGIN_PGML Use the quadratic formula to find the solution set to [```[$quadratic]=0```] [_]{$solutions}{30} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Recall that the quadratic formula is given in Subsection[$NBSP]*1.1. You already identified [`a = 2\text{,}`] [`b = -7\text{,}`] and [`c = -15\text{,}`] and the results from using these in the quadratic formula are [`-\frac{3}{2}`] and [`5\text{.}`] END_PGML_SOLUTION Section::End(); Scaffold::End(); ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/showcase/generated/webwork/units-in-answers.xml ================================================

    1. The average cost of gasoline in the United States in 2010 was $2.78 per gallon. How much gasoline would $20 get you in 2010, on average?

    2. In 2011, the average cost was $3.52 per gallon. What percent increase was that from 2010?

    3. In 2012, the cost had risen 2.8% from the 2011 cost. What was the cost of a gallon of gasoline in 2012?

    7.19424\ {\rm gal}

    26.6\%

    \$3.62

    'gallons',conversion=>{factor=>0.00378541,m=>3}}, {name=>'gallon',conversion=>{factor=>0.00378541,m=>3}}, {name=>'gal',conversion=>{factor=>0.00378541,m=>3}}, ]; Context()->flags->set(tolType=>'absolute',tolerance=>0.1); $volume = NumberWithUnits("20/2.78 gal", {newUnit=>$newUnits}); Context("Percent"); Context()->flags->set(tolerance=>0.01); $increase = Percent(352/278-1); Context("Currency"); $cost = Currency(3.52*1.028); ############################################################ # Body ############################################################ BEGIN_PGML a. The average cost of gasoline in the United States in 2010 was \$2.78 per gallon. How much gasoline would \$20 get you in 2010, on average? [_]{$volume}{10} a. In 2011, the average cost was \$3.52 per gallon. What percent increase was that from 2010? [_]{$increase}{10} a. In 2012, the cost had risen 2.8% from the 2011 cost. What was the cost of a gallon of gasoline in 2012? [_]{$cost}{10} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/showcase/project.ptx ================================================ html source/pretext-showcase.ptx publisher/publication.xml output/html latex source/pretext-showcase.ptx publisher/publication.xml output/latex pdf source/pretext-showcase.ptx publisher/publication.xml output/pdf html source/pretext-showcase.ptx publisher/publication.xml output/subset ch-first latex pdflatex xelatex asy sage convert pdftops pdf-crop-margins pageres node file2brl ================================================ FILE: examples/showcase/publisher/publication.xml ================================================ ================================================ FILE: examples/showcase/source/environments.ptx ================================================
    Environments Oscar Levin
    • Demonstrate block environments.

    • Illustrate styling.

    This section will demonstrate some of the environments available in . In addition to cataloging the options an author has to break up content, this will be a nice place to play with various styles that are under development.

    Maybe a better way to describe what this section will do is by specifying our objectives. Luckily there is an environment for that.

    Traditional Structure

    Many mathematics papers and textbook chapters are organized in the traditional definition-lemma-proof-theorem-proof format. Depending on how friendly the paper is, or who the intended audience is, there might be quite a bit of exposition surrounding these elements. This subsection is intended to be an illustration of this structure.

    We begin with some basic definitions. Depending on the narrative style of your text, you might want to define terms in the middle of paragraphs. We might call this an inline definition, which can be accomplished using the term tag.

    More formal texts will likely want numbered definitions.

    A numbered definition is a definition that gets a number. Note that we should still put the term being defined in term tags.

    One advantage to having numbered definitions (see ) is that you can refer to them, just like we just did. We can also refer to titled definitions (see ).

    Titled definitions

    When a definition is a numbered definition that also gets a title, we call it a titled definition.

    At this point it might be useful to give a few examples of the terms defined by your definitions. Of course here the definitions are examples of definitions, so instead will illustrate our point with an example of an example.

    This example is an example of an example that stands alone. It does not have a question in it, so it does not need a solution.

    Of course examples can consist of more than one paragraph, as this is also an example of. In fact, we could put an ordered list of things that could go in an example:

    1. There could just be a paragraph or two.

    2. There could be a list of examples.

    3. All of the above.

    While on this topic, it is worth mentioning that many authors choose to include examples of problems that can be solved. This suggests that part of an example is the solution. For example:

    exampleof example

    How do you include an example that has a solution, and maybe also a hint?

    Make sure you put the question is the statement.

    As mentioned in the hint, you must structure the example as a statement, followed by a hint, answer, and/or solution.

    This example is not an example of an example that has a separate answer, but of course you could have an answer as well.

    Examples with titles

    Can examples have titles?

    Yes.

    Returning to our main goal of establishing new mathematical theory, we might next state an axiom or two (especially if we are named Euclid). In the environments for axioms are not definition-like (the only definition-like environment is a definition). There are quite a few axiom-like environments.

    Axiom-like environments consist of: axiom, conjecture, principle, heuristic, hypothesis, and assumption.

    Once you have defined your terms and stated your axioms, you will likely want to prove something. Perhaps you will start with a lemma or two, use them to prove a theorem, followed by a few corollaries. If you are not as confident in the importance of your results, you might call them propositions or just facts.

    There exist lemmas that are presented without proof.

    The lemma above did not have a proof, since it's proof is obvious.

    Lemmas can have proofs.

    This is clear, as it follows from the proof of .

    Using the two lemmas above, we arrive at the following:

    The Fundamental Theorem of Nonsense

    Let P be any statement that follows from the two lemmas above. Then P is true.

    There is no reason you need to prove a theorem right away. You can always have some text, like this paragraph, before the proof. You could even have an example of how a theorem could be applied before pulling the reader back in for the eagerly awaited proof.

    This is an example of how you might interject an example before completing a proof. As such it is put between the statement of the theorem and its proof.

    Note that if you don't give a proof a title, it will get titled proof automatically. It makes sense to put a custom title in this case since you are referring to a proof of the a theorem that was stated without proof earlier.

    Proof of <xref ref="thm-example"/>

    Let P be as described in the theorem. By the lemmas, P is true.

    Therefore, P.

    The previous theorem is not useful.

    Lemmas, theorems, and corollaries naturally go together. There are other theorem-like environments that you might view as parallel to these. Here is an example.

    Propositions are like theorems, but perhaps not as important.

    If students are reading your textbook, it might be time to collect the main points that you have made for your students and put them in a box. You could also put your result in the box and let your student roam free. The following is an assemblage.

    Types of environments

    allows for a variety of environments:

    • Definitions

    • Theorem-like environments

    • Assemblages, to assemble or summarize important connected ideas.

    Your paper will likely have lots of remarks about its content as the connecting text between theorems, as this section exemplifies. However, it might also be useful to highlight important remarks, or to set off remarks that do not otherwise fit into the main flow of the text.

    Resist the temptation to use assemblages just because they give you the desired styling.

    If your remark is far removed from your main content, you might make it as an aside.

    Another environment like a remark is a note. Other remark-like environments are convention, observation, warning, and insight.

    No self-respecting paper on self-reference would be complete without some open questions. You might make some conjectures, which are axiom-like environments in .

    All the conjectures made in this paper are false.

    You might also present a question for your readers. The question and problem environments might be appropriate, although note that these are example-like, as they can receive hints, answers, and solutions.

    What's the difference between an example and a question or problem?

    Basically, it's just the name of the environment. Practically, the different environments might have pedagogical uses, and potentially they could be styled differently.

    Find a better solution to .

    As a final example, we present a renamed environment. In , one of the theorem-like environments is fact. But perhaps you would rather use Self Evident Fact as your environment name. The following is coded as fact, but using rename in docinfo we can get the following

    It goes without saying!

    In addition to example, provides two more example-like environments: question and problem.

    Inquiry Based Structure

    Another way you might structure a chapter is to give students more opportunities to actively engage in the material. You might give a long list of definitions, and then a list of theorems to prove. That would look a lot like the previous section (perhaps with fewer paragraphs between elements).

    Alternatively, you can mix inquiry based learning (IBL) structure into a more traditionally formatted section using appropriate environments. You might start a section with an activity, for example.

    Make a list of all the project-like environments, such as this activity.

    You might want to break down the activity into smaller tasks, which can be done by specifying each task, as in the following project.

    First you give an introduction to the project to tie the tasks together. Then:

    Specify the first task.

    Should the second task have a hint?

    It could.

    Can tasks, or stand alone projects, have answers or solutions?

    Yes. They can have both.

    Yes, they can. Depending on how the publisher chooses to produce your book, these could be hidden completely, moved to the back of the book, or displayed as knowls.

    You might end the project with a conclusion.

    Of course you might still have definitions, theorems, and examples in a document like this.

    A definition is illustrative if it serves the purpose of illustrating something.

    And then you might have an example.

    Should an example always follow a definition?

    No, but it could.

    Examples are a good way to ask students to think about a problem but provide a solution right away. To encourage students to think about a problem more before giving the solution, you could use an exercise. In , exercises that occur inside a section, along with other content, are called checkpoints, even though they are coded simply as exercise

    Write an exercise inside a section to show what they look like.

    Done.

    Of course, in this style of document, collecting important ideas is especially important.

    Components of good IBL writing

    Texts that support inquiry based learning should contain lots of opportunities for students to engage with the material, but can still be friendly and help students along their journey of discovery.

    ================================================ FILE: examples/showcase/source/exercises.ptx ================================================
    Exercises

    An interesting concept from group theory is that of a Sylow-p subgroup.

    Sylow-<m>p</m> subgroup

    If G is a finite group, and p is a prime number, and p^k is the largest power of p dividing \order{G}, then a Sylow-p subgroup of G is a subgroup of G with order p^k.

    This definition allows k to be 0, so p might not divide \order{G}. There is a theorem that gives information about how many Sylow-p subgroups a finite group might have.

    Sylow Theorem

    If G is a finite group and p is a prime dividing \order{G}, then the number of Sylow-p subgroups of G divides \order{G} and is congruent to 1 modulo p.

    Sylow-<m>3</m> subgroups, group of order <m>45</m>

    If G is a group of order 45, how many Sylow-3 subgroups could G have?

    Write n_3 to represent the number of Sylow-3 subgroups. We factor 45=9\cdot5, separating the maximal power of 3 from its complement. Since n_3 divides 45 and n_3\equiv1 modulo 3, it follows that n_3 divides 5. So either n_3=1 or n_3=5. But of those two options, only 1 is congruent to 1 mod 3. So G must have 1 Sylow-3 subgroup.

    Sylow-<m>7</m> subgroups, group of order <m>63</m>

    If G is a group of order 63, how many Sylow-7 subgroups could G have?

    Factor 63 and use .

    G has 1 Sylow-7 subgroup.

    Write n_7 to represent the number of Sylow-7 subgroups. We factor 63=9\cdot7, separating the maximal power of 7 from its complement. Since n_7 divides 63 and n_7\equiv1 modulo 7, it follows that n_7 divides 9. So either n_7=1, n_7=3, or n_7=9. But of those, only 1 is a real possibility, since only 1 is congruent to 1 mod 7. So G has 1 Sylow-7 subgroup.

    Sylow-<m>3</m> subgroups, group of order <m>63</m>

    If G is a group of order 63, how many Sylow-3 subgroups could G have?

    Factor 63 and use .

    G either has 1 Sylow-3 subgroup or it has 7.

    Write n_3 to represent the number of Sylow-3 subgroups. We factor 63=9\cdot7, separating the maximal power of 3 from its complement. Since n_3 divides 63 and n_3\equiv1 modulo 3, it follows that n_3 divides 7. So either n_3=1 or n_3=7. Both of those are real possibilities, since both are congruent to 1 mod 3. So G either has 1 Sylow-3 subgroup or it has 7.

    Understanding how to count Sylow-p subgroups will help us later when we are classifying finite groups.

    Does a group of order 21 have a Sylow-5 subgroup?

    Does always tell you exactly how many Sylow-p subgroups a finite group G has when you know the order of G?

    Vocabulary

    Research Sylow and explain who this person was with a short, one-paragraph biography.

    Given a group G of order 72, what would be the order of a Sylow-2 subgroup?

    Calculations

    If G is a group of order 2p for an odd prime p, how many Sylow-p subgroups might G have?

    Let G be a group of order 30. For each p, how many Sylow-p subgroups might G have?

    p=2

    p=3

    p=5

    Thinking Deeper

    If G has only one Sylow-p subgroup for some prime p, prove that it is a normal subgroup.

    If \order{G}=pq for primes p\lt q, what conditions on p and q guarantee that G\cong C_p\times C_q?

    ================================================ FILE: examples/showcase/source/latex-image.ptx ================================================
    Images and Diagrams Images and Diagrams from <latex/> Code
    tikz Examples imageTikZ source a drawing of a tall building and a tennis ball being launched upward; the path of the ball is an arc that goes upward and then downward to the ground \definecolor{ruby}{HTML}{9e0c0f} \definecolor{turquoise}{HTML}{008099} \begin{tikzpicture} \begin{axis}[ axis x line=none, axis y line=none, xmin=-3,xmax=6, ymin=-10, ymax=150, grid=none ] \addplot[color=ruby, fill=ruby!30] coordinates{(-1.5,0)(-1.5,80)(0.5,80)(0.5,0)(-1.5,0)}; \addplot[color=black,fill=white] coordinates{(0.2,8)(0,8)(0,3)(0.2,3)(0.2,8)(0,8)(0.1,8)(0.1,3)(0.1,5.5)(0,5.5)(0.2,5.5)}; \addplot[color=black,fill=white] coordinates{(-1,8)(-1.2,8)(-1.2,3)(-1,3)(-1,8)(-1.2,8)(-1.1,8)(-1.1,3)(-1.1,5.5)(-1.2,5.5)(-1,5.5)}; \addplot[color=black,fill=black!40] coordinates{(-0.3,9)(-0.3,0)(-0.7,0)(-0.7,9)(-0.3,9)}; \addplot[color=black] coordinates{(-0.5,0)(-0.5,9)}; \foreach \x in {0,...,2} \foreach \y in {0,...,5} {\addplot[color=black,fill=white] coordinates{(0.6*\x-1,18+10*\y)(0.6*\x-1.2,18+10*\y)(0.6*\x-1.2,13+10*\y)(0.6*\x-1,13+10*\y)(0.6*\x-1,18+10*\y)(0.6*\x-1.2,18+10*\y)(0.6*\x-1.1,18+10*\y)(0.6*\x-1.1,13+10*\y)(0.6*\x-1.1,15.5+10*\y)(0.6*\x-1.2,15.5+10*\y)(0.6*\x-1,15.5+10*\y)};} \addplot[color=black] coordinates{(-3,0)(6,0)}; \addplot[mark=*, samples=15, variable=\t, domain=0:5, smooth, -, color=turquoise] ({t}, {-16*t^2+64*t+80}); \end{axis} \end{tikzpicture} visual proof of the identity that the sum of k from k=1 to k=n is equal to n+1 choose 2

    There is a single ball at the top; beneath that there is a row with two balls; beneath that there is a row with three balls, then four, then five, then six.

    Below all this is a row with seven balls and a particular subset of two of those balls is highlighted. The diagram illustrates a correspondence from that pair to a particular ball in the upper collection.

    { \definecolor{summand}{rgb}{0.1, 0.1, 0.95} \definecolor{pair}{rgb}{0.9, 0.45, 0} \huge \begin{tikzpicture} \draw [dashed] (0.5-0.5*6.5,-0.866025*6.5) -- (7-0.5*6.5,-0.866025*6.5); \draw [very thick] (2-0.5*7,-0.866025*7) -- (2-0.5*4,-0.866025*4) -- (5-0.5*7,-0.866025*7); \foreach \x in {1,...,6} \foreach \y in {1,...,\x} \shade[ball color=summand!30] (\y-0.5*\x,-0.866025*\x) circle (0.2cm); \foreach \y in {1,...,7} \shade[ball color=pair!40] (\y-0.5*7,-0.866025*7) circle (0.2cm); \node at (2.5,-0.5) [anchor=north west]{$\color{summand}\sum\limits_{k=1}^nk\color{black}=\color{pair}\binom{n+1}{2}$}; \shade[ball color=summand] (2-0.5*4,-0.866025*4) circle (0.2cm); \shade[ball color=pair] (2-0.5*7,-0.866025*7) circle (0.2cm); \shade[ball color=pair] (5-0.5*7,-0.866025*7) circle (0.2cm); \end{tikzpicture} }
    pgfplots Examples imagepgfplots source a plot of the implicitly defined curve x cos(x y) = 4 - y; the viewing window is [-7,7] x [-4,10.6] \begin{tikzpicture}[ declare function={ c(\x)= cos(\x^2*180/3.14159265359); sp(\x)=sqrt(4+\x^2*c(\x)); sm(\x)=sqrt(4-\x^2*c(\x)); m(\x)= 2+sm(\x); o(\x)= 2-sm(\x); p(\x)= 2+sp(\x); q(\x)= 2-sp(\x); f(\x)= \x^2/m(\x); g(\x)= m(\x)/c(\x); h(\x)= -\x^2/p(\x); k(\x)= p(\x)/c(\x); } ] \begin{axis}[ xmin = -7, xmax = 7, ymin = -4, ymax = 10.6, xtick = {-4,-2,...,4}, ytick = {-4,-2,...,10}, minor xtick = {-7,-6,...,7}, minor ytick = {-4,-3,...,10}, variable = v, color = red, mark = none, solid, axis lines = center, axis line style = {<->}, xlabel = {$x$}, ylabel = {$y$}, yticklabel style={inner sep=0.333ex}, scale only axis, tick label style={font=\footnotesize, color = black}, grid = minor, grid style = {solid,gray!40}, ] \addplot[domain=0:2.2] ({f(v)},{m(v)}); \addplot[domain=2.2:2.3499859792] ({f(v)},{m(v)}); \addplot[domain=2.6965731707:2.72] ({f(v)},{m(v)}); \addplot[domain=2.72:3.1] ({f(v)},{m(v)}); \addplot[domain=3.1:3.36] ({f(v)},{m(v)}); \addplot[domain=3.36:3.369] ({f(v)},{m(v)}); \addplot[domain=3.7207600255:3.75] ({f(v)},{m(v)}); \addplot[domain=3.75:4.1] ({f(v)},{m(v)}); \addplot[domain=4.1:4.1826819343] ({f(v)},{m(v)}); \addplot[domain=4.5013070528:4.6] ({f(v)},{m(v)}); \addplot[domain=4.6:4.8] ({f(v)},{m(v)}); \addplot[domain=4.8:4.8632109381] ({f(v)},{m(v)}); \addplot[domain=5.1649321939:5.2] ({f(v)},{m(v)}); \addplot[domain=5.2:5.4] ({f(v)},{m(v)}); \addplot[domain=5.4:5.4596904128] ({f(v)},{m(v)}); \addplot[domain=5.7524607477:5.9970858912] ({f(v)},{m(v)}); \addplot[domain=6.2854560605:6.4899313929] ({f(v)},{m(v)}); \addplot[domain=6.7769950285:6.9475348363] ({f(v)},{m(v)}); \addplot[domain=7.2357791015:7.3762238487] ({f(v)},{m(v)}); \addplot[domain=7.6680608384:7.7804196739] ({f(v)},{m(v)}); \addplot[domain=8.0787873209:8.1630812697] ({f(v)},{m(v)}); \addplot[domain=8.4729783943:8.525239357] ({f(v)},{m(v)}); \addplot[mark=none] coordinates {({f(2.3499859792)},{m(2.3499859792)}) ({g(2.3499859793)},{o(2.3499859793)})}; \addplot[domain=2.2795725971:2.3499859793] ({g(v)},{o(v)}); \addplot[mark=none] coordinates {({f(2.6965731707)},{m(2.6965731707)}) ({g(2.696573171)},{o(2.696573171)})}; \addplot[domain=2.696573171:2.7240684007] ({g(v)},{o(v)}); \addplot[mark=none] coordinates {({f(3.369)},{m(3.369)}) ({g(3.3697995683)},{o(3.3697995683)})}; \addplot[domain=3.36795:3.3697995683] ({g(v)},{o(v)}); \addplot[domain=0.15:0.9934229315] ({g(v)},{o(v)}); \addplot[domain=1.4952570458:2.0001872665] ({g(v)},{o(v)}); \addplot[domain=2.9496641015:3.178782971] ({g(v)},{o(v)}); \addplot[domain=3.9009258917:4.0194955921] ({g(v)},{o(v)}); \addplot[domain=0:1.8] ({h(v)},{p(v)}); \addplot[domain=1.8:2.2] ({h(v)},{p(v)}); \addplot[domain=2.2:2.8] ({h(v)},{p(v)}); \addplot[domain=2.8:2.89] ({h(v)},{p(v)}); \addplot[domain=3.2571424315:3.3] ({h(v)},{p(v)}); \addplot[domain=3.3:3.75] ({h(v)},{p(v)}); \addplot[domain=3.75:3.7971078497] ({h(v)},{p(v)}); \addplot[domain=4.1295834659:4.2] ({h(v)},{p(v)}); \addplot[domain=4.2:4.5] ({h(v)},{p(v)}); \addplot[domain=4.5:4.5356939968] ({h(v)},{p(v)}); \addplot[domain=4.844517562:4.9] ({h(v)},{p(v)}); \addplot[domain=4.9:5] ({h(v)},{p(v)}); \addplot[domain=5:5.170055092] ({h(v)},{p(v)}); \addplot[domain=5.4665876095:5.5] ({h(v)},{p(v)}); \addplot[domain=5.5:5.7] ({h(v)},{p(v)}); \addplot[domain=5.7:5.7347036241] ({h(v)},{p(v)}); \addplot[domain=6.0248230446:6.2484075213] ({h(v)},{p(v)}); \addplot[domain=6.5357897386:6.7226893127] ({h(v)},{p(v)}); \addplot[domain=7.0100484639:7.1651804638] ({h(v)},{p(v)}); \addplot[domain=7.4549045114:7.5811656127] ({h(v)},{p(v)}); \addplot[domain=7.8758321028:7.9743147713] ({h(v)},{p(v)}); \addplot[domain=8.2775481783:8.3468023025] ({h(v)},{p(v)}); \addplot[domain=8.6671994161:8.6968286602] ({h(v)},{p(v)}); \addplot[mark=none] coordinates {({g(0.15)},{o(0.15)}) ({k(0.15)},{q(0.15)})}; \addplot[domain=0.15:0.9690222774] ({k(v)},{q(v)}); \addplot[domain=2.3375568425:2.6564493594] ({k(v)},{q(v)}); \addplot[domain=3.4567020839:3.6249982793] ({k(v)},{q(v)}); \addplot[domain=4.3047344897:4.3734360266] ({k(v)},{q(v)}); \addplot[mark=none] coordinates {({h(3.2571424315)},{p(3.2571424315)}) ({k(3.2571424316)},{q(3.2571424316)})}; \addplot[domain=3.2571424316:3.2608706576] ({k(v)},{q(v)}); \addplot[mark=none] coordinates {({h(2.89)},{p(2.89)}) ({k(2.89)},{q(2.89)})}; \addplot[domain=2.8754877926:2.89] ({k(v)},{q(v)}); \addplot[domain=1.4584452866:2.0506909475] ({k(v)},{q(v)}); \addplot[mark=none] coordinates {(3,-2)} node[black] {$x \cos(x y) = 4 - y$}; \end{axis} \end{tikzpicture} a 3D partial plot of the surface defined by r(u,v) = (u + v, u^2, v^2) \begin{tikzpicture} \begin{axis}[ compat=1.9, x={(-0.2cm,-0.1cm)}, y={(.375cm,0.0cm)}, z={(0cm,0.375cm)}, xlabel={}, ylabel={}, zlabel={}, xmin = -4, xmax = 4, ymin = -4, ymax = 4.5, zmin = -4, zmax = 4.5, xtick = {10}, ytick = {10}, ztick = {10}, samples = 10, samples y = 10, axis lines = center, ] \addplot3[surf, shader = faceted interp, domain = -2:0, y domain = -2:0,] ({x+y}, {x^2}, {y^2}); \addplot3[<->, domain = -2:2, samples y= 0] ({-1+x}, {1^2}, {x^2}); \addplot3[<->>, domain = -2:2, samples y= 0] ({-1.5+x}, {x^2}, {1.5^2}); \addplot3[surf, shader = faceted interp, domain = 0:2, y domain = -2:0,] ({x+y}, {x^2}, {y^2}); \addplot3[<->, domain = -2:2, samples y= 0] ({1.2+x}, {1.2^2}, {x^2}); \addplot3[surf, shader = faceted interp, domain = -2:0, y domain = 0:2,] ({x+y}, {x^2}, {y^2}); \addplot3[<->, domain = 0:2, samples y= 0] ({-1+x}, {1^2}, {x^2}); \addplot3[<->>, domain = -2:2, samples y= 0] ({0.9+x}, {x^2}, {0.9^2}); \addplot3[surf, shader = faceted interp, domain = 0:2, y domain = -2:0,] ({(x+y)*(abs(x^2-y^2)/(x^2-y^2)+1)/2}, {x^2}, {y^2*(abs(x^2-y^2)/(x^2-y^2)+1)/2 + x^2*(abs(y^2-x^2)/(y^2-x^2)+1)/2}); \addplot3[->>, domain = 1.5:2, samples y= 0] ({-1.5+x}, {x^2}, {1.5^2}); \addplot3[surf, shader = faceted interp, domain = 0:2, y domain = 0:2,] ({x+y}, {x^2}, {y^2}); \addplot3[->>, domain = 0.1:2, samples y= 0] ({0.9+x}, {x^2}, {0.9^2}); \addplot3[<->>, domain = -2:2, samples y= 0] ({2+x}, {x^2}, {2^2}); \addplot3[<->>, domain = -2:2, samples y= 0] ({-2+x}, {x^2}, {2^2}); \addplot3[<->, domain = -2:2, samples y= 0] ({2+x}, {2^2}, {x^2}); \addplot3[<->, domain = -2:2, samples y= 0] ({-2+x}, {2^2}, {x^2}); \addplot3[->, domain = 0:2, samples y= 0] ({1.2+x}, {1.2^2}, {x^2}); \addplot3[mark=none] coordinates {(0, 1, -2)} node {$r(u,v)=(u+v,u^2,v^2)$}; \end{axis} \end{tikzpicture}
    Images and Diagrams from Asymptote
    Canada Canadian flag size(4cm,6cm); pen canadared=rgb(235/256,45/256,55/256); real flagwidth=4, flagheight=2; path flag_outline=scale(flagwidth,flagheight)*unitsquare; path cbar1=scale(1,2)*unitsquare, cbar2=shift(3,0)*cbar1; path mapleleafleft= (0,-102) --(-5,-102)--(-2,-56) {dir(87)}..{dir(190)} (-8,-53) --(-51,-61)--(-45,-45){dir(70)}..{dir(141)} (-46,-41)--(-94,-3) --(-82,1) {dir(25)}..{dir(108)} (-81,6) --(-90,34) --(-63,29) {dir(348)}..{dir(67)} (-59,30) --(-54,43) --(-33,20) {dir(313)}..{dir(101)} (-27,23) --(-38,76) --(-21,62) {dir(330)}..{dir(63)} (-16,67) --(0,100); path mapleleafright=reflect((0,0),(0,1))*reverse(mapleleafleft); path mapleleaf=mapleleafleft--mapleleafright--cycle; filldraw(flag_outline,white,black); fill(cbar1,canadared); fill(cbar2,canadared); fill(shift(2,1)*scale(.008)*mapleleaf,canadared); draw(flag_outline);
    European Union European Union flag size(4cm,6cm); pen euflagblue=rgb(31/256,68/256,186/256); pen euflagyellow=rgb(254/256,203/256,11/256); real flagheight=2.0, flagwidth=3; path flag_outline=shift(-flagwidth/2,-flagheight/2)*scale(flagwidth,flagheight)*unitsquare; filldraw(flag_outline,euflagblue); path unitstar=dir(90)--dir(234)--dir(18)--dir(162)--dir(306)--cycle; path star=scale(1/9)*unitstar; for(int k: sequence(12)) {fill(shift(2/3*dir(k*30))*star,euflagyellow);}
    United States American flag size(4cm,6cm); pen usflagred=rgb(178/256,34/256,52/256); pen usflagblue=rgb(60/256,59/256,110/256); currentpen=linewidth(0.2pt); real flagheight=2.0, flagwidth=3.8, unionheight=7/13*flagheight, unionwidth=2/5*flagwidth; path flag_outline=scale(flagwidth,flagheight)*unitsquare; path union_outline=scale(unionwidth,unionheight)*unitsquare; path stripe=scale(flagwidth,1/13*flagheight)*unitsquare; path unitstar=dir(90)--dir(234)--dir(18)--dir(162)--dir(306)--cycle; path star=scale(0.0616)*unitstar; pair union_origin=(0,6/13*flagheight); real starhshift=unionwidth/12, starvshift=unionheight/10; filldraw(flag_outline,white,black); for (int k: sequence(13)) if (k%2==0) fill(shift(0,k/13*flagheight)*stripe,usflagred); fill(shift(union_origin)*union_outline, usflagblue); for (int i: sequence(1,11)) for (int j: sequence(1,9)) if ((i+j)%2==0) fill(shift(union_origin+(i*starhshift,j*starvshift))*star,white); draw(flag_outline);
    Area under the curve f(x)=e^{-x^2} graphic showing the area under the plot of the function e^(-x^2) import graph; size (3 inch,0); real f(real x) {return exp(-x^2);} real xmin=-2, xmax=2; real ymin=-.3, ymax=1.3; path g=graph(f,xmin,xmax, operator ..); path h=(xmax,f(xmax))--(xmax,0)--(xmin,0); fill(g--h--cycle,lightyellow); draw(g); label("$f(x)=e^{-x^2}$", (xmin,.7),.5*N); draw((xmin,.7){SSE}..{SE}(-.8,f(-.8)),Arrow); label("Area $=\sqrt\pi$",(xmax,.7),.5*N); draw((xmax,.7){S}..{W}(.3,.3),Arrow); draw((xmin,0)--(xmax,0)); draw((0,ymin)--(0,ymax));
    Five set Venn diagram using ellipses Venn diagram with five sets using ellipses size(6cm,5cm); path [] P ; path Ellipse = shift(1.2,.2)*scale(3.25,1.5)*unitcircle; pen [] Colourpen = { rgb(.45,.05,.05), rgb(.05,.45,.05), rgb(.05,.05,.40), rgb(.30,.30,0), rgb(.30,0,.30) }; picture pic; for (int k: sequence(5)) { P[k]=rotate(k*72)*Ellipse; fill(P[k],Colourpen[k]); for (int l: sequence(k)) { fill(pic, P[k], Colourpen[k]+Colourpen[l]); clip(pic,P[l]); add(pic); for (int m: sequence(l)) { fill(pic, P[k], Colourpen[k]+Colourpen[l]+Colourpen[m]); clip(pic,P[l]); clip(pic,P[m]); add(pic); for (int n: sequence(m)) { fill(pic, P[k], Colourpen[k]+Colourpen[l]+Colourpen[m]+Colourpen[n]); clip(pic,P[l]); clip(pic,P[m]); clip(pic,P[n]); add(pic); } } } } fill(pic, P[0], Colourpen[0]+Colourpen[1]+Colourpen[2]+Colourpen[3]+Colourpen[4]); for (int k: sequence(5)) {clip(pic,P[k]);} for (int k: sequence(5)) {draw(P[k],linewidth(0.4));} add(pic);
    Rotatable Deathstar three-dimensional graphic of stellated icosahedron size (3 inch,0); import three ; currentprojection = perspective (21,25,15); currentlight = White; real phi = (1+ sqrt (5))/2; // Vertices of the icosahedron are of the form // (0, \pm 1, \pm\ phi ), (\ pm\phi , 0, \pm 1), // (\ pm 1, \pm\phi , 0) triple [] Pts = { (0,1,phi), (0,-1,phi), (phi,0,1), (1,phi,0), (-1,phi,0), (-phi,0,1), (phi,0,-1), (0,1,-phi), (-phi,0,-1), (-1,-phi,0), (1,-phi,0), (0,-1,-phi) }; // Faces listed as triples (i,j,k) corresponding // to the face through Pts [i], Pts [j] and Pts [k]. triple [] faces = { (0,1,2), (0,2,3), (0,3,4), (0,4,5), (0,5,1), (11,6,7), (11,7,8), (11,8,9), (11,9,10), (11,10,6), (10,1,2), (6,2,3), (7,3,4), (8,4,5), (9,5,1), (3,6,7), (4,7,8), (5,8,9), (1,9,10), (2,10,6) }; for(triple T: Pts) draw(shift(T)*scale3(.08)*unitsphere,lightyellow); real t =2.5; // Scaling for stellation height // Function to compute the stellation point triple stell_point (triple u, triple v, triple w) {return t/3*( u+v+w);} void stellate ( triple Face ) { int i= round ( Face .x), j= round ( Face .y), k= round ( Face .z); triple S= stell_point ( Pts [i], Pts [j], Pts [k ]); draw ( shift (S)* scale3 (.08)* unitsphere , yellow ); draw (S--Pts[i], red ); draw (S--Pts[j], red ); draw (S--Pts[k], red ); draw ( surface (S-- Pts [i]-- Pts [j]-- cycle ), lightgreen ); draw ( surface (S-- Pts [i]-- Pts [k]-- cycle ), lightgreen ); draw ( surface (S-- Pts [j]-- Pts [k]-- cycle ), lightgreen ); draw (Pts[i]--Pts[j]--Pts[k]--cycle, red ); } for ( triple Face : faces ) stellate ( Face );
    ================================================ FILE: examples/showcase/source/mathematics.ptx ================================================
    Mathematics The Quadratic Formula

    There is a derivation of the quadratic formula that avoids using fractions until the very end. Suppose that we have an equation ax^2+bx+c=0, where a\neq0. Since 4a is also not equal to 0, we may multiply each side of the equation by 4a and not lose any information: mathematicsintertext mathematicsaligned equations 4a^2x^2+4abx+4ac\amp=0 Subtract 4ac from each side: 4a^2x^2+4abx\amp=-4ac Complete the square on the left side by adding b^2 to each side: 4a^2x^2+4abx+b^2\amp=b^2-4ac (2ax+b)^2\amp=b^2-4ac \lvert 2ax+b\rvert\amp=\sqrt{b^2-4ac} 2ax+b\amp=\pm\sqrt{b^2-4ac} 2ax\amp=-b\pm\sqrt{b^2-4ac} Since a\neq0, we may divide by 2a on each side: x\amp=\frac{-b\pm\sqrt{b^2-4ac}}{2a} And this is the famous quadratic formula.

    Some Amusing Identities

    These equations are amusing, although maybe only to mathematicians. Largely taken from math.stackexchange.com. mathematicsdisplayed equations \sqrt[\sqrt{2}]{2}=\sqrt{2}^{\sqrt{2}} 2592=2^59^2 \sqrt{2025}=20+25 \sum_{n=1}^{\infty}\frac{1}{n^n}=\int_{0}^1\frac{1}{x^x}\,dx 3^3 + 4^4 + 3^3 + 5^5 = 3435 \int_{-\infty}^{\infty}\frac{\sin x}{x}\,dx=\int_{-\infty}^{\infty}\frac{\sin^2 x}{x^2}\,dx \log(1+2+3)=\log(1)+\log(2)+\log(3) \int_{0}^{\infty}\frac1{1+x^2}\frac1{1+x^{\pi}}\,dx=\int_{0}^{\infty}\frac1{1+x^2}\frac1{1+x^e}\,dx

    ================================================ FILE: examples/showcase/source/pretext-showcase.ptx ================================================ eps pdf png svg tex \newcommand{\order}[1]{\left\lvert#1\right\rvert} \usepackage{tikz} \usepackage{pgfplots} \usetikzlibrary{positioning} % for worksheet \usepackage{pstricks} \usepackage{phaistos} \usepackage{xcolor} PTXSC pretext-SC Self Evident Fact
    <pretext/> Showcase Many Contributors Some From Academic Departments From Many Institutions In Many Locations beezer@pugetsound.edu

    This is a showcase of features. It is meant to be viewed in multiple output forms (HTML, PDF) to demonstrate what is possible from source.

    Index

    Entries are alphabetized word-by-word, not letter-by-letter. Topics indexed are features, not any actual content.

    This article was authored in, and produced with, . It is typeset with the Latin Modern font.

    ================================================ FILE: examples/showcase/source/webwork.ptx ================================================
    <webwork/>

    These exercises demonstrate some features.

    Answer Type Variety answer types

    This problem demonstrates that can process many kinds of answers.

    Context("Numeric"); $f = Formula("sqrt(x)"); $derivative = Formula("1/(2sqrt(x))"); $popup = PopUp(['?','power','exponential','linear','quadratic'],1); $radio = RadioButtons([ 'It shares ancestry with "radius", as in the radius of a circle.', 'It shares ancestry with "radish", a vegetable.', 'It shares ancestry with "radler", a mixture of beer and grapefruit soda.', ],1); Context("LimitedRadical"); $a = Formula("2sqrt(3)"); Context("LimitedNumeric"); $b = Real(sqrt(12)); Context("Interval"); $domain = Interval("[0,inf)"); Context("Point"); $point = Point("(4,2)"); Context("RestrictedDomains"); $restricted = Formula("x, x >= 0");

    Consider the function f defined by f(x)=.

    1. The exact value of f(12) is and a decimal approximation for this is .

    2. The domain of this function, in interval notation, is .

    3. The graph of y= intersects the graph of y=6-x at .

    4. \frac{d}{dx}={} .

    5. The formula for f(x)^2, including its restricted domain, is .

    6. f is a function.

    7. Which is true of the word radical?

    Special Feedback custom feedback hint solution

    Try multiplying the exponents to see what feedback you get. Also, try something no one should get credit for, like x^2*x^5.

    Context()->operators->set( '*' => {class => 'bizarro::BOP::multiply', isCommand => 1}, ' *' => {class => 'bizarro::BOP::multiply', isCommand => 1}, '* ' => {class => 'bizarro::BOP::multiply', isCommand => 1}, ); $given = Formula("x^2 x^5"); $answer = Formula("x^7"); $special = Formula("x^10"); $evaluator = $answer -> cmp( checker=>sub{ my ( $correct, $student, $ansHash ) = @_; Value::Error("When multiplying powers with the same base, you do not multiply the exponents.") if ($special == $student); return 0 if $ansHash->{isPreview} || $correct != $student; Context()->flags->set(bizarroMul=>1); delete $correct->{test_values}; delete $student->{test_values}; my $OK = ($correct == $student); Context()->flags->set(bizarroMul=>0); Value::Error( "Your answer is equivalent to the correct answer, but not in the expected form. Maybe it needs to be simplified, factored, expanded, have its denominator rationalized, etc." ) unless $OK; return $OK; } );

    Simplify the expression .

    Add the exponents.

    To simplify the product of two powers of the same base, add the exponents. \amp=x^{2+5} \amp=

    String Answers string answers algorithmic image

    Spelling counts, but not capitalization or spaces.

    Context("ArbitraryString"); $platypus = Compute("platypus")->cmp(checker => sub { my ($correct,$student,$ans) = @_; $correct = $correct->value; $student = $student->value; $student = lc($student); $student =~ s/ +/ /; $student =~ s/^ //; $student =~ s/ $//; return ($student eq $correct); });

    This Venn Diagram groups animals by certain characteristics.

    \begin{tikzpicture} \draw[fill=red, opacity=0.5] (0,0) circle (2cm) node[below left=1.5cm, opacity=1] {Has a Bill} node[below left, opacity=1] {Duck}; \draw[fill=green, opacity=0.5] (60:2cm) circle (2cm) node [above=2.1cm, opacity=1] {Is Venemous} node[above=0.5cm, opacity=1] {Jellyfish}; \draw[fill=blue, opacity=0.5] (0:2cm) circle (2cm) node [below right=1.5cm, opacity=1] {Has Fur} node[below right, opacity=1] {Beaver}; \end{tikzpicture}

    Name an animal that belongs in the center region. Spelling counts!

    Open Problem Library Open Problem Library

    has an Open Problem Library with over 40,000 exercises. One of them is this exercise, with file path Library/PCC/BasicAlgebra/NumberBasics/FactorInteger10.pg.

    Structured with Tasks tasks flexible answer syntax Context("Fraction"); $quadratic = Formula("2 x^2 - 7 x - 15")->reduce; $x1 = Fraction(5,1); $x2 = Fraction(-3,2); Context()->flags->set(reduceConstants=>0,reduceConstantFunctions=>0); Context("FiniteSolutionSets"); $solutions = Formula("-3/2,5");

    This problem has multiple parts that must be completed in order. Try answering the second part with various things you might expect a user to enter.

    Identify Coefficients

    Consider the equation = 0 Identify the coefficients for the quadratic equation using the standard form from .

    a= , b= , c=

    Take the coefficient of x^2 for the value of a, the coefficient of x for b, and the constant for c. In this case, they are a = 2, b = -7, c = -15.

    Use the Quadratic Formula

    Use the quadratic formula to find the solution set to =0

    Recall that the quadratic formula is given in .

    You already identified a = 2, b = -7, and c = -15, and the results from using these in the quadratic formula are -\frac{3}{2} and 5.

    Units in Answers unit answers

    The answers in this exercise require that units be used.

    $newUnits = [ {name=>'gallons',conversion=>{factor=>0.00378541,m=>3}}, {name=>'gallon',conversion=>{factor=>0.00378541,m=>3}}, {name=>'gal',conversion=>{factor=>0.00378541,m=>3}}, ]; Context()->flags->set(tolType=>'absolute',tolerance=>0.1); $volume = NumberWithUnits("20/2.78 gal", {newUnit=>$newUnits}); Context("Percent"); Context()->flags->set(tolerance=>0.01); $increase = Percent(352/278-1); Context("Currency"); $cost = Currency(3.52*1.028);

    1. The average cost of gasoline in the United States in 2010 was $2.78 per gallon. How much gasoline would $20 get you in 2010, on average?

    2. In 2011, the average cost was $3.52 per gallon. What percent increase was that from 2010?

    3. In 2012, the cost had risen 2.8% from the 2011 cost. What was the cost of a gallon of gasoline in 2012?

    ================================================ FILE: examples/showcase/source/worksheets.ptx ================================================
    Worksheets A Geometric Prelude
    • Practice visualizing vector addition
    • Use vectors without explicit coordinates

    It was known to Euclid, and probably earlier, that the midpoints of the sides of any quadrilateral all lie in the same plane (even if the vertices of the quadrilateral do not). In fact, these midpoints are the vertices of a parallelogram, as pictured in .

    The midpoints of the sides of a quadrilateral are the vertices of a parallelogram. \begin{tikzpicture}[xscale=0.8, yscale=0.8] \draw[style={black, ultra thick}] (0,0) -- (5,0) -- (4,4) -- (2,5) -- (0,0); \draw[style={black, dashed, very thick}] (2.5, 0) -- (4.5, 2) -- (3, 4.5) -- (1, 2.5) -- (2.5, 0); \end{tikzpicture}
    The sides of a triangle presented as vectors. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \end{tikzpicture}
    The medians of the triangle are \vec{M}_1, \vec{M}_2, and \vec{M}_3. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node {$\vec{M}_{1}$} -- (1.5,0); \draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node {$\vec{M}_{2}$} -- (2,1); \draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node {$\vec{M}_{3}$} -- (0.5,1); \node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; \node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; \end{tikzpicture}

    In this exercise, we'll use vectors to show that the medians of any triangle () intersect at a point. Recall that medians are the lines connecting the vertices of the triangle to the midpoints of their opposite edges, as in the figure. We'll do this in a few steps.

    What is the value of \vec{A} + \vec{B} + \vec{C}?

    from the previous page is reproduced for your convenience.

    The medians of the triangle are \vec{M}_1, \vec{M}_2, and \vec{M}_3. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node {$\vec{M}_{1}$} -- (1.5,0); \draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node {$\vec{M}_{2}$} -- (2,1); \draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node {$\vec{M}_{3}$} -- (0.5,1); \node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; \node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; \end{tikzpicture}

    Show that \vec{M}_{1} + \vec{M}_{2} + \vec{M}_{3} = 0.

    Use .

    To show that the point P exists (as the common intersection of the \vec{M}_{i}), show that \vec{A} + \frac{2}{3} \vec{M}_{3} = \frac{2}{3} \vec{M}_{2} = .

    If you have time, try to devise a vector proof of Euclid's result presented at the beginning of the workshop. Recall that a parallelogram is a four-sided polygon whose opposite sides are parallel.

    Wrap-up

    It's possible to do interesting things with vector arithmetic in a coordinate-free way: we didn't specify an origin, or any entries of any vectors in the examples.

    ================================================ FILE: examples/stack/README.md ================================================ # STACK examples These examples demonstrate how to author, and process, [STACK](https://stack-assessment.org/) problems for inclusion in a [PreTeXt](https://pretextbook.org) document. The process is more involved when your document includes a STACK problem, and requires the support of a server with the STACK API runnin both for one-off generation of a static document, and for ongoing support of students' interactions with dynamic materials. * The example scripts call the public STACK API server at [https://stack-api.maths.ed.ac.uk/](https://stack-api.maths.ed.ac.uk/) This server is intended for demonstration and testing only. ================================================ FILE: examples/stack/minimal/assets/stack/01_integration_with_feedback.xml ================================================ Integration Find \[ \int {@p@} d{@v@}\] [[input:ans1]] [[validation:ans1]]

    ]]>
    We can either do this question by inspection (i.e. spot the answer) or in a more formal manner by using the substitution \[ u = ({@v@}-{@a@}).\] Then, since \(\frac{d}{d{@v@}}u=1\) we have \[ \int {@p@} d{@v@} = \int u^{@n@} du = \frac{u^{@n+1@}}{@n+1@}+c = {@ta@}+c.\]

    ]]>
    1 0.1 0 2025030700 n:rand(5)+3; a:rand(5)+3; v:x p:(v-a)^n; ta:(v-a)^(n+1)/(n+1); [[feedback:prt1]]

    ]]>
    \(\int {@p@} d{@v@} = {@ta@}+c\) 1 0 0 . *10 dot 1 i cos-1 lang [ ans1 algebraic ta+c 20 1 0 0 int 1 1 1 1 1 prt1 1.0000000 1 1 0 Int ans1 ta v 0 = 1 -1 1-0-T = 0 -1 1-0-F 1001758021 165520961 1575780430 1893097548 196914510 119069312 2028726687 788370893 400217408 1304537090 1439331987 193373653 1 ans1 ta+c prt1 1.0000000 0.0000000 1-0-T 2 ans1 ta prt1 0.0000000 0.1000000 1-0-F 3 ans1 ev(n*(v-a)^(n-1),simp) prt1 0.0000000 0.1000000 1-0-F 4 ans1 (v-a)^(n+1) prt1 0.0000000 0.1000000 1-0-F 5 ans1 ev(float(ta),simp) prt1 NULL
    ================================================ FILE: examples/stack/minimal/project.ptx ================================================ html source/main.ptx publication/publication.ptx output/html latex source/main.ptx publication/publication.ptx output/latex pdf source/main.ptx publication/publication.ptx output/pdf latex pdflatex xelatex asy sage convert pdftops pdf-crop-margins pageres node file2brl ================================================ FILE: examples/stack/minimal/publication/publication.ptx ================================================ ================================================ FILE: examples/stack/minimal/source/main.ptx ================================================ \newcommand{\doubler}[1]{2#1}
    A minimal article containing a STACK question Chris Sangwin University of Edinburgh

    This is a very short article, illustrating the use of STACK questions within PreTeXt.

    This is a very short article, illustrating the use of STACK questions within PreTeXt.

    STACK question

    The following illustrated embedding a STACK question.

    STACK integration question

    A test question. (2025-08-15: you may need to ask for a "new" question to make this render.)

    ================================================ FILE: examples/webwork/Makefile ================================================ ## ********************************************************************* ## ## Copyright 2015-7 ## ## Robert A. Beezer, Michael Gage, Geoff Goehle, Alex Jordan ## ## ## ## This file is part of PreTeXt. ## ## ## ## PreTeXt is free software: you can redistribute it and/or modify ## ## it under the terms of the GNU General Public License as published by ## ## the Free Software Foundation, either version 2 or version 3 of the ## ## License (at your option). ## ## ## ## PreTeXt is distributed in the hope that it will be useful, ## ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## ## GNU General Public License for more details. ## ## ## ## You should have received a copy of the GNU General Public License ## ## along with PreTeXt. If not, see . ## ## ********************************************************************* ## ####################### # DO NOT EDIT THIS FILE ####################### # 1) Make a copy of Makefile.paths.original # as Makefile.paths # 2) Edit Makefile.paths as directed there, possibly # using Makefile.paths.example as an example # 3) This file (Makefile), Makefile.paths.original, # and Makefile.paths.example are managed by version # control and edits will conflict # 4) See updated history in Makefile.paths.original # for changes, or follow the revision control history ############## # Introduction ############## # This is not a "true" makefile, since it does not # operate on dependencies. It is more of a shell # script, sharing common configurations ###################### # System Prerequisites ###################### # install (system tool to make directories) # jing-trang (only for source validation) # (PDF viewer, web browser, pager, Sage executable, etc) ##### # Use ##### # A) Change directory to the location of this file # B) At command line: make # where is one of the recipes below # for example, sample-chapter-representations # The included file contains customized versions # of locations of the principal components of this # project and names of various helper executables include Makefile.paths # These paths are subdirectories of # the PreTeXt distribution PTXXSL = $(PTX)/xsl WWEXAMPLE = $(PTX)/examples/webwork # XML to apply templates to SMPC = $(WWEXAMPLE)/sample-chapter/sample-chapter.ptx MINI = $(WWEXAMPLE)/minimal/mini.xml # Publisher files SMPCPUB = $(WWEXAMPLE)/sample-chapter/publisher/publication.xml SMPRSPUB = $(WWEXAMPLE)/sample-chapter/publisher/publication-academy.xml MINIPUB = $(WWEXAMPLE)/minimal/publication.xml # These paths are subdirectories of # the scratch directory TEXOUT = $(SCRATCH)/latex PDFOUT = $(SCRATCH)/pdf IMGOUT = $(SCRATCH)/images HTMLOUT = $(SCRATCH)/html RSOUT = $(SCRATCH)/runestone EPUBOUT = $(SCRATCH)/epub PGOUT = $(SCRATCH)/pg ################## # Targets for make ################## # Build representations first # Then build PDF or Build HTML # Build PG (does not need representations) ######################################################################### # Verbose Output # Applications of the pretext/pretext script use extra-verbose output # via the -vv switch so that temporary directories are preserved for # testing purposes.This should not be taken as necessary or best # practice for a real PreTeXt project using WeBWorK problems. ######################################################################### # Construct macros file. This must be uploaded into the macros folder # of the server's host course before building representations below. # This file will be built inside a folder tree in my-generated/webwork/pg # or if there is no generated folder, into the destination folder. The # folder tree will be in the form PROJECT_TITLE/macros/INITIALISM.pl. # If building representations locally, this must be run first and # the macros file will be in the right place relative to the generated # folder. There are no macros for the minimal example, so omitted. sample-chapter-macros: install -d $(PGOUT)/macros cd $(PGOUT)/macros; \ $(PTX)/pretext/pretext -v -c pg-macros -p $(SMPCPUB) $(SMPC) ######################################################################### # Extract webwork problems into a single XML file. # Location is within generated folder (named in the publisher file), # within "webwork" subfolder sample-chapter-representations: $(PTX)/pretext/pretext -v -c webwork -p $(SMPCPUB) $(SMPC) mini-representations: $(PTX)/pretext/pretext -v -c webwork -p $(MINIPUB) $(MINI) ######################################################################### # PDF versions sample-chapter-pdf: -rm -r $(PDFOUT) install -d $(PDFOUT) $(PTX)/pretext/pretext -vv -c all -f pdf -p $(SMPCPUB) -d $(PDFOUT) $(SMPC) mini-pdf: -rm -r $(PDFOUT) install -d $(PDFOUT) $(PTX)/pretext/pretext -vv -c all -f pdf -p $(MINIPUB) -d $(PDFOUT) $(MINI) ######################################################################### # TeX versions # use -x latex.fillin.style box for box answer blanks instead of underlines sample-chapter-latex: -rm -r $(TEXOUT) install -d $(TEXOUT) $(PTX)/pretext/pretext -vv -c all -f latex -p $(SMPCPUB) -d $(TEXOUT) $(SMPC) mini-latex: -rm -r $(TEXOUT) install -d $(TEXOUT) $(PTX)/pretext/pretext -vv -c all -f latex -p $(MINIPUB) -d $(TEXOUT) $(MINI) ######################################################################### # HTML output # Note that for the sample chapter, first we make the latex-image svg. # We turn off dates in file headers, so when we use these for testing we # can get more accurate diffs. Dates are useful for single file output # (or at least less of an annoyance). This should not be taken as necessary # or best practice for a real PreTeXt project using WeBWorK problems. sample-chapter-html: -rm -r $(WWEXAMPLE)/sample-chapter/my-generated/latex-image $(PTX)/pretext/pretext -vv -c latex-image -f svg -p $(SMPCPUB) $(SMPC) -rm -r $(HTMLOUT) install -d $(HTMLOUT) $(PTX)/pretext/pretext -vv -c all -f html -p $(SMPCPUB) -x debug.datedfiles no -d $(HTMLOUT) $(SMPC); \ sample-chapter-runestone: -rm -r $(WWEXAMPLE)/sample-chapter/my-generated/latex-image $(PTX)/pretext/pretext -c latex-image -f svg -p $(SMPRSPUB) $(SMPC) -rm -r $(RSOUT) install -d $(RSOUT) $(PTX)/pretext/pretext -vv -c all -f html -p $(SMPRSPUB) -x debug.datedfiles no -d $(RSOUT) $(SMPC); \ mini-html: -rm -r $(HTMLOUT) install -d $(HTMLOUT) $(PTX)/pretext/pretext -vv -c all -f html -p $(MINIPUB) -x debug.datedfiles no -d $(HTMLOUT) $(MINI); \ ######################################################################### # PG output # Make an archive of webwork problem sets for each "section" (as specified # by chunk level) with set definition files, set header files, and problem # files in a file tree. Separate problem sets for inline and divisional # problems. This does not require having the representations file. # Adding a "-z" switch will create a "tgz" compressed archive sample-chapter-problem-sets: install -d $(PGOUT) cd $(PGOUT); \ rm -r Integrating_WeBWorK_into_Textbooks; \ $(PTX)/pretext/pretext -v -c all -f webwork-sets -p $(SMPCPUB) $(SMPC) mini-problem-sets: install -d $(PGOUT) cd $(PGOUT); \ rm -r WeBWorK_Minimal_Example; \ $(PTX)/pretext/pretext -v -c all -f webwork-sets -p $(MINIPUB) $(MINI) ######################################################################### # Verify Source integrity # Leaves "jingreport.txt" in SCRATCH # Automatically invokes the "less" pager, could configure as $(PAGER) sample-chapter-check: install -d $(SCRATCH) -rm $(SCRATCH)/jingreport.txt -java -classpath $(JINGTRANG) -Dorg.apache.xerces.xni.parser.XMLParserConfiguration=org.apache.xerces.parsers.XIncludeParserConfiguration -jar $(JINGTRANG)/jing.jar $(PTX)/schema/pretext.rng $(SMPC) > $(SCRATCH)/jingreport.txt less $(SCRATCH)/jingreport.txt webwork-mini-check: install -d $(SCRATCH) -rm $(SCRATCH)/jingreport.txt -java -classpath $(JINGTRANG) -Dorg.apache.xerces.xni.parser.XMLParserConfiguration=org.apache.xerces.parsers.XIncludeParserConfiguration -jar $(JINGTRANG)/jing.jar $(PTX)/schema/pretext.rng $(MINI) > $(SCRATCH)/jingreport.txt less $(SCRATCH)/jingreport.txt ================================================ FILE: examples/webwork/Makefile.paths.example ================================================ ## ********************************************************************* ## ## Copyright 2015-7 ## ## Robert A. Beezer, Michael Gage, Geoff Goehle, Alex Jordan ## ## ## ## This file is part of PreTeXt. ## ## ## ## PreTeXt is free software: you can redistribute it and/or modify ## ## it under the terms of the GNU General Public License as published by ## ## the Free Software Foundation, either version 2 or version 3 of the ## ## License (at your option). ## ## ## ## PreTeXt is distributed in the hope that it will be useful, ## ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## ## GNU General Public License for more details. ## ## ## ## You should have received a copy of the GNU General Public License ## ## along with PreTeXt. If not, see . ## ## ********************************************************************* ## ####################### # DO NOT EDIT THIS FILE ####################### # 1) Do make a copy of Makefile.paths.original # as Makefile.paths # 2) Edit Makefile.paths as directed there # 3) Makefile and this file (Makefile.paths.original) # are managed by revision control and edits will conflict # 4) See updated history in Makefile.paths.original # for changes, or follow the revision control history # 5) See Makefile.paths.example for guidance # Change History # 2021/11/27: Change MB to PTX # 2017/09/25: Local path for jing-trang # 2015/07/22: First release ########### # Variables ########### # Provide full paths for principal variables, # each without a trailing slash # PreTeXt distribution root PTX = /Users/alex.jordan/mathbook # Products are built in subdirectories # of a "scratch" directory SCRATCH = /Users/alex.jordan/scratch # Jing-Trang for RELAX-NG schema validation JINGTRANG = /Users/alex.jordan/jing-trang/build # These are executables to helper applications # Provide as much of a path as is needed # LaTeX engine, executable # xelatex is preferable, but pdflatex is another option ENGINE = xelatex # Text file viewer (eg, DTD errors) # "more" or "less" are likely system utilities PAGER = less # HTML viewer (eg "open -a firefox", "open -a safari", on Mac) HTMLVIEWER = firefox ================================================ FILE: examples/webwork/Makefile.paths.original ================================================ ## ********************************************************************* ## ## Copyright 2015-7 ## ## Robert A. Beezer, Michael Gage, Geoff Goehle, Alex Jordan ## ## ## ## This file is part of PreTeXt. ## ## ## ## PreTeXt is free software: you can redistribute it and/or modify ## ## it under the terms of the GNU General Public License as published by ## ## the Free Software Foundation, either version 2 or version 3 of the ## ## License (at your option). ## ## ## ## PreTeXt is distributed in the hope that it will be useful, ## ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## ## GNU General Public License for more details. ## ## ## ## You should have received a copy of the GNU General Public License ## ## along with PreTeXt. If not, see . ## ## ********************************************************************* ## ####################### # DO NOT EDIT THIS FILE ####################### # 1) Do make a copy of Makefile.paths.original # as Makefile.paths # 2) Edit Makefile.paths as directed there # 3) Makefile and this file (Makefile.paths.original) # are managed by revision control and edits will conflict # 4) See updated history in Makefile.paths.original # for changes, or follow the revision control history # 5) See Makefile.paths.example for guidance # Change History # 2021/11/27: Change MB to PTX # 2017/09/25: Local path for jing-trang # 2015/07/22: First release ########### # Variables ########### # Provide full paths for principal variables, # each without a trailing slash # PreTeXt distribution root PTX = # Products are built in subdirectories # of a "scratch" directory SCRATCH = # Jing-Trang for RELAX-NG schema validation JINGTRANG = # These are executables to helper applications # Provide as much of a path as is needed # LaTeX engine, executable # xelatex is preferable, but pdflatex is another option ENGINE = xelatex # Text file viewer (eg, DTD errors) # "more" or "less" are likely system utilities PAGER = more # HTML viewer (eg "open -a firefox", "open -a safari", on Mac) HTMLVIEWER = firefox ================================================ FILE: examples/webwork/README.md ================================================ # WeBWorK examples These examples demonstrate how to author, and process, [WeBWorK](http://webwork.maa.org/) automated homework problems for inclusion in a [PreTeXt](https://pretextbook.org) document. Because the process can be a bit more involved when your document includes a WW problem, we provide a makefile to process the examples and as concrete documentation of how to process your own document. * copy `Makefile.paths.original` and populate the variables as shown in the `.example` version * use the `make` command to build various outputs * read comments in `Makefile` to understand the various scenarios ================================================ FILE: examples/webwork/minimal/generated/webwork/add-integers.xml ================================================

    Compute the sum of {3} and {1}\text{:}

    {3} + {1} =

    Add {3} and {1} together.

    4

    {3} + {1} = {4}\text{.}

    ================================================ FILE: examples/webwork/minimal/generated/webwork/cylinder-volume.xml ================================================

    A cylinders bases radius is {2\ {\rm m}}, and its height is {5\ {\rm m}}.

    1. This cylinders volume, in terms of \pi, is .

    2. This cylinders volume, rounded to the hundredth place, is .

    20\pi\ {\rm m^{3}}

    62.83\ {\rm m^{3}}

    We use r to represent the bases radius, and h to represent the cylinders height.

    A cylinders volume formula is V= (\text{base area}) \cdot \text{height}. A cylinders base is a circle, with its area formula A = \pi r^{2}.

    Putting together these two formulas, we have a cylinders volume formula:

    \displaystyle{ V= \pi r^{2} h }

    Throughout these computations, all quantities have units attached, and we only show them in the final step.

    1. Using the volume formula, we have:

      \displaystyle{\begin{aligned} V \amp = \pi r^{2} h \\ \amp = \pi \cdot 2^{2} \cdot 5 \\ \amp = \pi \cdot 20 \\ \amp = 20 \pi \textrm{ m}^3 \end{aligned}}

      Dont forget the volume unit \textrm{m}^3.

    2. To find the decimal version, we replace \pi with its decimal value, and we have:

      \displaystyle{\begin{aligned}[t] V\amp = 20 \pi \\ \amp \approx 20 \cdot 3.14\ldots \\ \amp \approx {62.83\ {\rm m^{3}}} \end{aligned}}

      Dont forget the volume unit \textrm{m}^3.

    ================================================ FILE: examples/webwork/minimal/generated/webwork/pg/WeBWorK_Minimal_Example/1-WeBWorK_Minimal_Section/1_1.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:25:22-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $a = Compute(random(1, 9, 1)); $b = Compute(random(1, 9, 1)); $c = $a + $b; ############################################################ # Body ############################################################ BEGIN_PGML Compute the sum of [`[$a]`] and [`[$b]\text{:}`] [`[$a] + [$b] =`] [_]{$c}{5} END_PGML ############################################################ # Hint ############################################################ #Set value of $showHint in PGcourse.pl for course-wide attempt threshhold for revealing hints BEGIN_PGML_HINT Add [`[$a]`] and [`[$b]`] together. END_PGML_HINT ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION [`[$a] + [$b] = [$c]\text{.}`] END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/minimal/generated/webwork/pg/WeBWorK_Minimal_Example/1-WeBWorK_Minimal_Section/1_3.pg ================================================ ## DESCRIPTION ## Give a value for pi ## ENDDESCRIPTION ## KEYWORDS('template', 'pi') ## DBsubject('Algebra') ## DBchapter('Fundamentals') ## DBsection('Real Numbers') ## Date('') ## Author('') ## Institution('') DOCUMENT(); loadMacros( "PGstandard.pl", # Standard macros for PG language "PGML.pl", # PGML markup and Math Objects "PGcourse.pl", # Customization file for the course ); # Uncomment the following if you don't want to show which # answers are correct and which are incorrect #$showPartialCorrectAnswers = 0; $pi = Real("pi"); BEGIN_PGML Enter a value for [`\pi`]. [_]{$pi}{5} END_PGML BEGIN_PGML_SOLUTION You could type [|pi|]* or [|3.14|]*, or [|22/7|]*, among other options. END_PGML_SOLUTION ENDDOCUMENT(); ================================================ FILE: examples/webwork/minimal/generated/webwork/pg/WeBWorK_Minimal_Example/def/set1-WeBWorK_Minimal_Section.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = WeBWorK_Minimal_Example/header/1-WeBWorK_Minimal_Section.pg screenHeaderFile = WeBWorK_Minimal_Example/header/1-WeBWorK_Minimal_Section.pg description = WeBWorK Minimal Section problemListV2 problem_start source_file = WeBWorK_Minimal_Example/1-WeBWorK_Minimal_Section/1_1.pg problem_id = 1 problem_end problem_start source_file = Library/PCC/BasicAlgebra/Geometry/CylinderVolume10.pg problem_id = 2 problem_end problem_start source_file = WeBWorK_Minimal_Example/1-WeBWorK_Minimal_Section/1_3.pg problem_id = 3 problem_end ================================================ FILE: examples/webwork/minimal/generated/webwork/pg/WeBWorK_Minimal_Example/header/1-WeBWorK_Minimal_Section.pg ================================================ # Header file for problem set 1-WeBWorK_Minimal_Section # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 1 of WeBWorK Minimal Example."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/minimal/generated/webwork/pg/WeBWorK_Minimal_Example/macros/WeBWorK_Minimal_Example.pl ================================================ ############################################################################# # This macro library supports WeBWorK problems from the PreTeXt project named # WeBWorK Minimal Example ############################################################################# ================================================ FILE: examples/webwork/minimal/generated/webwork/value-of-pi.xml ================================================

    Enter a value for \pi.

    3.14159

    You could type pi or 3.14, or 22/7, among other options.

    ================================================ FILE: examples/webwork/minimal/mini.xml ================================================
    <webwork /> Minimal Example Jane Doe
    <webwork /> Minimal Section $a = Compute(random(1, 9, 1)); $b = Compute(random(1, 9, 1)); $c = $a + $b;

    Compute the sum of and :

    + =

    Add and together.

    + = .

    ================================================ FILE: examples/webwork/minimal/pg/newProblem.pg ================================================ ## DESCRIPTION ## Give a value for pi ## ENDDESCRIPTION ## KEYWORDS('template', 'pi') ## DBsubject('Algebra') ## DBchapter('Fundamentals') ## DBsection('Real Numbers') ## Date('') ## Author('') ## Institution('') DOCUMENT(); loadMacros( "PGstandard.pl", # Standard macros for PG language "PGML.pl", # PGML markup and Math Objects "PGcourse.pl", # Customization file for the course ); # Uncomment the following if you don't want to show which # answers are correct and which are incorrect #$showPartialCorrectAnswers = 0; $pi = Real("pi"); BEGIN_PGML Enter a value for [`\pi`]. [_]{$pi}{5} END_PGML BEGIN_PGML_SOLUTION You could type [|pi|]* or [|3.14|]*, or [|22/7|]*, among other options. END_PGML_SOLUTION ENDDOCUMENT(); ================================================ FILE: examples/webwork/minimal/publication.xml ================================================ ================================================ FILE: examples/webwork/sample-chapter/my-generated/.gitkeep ================================================ ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/an-exercisegroup-exercise.xml ================================================

    What is 1+1\text{?}

    >

    2

    addToPreamble(latexImagePreamble()); $introduction_image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw[fill=blue!20] (0,0) -| (1,1) -| cycle; \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML This introduction should appear ahead of the exercise when it shows up in the Assignment page. >> [@DataTable( [ [PGML('[`(0,0)`]'), PGML('[`(0,1)`]'), ], [PGML('[`(1,0)`]'), PGML('[`(1,1)`]'), ], ], align => '*{2}{l}', valign => 'middle',);@]* << >> [@image(insertGraph($introduction_image_1), width=>600, alt=>qq"a blue square")@]* << It has a table and an image too to check it all comes through. What is [`1+1\text{?}`] [_]{'2'}{5}> END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/answer-arrays.xml ================================================

    These answer blanks are all expecting some sort of answer in an array format.

    {\left(0,0\right)} = {}

    {\left\lt 1,2\right>} = {}

    {\left[\begin{array}{c}3\\4\\\end{array}\right]} = {}

    {\left[\begin{array}{cc} 1 \amp 2\cr 3 \amp 4 \end{array}\right]} = {}

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/antiderivative-exp.xml ================================================

    f(x)=e^x

    e^{x}+C

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/antiderivative-sin.xml ================================================

    f(x)=\sin(x)

    -\cos\mathopen{}\left(x\right)+C

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/box-diagonal-five.xml ================================================

    Find D when L=4 and W=3\text{.}

    5

    addToPreamble(latexImagePreamble()); $introduction_image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(L\)} --++ (0,3) node[right,pos=0.5] {\(W\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(D\)} --++ (0,3) --++ (4,0); \end{tikzpicture} END_LATEX_IMAGE $image_1 = createLaTeXImage(); $image_1->addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(4\)} --++ (0,3) node[right,pos=0.5] {\(3\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(5\)} --++ (0,3) --++ (4,0); \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML This exercisegroup has a [||]* image in its introduction. In standalone versions of the exercise, this image should be repeated. >> [@image(insertGraph($introduction_image_1), width=>300)@]* << Find [`D`] when [`L=4`] and [`W=3\text{.}`] [_]{'5'}{10} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION >> [@image(insertGraph($image_1), width=>600)@]* << END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/box-diagonal-thirteen.xml ================================================

    Find D when L=12 and W=5\text{.}

    13

    addToPreamble(latexImagePreamble()); $introduction_image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(L\)} --++ (0,3) node[right,pos=0.5] {\(W\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(D\)} --++ (0,3) --++ (4,0); \end{tikzpicture} END_LATEX_IMAGE $image_1 = createLaTeXImage(); $image_1->addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(12\)} --++ (0,3) node[right,pos=0.5] {\(5\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(13\)} --++ (0,3) --++ (4,0); \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML This exercisegroup has a [||]* image in its introduction. In standalone versions of the exercise, this image should be repeated. >> [@image(insertGraph($introduction_image_1), width=>300)@]* << Find [`D`] when [`L=12`] and [`W=5\text{.}`] [_]{'13'}{10} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION >> [@image(insertGraph($image_1), width=>600)@]* << END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/choose-one.xml ================================================

    Which of the following suggest that differentiation and integration are inverse processes?

    • The Quadratic Formula

    • The Fundamental Theorem of Calculus

    • The Fundamental Theorem of Arithmetic

    • None of these

    \text{The Fundamental ... of Calculus}

    The correct answer is The Fundamental ... of Calculus.

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/copy-webwork-add-numbers-exploration.xml ================================================

    Compute the sum of 7 and 1\text{:}

    7 + 1 =

    8

    7 + 1 = {8}\text{.}

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/copy-webwork-add-numbers.xml ================================================

    Compute the sum of 6 and 5\text{:}

    6 + 5 =

    11

    6 + 5 = {11}\text{.}

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/copy-with-tasks.xml ================================================

    Consider the quadratic equation {2x^{2}-5x-25} = 0\text{.}

    Identify Coefficients

    Identify the coefficients for the quadratic equation using the standard form from Theorem1.2.1.

    a= , b= , c=

    2

    -5

    -25

    Take the coefficient of x^2 for the value of a\text{,} the coefficient of x for b\text{,} and the constant for c\text{.} In this case, they are a = {2}\text{,} b = {-5}\text{,} c = {-25}\text{.}

    Use the Quadratic Formula

    Using the quadratic formula, solve the equation.

    \left\{5,\frac{-5}{2}\right\}

    Recall that the quadratic formula is given in Theorem1.2.1.

    You already identified a = {2}\text{,} b = {-5}\text{,} and c = {-25}\text{,} so the results are:

    x = {\frac{-\left(-5\right)+\sqrt{\left(-5\right)^{2}-4\cdot 2\cdot \left(-25\right)}}{2\cdot 2}} = {5}

    or

    x = {\frac{-\left(-5\right)-\sqrt{\left(-5\right)^{2}-4\cdot 2\cdot \left(-25\right)}}{2\cdot 2}} = {-{\frac{5}{2}}}

    This conclusion is just here for testing.

    reduce; $x1 = Fraction($r,1); $x2 = Fraction(-$k,$a); Context()->flags->set(reduceConstants=>0,reduceConstantFunctions=>0); $sol1 = Formula("(-$b+sqrt(($b)**2-4($a)($c)))/(2($a))"); $sol2 = Formula("(-$b-sqrt(($b)**2-4($a)($c)))/(2($a))"); $evaluatorfora = $a->cmp()->withPostFilter(AnswerHints( [-$a] => "Do you have the sign correct?") ); $evaluatorforb = $b->cmp()->withPostFilter(AnswerHints( [-$b] => "Do you have the sign correct?") ); $evaluatorforc = $c->cmp()->withPostFilter(AnswerHints( [-$c] => "Do you have the sign correct?") ); Context("FiniteSolutionSets"); $solutionset = Formula("{$x1,$x2}"); ############################################################ # Body ############################################################ BEGIN_PGML Consider the quadratic equation [`[$quadratic] = 0\text{.}`] END_PGML ############################################################ # Scaffold ############################################################ Scaffold::Begin(numbered => 1,is_open => "correct_or_first_incorrect",can_open => when_previous_correct,); ############################################################ # Section ############################################################ Section::Begin("Identify Coefficients"); BEGIN_PGML Identify the coefficients for the quadratic equation using the standard form from Theorem[$NBSP]*1.2.1. [`a=`] [_]{$evaluatorfora}{4}, [`b=`] [_]{$evaluatorforb}{4}, [`c=`] [_]{$evaluatorforc}{4} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Take the coefficient of [`x^2`] for the value of [`a\text{,}`] the coefficient of [`x`] for [`b\text{,}`] and the constant for [`c\text{.}`] _In this case_, they are [`a = [$a]\text{,}`] [`b = [$b]\text{,}`] [`c = [$c]\text{.}`] END_PGML_SOLUTION Section::End(); ############################################################ # Section ############################################################ Section::Begin("Use the Quadratic Formula"); BEGIN_PGML Using the quadratic formula, solve the equation. [_]{$solutionset}{40} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Recall that the quadratic formula is given in Theorem[$NBSP]*1.2.1. You already identified [`a = [$a]\text{,}`] [`b = [$b]\text{,}`] and [`c = [$c]\text{,}`] so the results are: [```x = [$sol1] = [$x1]```] or [```x = [$sol2] = [$x2]```] END_PGML_SOLUTION Section::End(); Scaffold::End(); BEGIN_PGML This conclusion is just here for testing. END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/cylinder-volume.xml ================================================

    A cylinders bases radius is {6\ {\rm m}}, and its height is {10\ {\rm m}}.

    1. This cylinders volume, in terms of \pi, is .

    2. This cylinders volume, rounded to the hundredth place, is .

    360\pi\ {\rm m^{3}}

    1130.97\ {\rm m^{3}}

    We use r to represent the bases radius, and h to represent the cylinders height.

    A cylinders volume formula is V= (\text{base area}) \cdot \text{height}. A cylinders base is a circle, with its area formula A = \pi r^{2}.

    Putting together these two formulas, we have a cylinders volume formula:

    \displaystyle{ V= \pi r^{2} h }

    Throughout these computations, all quantities have units attached, and we only show them in the final step.

    1. Using the volume formula, we have:

      \displaystyle{\begin{aligned} V \amp = \pi r^{2} h \\ \amp = \pi \cdot 6^{2} \cdot 10 \\ \amp = \pi \cdot 360 \\ \amp = 360 \pi \textrm{ m}^3 \end{aligned}}

      Dont forget the volume unit \textrm{m}^3.

    2. To find the decimal version, we replace \pi with its decimal value, and we have:

      \displaystyle{\begin{aligned}[t] V\amp = 360 \pi \\ \amp \approx 360 \cdot 3.14\ldots \\ \amp \approx {1130.97\ {\rm m^{3}}} \end{aligned}}

      Dont forget the volume unit \textrm{m}^3.

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/deep-nested-lists.xml ================================================

    Ordered list.

    1. Level 1, first.

    2. Level 1, second.

      1. Level 2, first.

      2. Level 2, second.

        1. Level 3, first.

        2. Level 3, second.

          1. Level 4, first.

          2. Level 4, second.

          3. Level 4, third.

        3. Level 3, third.

      3. Level 2, third.

    3. Level 1, third.

    Unordered list.

    • Level 1, first.

    • Level 1, second.

      • Level 2, first.

      • Level 2, second.

        • Level 3, first.

        • Level 3, second.

          • Level 4, first.

          • Level 4, second.

          • Level 4, third.

        • Level 3, third.

      • Level 2, third.

    • Level 1, third.

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/divisional-bare.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/divisional-conclusion.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/divisional-introduction-conclusion.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/divisional-introduction.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/divisional-title-conclusion.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/divisional-title-introduction-conclusion.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/divisional-title-introduction.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/divisional-title.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/empty-statement.xml ================================================ ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/exercisegroup-bare.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/exercisegroup-conclusion.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/exercisegroup-introduction-conclusion.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/exercisegroup-introduction.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/exercisegroup-title-conclusion.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/exercisegroup-title-introduction-conclusion.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/exercisegroup-title-introduction.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/exercisegroup-title.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/function-with-domain-issues.xml ================================================

    1. Suppose the correct answer is \displaystyle {\sqrt{x-4}}\text{.}

    2. Suppose the correct answer is \displaystyle {\ln\mathopen{}\left(\left|\frac{x}{x-4}\right|\right)}\text{.}

    \sqrt{x-4}

    \ln\mathopen{}\left(\left|\frac{x}{x-4}\right|\right)

    Solution explanation goes here.

    {limits} = [$a+1,$a+4]; $answer2 = Compute("ln(abs( x / (x-$a) ))"); $answer2->{test_points} = [[-5],[-4],[1],[$a-1],[7],[8]]; $answer2evaluator = $answer2 -> cmp() -> withPostFilter( AnswerHints( [Compute("ln(abs((x-$a)/x))"),] => "This is the opposite of correct...",)); ############################################################ # Body ############################################################ BEGIN_PGML a. Suppose the correct answer is [`\displaystyle [$answer1]\text{.}`] + [_]{$answer1}{15} [@AnswerFormatHelp('formulas')@]* a. Suppose the correct answer is [`\displaystyle [$answer2]\text{.}`] + [_]{$answer2evaluator}{15} [@AnswerFormatHelp('formulas')@]* END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Solution explanation goes here. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/images/box-diagonal-five-image-1.tex ================================================ \documentclass{standalone} \usepackage[svgnames]{xcolor} \usepackage{pgfplots} \pgfplotsset{ every axis/.append style={ axis lines=middle, xlabel={$x$}, ylabel={$y$}, grid = both, } } \begin{document} \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(4\)} --++ (0,3) node[right,pos=0.5] {\(3\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(5\)} --++ (0,3) --++ (4,0); \end{tikzpicture} \end{document} ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/images/box-diagonal-thirteen-image-1.tex ================================================ \documentclass{standalone} \usepackage[svgnames]{xcolor} \usepackage{pgfplots} \pgfplotsset{ every axis/.append style={ axis lines=middle, xlabel={$x$}, ylabel={$y$}, grid = both, } } \begin{document} \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(12\)} --++ (0,3) node[right,pos=0.5] {\(5\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(13\)} --++ (0,3) --++ (4,0); \end{tikzpicture} \end{document} ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/images/latex-image-with-preamble-image-1.tex ================================================ \documentclass{standalone} \usepackage[svgnames]{xcolor} \usepackage{pgfplots} \pgfplotsset{ every axis/.append style={ axis lines=middle, xlabel={$x$}, ylabel={$y$}, grid = both, } } \begin{document} \begin{tikzpicture} \begin{axis} \addplot[domain=-2:3,smooth] {(x--1)*(x-1)*(x-2)}; \end{axis} \end{tikzpicture} \end{document} ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/images/randomized-latex-image-image-1.tex ================================================ \documentclass{standalone} \usepackage[svgnames]{xcolor} \usepackage{pgfplots} \pgfplotsset{ every axis/.append style={ axis lines=middle, xlabel={$x$}, ylabel={$y$}, grid = both, } } \begin{document} \begin{tikzpicture} \draw[fill=blue!20] (0,0) --++ (6,0) node[pos=0.5,below] {\(6\)\,cm} --++ (0,4) node[pos=0.5,right] {\(4\)\,cm} --++ (-6,0) -- cycle; \end{tikzpicture} \end{document} ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/images/special-characters-image-1.tex ================================================ \documentclass{standalone} \usepackage[svgnames]{xcolor} \usepackage{pgfplots} \pgfplotsset{ every axis/.append style={ axis lines=middle, xlabel={$x$}, ylabel={$y$}, grid = both, } } \begin{document} \begin{tikzpicture} \node at (0,0) {I need about \$3.50.}; \node at (0,1) {You gotta give 110\%.}; %This is a comment. \node at (0,2) {Send email user@domain.com.}; \end{tikzpicture} \end{document} ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/images/static-latex-image-image-1.tex ================================================ \documentclass{standalone} \usepackage[svgnames]{xcolor} \usepackage{pgfplots} \pgfplotsset{ every axis/.append style={ axis lines=middle, xlabel={$x$}, ylabel={$y$}, grid = both, } } \begin{document} \begin{tikzpicture} \draw[dashed] (0.5-0.5*6.5,-0.866025*6.5) -- (7-0.5*6.5,-0.866025*6.5); \draw[very thick] (2-0.5*7,-0.866025*7) -- (2-0.5*4,-0.866025*4) -- (5-0.5*7,-0.866025*7); \foreach \x in {1,...,6} \foreach \y in {1,...,\x} \shade[ball color=blue!30] (\y-0.5*\x,-0.866025*\x) circle (0.2cm); \foreach \y in {1,...,7} \shade[ball color=orange!40] (\y-0.5*7,-0.866025*7) circle (0.2cm); \node at (2.5,-0.5) [anchor=north west]{\(\color{blue}\sum\limits_{k=1}^nk\color{black}\)}; \shade[ball color=blue] (2-0.5*4,-0.866025*4) circle (0.2cm); \shade[ball color=orange] (2-0.5*7,-0.866025*7) circle (0.2cm); \shade[ball color=orange] (5-0.5*7,-0.866025*7) circle (0.2cm); \end{tikzpicture} \end{document} ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/inline-bare.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/inline-conclusion.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/inline-introduction-conclusion.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/inline-introduction.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/inline-title-conclusion.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/inline-title-introduction-conclusion.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/inline-title-introduction.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/inline-title.xml ================================================

    1+1=2

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/integer-addition-with-control-seed.xml ================================================

    Compute the sum of 1 and 2\text{:}

    1 + 2 =

    3

    1 + 2 = {3}\text{.}

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/integer-addition-with-seed.xml ================================================

    Compute the sum of 5 and 8\text{:}

    5 + 8 =

    13

    5 + 8 = {13}\text{.}

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/integer-addition.xml ================================================

    Compute the sum of 6 and 1\text{:}

    6 + 1 =

    7

    6 + 1 = {7}\text{.}

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/intertext.xml ================================================

    Here, we solve an equation.

    \begin{aligned} 2x+1 \amp= 3 \end{aligned}

    Now subtract 1 from each side.

    \begin{aligned} 2x \amp= 2 \end{aligned}

    Now divide by 2 on each side.

    \begin{aligned} x \amp= 1 \end{aligned}

    We should also test when the <md> is within a list.

    1. Start a list.

    2. \begin{aligned} 2x+1 \amp= 3 \end{aligned}

      Now subtract 1 from each side.

      \begin{aligned} 2x \amp= 2 \end{aligned}

      Now divide by 2 on each side.

      \begin{aligned} x \amp= 1 \end{aligned}

    3. Still in the list?

    |]* is within a list. a. Start a list. a. [$NBSP]* [```\newcommand{\amp}{&} \begin{aligned} 2x+1 \amp= 3 \end{aligned} ```] Now subtract [`1`] from each side. [```\newcommand{\amp}{&} \begin{aligned} 2x \amp= 2 \end{aligned} ```] Now divide by [`2`] on each side. [```\newcommand{\amp}{&} \begin{aligned} x \amp= 1 \end{aligned} ```] a. Still in the list? END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/latex-image-with-preamble.xml ================================================

    What are the roots of this polynomial?

    the graph of a polynomial that crosses the x-axis at -1, 1, and 2.

    -1, 1, 2

    addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \begin{axis} \addplot[domain=$xmin:$xmax,smooth] {(x-$roots[0])*(x-$roots[1])*(x-$roots[2])}; \end{axis} \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML What are the roots of this polynomial? >> [@image(insertGraph($image_1), width=>300, alt=>qq"the graph of a polynomial that crosses the x-axis at $roots[0], $roots[1], and $roots[2].")@]* << [_]{$answer}{20} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/list-indentation-with-images-and-tables.xml ================================================

    1. Structured item

    Structured item

    1. Structured item

    2. Structured item

    3. Structured item

      a b c d
    4. 1 two \lfloor\pi\rfloor \text{I}+\text{I} {}+\text{I}+\text{I} 5 six 2^3-1 VIII

    Structured item

    1. Structured item

      a b c d

      Second paragraph

    2. Structured item

    [0,0]); ############################################################ # Body ############################################################ BEGIN_PGML a. Structured item [@image(insertGraph($g), width=>102)@]* a. [@image(insertGraph($g), width=>102)@]* Structured item a. Structured item [@image(insertGraph($g), width=>102)@]* a. Structured item a. Structured item [@DataTable( [ [PGML('a'), PGML('b'), ], [PGML('c'), PGML('d'), ], ], align => '*{2}{l}', valign => 'middle', );@]* a. [@DataTable( [ [[PGML('1'), halign => 'r',], PGML('two'), PGML('[`\lfloor\pi\rfloor`]'), ], [[PGML('[`\text{I}+\text{I}`] [`{}+\text{I}+\text{I}`] '), rowbottom => '3', midrule => '1', bottom => '1', valign => 'bottom',], PGML('[`5`]'), PGML('six'), ], [[PGML('[`2^3-1`]'), rowbottom => '3', midrule => '1',], [PGML('VIII'), colspan => '2',], ], ], align => '!{\vrule width 0.11em}r|c!{\vrule width 0.07em}l|', valign => 'middle', top => '3', );@]* Structured item a. Structured item [@DataTable( [ [PGML('a'), PGML('b'), ], [PGML('c'), PGML('d'), ], ], align => '*{2}{l}', valign => 'middle', );@]* Second paragraph a. Structured item END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/list-indentation.xml ================================================

    1. Simple item

    2. Simple item

    3. Simple item

    1. Simple item

    2. Simple item

    3. Simple item

    Text before.

    1. Simple item

    2. Simple item

    3. Simple item

    And after.

    1. Structured item

    2. Structured item

    3. Structured item

    Text before.

    1. Structured item

    2. Structured item

    3. Structured item

    And after.

    1. Structured item

      1. Sublist Item

      2. Sublist Item

      3. Sublist Item

    2. Structured item

    Text before.

    1. Structured item

    2. Text before.

      1. Sublist Item

      2. Sublist Item

      3. Sublist Item

      And after.

    3. Structured item

    And after.

    1. Structured item

      Second paragraph

      1. Sublist Item

        Second paragraph

      2. Sublist Item

        Second paragraph

      3. Sublist Item

        Second paragraph

    2. Structured item

      Second paragraph

    Text before.

    1. Structured item

      Second paragraph

    2. Text before.

      1. Sublist Item

        Second paragraph

      2. Sublist Item

        Second paragraph

      3. Sublist Item

        Second paragraph

      And after.

    3. Structured item

      Second paragraph

    And after.

    1. 1+1=2

      Structured item

      Second

      1+1=2

      paragraph

      1. Sublist

        1+1=2

        Item

        Second paragraph

        1+1=2

      2. 1+1=2

        Sublist Item

        Second

        1+1=2

        paragraph

      3. Sublist Item

        1+1=2

        1+1=2

        Second paragraph

    2. Structured

      1+1=2

      item

      Second paragraph

      1+1=2

    Text before.

    1. Structured

      1+1=2

      item

      Second paragraph

      1+1=2

    2. 1+1=2

      Text before.

      1. Sublist

        1+1=2

        Item

        Second paragraph

        1+1=2

      2. 1+1=2

        Sublist Item

        Second

        1+1=2

        paragraph

      3. Sublist Item

        1+1=2

        1+1=2

        Second paragraph

      And

      1+1=2

      after.

    3. Structured item

      1+1=2

      1+1=2

      Second paragraph

    And after.

    Text before.

    1. Structured

      \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned}

      item

      Second paragraph

      \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned}

    2. \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned}

      Text before.

      1. Sublist

        \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned}

        Item

        Second paragraph

        \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned}

      2. \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned}

        Sublist Item

        Second

        \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned}

        paragraph

      3. Sublist Item

        \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned}

        \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned}

        Second paragraph

      And

      \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned}

      after.

    3. Structured item

      \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned}

      \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned}

      Second paragraph

    And after.

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/local-pg-file.xml ================================================

    Compute the sum of 2 and 2\text{:}

    2 + 2 =

    4

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/local-pg.xml ================================================

    Compute the sum of 1 and 5\text{:}

    1 + 5 =

    6

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/math-and-alignment.xml ================================================

    If a=5 and b=12\text{,} then

    a^2+b^2=13^2\text{.}

    Here, we solve an equation.

    \begin{aligned} 2x+1 \amp= 3\\ 2x \amp= 2\\ x \amp= 1 \end{aligned}

    Here we have a three-way inequality to solve.

    \begin{gathered} 1 \lt 2x+1 \lt 3\\ 0 \lt 2x \lt 2\\ 0 \lt x \lt 1 \end{gathered}

    And here, we see a system of equations.

    \begin{alignedat}{3} 2x + 2y \amp {}+{} \amp z \amp {}={} \amp 10\\ y \amp {}-{} \amp 4z \amp {}={} \amp 9\\ \amp\amp 3z \amp {}={} \amp -6 \end{alignedat}

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/mathobject-string-answers.xml ================================================

    1. Special characters used by XML, character escaping: <>&'";

      Now as a MathObject: <>&'";

    2. Special characters used by LaTeX, where LaTeX \text and MathJax \text disagree: #%&<>\^_`|~

      Now as a MathObject: #%&<>\^_`|~

    3. Special characters used by LaTeX, where LaTeX \text and MathJax \text can agree: ${}

      Now as a MathObject: ${}

    4. Alphanumeric characters: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789

      Now as a MathObject: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789

    5. Other characters: !()*+,-./:=?@[]

      Now as a MathObject: !()*+,-./:=?@[]

    In answers, because of and MathJax divergence, the first two should come out in verbatim. (And so should any string containing even one of those characters.) The latter three should come out in regular text.

    {\verb!<>&'";!}

    {\verb!#%&<>\^_`|~!}

    {\text{\$\{\}}}

    \text{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789}

    {\text{!()*+,-./:=?@[]}}

    &'";); $latex0 = '#%&<>\^_`|~'; $latex1 = '${}'; $alphanumeric = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $otherchars = '!()*+,-./:=?@[]'; Context()->strings->add($xmlchars=>{}); Context()->strings->add($latex0=>{}); Context()->strings->add($latex1=>{}); Context()->strings->add($alphanumeric=>{}); Context()->strings->add($otherchars=>{}); $xmlcharsMO = String($xmlchars); $latex0MO = String($latex0); $latex1MO = String($latex1); $alphanumericMO = String($alphanumeric); $othercharsMO = String($otherchars); ############################################################ # Body ############################################################ BEGIN_PGML a. Special characters used by XML, character escaping: [$xmlchars] Now as a MathObject: [$xmlcharsMO] [_]{$xmlchars}{6} a. Special characters used by LaTeX, where LaTeX [|\text|]* and MathJax [|\text|]* disagree: [$latex0] Now as a MathObject: [$latex0MO] [_]{$latex0}{11} a. Special characters used by LaTeX, where LaTeX [|\text|]* and MathJax [|\text|]* can agree: [$latex1] Now as a MathObject: [$latex1MO] [_]{$latex1}{3} a. Alphanumeric characters: [$alphanumeric] Now as a MathObject: [$alphanumericMO] [_]{$alphanumeric}{62} a. Other characters: [$otherchars] Now as a MathObject: [$othercharsMO] [_]{$otherchars}{15} In answers, because of [$LATEX]* and MathJax divergence, the first two should come out in verbatim. (And so should any string containing even one of those characters.) The latter three should come out in regular text. END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/multiple-choice-popup-or-radio-buttons.xml ================================================

    My favorite color is

    • ?

    • Red

    • Blue

    • Green

    .

    My favorite color is

    • Red

    • Blue

    • Green

    • None of these

    My favorite color is

    • Red

    • Blue

    • Green

    • None of these

    \text{Blue}

    \text{Blue}

    \text{Blue}

    The correct answer is Blue.

    The correct answer is Blue.

    The correct answer is Blue.

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/multiple-choice.xml ================================================

    The number \sqrt{2}

    • ?

    • is

    • is not

    rational.

    \text{is not}

    If \sqrt{2} were rational, then \sqrt{2}=\frac{p}{q}\text{,} with p and q coprime. But then 2q^2=p^2\text{.} By the Fundamental Theorem of Arithmetic, the power of 2 dividing the left side is odd, while the power of 2 dividing the right side is even. This is a contradiction, so \sqrt{2} is not rational.

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/nested-tasks.xml ================================================

    Consider the quadratic equation {3x^{2}-16x-12} = 0\text{.}

    Identify Coefficients

    Identify the coefficients for the quadratic equation using the standard form from Theorem1.2.1.

    a= ,

    3

    Take the coefficient of x^2 for the value of a\text{.} In this case, a = {3}\text{.}

    b= ,

    -16

    Take the coefficient of x for the value of b\text{.} In this case, b = {-16}\text{.}

    c=

    -12

    Take the constant term for the value of c\text{.} In this case, c = {-12}\text{.}

    Use the Quadratic Formula

    Using the quadratic formula, solve the equation.

    \left\{6,\frac{-2}{3}\right\}

    Recall that the quadratic formula is given in Theorem1.2.1.

    You already identified a = {3}\text{,} b = {-16}\text{,} and c = {-12}\text{,} so the results are:

    x = {\frac{-\left(-16\right)+\sqrt{\left(-16\right)^{2}-4\cdot 3\cdot \left(-12\right)}}{2\cdot 3}} = {6}

    or

    x = {\frac{-\left(-16\right)-\sqrt{\left(-16\right)^{2}-4\cdot 3\cdot \left(-12\right)}}{2\cdot 3}} = {-{\frac{2}{3}}}

    This conclusion is just here for testing.

    reduce; $x1 = Fraction($r,1); $x2 = Fraction(-$k,$a); Context()->flags->set(reduceConstants=>0,reduceConstantFunctions=>0); $sol1 = Formula("(-$b+sqrt(($b)**2-4($a)($c)))/(2($a))"); $sol2 = Formula("(-$b-sqrt(($b)**2-4($a)($c)))/(2($a))"); $evaluatorfora = $a->cmp()->withPostFilter(AnswerHints( [-$a] => "Do you have the sign correct?") ); $evaluatorforb = $b->cmp()->withPostFilter(AnswerHints( [-$b] => "Do you have the sign correct?") ); $evaluatorforc = $c->cmp()->withPostFilter(AnswerHints( [-$c] => "Do you have the sign correct?") ); Context("FiniteSolutionSets"); $solutionset = Formula("{$x1,$x2}"); ############################################################ # Body ############################################################ BEGIN_PGML Consider the quadratic equation [`[$quadratic] = 0\text{.}`] END_PGML ############################################################ # Scaffold ############################################################ Scaffold::Begin(numbered => 1,is_open => "correct_or_first_incorrect",can_open => when_previous_correct,); ############################################################ # Section ############################################################ Section::Begin("Identify Coefficients"); BEGIN_PGML Identify the coefficients for the quadratic equation using the standard form from Theorem[$NBSP]*1.2.1. END_PGML ############################################################ # Scaffold ############################################################ Scaffold::Begin(numbered=>1); ############################################################ # Section ############################################################ Section::Begin(""); BEGIN_PGML [`a=`] [_]{$evaluatorfora}{4}, END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Take the coefficient of [`x^2`] for the value of [`a\text{.}`] _In this case_, [`a = [$a]\text{.}`] END_PGML_SOLUTION Section::End(); ############################################################ # Section ############################################################ Section::Begin(""); BEGIN_PGML [`b=`] [_]{$evaluatorforb}{4}, END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Take the coefficient of [`x`] for the value of [`b\text{.}`] _In this case_, [`b = [$b]\text{.}`] END_PGML_SOLUTION Section::End(); ############################################################ # Section ############################################################ Section::Begin(""); BEGIN_PGML [`c=`] [_]{$evaluatorforc}{4} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Take the constant term for the value of [`c\text{.}`] _In this case_, [`c = [$c]\text{.}`] END_PGML_SOLUTION Section::End(); Scaffold::End(); Section::End(); ############################################################ # Section ############################################################ Section::Begin("Use the Quadratic Formula"); BEGIN_PGML Using the quadratic formula, solve the equation. [_]{$solutionset}{40} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Recall that the quadratic formula is given in Theorem[$NBSP]*1.2.1. You already identified [`a = [$a]\text{,}`] [`b = [$b]\text{,}`] and [`c = [$c]\text{,}`] so the results are: [```x = [$sol1] = [$x1]```] or [```x = [$sol2] = [$x2]```] END_PGML_SOLUTION Section::End(); Scaffold::End(); BEGIN_PGML This conclusion is just here for testing. END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/no-random.xml ================================================

    1+2=

    3

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/number-or-function.xml ================================================

    1. Suppose the correct answer is {-2}\text{.}

    2. Suppose the correct answer is \displaystyle {\frac{7-2x^{7}}{x}}\text{.}

    -2

    \frac{7-2x^{7}}{x}

    Solution explanation goes here.

    reduce(); ############################################################ # Body ############################################################ BEGIN_PGML a. Suppose the correct answer is [`[$answer1]\text{.}`] + [_]{$answer1}{15} [@AnswerFormatHelp('numbers')@]* a. Suppose the correct answer is [`\displaystyle [$answer2]\text{.}`] + [_]{$answer2}{15} [@AnswerFormatHelp('formulas')@]* END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Solution explanation goes here. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/options-subset-auto-label.xml ================================================

    Select all expressions that are equivalent to e^{x^2 + 1/x}\text{.} There may be more than one correct answer.

    1. e^{x^2} e^{x^{-1}}

    2. e^{ (x^3+1) / x}

    3. \dfrac{ e^{x^2} }{ e^x }

    4. e^{x^2} e^{1/x}

    5. e^{x^2} + e^{1/x}

    6. None of the above

    \text{A, B, D}

    The correct answer is A, B, D.

    "ABC", # "abc", "123", "roman", "Roman" ); ############################################################ # Body ############################################################ BEGIN_PGML Select all expressions that are equivalent to [`e^{x^2 + 1/x}\text{.}`] There may be more than one correct answer. [_]{$checks}{5} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION The correct answer is [$checks]. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/options-subset-explicit-labeling.xml ================================================

    Select all expressions that are equivalent to e^{x^2 + 1/x}\text{.} There may be more than one correct answer.

  • SUSHI

    e^{ (x^3+1) / x}

  • BURRITO

    e^{x^2} + e^{1/x}

  • BURGER

    \dfrac{ e^{x^2} }{ e^x }

  • TACO

    e^{x^2} e^{1/x}

  • PIZZA

    e^{x^2} e^{x^{-1}}

  • HUNGRY

    None of the above

  • \text{SUSHI, TACO, PIZZA}

    The correct answer is SUSHI, TACO, PIZZA.

    "${BM}e^{x^2} e^{1/x}${EM}"}, {PIZZA => "${BM}e^{x^2} e^{x^{-1}}${EM}"}, {SUSHI => "${BM}e^{ (x^3+1) / x}${EM}"}, {BURGER => "${BM}\dfrac{ e^{x^2} }{ e^x }${EM}"}, {BURRITO => "${BM}e^{x^2} + e^{1/x}${EM}"} ], {HUNGRY => "None of the above"} ], [0, 1, 2], displayLabels => 1 ); ############################################################ # Body ############################################################ BEGIN_PGML Select all expressions that are equivalent to [`e^{x^2 + 1/x}\text{.}`] There may be more than one correct answer. [_]{$checks}{5} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION The correct answer is [$checks]. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/options-subset.xml ================================================

    Select all expressions that are equivalent to e^{x^2 + 1/x}\text{.} There may be more than one correct answer.

    • e^{x^2} e^{x^{-1}}

    • \dfrac{ e^{x^2} }{ e^x }

    • e^{x^2} e^{1/x}

    • e^{x^2} + e^{1/x}

    • e^{ (x^3+1) / x}

    • None of the above

    \text{Choice 1, Choice 3, Choice 5}

    The correct answer is Choice 1, Choice 3, Choice 5.

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_1-Adding_SingleDigit_Integers.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.1.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); COMMENT('Add two positive single-digit integers.'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $a = random(1, 9, 1); $b = random(1, 9, 1); $c = Compute($a + $b); ############################################################ # Body ############################################################ BEGIN_PGML Compute the sum of [`[$a]`] and [`[$b]\text{:}`] [`[$a] + [$b] =`] [_]{$c}{5} [@AnswerFormatHelp('numbers')@]* END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION [`[$a] + [$b] = [$c]\text{.}`] END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_3-Controlling_Randomness.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.1.3) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $a = random(1, 9, 1); $b = random(1, 9, 1); if ($envir{problemSeed}==1){$a=1;$b=2}; $c = Compute($a + $b); ############################################################ # Body ############################################################ BEGIN_PGML Compute the sum of [`[$a]`] and [`[$b]\text{:}`] [`[$a] + [$b] =`] [_]{$c}{5} [@AnswerFormatHelp('numbers')@]* END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION [`[$a] + [$b] = [$c]\text{.}`] END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_4-Special_Answer_Checking.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.1.4) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PCCmacros.pl", "answerHints.pl", "contextForm.pl", "contextLimitedPolynomial.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ $a = random(1, 9, 1); $b = random(1, 9, 1); $c = $a + $b; $expression = Formula("x^($a)*x^($b)"); Context("LimitedPolynomial-Strict"); # custom error message Context()->{error}{msg}{"A variable can appear only once in each term of a polynomial"} = "Your answer must be fully simplified"; $answer = Formula("x^($c)"); $product = $a*$b; $evaluator = $answer->cmp()->withPostFilter(AnswerHints( [Compute("x^($product)")] => "When multiplying terms with the same base, you do not multiply the exponents.")); ############################################################ # Body ############################################################ BEGIN_PGML Use the properties of exponents to simplify [`[$expression]\text{.}`] [@KeyboardInstructions('To enter a power, use a [|^|]*, as in [|x^2|]* for [`x^2\text{.}`]')@]** [`[$expression]=`] [_]{$evaluator}{8} [@AnswerFormatHelp('formulas')@]* END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION We _add_ the exponents as follows, while including a gratuitous reference to the quadratic formula: [``` \begin{aligned} [$expression]&=x^{[$a]+[$b]}&\text{Theorem 1.2.1}\\ &=x^{[$c]} \end{aligned} ```] END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_5-Using_Hints.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.1.5) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "contextForm.pl", "contextLimitedRadical.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ do { $a = list_random(2,3,5,6); $b = random(1, 5, 1); } until (gcd($a,$b) == 1); $c = $a * $b**2; Context()->flags->set(reduceConstantFunctions=>0); $expression = Formula("sqrt($c)"); Context("LimitedRadical"); $answer = Formula("$b sqrt($a)"); ############################################################ # Body ############################################################ BEGIN_PGML Simplify the expression [`[$expression]\text{.}`] [`[$expression]=`] [_]{$answer}{10} END_PGML ############################################################ # Hint ############################################################ #Set value of $showHint in PGcourse.pl for course-wide attempt threshhold for revealing hints BEGIN_PGML_HINT Factor the number inside the radical. END_PGML_HINT ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION [```[$expression]=\sqrt{[$b]^2\cdot [$a]}=[$b]\sqrt{[$a]}```] END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_6-No_Randomization.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.1.6) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+2=`] [_]{3}{5} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_7-Local_PG.pg ================================================ DOCUMENT(); loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Add two positive single-digit integers.'); Context('Numeric'); $a = random(1, 9, 1); $b = random(1, 9, 1); $c = Compute($a + $b); BEGIN_PGML Compute the sum of [`[$a]`] and [`[$b]\text{:}`] [`[$a] + [$b] =`] [_]{$c}{5} [@AnswerFormatHelp('numbers')@]* END_PGML ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_8-Local_PG_File.pg ================================================ DOCUMENT(); loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Add two positive single-digit integers.'); Context('Numeric'); $a = random(1, 9, 1); $b = random(1, 9, 1); $c = Compute($a + $b); BEGIN_PGML Compute the sum of [`[$a]`] and [`[$b]\text{:}`] [`[$a] + [$b] =`] [_]{$c}{5} [@AnswerFormatHelp('numbers')@]* END_PGML ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/Exploration-1_1_2-Inside_an_exploration.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); COMMENT('Add two positive single-digit integers.'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $a = random(1, 9, 1); $b = random(1, 9, 1); $c = Compute($a + $b); ############################################################ # Body ############################################################ BEGIN_PGML Compute the sum of [`[$a]`] and [`[$b]\text{:}`] [`[$a] + [$b] =`] [_]{$c}{5} [@AnswerFormatHelp('numbers')@]* END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION [`[$a] + [$b] = [$c]\text{.}`] END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/Project-1_1_1-Inside_a_project.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); COMMENT('Add two positive single-digit integers.'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $a = random(1, 9, 1); $b = random(1, 9, 1); $c = Compute($a + $b); ############################################################ # Body ############################################################ BEGIN_PGML Compute the sum of [`[$a]`] and [`[$b]\text{:}`] [`[$a] + [$b] =`] [_]{$c}{5} [@AnswerFormatHelp('numbers')@]* END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION [`[$a] + [$b] = [$c]\text{.}`] END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_2-The_Quadratic_Formula/1_2_2-Solving_Quadratic_Equations.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.2.2) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "scaffold.pl", "answerHints.pl", "contextFiniteSolutionSets.pl", "contextForm.pl", "contextFraction.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); COMMENT('This problem is scaffolded with multiple parts'); COMMENT(q"Find a quadratic equation's solutions.", 'One positive integer solution and one negative fraction solution.'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context("Fraction"); $a = Compute(random(2,6,1)); do {$k = Compute(random(2,6,1))} until (gcd($a,$k)==1); $r = Compute(random(2,6,1)); $c = $k*-$r; $b = $a*-$r+$k; $quadratic = Formula("$a x^2 + $b x + $c")->reduce; $x1 = Fraction($r,1); $x2 = Fraction(-$k,$a); Context()->flags->set(reduceConstants=>0,reduceConstantFunctions=>0); $sol1 = Formula("(-$b+sqrt(($b)**2-4($a)($c)))/(2($a))"); $sol2 = Formula("(-$b-sqrt(($b)**2-4($a)($c)))/(2($a))"); $evaluatorfora = $a->cmp()->withPostFilter(AnswerHints( [-$a] => "Do you have the sign correct?") ); $evaluatorforb = $b->cmp()->withPostFilter(AnswerHints( [-$b] => "Do you have the sign correct?") ); $evaluatorforc = $c->cmp()->withPostFilter(AnswerHints( [-$c] => "Do you have the sign correct?") ); Context("FiniteSolutionSets"); $solutionset = Formula("{$x1,$x2}"); ############################################################ # Body ############################################################ BEGIN_PGML Consider the quadratic equation [`[$quadratic] = 0\text{.}`] END_PGML ############################################################ # Scaffold ############################################################ Scaffold::Begin(numbered => 1,is_open => "correct_or_first_incorrect",can_open => when_previous_correct,); ############################################################ # Section ############################################################ Section::Begin("Identify Coefficients"); BEGIN_PGML Identify the coefficients for the quadratic equation using the standard form from Theorem[$NBSP]*1.2.1. [`a=`] [_]{$evaluatorfora}{4}, [`b=`] [_]{$evaluatorforb}{4}, [`c=`] [_]{$evaluatorforc}{4} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Take the coefficient of [`x^2`] for the value of [`a\text{,}`] the coefficient of [`x`] for [`b\text{,}`] and the constant for [`c\text{.}`] _In this case_, they are [`a = [$a]\text{,}`] [`b = [$b]\text{,}`] [`c = [$c]\text{.}`] END_PGML_SOLUTION Section::End(); ############################################################ # Section ############################################################ Section::Begin("Use the Quadratic Formula"); BEGIN_PGML Using the quadratic formula, solve the equation. [_]{$solutionset}{40} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Recall that the quadratic formula is given in Theorem[$NBSP]*1.2.1. You already identified [`a = [$a]\text{,}`] [`b = [$b]\text{,}`] and [`c = [$c]\text{,}`] so the results are: [```x = [$sol1] = [$x1]```] or [```x = [$sol2] = [$x2]```] END_PGML_SOLUTION Section::End(); Scaffold::End(); BEGIN_PGML This conclusion is just here for testing. END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_2-The_Quadratic_Formula/1_2_3-Nested_tasks.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.2.3) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "scaffold.pl", "answerHints.pl", "contextFiniteSolutionSets.pl", "contextForm.pl", "contextFraction.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); COMMENT('This problem is scaffolded with multiple parts'); COMMENT(q"Find a quadratic equation's solutions.", 'One positive integer solution and one negative fraction solution.'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context("Fraction"); $a = Compute(random(2,6,1)); do {$k = Compute(random(2,6,1))} until (gcd($a,$k)==1); $r = Compute(random(2,6,1)); $c = $k*-$r; $b = $a*-$r+$k; $quadratic = Formula("$a x^2 + $b x + $c")->reduce; $x1 = Fraction($r,1); $x2 = Fraction(-$k,$a); Context()->flags->set(reduceConstants=>0,reduceConstantFunctions=>0); $sol1 = Formula("(-$b+sqrt(($b)**2-4($a)($c)))/(2($a))"); $sol2 = Formula("(-$b-sqrt(($b)**2-4($a)($c)))/(2($a))"); $evaluatorfora = $a->cmp()->withPostFilter(AnswerHints( [-$a] => "Do you have the sign correct?") ); $evaluatorforb = $b->cmp()->withPostFilter(AnswerHints( [-$b] => "Do you have the sign correct?") ); $evaluatorforc = $c->cmp()->withPostFilter(AnswerHints( [-$c] => "Do you have the sign correct?") ); Context("FiniteSolutionSets"); $solutionset = Formula("{$x1,$x2}"); ############################################################ # Body ############################################################ BEGIN_PGML Consider the quadratic equation [`[$quadratic] = 0\text{.}`] END_PGML ############################################################ # Scaffold ############################################################ Scaffold::Begin(numbered => 1,is_open => "correct_or_first_incorrect",can_open => when_previous_correct,); ############################################################ # Section ############################################################ Section::Begin("Identify Coefficients"); BEGIN_PGML Identify the coefficients for the quadratic equation using the standard form from Theorem[$NBSP]*1.2.1. END_PGML ############################################################ # Scaffold ############################################################ Scaffold::Begin(numbered=>1); ############################################################ # Section ############################################################ Section::Begin(""); BEGIN_PGML [`a=`] [_]{$evaluatorfora}{4}, END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Take the coefficient of [`x^2`] for the value of [`a\text{.}`] _In this case_, [`a = [$a]\text{.}`] END_PGML_SOLUTION Section::End(); ############################################################ # Section ############################################################ Section::Begin(""); BEGIN_PGML [`b=`] [_]{$evaluatorforb}{4}, END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Take the coefficient of [`x`] for the value of [`b\text{.}`] _In this case_, [`b = [$b]\text{.}`] END_PGML_SOLUTION Section::End(); ############################################################ # Section ############################################################ Section::Begin(""); BEGIN_PGML [`c=`] [_]{$evaluatorforc}{4} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Take the constant term for the value of [`c\text{.}`] _In this case_, [`c = [$c]\text{.}`] END_PGML_SOLUTION Section::End(); Scaffold::End(); Section::End(); ############################################################ # Section ############################################################ Section::Begin("Use the Quadratic Formula"); BEGIN_PGML Using the quadratic formula, solve the equation. [_]{$solutionset}{40} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Recall that the quadratic formula is given in Theorem[$NBSP]*1.2.1. You already identified [`a = [$a]\text{,}`] [`b = [$b]\text{,}`] and [`c = [$c]\text{,}`] so the results are: [```x = [$sol1] = [$x1]```] or [```x = [$sol2] = [$x2]```] END_PGML_SOLUTION Section::End(); Scaffold::End(); BEGIN_PGML This conclusion is just here for testing. END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_4-Antidifferentiation/1_4_2_2-Every_Continuous_Function_has_an_Antiderivative.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.4.2.2) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGessaymacros.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML Explain how we can use Corollary[$NBSP]*1.4.3 to say that every continuous function _always_ has a derivative. (And we will demonstrate here that you can use a macro from [|docinfo|]*: [`\newcommand{\definiteintegral}[4]{\int_{#1}^{#2}\,#3\,d#4}\definiteintegral{1}{2}{\frac{1}{x}}{x}=\ln(2)\text{.}`] It will work in the WeBWorK problem, regardless of whether you are using images, MathJax, or hardcopy.) [@ANS(essay_cmp()); essay_box(6,76)@]* [@essay_help()@]* END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_4-Antidifferentiation/1_4_2_3-Inverse_Processes.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.4.2.3) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGessaymacros.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML "Differentiation and integration are inverse processes." Cite *specific results* from this section in an explanation of how they justify this (somewhat imprecise) claim. [@ANS(essay_cmp()); essay_box(6,40)@]* [@essay_help()@]* END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_4-Antidifferentiation/1_4_2_4.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.4.2.4) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "parserFormulaUpToConstant.pl", "contextForm.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $answer = FormulaUpToConstant("-cos(x)"); ############################################################ # Body ############################################################ BEGIN_PGML For the given function [`f\text{,}`] find [`\newcommand{\indefiniteintegral}[2]{\int#1\,d#2}\indefiniteintegral{f(x)}{x}\text{.}`] Note that these common instructions are phrased in such a way that they would read well if they were applied to only one exercise at a time. That will happen if these exercises are exported as [|.pg|]* files, for example to be used in online homework from a WeBWorK server. [`f(x)=\sin(x)`] [_]{$answer}{20} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_4-Antidifferentiation/1_4_2_5.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.4.2.5) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "parserFormulaUpToConstant.pl", "contextForm.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $answer = FormulaUpToConstant("e^x"); ############################################################ # Body ############################################################ BEGIN_PGML For the given function [`f\text{,}`] find [`\newcommand{\indefiniteintegral}[2]{\int#1\,d#2}\indefiniteintegral{f(x)}{x}\text{.}`] Note that these common instructions are phrased in such a way that they would read well if they were applied to only one exercise at a time. That will happen if these exercises are exported as [|.pg|]* files, for example to be used in online homework from a WeBWorK server. [`f(x)=e^x`] [_]{$answer}{20} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_4-Antidifferentiation/1_4_2_6-Show_Your_Work.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.4.2.6) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGessaymacros.pl", "contextForm.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $answer = Formula('2x'); $showwork = '[@ explanation_box(message => "Show your work.") @]*'; ############################################################ # Body ############################################################ BEGIN_PGML Use the definition of the derivative to find [`\frac{d}{dx}x^2\text{.}`] [_]{$answer}{10} [$showwork]** END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_5-Math_Content/1_5_1-Math_Elements_and_Alignment.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.5.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML If [`a=5`] and [`b=12\text{,}`] then [```a^2+b^2=13^2\text{.}```] Here, we solve an equation. [```\newcommand{\amp}{&} \begin{aligned} 2x+1 \amp= 3\\ 2x \amp= 2\\ x \amp= 1 \end{aligned} ```] Here we have a three-way inequality to solve. [```\newcommand{\lt}{<} \begin{gathered} 1 \lt 2x+1 \lt 3\\ 0 \lt 2x \lt 2\\ 0 \lt x \lt 1 \end{gathered} ```] And here, we see a system of equations. [```\newcommand{\amp}{&} \begin{alignedat}{3} 2x + 2y \amp {}+{} \amp z \amp {}={} \amp 10\\ y \amp {}-{} \amp 4z \amp {}={} \amp 9\\ \amp\amp 3z \amp {}={} \amp -6 \end{alignedat} ```] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_5-Math_Content/1_5_2-Intertext.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.5.2) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML Here, we solve an equation. [```\newcommand{\amp}{&} \begin{aligned} 2x+1 \amp= 3 \end{aligned} ```] Now subtract [`1`] from each side. [```\newcommand{\amp}{&} \begin{aligned} 2x \amp= 2 \end{aligned} ```] Now divide by [`2`] on each side. [```\newcommand{\amp}{&} \begin{aligned} x \amp= 1 \end{aligned} ```] We should also test when the [||]* is within a list. a. Start a list. a. [$NBSP]* [```\newcommand{\amp}{&} \begin{aligned} 2x+1 \amp= 3 \end{aligned} ```] Now subtract [`1`] from each side. [```\newcommand{\amp}{&} \begin{aligned} 2x \amp= 2 \end{aligned} ```] Now divide by [`2`] on each side. [```\newcommand{\amp}{&} \begin{aligned} x \amp= 1 \end{aligned} ```] a. Still in the list? END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_6-Multiple_Choice/1_6_1-DropdownPopup.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.6.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "parserPopUp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $rational = PopUp( ["?","is","is not",], "is not", ); ############################################################ # Body ############################################################ BEGIN_PGML The number [`\sqrt{2}`] [_]{$rational}{5} rational. END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION If [`\sqrt{2}`] were rational, then [`\sqrt{2}=\frac{p}{q}\text{,}`] with [`p`] and [`q`] coprime. But then [`2q^2=p^2\text{.}`] By [@htmlLink("https://en.wikipedia.org/wiki/Fundamental_theorem_of_arithmetic#Canonical_representation_of_a_positive_integer","the Fundamental Theorem of Arithmetic","TARGET='_blank'")@]*, the power of [`2`] dividing the left side is odd, while the power of [`2`] dividing the right side is even. This is a contradiction, so [`\sqrt{2}`] [$rational] rational. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_6-Multiple_Choice/1_6_2-Choose_one.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.6.2) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "parserRadioButtons.pl", "contextForm.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $theorem = RadioButtons( ["The Quadratic Formula","The Fundamental Theorem of Calculus","The Fundamental Theorem of Arithmetic","None of these"], 1, # index of correct answer; could also just be the correct answer ); ############################################################ # Body ############################################################ BEGIN_PGML Which of the following suggest that differentiation and integration are inverse processes? [_]{$theorem}{5} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION The correct answer is [$theorem]. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_6-Multiple_Choice/1_6_3-Choose_a_Subset_of_Options.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.6.3) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "parserCheckboxList.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $checks = CheckboxList( [ [ "${BM}e^{x^2} e^{1/x}${EM}", "${BM}e^{x^2} e^{x^{-1}}${EM}", "${BM}e^{ (x^3+1) / x}${EM}", "${BM}\dfrac{ e^{x^2} }{ e^x }${EM}", "${BM}e^{x^2} + e^{1/x}${EM}" ], "None of the above" ], [0, 1, 2] ); ############################################################ # Body ############################################################ BEGIN_PGML Select all expressions that are equivalent to [`e^{x^2 + 1/x}\text{.}`] There may be more than one correct answer. [_]{$checks}{5} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION The correct answer is [$checks]. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_6-Multiple_Choice/1_6_4-Choose_a_Subset_of_Options_with_Automated_Labeling.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.6.4) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "parserCheckboxList.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $checks = CheckboxList( [ [ "${BM}e^{x^2} e^{1/x}${EM}", "${BM}e^{x^2} e^{x^{-1}}${EM}", "${BM}e^{ (x^3+1) / x}${EM}", "${BM}\dfrac{ e^{x^2} }{ e^x }${EM}", "${BM}e^{x^2} + e^{1/x}${EM}" ], "None of the above" ], [0, 1, 2], labels => "ABC", # "abc", "123", "roman", "Roman" ); ############################################################ # Body ############################################################ BEGIN_PGML Select all expressions that are equivalent to [`e^{x^2 + 1/x}\text{.}`] There may be more than one correct answer. [_]{$checks}{5} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION The correct answer is [$checks]. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_6-Multiple_Choice/1_6_5-Choose_a_Subset_of_Options_with_Explicit_Labeling.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.6.5) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "parserCheckboxList.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $checks = CheckboxList( [ [ {TACO => "${BM}e^{x^2} e^{1/x}${EM}"}, {PIZZA => "${BM}e^{x^2} e^{x^{-1}}${EM}"}, {SUSHI => "${BM}e^{ (x^3+1) / x}${EM}"}, {BURGER => "${BM}\dfrac{ e^{x^2} }{ e^x }${EM}"}, {BURRITO => "${BM}e^{x^2} + e^{1/x}${EM}"} ], {HUNGRY => "None of the above"} ], [0, 1, 2], displayLabels => 1 ); ############################################################ # Body ############################################################ BEGIN_PGML Select all expressions that are equivalent to [`e^{x^2 + 1/x}\text{.}`] There may be more than one correct answer. [_]{$checks}{5} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION The correct answer is [$checks]. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_7-Tables/1_7_1-Complete_this_Table.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.7.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "niceTables.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); @a = (random(2,9,1),random(2,9,1)); @b = (random(2,9,1),random(2,9,1)); for my$i(0..3){$p[$i]=$a[int($i/2)]*$b[$i % 2]}; ############################################################ # Body ############################################################ BEGIN_PGML Complete this multiplication table. >> [@DataTable( [ [[PGML('[`\times`]'), rowbottom => '3', midrule => '1',], PGML('[`[$a[0]]`]'), PGML('[`[$a[1]]`]'), ], [[PGML('[`[$b[0]]`]'), rowbottom => '1', midrule => '1',], PGML('[_]{$p[0]}{5}'), PGML('[_]{$p[2]}{5}'), ], [[PGML('[`[$b[1]]`]'), rowbottom => '1', midrule => '1',], PGML('[_]{$p[1]}{5}'), PGML('[_]{$p[3]}{5}'), ], ], align => 'r!{\vrule width 0.11em}c|c|', valign => 'middle',);@]* << END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION >> [@DataTable( [ [[PGML('[`\times`]'), rowbottom => '3', midrule => '1',], PGML('[`[$a[0]]`]'), PGML('[`[$a[1]]`]'), ], [[PGML('[`[$b[0]]`]'), rowbottom => '1', midrule => '1',], PGML('[`[$p[0]]`]'), PGML('[`[$p[2]]`]'), ], [[PGML('[`[$b[1]]`]'), rowbottom => '1', midrule => '1',], PGML('[`[$p[1]]`]'), PGML('[`[$p[3]]`]'), ], ], align => 'r!{\vrule width 0.11em}c|c|', valign => 'middle',);@]* << END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_1-A_static_lateximage_graph.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.8.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGlateximage.pl", "PCCmacros.pl", "parserOneOf.pl", "contextForm.pl", "contextIntegerFunctions.pl", "WWSC.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context("IntegerFunctions"); Context()->variables->are(n=>'Real'); $answer = OneOf(Formula("C(n+1,2)"),Formula("(n+1)n/2")); $image_1 = createLaTeXImage(); $image_1->addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw[dashed] (0.5-0.5*6.5,-0.866025*6.5) -- (7-0.5*6.5,-0.866025*6.5); \draw[very thick] (2-0.5*7,-0.866025*7) -- (2-0.5*4,-0.866025*4) -- (5-0.5*7,-0.866025*7); \foreach \x in {1,...,6} \foreach \y in {1,...,\x} \shade[ball color=blue!30] (\y-0.5*\x,-0.866025*\x) circle (0.2cm); \foreach \y in {1,...,7} \shade[ball color=orange!40] (\y-0.5*7,-0.866025*7) circle (0.2cm); \node at (2.5,-0.5) [anchor=north west]{\(\color{blue}\sum\limits_{k=1}^nk\color{black}\)}; \shade[ball color=blue] (2-0.5*4,-0.866025*4) circle (0.2cm); \shade[ball color=orange] (2-0.5*7,-0.866025*7) circle (0.2cm); \shade[ball color=orange] (5-0.5*7,-0.866025*7) circle (0.2cm); \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML This image is a visual proof that [`\sum_{k=1}^{n}k`] equals what? >> [@image(insertGraph($image_1), width=>300, alt=>qq"21 blue balls are arranged in a triangular formation, with one at the top, then a row of two, a row of three, and so on until a row of six; there is a seventh row with seven orange balls; one blue ball is highlighted, and two lines extend downward from that ball, one to the left and one to the right, parallel to the sides of the triangle, until they intersect two orange balls; the effect is that each of the 1\+2\+3\+4\+5\+6 blue balls corresponds to one pair from the 7 orange balls")@]* << [@KeyboardInstructions('You may enter the answer using [|C(n,k)|]* notation.')@]** [_]{$answer}{20} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_1.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.8.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGlateximage.pl", "WWSC.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $introduction_image_1 = createLaTeXImage(); $introduction_image_1->addToPreamble(latexImagePreamble()); $introduction_image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(L\)} --++ (0,3) node[right,pos=0.5] {\(W\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(D\)} --++ (0,3) --++ (4,0); \end{tikzpicture} END_LATEX_IMAGE $image_1 = createLaTeXImage(); $image_1->addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(4\)} --++ (0,3) node[right,pos=0.5] {\(3\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(5\)} --++ (0,3) --++ (4,0); \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML This exercisegroup has a [||]* image in its introduction. In standalone versions of the exercise, this image should be repeated. >> [@image(insertGraph($introduction_image_1), width=>300)@]* << Find [`D`] when [`L=4`] and [`W=3\text{.}`] [_]{'5'}{10} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION >> [@image(insertGraph($image_1), width=>600)@]* << END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_2-A_randomized_lateximage_graph.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.8.2) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGlateximage.pl", "parserNumberWithUnits.pl", "WWSC.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $a = random(4,6,1); $b = $a + random(2,4,1); $area = NumberWithUnits($a*$b, 'cm^2'); $image_1 = createLaTeXImage(); $image_1->addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw[fill=blue!20] (0,0) --++ (6,0) node[pos=0.5,below] {\($b\)\,cm} --++ (0,4) node[pos=0.5,right] {\($a\)\,cm} --++ (-6,0) -- cycle; \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML Find the area of the rectangle. >> [@image(insertGraph($image_1), width=>300, alt=>qq"a rectangle whose width is labeled $b cm and height is labeled $a cm")@]* << [_]{$area}{20} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_2.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.8.2) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGlateximage.pl", "WWSC.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $introduction_image_1 = createLaTeXImage(); $introduction_image_1->addToPreamble(latexImagePreamble()); $introduction_image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(L\)} --++ (0,3) node[right,pos=0.5] {\(W\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(D\)} --++ (0,3) --++ (4,0); \end{tikzpicture} END_LATEX_IMAGE $image_1 = createLaTeXImage(); $image_1->addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(12\)} --++ (0,3) node[right,pos=0.5] {\(5\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(13\)} --++ (0,3) --++ (4,0); \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML This exercisegroup has a [||]* image in its introduction. In standalone versions of the exercise, this image should be repeated. >> [@image(insertGraph($introduction_image_1), width=>300)@]* << Find [`D`] when [`L=12`] and [`W=5\text{.}`] [_]{'13'}{10} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION >> [@image(insertGraph($image_1), width=>600)@]* << END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_3-A_lateximage_graph_affected_by_lateximagepreamble.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.8.3) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGlateximage.pl", "PGchoicemacros.pl", "WWSC.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); @roots = (-3..3)[NchooseK(7,3)]; @roots = num_sort(@roots); $answer = List(@roots); $xmin = min(-1,@roots)-1; $xmax = max(1,@roots)+1; $image_1 = createLaTeXImage(); $image_1->addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \begin{axis} \addplot[domain=$xmin:$xmax,smooth] {(x-$roots[0])*(x-$roots[1])*(x-$roots[2])}; \end{axis} \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML What are the roots of this polynomial? >> [@image(insertGraph($image_1), width=>300, alt=>qq"the graph of a polynomial that crosses the x-axis at $roots[0], $roots[1], and $roots[2].")@]* << [_]{$answer}{20} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_4-Special_characters.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.8.4) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGlateximage.pl", "WWSC.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $image_1 = createLaTeXImage(); $image_1->addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \node at (0,0) {I need about \~~$3.50.}; \node at (0,1) {You gotta give 110\~~%.}; %This is a comment. \node at (0,2) {Send email user~~@domain.com.}; \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML The code below has a printed dollar sign, a printed percent sign, a printed at sign, and a percent sign used as a comment marker. >> [@image(insertGraph($image_1), width=>300, alt=>qq"this image has pictures of text with special characters like \$, %, and @")@]* << END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_5-Solve_using_a_graph.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(1.8.5) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGgraphmacros.pl", "contextFiniteSolutionSets.pl", "contextForm.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ $a = random(1,3,1); $gr = init_graph(-1,-1,4,4, axes=>[0,0], grid=>[5,5], size=>[300,180] ); add_functions($gr, "x^3/$a^3 for x in <-1,4> using color:blue and weight:2"); $second_x = Real($a*2**(1/3)); $solgr = init_graph(-1,-1,4,4, axes=>[0,0], grid=>[5,5], size=>[300,180] ); add_functions($solgr, "x^3/$a^3 for x in <-1,4> using color:blue and weight:2"); $solgr->moveTo(0,1); $solgr->lineTo($a,1,'black',3); $solgr->arrowTo($a,0,'black',3); Context("FiniteSolutionSets"); $answer = Formula("{$a}"); ############################################################ # Body ############################################################ BEGIN_PGML The graph below is a graph of [`y=f(x)\text{.}`] Use the graph to solve the equation [`f(x)=1\text{.}`] >> [@image(insertGraph($gr), width=>300, alt=>qq"a plot of a curve on a cartesian set of axes; the x axis ranges from -1 to 4, and the y-axis ranges from -1 to 4; the curve enters from the left, below the x-axis, and curves upward and to the right until it reaches the point (0,0); from here it continues predominantly rightward for a bit, bending slightly upward more and more as it progresses; it passes through the points ($a,1) and ($second_x,2) before leaving the graph moving more and more upward and to the right.")@]* << [_]{$answer}{5} [@AnswerFormatHelp('numbers')@]* END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION The graph reveals that the solution set to [`f(x)=1`] is [`[$answer]\text{.}`] >> [@image(insertGraph($solgr), width=>300, alt=>qq"a plot of a curve on a cartesian set of axes; the x axis ranges from -1 to 4, and the y-axis ranges from -1 to 4; the curve enters from the left, below the x-axis, and curves upward and to the right until it reaches the point (0,0); from here it continues predominantly rightward for a bit, bending slightly upward more and more as it progresses; it passes through the points ($a,1) and ($second_x,2) before leaving the graph moving more and more upward and to the right; a horizontal line segment moves rightward from y=1 on the y-axis until it reaches a point on the curve; a vertical line segment moves down from this point to x=$a on the x-axis.")@]* << END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_1-PGML_Formatting_and_Verbatim_Calisthenics/2_1_1-PGML_Formatting.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.1.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML Smart double quotes: "Life is about making an impact, not making an income." Smart single quotes: 'Whatever the mind of man can conceive and believe, it can achieve.' Regular apostrophes: My siblings' mother's daughter isn't my daughter's siblings' mother. Emphasis: _very important_ Alert: *do not* do it Braces: \{text that looks like a set\} ``` Some pre-formatted text with an indented line and an out-dented line This should not be altered *a problem* And this [$NDASH]* should not be an en-dash ``` Here is some inline [|code with special characters & < > " ' # $ % ^ _ { } ~ \ * [ ]|]*, and here is some ``` single-line display code with special characters & < > " ' # $ % ^ _ { } ~ \ * [ ] ``` and here is some ``` multi-line display code with special characters & < > " ' # $ % ^ _ { } ~ \ * [ ] ``` Some raw characters, XML/HTML: & < > " ' Some raw characters, [$LATEX]*: \# \$ % ^ & \_ \{ \} ~ \\ Some raw characters, PGML: \\ \* \# \{ \} \[ \] Some characters that need special handling for PGML conversion to HTML or [$LATEX]*: A non[$NBSP]*breaking space (invisble where a hyphen should be) An ndash[$NDASH]*right here. An mdash[$MDASH]*right here. Some constructions in "normal" text, which need to be manipulated, lest they get interpreted as PGML markup: \>\>This should not be a centered line << \>\>Nor a right-justified line, either We should not get \_a phrase in italics\_ in the midst of this sentence. Brackets, unpaired; \] with content between \[ Brackets, paired, in PGML constructions; \[\$NDASH\]\*, \[\_\_\_\]\{\$answer\} \#\#\# This should not be a level 3 heading =\== Not a horizontal rule from three equal signs == Not a horizontal rule from two equal signs =\==== Not a horizontal rule from five equal signs -\-\- Not a horizontal rule from three hyphens -\- Not a horizontal rule from two hyphens -\---\- Not a horizontal rule from five hyphens \+ Not an unordered list item \- Not an unordered list item END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_1-PGML_Formatting_and_Verbatim_Calisthenics/2_1_2.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.1.2) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "contextABCD.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ $xmlchars = q(<>&'";); $latex0 = '#%&<>\^_`|~'; $latex1 = '${}'; $alphanumeric = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $otherchars = '!()*+,-./:=?@[]'; Context()->strings->add($xmlchars=>{}); Context()->strings->add($latex0=>{}); Context()->strings->add($latex1=>{}); Context()->strings->add($alphanumeric=>{}); Context()->strings->add($otherchars=>{}); $xmlcharsMO = String($xmlchars); $latex0MO = String($latex0); $latex1MO = String($latex1); $alphanumericMO = String($alphanumeric); $othercharsMO = String($otherchars); ############################################################ # Body ############################################################ BEGIN_PGML a. Special characters used by XML, character escaping: [$xmlchars] Now as a MathObject: [$xmlcharsMO] [_]{$xmlchars}{6} a. Special characters used by LaTeX, where LaTeX [|\text|]* and MathJax [|\text|]* disagree: [$latex0] Now as a MathObject: [$latex0MO] [_]{$latex0}{11} a. Special characters used by LaTeX, where LaTeX [|\text|]* and MathJax [|\text|]* can agree: [$latex1] Now as a MathObject: [$latex1MO] [_]{$latex1}{3} a. Alphanumeric characters: [$alphanumeric] Now as a MathObject: [$alphanumericMO] [_]{$alphanumeric}{62} a. Other characters: [$otherchars] Now as a MathObject: [$othercharsMO] [_]{$otherchars}{15} In answers, because of [$LATEX]* and MathJax divergence, the first two should come out in verbatim. (And so should any string containing even one of those characters.) The latter three should come out in regular text. END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_1-PGML_Formatting_and_Verbatim_Calisthenics/2_1_3.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.1.3) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $statement = 'some PGML math: [`\frac{1}{2}+\frac{3}{2}=2`]; and some *bold text*'; ############################################################ # Body ############################################################ BEGIN_PGML [$statement] makes: [$statement]** END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_2-Subject_Area_Templates/2_2_1-Answer_is_a_number_or_a_function.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.2.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $a = non_zero_random(-9,9,1); do { $b = random(2,9,1); } until ( $b != $a ); $answer1 = Compute("$a"); $answer2 = Compute("($a x^($b) + $b)/x")->reduce(); ############################################################ # Body ############################################################ BEGIN_PGML a. Suppose the correct answer is [`[$answer1]\text{.}`] + [_]{$answer1}{15} [@AnswerFormatHelp('numbers')@]* a. Suppose the correct answer is [`\displaystyle [$answer2]\text{.}`] + [_]{$answer2}{15} [@AnswerFormatHelp('formulas')@]* END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Solution explanation goes here. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_2-Subject_Area_Templates/2_2_2-Answer_is_a_function_with_domain_issues.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.2.2) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "answerHints.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $a = random(2,5,1); $answer1 = Compute("sqrt(x-$a)"); $answer1->{limits} = [$a+1,$a+4]; $answer2 = Compute("ln(abs( x / (x-$a) ))"); $answer2->{test_points} = [[-5],[-4],[1],[$a-1],[7],[8]]; $answer2evaluator = $answer2 -> cmp() -> withPostFilter( AnswerHints( [Compute("ln(abs((x-$a)/x))"),] => "This is the opposite of correct...",)); ############################################################ # Body ############################################################ BEGIN_PGML a. Suppose the correct answer is [`\displaystyle [$answer1]\text{.}`] + [_]{$answer1}{15} [@AnswerFormatHelp('formulas')@]* a. Suppose the correct answer is [`\displaystyle [$answer2]\text{.}`] + [_]{$answer2evaluator}{15} [@AnswerFormatHelp('formulas')@]* END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Solution explanation goes here. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_2-Subject_Area_Templates/2_2_3-Multiple_Choice_by_Popup_Radio_Buttons_or_Checkboxes.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.2.3) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "parserCheckboxList.pl", "parserPopUp.pl", "parserRadioButtons.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $color1 = PopUp(["?","Red","Blue","Green"], 2); $color2 = RadioButtons(["Red","Blue","Green","None of these"], 1); $color3 = CheckboxList(["Red","Blue","Green","None of these"], [1]); ############################################################ # Body ############################################################ BEGIN_PGML My favorite color is [_]{$color1}{5}. My favorite color is [_]{$color2}{5} My favorite color is [_]{$color3}{5} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION The correct answer is [$color1]. The correct answer is [$color2]. The correct answer is [$color3]. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_2-Subject_Area_Templates/2_2_4.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.2.4) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "parserRadioButtons.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $expressions = RadioButtons(['\(x\)','\(x^2\)','\(2^x\)'], 2); ############################################################ # Body ############################################################ BEGIN_PGML There is math in each option for this question. Which expression is not a polynomial? [_]{$expressions}{5} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION The answer is [$expressions]. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_2-Subject_Area_Templates/2_2_5-Tables.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.2.5) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "niceTables.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $x = Real(5); ############################################################ # Body ############################################################ BEGIN_PGML A table with minimal XML source. >> [@DataTable( [ [PGML('A'), PGML('B'), PGML('C'), ], [PGML('D'), PGML('E'), PGML('F'), ], [PGML('G'), PGML('H'), PGML('I'), ], ], align => '*{3}{l}', valign => 'middle',);@]* << Finish this table. >> [@DataTable( [ [[PGML('1'), halign => 'r',], PGML('two'), PGML('[`\lfloor\pi\rfloor`]'), ], [[PGML('[`\text{I}+\text{I}`] [`{}+\text{I}+\text{I}`] '), rowbottom => '3', midrule => '1', bottom => '1', valign => 'bottom',], PGML('[_]{$x}{5}'), PGML('six'), ], [[PGML('[`2^3-1`]'), rowbottom => '3', midrule => '1',], [PGML('VIII'), colspan => '2',], ], ], align => '!{\vrule width 0.11em}r|c!{\vrule width 0.07em}l|', valign => 'middle', top => '3',);@]* << END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION The missing number is [$x]. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_2-Subject_Area_Templates/2_2_6-Answer_Arrays.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.2.6) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context("Point"); $p = Point(0,0); Context("Vector"); $v = Vector(1,2); $c = ColumnVector(3,4); Context("Matrix"); $m = Matrix([[1,2],[3,4]]); ############################################################ # Body ############################################################ BEGIN_PGML These answer blanks are all expecting some sort of answer in an array format. [`[$p] = {}`][_]*{$p}{5} [`[$v] = {}`][_]*{$v}{5} [`[$c] = {}`][_]*{$c}{5} [`[$m] = {}`][_]*{$m}{5} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_3-Stress_Tests/2_3_1-PTX_problem_source_with_servergenerated_images.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.3.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGgraphmacros.pl", "scaffold.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); COMMENT('This problem is scaffolded with multiple parts'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); for my $i(0..7){$gr[$i] = init_graph(-1,-1,4,4,axes=>[0,0],grid=>[5,5],size=>[150,150]);}; add_functions($gr[0], "1 for x in <-1,4> using color:blue and weight:2"); add_functions($gr[1], "x for x in <-1,4> using color:blue and weight:2"); add_functions($gr[2], "x^2 for x in <-1,4> using color:blue and weight:2"); add_functions($gr[3], "x^3 for x in <-1,4> using color:blue and weight:2"); add_functions($gr[4], "e^x for x in <-1,4> using color:blue and weight:2"); add_functions($gr[5], "sin(x) for x in <-1,4> using color:blue and weight:2"); add_functions($gr[6], "cos(x) for x in <-1,4> using color:blue and weight:2"); add_functions($gr[7], "exp(-x^2) for x in <-1,4> using color:blue and weight:2"); ############################################################ # Body ############################################################ ############################################################ # Scaffold ############################################################ Scaffold::Begin(numbered => 1,is_open => "correct_or_first_incorrect",can_open => when_previous_correct,); ############################################################ # Section ############################################################ Section::Begin(""); BEGIN_PGML >> [@image(insertGraph($gr[0]), width=>150)@]* << >> [@image(insertGraph($gr[1]), width=>150)@]* << END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION >> [@image(insertGraph($gr[2]), width=>150)@]* << END_PGML_SOLUTION Section::End(); ############################################################ # Section ############################################################ Section::Begin(""); BEGIN_PGML >> [@image(insertGraph($gr[3]), width=>150)@]* << >> [@image(insertGraph($gr[4]), width=>150)@]* << >> [@image(insertGraph($gr[5]), width=>150)@]* << END_PGML ############################################################ # Hint ############################################################ #Set value of $showHint in PGcourse.pl for course-wide attempt threshhold for revealing hints BEGIN_PGML_HINT >> [@image(insertGraph($gr[6]), width=>150)@]* << END_PGML_HINT ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION >> [@image(insertGraph($gr[7]), width=>150)@]* << END_PGML_SOLUTION Section::End(); Scaffold::End(); ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_3-Stress_Tests/2_3_2-Checking_Proper_Indentation_In_Lists.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.3.2) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML a. Simple item a. Simple item a. Simple item a. Simple item a. Simple item a. Simple item Text before. a. Simple item a. Simple item a. Simple item And after. a. Structured item a. Structured item a. Structured item Text before. a. Structured item a. Structured item a. Structured item And after. a. Structured item a. [$NBSP]* A. Sublist Item A. Sublist Item A. Sublist Item a. Structured item Text before. a. Structured item a. Text before. i. Sublist Item i. Sublist Item i. Sublist Item And after. a. Structured item And after. a. Structured item Second paragraph a. [$NBSP]* I. Sublist Item Second paragraph I. Sublist Item Second paragraph I. Sublist Item Second paragraph a. Structured item Second paragraph Text before. a. Structured item Second paragraph a. Text before. 1. Sublist Item Second paragraph 1. Sublist Item Second paragraph 1. Sublist Item Second paragraph And after. a. Structured item Second paragraph And after. a. [$NBSP]* [```1+1=2```] Structured item Second [```1+1=2```] paragraph a. [$NBSP]* a. Sublist [```1+1=2```] Item Second paragraph [```1+1=2```] a. [$NBSP]* [```1+1=2```] Sublist Item Second [```1+1=2```] paragraph a. Sublist Item [```1+1=2```] [```1+1=2```] Second paragraph a. Structured [```1+1=2```] item Second paragraph [```1+1=2```] Text before. a. Structured [```1+1=2```] item Second paragraph [```1+1=2```] a. [$NBSP]* [```1+1=2```] Text before. A. Sublist [```1+1=2```] Item Second paragraph [```1+1=2```] A. [$NBSP]* [```1+1=2```] Sublist Item Second [```1+1=2```] paragraph A. Sublist Item [```1+1=2```] [```1+1=2```] Second paragraph And [```1+1=2```] after. a. Structured item [```1+1=2```] [```1+1=2```] Second paragraph And after. Text before. a. Structured [```\newcommand{\amp}{&} \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned} ```] item Second paragraph [```\newcommand{\amp}{&} \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned} ```] a. [$NBSP]* [```\newcommand{\amp}{&} \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned} ```] Text before. i. Sublist [```\newcommand{\amp}{&} \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned} ```] Item Second paragraph [```\newcommand{\amp}{&} \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned} ```] i. [$NBSP]* [```\newcommand{\amp}{&} \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned} ```] Sublist Item Second [```\newcommand{\amp}{&} \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned} ```] paragraph i. Sublist Item [```\newcommand{\amp}{&} \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned} ```] [```\newcommand{\amp}{&} \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned} ```] Second paragraph And [```\newcommand{\amp}{&} \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned} ```] after. a. Structured item [```\newcommand{\amp}{&} \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned} ```] [```\newcommand{\amp}{&} \begin{aligned} 1+1\amp=2\\ 2\amp=2 \end{aligned} ```] Second paragraph And after. END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_3-Stress_Tests/2_3_3-Checking_Proper_Indentation_In_Lists_with_Images_and_Tables.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.3.3) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "niceTables.pl", "PGgraphmacros.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $g=init_graph(-1,-1,1,1,axes=>[0,0]); ############################################################ # Body ############################################################ BEGIN_PGML a. Structured item [@image(insertGraph($g), width=>102)@]* a. [@image(insertGraph($g), width=>102)@]* Structured item a. Structured item [@image(insertGraph($g), width=>102)@]* a. Structured item a. Structured item [@DataTable( [ [PGML('a'), PGML('b'), ], [PGML('c'), PGML('d'), ], ], align => '*{2}{l}', valign => 'middle', );@]* a. [@DataTable( [ [[PGML('1'), halign => 'r',], PGML('two'), PGML('[`\lfloor\pi\rfloor`]'), ], [[PGML('[`\text{I}+\text{I}`] [`{}+\text{I}+\text{I}`] '), rowbottom => '3', midrule => '1', bottom => '1', valign => 'bottom',], PGML('[`5`]'), PGML('six'), ], [[PGML('[`2^3-1`]'), rowbottom => '3', midrule => '1',], [PGML('VIII'), colspan => '2',], ], ], align => '!{\vrule width 0.11em}r|c!{\vrule width 0.07em}l|', valign => 'middle', top => '3', );@]* Structured item a. Structured item [@DataTable( [ [PGML('a'), PGML('b'), ], [PGML('c'), PGML('d'), ], ], align => '*{2}{l}', valign => 'middle', );@]* Second paragraph a. Structured item END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_3-Stress_Tests/2_3_4-Deepnested_lists.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.3.4) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML Ordered list. a. Level 1, first. a. Level 1, second. i. Level 2, first. i. Level 2, second. A. Level 3, first. A. Level 3, second. 1. Level 4, first. 1. Level 4, second. 1. Level 4, third. A. Level 3, third. i. Level 2, third. a. Level 1, third. Unordered list. * Level 1, first. * Level 1, second. o Level 2, first. o Level 2, second. + Level 3, first. + Level 3, second. * Level 4, first. * Level 4, second. * Level 4, third. + Level 3, third. o Level 2, third. * Level 1, third. END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_3-Stress_Tests/2_3_5.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.3.5) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_3-Stress_Tests/2_3_6.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.3.6) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "niceTables.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML >> [@DataTable( [ [PGML(q"What's up, Doc?"), ], ], align => '*{1}{l}', valign => 'middle',);@]* << END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_1.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2-Has_a_Title.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_1.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_10-Has_a_Title.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.10) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML These are inside an exercisegroup. [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_11.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.11) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML These are inside an exercisegroup. [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_12-Has_a_Title.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.12) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML These are inside an exercisegroup. [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_13.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.13) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML These are inside an exercisegroup. [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_14-Has_a_Title.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.14) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML These are inside an exercisegroup. [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_15.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.15) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML These are inside an exercisegroup. [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_16-Has_a_Title.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.16) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML These are inside an exercisegroup. [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_2-Has_a_Title.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.2) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_3.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.3) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_4-Has_a_Title.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.4) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_5.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.5) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_6-Has_a_Title.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.6) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_7.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.7) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_8-Has_a_Title.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.8) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_9.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.2.9) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML These are inside an exercisegroup. [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_3.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.3) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_4-Has_a_Title.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.4) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_5.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.5) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_6-Has_a_Title.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.6) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_7.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.7) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_8-Has_a_Title.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.4.8) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); ############################################################ # Body ############################################################ BEGIN_PGML [`1+1=2`] END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_5-Runestone_Assignment_Testing/2_5_1.pg ================================================ ############################################# ### Generated from PreTeXt source ### on 2026-05-15T12:29:44-07:00 ### A recent stable commit (2022-07-01): ### 6c761d3dba23af92cba35001c852aac04ae99a5f ### ### https://pretextbook.org ### ############################################# ## DBsubject() ## DBchapter() ## DBsection() ## Level() ## KEYWORDS() ## TitleText1() ## EditionText1() ## AuthorText1() ## Section1(not reported) ## Problem1(2.5.1) ## Author() ## Institution() ## Language(en-US) DOCUMENT(); ############################################################ # Load Macros ############################################################ loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGlateximage.pl", "WWSC.pl", "PGcourse.pl", ); COMMENT('Authored in PreTeXt'); ############################################################ # Header ############################################################ TEXT(beginproblem()); ############################################################ # PG Setup Code ############################################################ Context('Numeric'); $introduction_image_1 = createLaTeXImage(); $introduction_image_1->addToPreamble(latexImagePreamble()); $introduction_image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw[fill=blue!20] (0,0) -| (1,1) -| cycle; \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML This introduction should appear ahead of the exercise when it shows up in the Assignment page. >> [@DataTable( [ [PGML('[`(0,0)`]'), PGML('[`(0,1)`]'), ], [PGML('[`(1,0)`]'), PGML('[`(1,1)`]'), ], ], align => '*{2}{l}', valign => 'middle',);@]* << >> [@image(insertGraph($introduction_image_1), width=>600, alt=>qq"a blue square")@]* << It has a table and an image too to check it all comes through. What is [`1+1\text{?}`] [_]{'2'}{5}> END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set1_1-Arithmetic.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_1-Arithmetic.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_1-Arithmetic.pg description = Arithmetic problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_1-Adding_SingleDigit_Integers.pg problem_id = 1 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_1-Adding_SingleDigit_Integers.pg problem_id = 2 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_3-Controlling_Randomness.pg problem_id = 3 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_4-Special_Answer_Checking.pg problem_id = 4 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_5-Using_Hints.pg problem_id = 5 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_6-No_Randomization.pg problem_id = 6 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_7-Local_PG.pg problem_id = 7 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/1_1_8-Local_PG_File.pg problem_id = 8 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/Project-1_1_1-Inside_a_project.pg problem_id = problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_1-Arithmetic/Exploration-1_1_2-Inside_an_exploration.pg problem_id = problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set1_2-The_Quadratic_Formula.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_2-The_Quadratic_Formula.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_2-The_Quadratic_Formula.pg description = The Quadratic Formula problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_2-The_Quadratic_Formula/1_2_2-Solving_Quadratic_Equations.pg problem_id = 2 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_2-The_Quadratic_Formula/1_2_3-Nested_tasks.pg problem_id = 3 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_2-The_Quadratic_Formula/1_2_2-Solving_Quadratic_Equations.pg problem_id = 4 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set1_3-Open_Problem_Library.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_3-Open_Problem_Library.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_3-Open_Problem_Library.pg description = Open Problem Library problemListV2 problem_start source_file = Library/PCC/BasicAlgebra/Geometry/CylinderVolume10.pg problem_id = 1 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set1_4-Antidifferentiation_Exercises.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_4-Antidifferentiation_Exercises.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_4-Antidifferentiation_Exercises.pg description = Antidifferentiation problemListV2 problem_start source_file = Library/ma122DB/set12/s5_4_26.pg problem_id = 1 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_4-Antidifferentiation/1_4_2_2-Every_Continuous_Function_has_an_Antiderivative.pg problem_id = 2 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_4-Antidifferentiation/1_4_2_3-Inverse_Processes.pg problem_id = 3 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_4-Antidifferentiation/1_4_2_4.pg problem_id = 4 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_4-Antidifferentiation/1_4_2_5.pg problem_id = 5 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_4-Antidifferentiation/1_4_2_6-Show_Your_Work.pg problem_id = 6 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set1_5-Math_Content.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_5-Math_Content.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_5-Math_Content.pg description = Math Content problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_5-Math_Content/1_5_1-Math_Elements_and_Alignment.pg problem_id = 1 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_5-Math_Content/1_5_2-Intertext.pg problem_id = 2 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set1_6-Multiple_Choice.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_6-Multiple_Choice.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_6-Multiple_Choice.pg description = Multiple Choice problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_6-Multiple_Choice/1_6_1-DropdownPopup.pg problem_id = 1 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_6-Multiple_Choice/1_6_2-Choose_one.pg problem_id = 2 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_6-Multiple_Choice/1_6_3-Choose_a_Subset_of_Options.pg problem_id = 3 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_6-Multiple_Choice/1_6_4-Choose_a_Subset_of_Options_with_Automated_Labeling.pg problem_id = 4 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_6-Multiple_Choice/1_6_5-Choose_a_Subset_of_Options_with_Explicit_Labeling.pg problem_id = 5 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set1_7-Tables.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_7-Tables.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_7-Tables.pg description = Tables problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_7-Tables/1_7_1-Complete_this_Table.pg problem_id = 1 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set1_8-Graphics_in_Exercises.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_8-Graphics_in_Exercises.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_8-Graphics_in_Exercises.pg description = Graphics in Exercises problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_1-A_static_lateximage_graph.pg problem_id = 1 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_2-A_randomized_lateximage_graph.pg problem_id = 2 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_3-A_lateximage_graph_affected_by_lateximagepreamble.pg problem_id = 3 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_4-Special_characters.pg problem_id = 4 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_5-Solve_using_a_graph.pg problem_id = 5 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set1_8-Graphics_in_Exercises_Exercises.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_8-Graphics_in_Exercises_Exercises.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/1_8-Graphics_in_Exercises_Exercises.pg description = Graphics in Exercises problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_1.pg problem_id = 1 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/1-Instructive_Examples/1_8-Graphics_in_Exercises/1_8_2.pg problem_id = 2 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set2_1-PGML_Formatting_and_Verbatim_Calisthenics.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/2_1-PGML_Formatting_and_Verbatim_Calisthenics.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/2_1-PGML_Formatting_and_Verbatim_Calisthenics.pg description = PGML Formatting and Verbatim Calisthenics problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_1-PGML_Formatting_and_Verbatim_Calisthenics/2_1_1-PGML_Formatting.pg problem_id = 1 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_1-PGML_Formatting_and_Verbatim_Calisthenics/2_1_2.pg problem_id = 2 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_1-PGML_Formatting_and_Verbatim_Calisthenics/2_1_3.pg problem_id = 3 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set2_2-Subject_Area_Templates.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/2_2-Subject_Area_Templates.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/2_2-Subject_Area_Templates.pg description = Subject Area Templates problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_2-Subject_Area_Templates/2_2_1-Answer_is_a_number_or_a_function.pg problem_id = 1 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_2-Subject_Area_Templates/2_2_2-Answer_is_a_function_with_domain_issues.pg problem_id = 2 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_2-Subject_Area_Templates/2_2_3-Multiple_Choice_by_Popup_Radio_Buttons_or_Checkboxes.pg problem_id = 3 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_2-Subject_Area_Templates/2_2_4.pg problem_id = 4 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_2-Subject_Area_Templates/2_2_5-Tables.pg problem_id = 5 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_2-Subject_Area_Templates/2_2_6-Answer_Arrays.pg problem_id = 6 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set2_3-Stress_Tests.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/2_3-Stress_Tests.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/2_3-Stress_Tests.pg description = Stress Tests problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_3-Stress_Tests/2_3_1-PTX_problem_source_with_servergenerated_images.pg problem_id = 1 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_3-Stress_Tests/2_3_2-Checking_Proper_Indentation_In_Lists.pg problem_id = 2 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_3-Stress_Tests/2_3_3-Checking_Proper_Indentation_In_Lists_with_Images_and_Tables.pg problem_id = 3 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_3-Stress_Tests/2_3_4-Deepnested_lists.pg problem_id = 4 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_3-Stress_Tests/2_3_5.pg problem_id = 5 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_3-Stress_Tests/2_3_6.pg problem_id = 6 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set2_4-Layout_Configuration_Testing.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/2_4-Layout_Configuration_Testing.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/2_4-Layout_Configuration_Testing.pg description = Layout Configuration Testing problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_1.pg problem_id = 1 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2-Has_a_Title.pg problem_id = 2 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_3.pg problem_id = 3 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_4-Has_a_Title.pg problem_id = 4 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_5.pg problem_id = 5 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_6-Has_a_Title.pg problem_id = 6 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_7.pg problem_id = 7 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_8-Has_a_Title.pg problem_id = 8 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set2_4-Layout_Configuration_Testing_Exercises.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/2_4-Layout_Configuration_Testing_Exercises.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/2_4-Layout_Configuration_Testing_Exercises.pg description = Layout Configuration Testing problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_1.pg problem_id = 1 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_2-Has_a_Title.pg problem_id = 2 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_3.pg problem_id = 3 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_4-Has_a_Title.pg problem_id = 4 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_5.pg problem_id = 5 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_6-Has_a_Title.pg problem_id = 6 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_7.pg problem_id = 7 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_8-Has_a_Title.pg problem_id = 8 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_9.pg problem_id = 9 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_10-Has_a_Title.pg problem_id = 10 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_11.pg problem_id = 11 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_12-Has_a_Title.pg problem_id = 12 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_13.pg problem_id = 13 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_14-Has_a_Title.pg problem_id = 14 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_15.pg problem_id = 15 problem_end problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_4-Layout_Configuration_Testing/2_4_2_16-Has_a_Title.pg problem_id = 16 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/def/set2_5-Runestone_Assignment_Testing_Exercises.def ================================================ openDate = 05/15/2026 at 12:00am dueDate = 11/15/2026 at 10:00pm answerDate = 11/15/2026 at 10:00pm paperHeaderFile = Integrating_WeBWorK_into_Textbooks/header/2_5-Runestone_Assignment_Testing_Exercises.pg screenHeaderFile = Integrating_WeBWorK_into_Textbooks/header/2_5-Runestone_Assignment_Testing_Exercises.pg description = Runestone Assignment Testing problemListV2 problem_start source_file = Integrating_WeBWorK_into_Textbooks/2-Technical_Examples/2_5-Runestone_Assignment_Testing/2_5_1.pg problem_id = 1 problem_end ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/1_1-Arithmetic.pg ================================================ # Header file for problem set 1_1-Arithmetic # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 1.1 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/1_2-The_Quadratic_Formula.pg ================================================ # Header file for problem set 1_2-The_Quadratic_Formula # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 1.2 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/1_3-Open_Problem_Library.pg ================================================ # Header file for problem set 1_3-Open_Problem_Library # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 1.3 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/1_4-Antidifferentiation_Exercises.pg ================================================ # Header file for problem set 1_4-Antidifferentiation # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 1.4 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/1_5-Math_Content.pg ================================================ # Header file for problem set 1_5-Math_Content # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 1.5 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/1_6-Multiple_Choice.pg ================================================ # Header file for problem set 1_6-Multiple_Choice # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 1.6 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/1_7-Tables.pg ================================================ # Header file for problem set 1_7-Tables # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 1.7 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/1_8-Graphics_in_Exercises.pg ================================================ # Header file for problem set 1_8-Graphics_in_Exercises # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 1.8 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/1_8-Graphics_in_Exercises_Exercises.pg ================================================ # Header file for problem set 1_8-Graphics_in_Exercises # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 1.8 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/2_1-PGML_Formatting_and_Verbatim_Calisthenics.pg ================================================ # Header file for problem set 2_1-PGML_Formatting_and_Verbatim_Calisthenics # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 2.1 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/2_2-Subject_Area_Templates.pg ================================================ # Header file for problem set 2_2-Subject_Area_Templates # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 2.2 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/2_3-Stress_Tests.pg ================================================ # Header file for problem set 2_3-Stress_Tests # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 2.3 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/2_4-Layout_Configuration_Testing.pg ================================================ # Header file for problem set 2_4-Layout_Configuration_Testing # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 2.4 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/2_4-Layout_Configuration_Testing_Exercises.pg ================================================ # Header file for problem set 2_4-Layout_Configuration_Testing # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 2.4 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/header/2_5-Runestone_Assignment_Testing_Exercises.pg ================================================ # Header file for problem set 2_5-Runestone_Assignment_Testing # This header file can be used for both the screen and hardcopy output DOCUMENT(); loadMacros( "PG.pl", "PGbasicmacros.pl", "PGML.pl", "PGcourse.pl", ); TEXT($BEGIN_ONE_COLUMN); $texTopLine = "\noindent {\large \bf $studentName}\hfill{\large \bf {".protect_underbar($courseName)."}}"; if (defined($sectionName) and ($sectionName ne '')) {$texTopLine .= " {\large \bf { Section: ".protect_underbar($sectionName)." } }"}; $texTopLine .= "\par"; #################################################### # # MODES provides for distinct output for TeX and HTML # #################################################### TEXT(MODES( TeX =>"$texTopLine", HTML=>"", )); TEXT(MODES( TeX =>"\noindent{\large \sc {Assignment ".protect_underbar($setNumber)." due $formatedDueDate}}\par". "\noindent \bigskip ", HTML=>"WeBWorK Assignment ".protect_underbar($setNumber)." is due: $formattedDueDate. $PAR", )); TEXT("This assignment contains exercises from Section 2.5 of Integrating WeBWorK into Textbooks."); TEXT($END_ONE_COLUMN); ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pg/Integrating_WeBWorK_into_Textbooks/macros/WWSC.pl ================================================ ############################################################################# # This macro library supports WeBWorK problems from the PreTeXt project named # Integrating WeBWorK into Textbooks ############################################################################# # Return a string containing the latex-image-preamble contents. # To be used by LaTeXImage objects as in: # $image->addToPreamble(latexImagePreamble()) sub latexImagePreamble { return <<'END_LATEX_IMAGE_PREAMBLE' \usepackage{pgfplots} \pgfplotsset{ every axis/.append style={ axis lines=middle, xlabel={\(x\)}, ylabel={\(y\)}, grid = both, } } END_LATEX_IMAGE_PREAMBLE } ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/pgml-data-attribute.xml ================================================

    some PGML math: [`\frac{1}{2}+\frac{3}{2}=2`]; and some *bold text* makes:

    some PGML math: \frac{1}{2}+\frac{3}{2}=2; and some bold text

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/ptx-source-with-server-images.xml ================================================ [0,0],grid=>[5,5],size=>[150,150]);}; add_functions($gr[0], "1 for x in <-1,4> using color:blue and weight:2"); add_functions($gr[1], "x for x in <-1,4> using color:blue and weight:2"); add_functions($gr[2], "x^2 for x in <-1,4> using color:blue and weight:2"); add_functions($gr[3], "x^3 for x in <-1,4> using color:blue and weight:2"); add_functions($gr[4], "e^x for x in <-1,4> using color:blue and weight:2"); add_functions($gr[5], "sin(x) for x in <-1,4> using color:blue and weight:2"); add_functions($gr[6], "cos(x) for x in <-1,4> using color:blue and weight:2"); add_functions($gr[7], "exp(-x^2) for x in <-1,4> using color:blue and weight:2"); ############################################################ # Body ############################################################ ############################################################ # Scaffold ############################################################ Scaffold::Begin(numbered => 1,is_open => "correct_or_first_incorrect",can_open => when_previous_correct,); ############################################################ # Section ############################################################ Section::Begin(""); BEGIN_PGML >> [@image(insertGraph($gr[0]), width=>150)@]* << >> [@image(insertGraph($gr[1]), width=>150)@]* << END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION >> [@image(insertGraph($gr[2]), width=>150)@]* << END_PGML_SOLUTION Section::End(); ############################################################ # Section ############################################################ Section::Begin(""); BEGIN_PGML >> [@image(insertGraph($gr[3]), width=>150)@]* << >> [@image(insertGraph($gr[4]), width=>150)@]* << >> [@image(insertGraph($gr[5]), width=>150)@]* << END_PGML ############################################################ # Hint ############################################################ #Set value of $showHint in PGcourse.pl for course-wide attempt threshhold for revealing hints BEGIN_PGML_HINT >> [@image(insertGraph($gr[6]), width=>150)@]* << END_PGML_HINT ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION >> [@image(insertGraph($gr[7]), width=>150)@]* << END_PGML_SOLUTION Section::End(); Scaffold::End(); ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]> ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/quadratic-equation.xml ================================================

    Consider the quadratic equation {2x^{2}-5x-12} = 0\text{.}

    Identify Coefficients

    Identify the coefficients for the quadratic equation using the standard form from Theorem1.2.1.

    a= , b= , c=

    2

    -5

    -12

    Take the coefficient of x^2 for the value of a\text{,} the coefficient of x for b\text{,} and the constant for c\text{.} In this case, they are a = {2}\text{,} b = {-5}\text{,} c = {-12}\text{.}

    Use the Quadratic Formula

    Using the quadratic formula, solve the equation.

    \left\{4,\frac{-3}{2}\right\}

    Recall that the quadratic formula is given in Theorem1.2.1.

    You already identified a = {2}\text{,} b = {-5}\text{,} and c = {-12}\text{,} so the results are:

    x = {\frac{-\left(-5\right)+\sqrt{\left(-5\right)^{2}-4\cdot 2\cdot \left(-12\right)}}{2\cdot 2}} = {4}

    or

    x = {\frac{-\left(-5\right)-\sqrt{\left(-5\right)^{2}-4\cdot 2\cdot \left(-12\right)}}{2\cdot 2}} = {-{\frac{3}{2}}}

    This conclusion is just here for testing.

    reduce; $x1 = Fraction($r,1); $x2 = Fraction(-$k,$a); Context()->flags->set(reduceConstants=>0,reduceConstantFunctions=>0); $sol1 = Formula("(-$b+sqrt(($b)**2-4($a)($c)))/(2($a))"); $sol2 = Formula("(-$b-sqrt(($b)**2-4($a)($c)))/(2($a))"); $evaluatorfora = $a->cmp()->withPostFilter(AnswerHints( [-$a] => "Do you have the sign correct?") ); $evaluatorforb = $b->cmp()->withPostFilter(AnswerHints( [-$b] => "Do you have the sign correct?") ); $evaluatorforc = $c->cmp()->withPostFilter(AnswerHints( [-$c] => "Do you have the sign correct?") ); Context("FiniteSolutionSets"); $solutionset = Formula("{$x1,$x2}"); ############################################################ # Body ############################################################ BEGIN_PGML Consider the quadratic equation [`[$quadratic] = 0\text{.}`] END_PGML ############################################################ # Scaffold ############################################################ Scaffold::Begin(numbered => 1,is_open => "correct_or_first_incorrect",can_open => when_previous_correct,); ############################################################ # Section ############################################################ Section::Begin("Identify Coefficients"); BEGIN_PGML Identify the coefficients for the quadratic equation using the standard form from Theorem[$NBSP]*1.2.1. [`a=`] [_]{$evaluatorfora}{4}, [`b=`] [_]{$evaluatorforb}{4}, [`c=`] [_]{$evaluatorforc}{4} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Take the coefficient of [`x^2`] for the value of [`a\text{,}`] the coefficient of [`x`] for [`b\text{,}`] and the constant for [`c\text{.}`] _In this case_, they are [`a = [$a]\text{,}`] [`b = [$b]\text{,}`] [`c = [$c]\text{.}`] END_PGML_SOLUTION Section::End(); ############################################################ # Section ############################################################ Section::Begin("Use the Quadratic Formula"); BEGIN_PGML Using the quadratic formula, solve the equation. [_]{$solutionset}{40} END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION Recall that the quadratic formula is given in Theorem[$NBSP]*1.2.1. You already identified [`a = [$a]\text{,}`] [`b = [$b]\text{,}`] and [`c = [$c]\text{,}`] so the results are: [```x = [$sol1] = [$x1]```] or [```x = [$sol2] = [$x2]```] END_PGML_SOLUTION Section::End(); Scaffold::End(); BEGIN_PGML This conclusion is just here for testing. END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/radio-buttons-with-math.xml ================================================

    There is math in each option for this question. Which expression is not a polynomial?

    • x

    • x^2

    • 2^x

    \text{Choice 3}

    The answer is Choice 3.

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/randomized-latex-image.xml ================================================

    Find the area of the rectangle.

    a rectangle whose width is labeled 6 cm and height is labeled 4 cm

    24\ {\rm cm^{2}}

    addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw[fill=blue!20] (0,0) --++ (6,0) node[pos=0.5,below] {\($b\)\,cm} --++ (0,4) node[pos=0.5,right] {\($a\)\,cm} --++ (-6,0) -- cycle; \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML Find the area of the rectangle. >> [@image(insertGraph($image_1), width=>300, alt=>qq"a rectangle whose width is labeled $b cm and height is labeled $a cm")@]* << [_]{$area}{20} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/single-quote-in-table-cell.xml ================================================ Whats up, Doc? > [@DataTable( [ [PGML(q"What's up, Doc?"), ], ], align => '*{1}{l}', valign => 'middle',);@]* << END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]> ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/solving-with-graph.xml ================================================

    The graph below is a graph of y=f(x)\text{.} Use the graph to solve the equation f(x)=1\text{.}

    a plot of a curve on a cartesian set of axes; the x axis ranges from -1 to 4, and the y-axis ranges from -1 to 4; the curve enters from the left, below the x-axis, and curves upward and to the right until it reaches the point (0,0); from here it continues predominantly rightward for a bit, bending slightly upward more and more as it progresses; it passes through the points (2,1) and (2.51984,2) before leaving the graph moving more and more upward and to the right.

    \left\{2\right\}

    The graph reveals that the solution set to f(x)=1 is {\left\{2\right\}}\text{.}

    a plot of a curve on a cartesian set of axes; the x axis ranges from -1 to 4, and the y-axis ranges from -1 to 4; the curve enters from the left, below the x-axis, and curves upward and to the right until it reaches the point (0,0); from here it continues predominantly rightward for a bit, bending slightly upward more and more as it progresses; it passes through the points (2,1) and (2.51984,2) before leaving the graph moving more and more upward and to the right; a horizontal line segment moves rightward from y=1 on the y-axis until it reaches a point on the curve; a vertical line segment moves down from this point to x=2 on the x-axis.
    [0,0], grid=>[5,5], size=>[300,180] ); add_functions($gr, "x^3/$a^3 for x in <-1,4> using color:blue and weight:2"); $second_x = Real($a*2**(1/3)); $solgr = init_graph(-1,-1,4,4, axes=>[0,0], grid=>[5,5], size=>[300,180] ); add_functions($solgr, "x^3/$a^3 for x in <-1,4> using color:blue and weight:2"); $solgr->moveTo(0,1); $solgr->lineTo($a,1,'black',3); $solgr->arrowTo($a,0,'black',3); Context("FiniteSolutionSets"); $answer = Formula("{$a}"); ############################################################ # Body ############################################################ BEGIN_PGML The graph below is a graph of [`y=f(x)\text{.}`] Use the graph to solve the equation [`f(x)=1\text{.}`] >> [@image(insertGraph($gr), width=>300, alt=>qq"a plot of a curve on a cartesian set of axes; the x axis ranges from -1 to 4, and the y-axis ranges from -1 to 4; the curve enters from the left, below the x-axis, and curves upward and to the right until it reaches the point (0,0); from here it continues predominantly rightward for a bit, bending slightly upward more and more as it progresses; it passes through the points ($a,1) and ($second_x,2) before leaving the graph moving more and more upward and to the right.")@]* << [_]{$answer}{5} [@AnswerFormatHelp('numbers')@]* END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION The graph reveals that the solution set to [`f(x)=1`] is [`[$answer]\text{.}`] >> [@image(insertGraph($solgr), width=>300, alt=>qq"a plot of a curve on a cartesian set of axes; the x axis ranges from -1 to 4, and the y-axis ranges from -1 to 4; the curve enters from the left, below the x-axis, and curves upward and to the right until it reaches the point (0,0); from here it continues predominantly rightward for a bit, bending slightly upward more and more as it progresses; it passes through the points ($a,1) and ($second_x,2) before leaving the graph moving more and more upward and to the right; a horizontal line segment moves rightward from y=1 on the y-axis until it reaches a point on the curve; a vertical line segment moves down from this point to x=$a on the x-axis.")@]* << END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/special-answer-checking.xml ================================================

    Use the properties of exponents to simplify {x^{5}x^{3}}\text{.}

    {x^{5}x^{3}}=

    x^{8}

    We add the exponents as follows, while including a gratuitous reference to the quadratic formula:

    \begin{aligned} {x^{5}x^{3}}\amp =x^{5+3}\amp \text{Theorem 1.2.1}\\ \amp =x^{8} \end{aligned}

    {error}{msg}{"A variable can appear only once in each term of a polynomial"} = "Your answer must be fully simplified"; $answer = Formula("x^($c)"); $product = $a*$b; $evaluator = $answer->cmp()->withPostFilter(AnswerHints( [Compute("x^($product)")] => "When multiplying terms with the same base, you do not multiply the exponents.")); ############################################################ # Body ############################################################ BEGIN_PGML Use the properties of exponents to simplify [`[$expression]\text{.}`] [@KeyboardInstructions('To enter a power, use a [|^|]*, as in [|x^2|]* for [`x^2\text{.}`]')@]** [`[$expression]=`] [_]{$evaluator}{8} [@AnswerFormatHelp('formulas')@]* END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION We _add_ the exponents as follows, while including a gratuitous reference to the quadratic formula: [``` \begin{aligned} [$expression]&=x^{[$a]+[$b]}&\text{Theorem 1.2.1}\\ &=x^{[$c]} \end{aligned} ```] END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/special-characters.xml ================================================

    The code below has a printed dollar sign, a printed percent sign, a printed at sign, and a percent sign used as a comment marker.

    this image has pictures of text with special characters like $, %, and @
    addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \node at (0,0) {I need about \~~$3.50.}; \node at (0,1) {You gotta give 110\~~%.}; %This is a comment. \node at (0,2) {Send email user~~@domain.com.}; \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML The code below has a printed dollar sign, a printed percent sign, a printed at sign, and a percent sign used as a comment marker. >> [@image(insertGraph($image_1), width=>300, alt=>qq"this image has pictures of text with special characters like \$, %, and @")@]* << END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/static-latex-image.xml ================================================

    This image is a visual proof that \sum_{k=1}^{n}k equals what?

    21 blue balls are arranged in a triangular formation, with one at the top, then a row of two, a row of three, and so on until a row of six; there is a seventh row with seven orange balls; one blue ball is highlighted, and two lines extend downward from that ball, one to the left and one to the right, parallel to the sides of the triangle, until they intersect two orange balls; the effect is that each of the 1+2+3+4+5+6 blue balls corresponds to one pair from the 7 orange balls

    \mathop{\rm C}\nolimits\mathopen{}\left(n+1,2\right)\hbox{ or }\frac{\left(n+1\right)n}{2}

    variables->are(n=>'Real'); $answer = OneOf(Formula("C(n+1,2)"),Formula("(n+1)n/2")); $image_1 = createLaTeXImage(); $image_1->addToPreamble(latexImagePreamble()); $image_1->BEGIN_LATEX_IMAGE \begin{tikzpicture} \draw[dashed] (0.5-0.5*6.5,-0.866025*6.5) -- (7-0.5*6.5,-0.866025*6.5); \draw[very thick] (2-0.5*7,-0.866025*7) -- (2-0.5*4,-0.866025*4) -- (5-0.5*7,-0.866025*7); \foreach \x in {1,...,6} \foreach \y in {1,...,\x} \shade[ball color=blue!30] (\y-0.5*\x,-0.866025*\x) circle (0.2cm); \foreach \y in {1,...,7} \shade[ball color=orange!40] (\y-0.5*7,-0.866025*7) circle (0.2cm); \node at (2.5,-0.5) [anchor=north west]{\(\color{blue}\sum\limits_{k=1}^nk\color{black}\)}; \shade[ball color=blue] (2-0.5*4,-0.866025*4) circle (0.2cm); \shade[ball color=orange] (2-0.5*7,-0.866025*7) circle (0.2cm); \shade[ball color=orange] (5-0.5*7,-0.866025*7) circle (0.2cm); \end{tikzpicture} END_LATEX_IMAGE ############################################################ # Body ############################################################ BEGIN_PGML This image is a visual proof that [`\sum_{k=1}^{n}k`] equals what? >> [@image(insertGraph($image_1), width=>300, alt=>qq"21 blue balls are arranged in a triangular formation, with one at the top, then a row of two, a row of three, and so on until a row of six; there is a seventh row with seven orange balls; one blue ball is highlighted, and two lines extend downward from that ball, one to the left and one to the right, parallel to the sides of the triangle, until they intersect two orange balls; the effect is that each of the 1\+2\+3\+4\+5\+6 blue balls corresponds to one pair from the 7 orange balls")@]* << [@KeyboardInstructions('You may enter the answer using [|C(n,k)|]* notation.')@]** [_]{$answer}{20} END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/table-completion.xml ================================================

    Complete this multiplication table.

    \times 8 6 6 9

    48

    36

    72

    54

    \times 8 6 6 48 36 9 72 54
    > [@DataTable( [ [[PGML('[`\times`]'), rowbottom => '3', midrule => '1',], PGML('[`[$a[0]]`]'), PGML('[`[$a[1]]`]'), ], [[PGML('[`[$b[0]]`]'), rowbottom => '1', midrule => '1',], PGML('[_]{$p[0]}{5}'), PGML('[_]{$p[2]}{5}'), ], [[PGML('[`[$b[1]]`]'), rowbottom => '1', midrule => '1',], PGML('[_]{$p[1]}{5}'), PGML('[_]{$p[3]}{5}'), ], ], align => 'r!{\vrule width 0.11em}c|c|', valign => 'middle',);@]* << END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION >> [@DataTable( [ [[PGML('[`\times`]'), rowbottom => '3', midrule => '1',], PGML('[`[$a[0]]`]'), PGML('[`[$a[1]]`]'), ], [[PGML('[`[$b[0]]`]'), rowbottom => '1', midrule => '1',], PGML('[`[$p[0]]`]'), PGML('[`[$p[2]]`]'), ], [[PGML('[`[$b[1]]`]'), rowbottom => '1', midrule => '1',], PGML('[`[$p[1]]`]'), PGML('[`[$p[3]]`]'), ], ], align => 'r!{\vrule width 0.11em}c|c|', valign => 'middle',);@]* << END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/tables.xml ================================================

    A table with minimal XML source.

    A B C D E F G H I

    Finish this table.

    1 two \lfloor\pi\rfloor \text{I}+\text{I} {}+\text{I}+\text{I} six 2^3-1 VIII

    5

    The missing number is 5.

    > [@DataTable( [ [PGML('A'), PGML('B'), PGML('C'), ], [PGML('D'), PGML('E'), PGML('F'), ], [PGML('G'), PGML('H'), PGML('I'), ], ], align => '*{3}{l}', valign => 'middle',);@]* << Finish this table. >> [@DataTable( [ [[PGML('1'), halign => 'r',], PGML('two'), PGML('[`\lfloor\pi\rfloor`]'), ], [[PGML('[`\text{I}+\text{I}`] [`{}+\text{I}+\text{I}`] '), rowbottom => '3', midrule => '1', bottom => '1', valign => 'bottom',], PGML('[_]{$x}{5}'), PGML('six'), ], [[PGML('[`2^3-1`]'), rowbottom => '3', midrule => '1',], [PGML('VIII'), colspan => '2',], ], ], align => '!{\vrule width 0.11em}r|c!{\vrule width 0.07em}l|', valign => 'middle', top => '3',);@]* << END_PGML ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION The missing number is [$x]. END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/using-hints.xml ================================================

    Simplify the expression {\sqrt{48}}\text{.}

    {\sqrt{48}}=

    Factor the number inside the radical.

    4\sqrt{3}

    {\sqrt{48}}=\sqrt{4^2\cdot 3}=4\sqrt{3}

    flags->set(reduceConstantFunctions=>0); $expression = Formula("sqrt($c)"); Context("LimitedRadical"); $answer = Formula("$b sqrt($a)"); ############################################################ # Body ############################################################ BEGIN_PGML Simplify the expression [`[$expression]\text{.}`] [`[$expression]=`] [_]{$answer}{10} END_PGML ############################################################ # Hint ############################################################ #Set value of $showHint in PGcourse.pl for course-wide attempt threshhold for revealing hints BEGIN_PGML_HINT Factor the number inside the radical. END_PGML_HINT ############################################################ # Solution ############################################################ BEGIN_PGML_SOLUTION [```[$expression]=\sqrt{[$b]^2\cdot [$a]}=[$b]\sqrt{[$a]}```] END_PGML_SOLUTION ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/ww-PGML-format.xml ================================================

    Smart double quotes: Life is about making an impact, not making an income.

    Smart single quotes: Whatever the mind of man can conceive and believe, it can achieve.

    Regular apostrophes: My siblings mothers daughter isnt my daughters siblings mother.

    Emphasis: very important

    Alert: do not do it

    Braces: {text that looks like a set}

        Some pre-formatted text
                    with an indented line
    and an out-dented line
    This should not be altered *a problem*
    And this [$NDASH]* should not be an en-dash
    

    Here is some inline code with special characters & < > " ' # $ % ^ _ { } ~ \ * [ ], and here is some

    single-line display code with special characters & < > " ' # $ % ^ _ { } ~ \ * [ ]
    

    and here is some

    multi-line display   
    code with special characters & < > " ' # $ % ^ _ { } ~ \ * [ ]   
    

    Some raw characters, XML/HTML: & < >

    Some raw characters, : # $ % ^ & _ { } ~ \

    Some raw characters, PGML: \ * # { } [ ]

    Some characters that need special handling for PGML conversion to HTML or :

    A nonbreaking space (invisble where a hyphen should be)

    An ndashright here.

    An mdashright here.

    Some constructions in normal text, which need to be manipulated, lest they get interpreted as PGML markup:

    >>This should not be a centered line <<

    >>Nor a right-justified line, either

    We should not get _a phrase in italics_ in the midst of this sentence.

    Brackets, unpaired; ] with content between [

    Brackets, paired, in PGML constructions; [$NDASH]*, [___]{$answer}

    ### This should not be a level 3 heading

    === Not a horizontal rule from three equal signs

    == Not a horizontal rule from two equal signs

    ===== Not a horizontal rule from five equal signs

    --- Not a horizontal rule from three hyphens

    -- Not a horizontal rule from two hyphens

    ----- Not a horizontal rule from five hyphens

    + Not an unordered list item

    - Not an unordered list item

    " ' # $ % ^ _ { } ~ \ * [ ]|]*, and here is some ``` single-line display code with special characters & < > " ' # $ % ^ _ { } ~ \ * [ ] ``` and here is some ``` multi-line display code with special characters & < > " ' # $ % ^ _ { } ~ \ * [ ] ``` Some raw characters, XML/HTML: & < > " ' Some raw characters, [$LATEX]*: \# \$ % ^ & \_ \{ \} ~ \\ Some raw characters, PGML: \\ \* \# \{ \} \[ \] Some characters that need special handling for PGML conversion to HTML or [$LATEX]*: A non[$NBSP]*breaking space (invisble where a hyphen should be) An ndash[$NDASH]*right here. An mdash[$MDASH]*right here. Some constructions in "normal" text, which need to be manipulated, lest they get interpreted as PGML markup: \>\>This should not be a centered line << \>\>Nor a right-justified line, either We should not get \_a phrase in italics\_ in the midst of this sentence. Brackets, unpaired; \] with content between \[ Brackets, paired, in PGML constructions; \[\$NDASH\]\*, \[\_\_\_\]\{\$answer\} \#\#\# This should not be a level 3 heading =\== Not a horizontal rule from three equal signs == Not a horizontal rule from two equal signs =\==== Not a horizontal rule from five equal signs -\-\- Not a horizontal rule from three hyphens -\- Not a horizontal rule from two hyphens -\---\- Not a horizontal rule from five hyphens \+ Not an unordered list item \- Not an unordered list item END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/ww-antiderivatives.xml ================================================

    \displaystyle \int_0^{2} (4 e^x+2 \sin x)\, dx =

    28.3885180688169

    SOLUTION

    \begin{array}{rcl} \displaystyle \int_0^{2} (4 e^x+2 \sin x)\, dx \amp =\amp \displaystyle 4 e^x-2 \cos x \Big]_0^{2} \\ \amp =\amp (4 e^{2} - 2 \cos 2) - (4 e^0 - 2 \cos0 ) \\ \amp =\amp 4 e^{2} - 2 \cos 2 - 2 \end{array}

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/ww-discuss-always-antiderivative.xml ================================================

    Explain how we can use Corollary1.4.3 to say that every continuous function always has a derivative. (And we will demonstrate here that you can use a macro from docinfo: \definiteintegral{1}{2}{\frac{1}{x}}{x}=\ln(2)\text{.} It will work in the WeBWorK problem, regardless of whether you are using images, MathJax, or hardcopy.)

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/ww-discuss-inverse-processes.xml ================================================

    Differentiation and integration are inverse processes. Cite specific results from this section in an explanation of how they justify this (somewhat imprecise) claim.

    ================================================ FILE: examples/webwork/sample-chapter/my-generated/webwork/ww-use-the-definition-of-the-derivative.xml ================================================

    Use the definition of the derivative to find \frac{d}{dx}x^2\text{.}

    2x

    "Show your work.") @]*'; ############################################################ # Body ############################################################ BEGIN_PGML Use the definition of the derivative to find [`\frac{d}{dx}x^2\text{.}`] [_]{$answer}{10} [$showwork]** END_PGML ############################################################ # End Problem ############################################################ ENDDOCUMENT(); ]]>
    ================================================ FILE: examples/webwork/sample-chapter/pg/Adding_SingleDigit_Integers.pg ================================================ DOCUMENT(); loadMacros( "PGstandard.pl", "PGML.pl", "AnswerFormatHelp.pl", "PGcourse.pl", ); COMMENT('Add two positive single-digit integers.'); Context('Numeric'); $a = random(1, 9, 1); $b = random(1, 9, 1); $c = Compute($a + $b); BEGIN_PGML Compute the sum of [`[$a]`] and [`[$b]\text{:}`] [`[$a] + [$b] =`] [_]{$c}{5} [@AnswerFormatHelp('numbers')@]* END_PGML ENDDOCUMENT(); ================================================ FILE: examples/webwork/sample-chapter/project.ptx ================================================ html sample-chapter.ptx publisher/publication.xml output/html html sample-chapter.ptx publisher/publication-academy.xml published/PTXWW pdf sample-chapter.ptx publisher/publication.ptx output/print latex sample-chapter.ptx publisher/publication.ptx output/print-latex latex pdflatex xelatex pdf2svg asy sage convert pdftops pdf-crop-margins pageres node file2brl ================================================ FILE: examples/webwork/sample-chapter/publisher/publication-academy.xml ================================================ ================================================ FILE: examples/webwork/sample-chapter/publisher/publication.xml ================================================ ================================================ FILE: examples/webwork/sample-chapter/sample-chapter.ptx ================================================ PTXWW \newcommand{\definiteintegral}[4]{\int_{#1}^{#2}\,#3\,d#4} \newcommand{\indefiniteintegral}[2]{\int#1\,d#2} % comments get stripped WWSC \usepackage{pgfplots} \pgfplotsset{ every axis/.append style={ axis lines=middle, xlabel={\(x\)}, ylabel={\(y\)}, grid = both, } } Integrating <webwork /> into Textbooks Sample Exercises Robert Beezer Department of Mathematics and Computer Science University of Puget Sound Tacoma, Washington, USA beezer@pugetsound.edu Alex Jordan Department of Mathematics Portland Community College Portland, Oregon, USA alex.jordan@pcc.edu

    This is a sample book to demonstrate integrating homework problems into content authored with . It is structured as a book whose chapters are again structured with sections (no introductions or conclusions) so that it fits Ruestone's chaper/subchapter model and can be used for testing on Runestone Academy.

    This work was funded with grants from OpenOregon and the University of Puget Sound.

    Rob Beezer (University of Puget Sound) and Alex Jordan (Portland Community College) worked on the enhancements that make this possible. Mike Gage (Univeristy of Rochester), Geoff Goehle (Western Carolina University), and Alex Jordan made this possible by enhancing the end, and generally maintaining software.

    This book assumes a mild familiarity with both and . For more information about either project, follow the links.

    Instructive Examples
    Arithmetic

    Some questions with quantitative answers.

    Adding Single-Digit Integers

    A simple, but functional example to begin with. If you are just learning how to add, you can test yourself here.

    Add two positive single-digit integers. $a = random(1, 9, 1); $b = random(1, 9, 1); $c = Compute($a + $b);

    Compute the sum of and :

    + =

    + = .

    That was a simple problem. Let's move on.

    If you are familiar with , then it may be a surprise to you to be interacting with a problem this way, without having logged in to .

    Declaring a Problem Seed

    You can also declare a seed to specify a version of any problem that has randomization. Here is the same problem (copied in the source), but with a seed specified.

    Controlling Randomness

    You can code your problem with randomization, but then use a specific seed and 's $envir{problemSeed} to override that randomization for the purposes of the version that will appear in HTML and print output.

    $a = random(1, 9, 1); $b = random(1, 9, 1); if ($envir{problemSeed}==1){$a=1;$b=2}; $c = Compute($a + $b);

    Compute the sum of and :

    + =

    + = .

    Special Answer Checking

    One of the strengths of is its ability to give intelligent feedback for incorrect answers.

    • There is general feedback for when the student's answer is in an entirely different ballpark from the correct answer. Try entering something like y.

    • There is general feedback for when the student's answer is not in the right form. Try entering x^2*x^3, which, right or wrong, is unsimplified.

    • And problems can be written to detect and respond to common mistakes. Try entering an answer where you multiply the two exponents (instead of adding them, which would be correct.)

    $a = random(1, 9, 1); $b = random(1, 9, 1); $c = $a + $b; $expression = Formula("x^($a)*x^($b)"); Context("LimitedPolynomial-Strict"); # custom error message Context()->{error}{msg}{"A variable can appear only once in each term of a polynomial"} = "Your answer must be fully simplified"; $answer = Formula("x^($c)"); $product = $a*$b; $evaluator = $answer->cmp()->withPostFilter(AnswerHints( [Compute("x^($product)")] => "When multiplying terms with the same base, you do not multiply the exponents."));

    Use the properties of exponents to simplify .

    To enter a power, use a ^, as in x^2 for x^2.

    =

    We add the exponents as follows, while including a gratuitous reference to the quadratic formula: &=x^{+}& &=x^{}

    Using Hints

    Hints can be inserted into exercises. Whether a hint is visible in the HTML depends on the value of $showHint in PGcourse.pl in the course that is hosting these exercises. How the hint is displayed in the pdf output is controlled in the usual way that an PTX hint is controlled.

    do { $a = list_random(2,3,5,6); $b = random(1, 5, 1); } until (gcd($a,$b) == 1); $c = $a * $b**2; Context()->flags->set(reduceConstantFunctions=>0); $expression = Formula("sqrt($c)"); Context("LimitedRadical"); $answer = Formula("$b sqrt($a)");

    Simplify the expression .

    =

    Factor the number inside the radical.

    =\sqrt{^2\cdot }=\sqrt{}

    No Randomization

    This problem has no randomization at all, not even if it were exported to be part of a problem set on a server. As such, it really doesn't need any lines of Perl code in its setup, so you have the option of skipping that part of the authoring process.

    1+2=

    For more about problems that do not require any randomization, see the PTX Author Guide.

    Local PG

    The complete text of a .pg file can be used as the content of a webwork. Attention should be given to newlines and white space within the webwork, as they will be included in the PG problem that is rendered.

    Local PG File

    It is convenient to get the text of a .pg file using xi:include. This may help with file management and management of to not have to manage whitespace.

    Inside a <tag>project</tag>

    If you like, you can have a inside a project. Just like with an exercise, it can be preceded with an optional introduction and followed by an optional conclusion.

    Add two positive single-digit integers. $a = random(1, 9, 1); $b = random(1, 9, 1); $c = Compute($a + $b);

    Compute the sum of and :

    + =

    + = .

    Inside an <tag>exploration</tag>

    There are other project-like tags besides project. Here, we use an exploration.

    Add two positive single-digit integers. $a = random(1, 9, 1); $b = random(1, 9, 1); $c = Compute($a + $b);

    Compute the sum of and :

    + =

    + = .

    The Quadratic Formula

    In the previous section, we saw relatively simple questions. This section demonstrates how even very complicated problems can still behave well.

    Here is a theorem that gives us a formula for the solutions of a second-degree polynomial equation. Note later how the problem references the theorem by its number. This seemingly minor detail demonstrates the degree to which and have been integrated.

    Quadratic Formula

    Given the second-degree polynomial equation ax^2 + bx + c = 0, where a\neq0, solutions are given by x = \frac{-b\pm\sqrt{b^2-4ac}}{2a}.

    ax^2 + bx + c &= 0 ax^2 + bx &= -c 4ax^2 + 4bx &= -4c 4ax^2 + 4bx + b^2 &= b^2 - 4ac (2ax + b)^2 &= b^2 - 4ac 2ax + b &=\pm\sqrt{b^2 - 4ac} 2ax &=-b\pm\sqrt{b^2 - 4ac} x &=\frac{-b\pm\sqrt{b^2 - 4ac}}{2a}

    Solving Quadratic Equations Find a quadratic equation's solutions. One positive integer solution and one negative fraction solution. Context("Fraction"); $a = Compute(random(2,6,1)); do {$k = Compute(random(2,6,1))} until (gcd($a,$k)==1); $r = Compute(random(2,6,1)); $c = $k*-$r; $b = $a*-$r+$k; $quadratic = Formula("$a x^2 + $b x + $c")->reduce; $x1 = Fraction($r,1); $x2 = Fraction(-$k,$a); Context()->flags->set(reduceConstants=>0,reduceConstantFunctions=>0); $sol1 = Formula("(-$b+sqrt(($b)**2-4($a)($c)))/(2($a))"); $sol2 = Formula("(-$b-sqrt(($b)**2-4($a)($c)))/(2($a))"); $evaluatorfora = $a->cmp()->withPostFilter(AnswerHints( [-$a] => "Do you have the sign correct?") ); $evaluatorforb = $b->cmp()->withPostFilter(AnswerHints( [-$b] => "Do you have the sign correct?") ); $evaluatorforc = $c->cmp()->withPostFilter(AnswerHints( [-$c] => "Do you have the sign correct?") ); Context("FiniteSolutionSets"); $solutionset = Formula("{$x1,$x2}");

    Consider the quadratic equation = 0.

    Identify Coefficients

    Identify the coefficients for the quadratic equation using the standard form from .

    a= , b= , c=

    Take the coefficient of x^2 for the value of a, the coefficient of x for b, and the constant for c. In this case, they are a = , b = , c = .

    Use the Quadratic Formula

    Using the quadratic formula, solve the equation.

    Recall that the quadratic formula is given in .

    You already identified a = , b = , and c = , so the results are: x = = or x = =

    This conclusion is just here for testing.

    Nested tasks

    This exercise tests that nested tasks work.

    Find a quadratic equation's solutions. One positive integer solution and one negative fraction solution. Context("Fraction"); $a = Compute(random(2,6,1)); do {$k = Compute(random(2,6,1))} until (gcd($a,$k)==1); $r = Compute(random(2,6,1)); $c = $k*-$r; $b = $a*-$r+$k; $quadratic = Formula("$a x^2 + $b x + $c")->reduce; $x1 = Fraction($r,1); $x2 = Fraction(-$k,$a); Context()->flags->set(reduceConstants=>0,reduceConstantFunctions=>0); $sol1 = Formula("(-$b+sqrt(($b)**2-4($a)($c)))/(2($a))"); $sol2 = Formula("(-$b-sqrt(($b)**2-4($a)($c)))/(2($a))"); $evaluatorfora = $a->cmp()->withPostFilter(AnswerHints( [-$a] => "Do you have the sign correct?") ); $evaluatorforb = $b->cmp()->withPostFilter(AnswerHints( [-$b] => "Do you have the sign correct?") ); $evaluatorforc = $c->cmp()->withPostFilter(AnswerHints( [-$c] => "Do you have the sign correct?") ); Context("FiniteSolutionSets"); $solutionset = Formula("{$x1,$x2}");

    Consider the quadratic equation = 0.

    Identify Coefficients

    Identify the coefficients for the quadratic equation using the standard form from .

    a= ,

    Take the coefficient of x^2 for the value of a. In this case, a = .

    b= ,

    Take the coefficient of x for the value of b. In this case, b = .

    c=

    Take the constant term for the value of c. In this case, c = .

    Use the Quadratic Formula

    Using the quadratic formula, solve the equation.

    Recall that the quadratic formula is given in .

    You already identified a = , b = , and c = , so the results are: x = = or x = =

    This conclusion is just here for testing.

    Copy a Problem with Tasks

    We are testing copying the quadratic equation problem above (), since it is structured with task, and we also provide a new seed.

    Open Problem Library

    The Open Problem Library (OPL) is a repository of curated problems. At last count it had something like 30,000 problems, searchable by topic.

    Most of the problems in this sample chapter have their source authored within the same document as the narrative. However the problems in this section are from the OPL and elsewhere on the server that is hosting the caclulations. For HTML output we can connect to the server and render the problem here in an interactive fashion. For print/PDF we use the pretext script to connect to the server to produce code for the problem. We can use the exercise.text.* switches to control which parts of the problem (statements, solutions, hints) are incorporated.

    Problems do not have to be in the OPL to reside on a server; any problem that is accessbile from the course which is hosting the computation may be used this way.

    Cylinder Volume

    This problem is one that Portland Community College has donated to the Open Problem Library.

    This uninteresting image, authored in syntax, is here only to make sure its automatically-assigned identifier is correct, given that the OPL problem just above is going to generate another image for its static representation.

    \begin{tikzpicture} \draw[fill=white] (0,0) ellipse (3 and 0.45); \end{tikzpicture} Incompatible Problems

    Not all problems that come from the OPL are compatible with . The reasons vary. Perhaps the problem uses older macros that cannot be augmented to provide output. Perhaps the problem nests a table within a table, which will not support. Perhaps there are graphics in the problem that are not sized appropriately for output and there's nothing you can do about it. And there are many more reasons.

    Unfortunately the variety of reasons for which a problem may be incompatible means that at present, there is no way to validate a problem automatically. Using an incompatible problem might not raise any errors at any stage of the processing, but large chunks of the problem may be missing, especially in print output. So we recommend that you review all output modes when using an OPL problem. Chances are that if it is behaving in print, it will behave elsewhere. But that is an unproven theory at this point.

    Antidifferentiation A Few More Features

    This subsection demonstrates a few more features.

    Antiderivative of a Function

    Suppose that f(x) and F(x) are two functions such that F^\prime(x) = f(x). Then we say F is an antiderivative of f.

    The Fundamental Theorem of Calculus in one of the high points of a course in single-variable course.

    The Fundamental Theorem of Calculus Fundamental Theorem of Calculus

    If f(x) is continuous, and the derivative of F(x) is f(x), then \definiteintegral{a}{b}{f(x)}{x}=F(b)-F(a)

    Left to the reader.

    We state an equivalent version of the FTC, which is less-suited for computation, but which perhaps is a more interesting theoretical statement.

    Suppose f(x) is a continuous function. Then \frac{d}{dx}\definiteintegral{a}{x}{f(t)}{t}=f(x)

    We simply take the indicated derivative, applying at . \frac{d}{dx}\definiteintegral{a}{x}{f(t)}{t}&=\frac{d}{dx}\left(F(x)-F(a)\right) &=\frac{d}{dx}F(x)-\frac{d}{dx}F(a) &=f(x)-0 = f(x)

    <webwork /> Exercises

    The first problem in this list is coming from the Open Problem Library. One implication of this is that we might want to provide some commentary that connects the problem to the text. The other two ask for essay answers, which would be graded by an instructor, so in the HTML output there is no opportunity to provide an answer.

    Antiderivatives

    Consult and the to assist you with the following problem.

    Unless the OPL has changed this problem out from under us, note the SOLUTION appearing in the solution. That is hard-coded into the OPL version of the problem. This is an example of something undesirable that may happen when using OPL problems that were not originally written with in mind.

    Every Continuous Function has an Antiderivative

    problems can allow for open-ended essay responses that are intended to be assessed later by the instructor. For anonymous access, no text field is provided. But if this problem were used within as part of a homework set, users could submit an answer.

    Explain how we can use to say that every continuous function always has a derivative. (And we will demonstrate here that you can use a macro from docinfo: \definiteintegral{1}{2}{\frac{1}{x}}{x}=\ln(2). It will work in the problem, regardless of whether you are using images, MathJax, or hardcopy.)

    Inverse Processes

    Differentiation and integration are inverse processes. Cite specific results from this section in an explanation of how they justify this (somewhat imprecise) claim.

    For the given function f, find \indefiniteintegral{f(x)}{x}.

    Note that these common instructions are phrased in such a way that they would read well if they were applied to only one exercise at a time. That will happen if these exercises are exported as .pg files, for example to be used in online homework from a server.

    $answer = FormulaUpToConstant("-cos(x)");

    f(x)=\sin(x)

    $answer = FormulaUpToConstant("e^x");

    f(x)=e^x

    Show Your Work

    Sometimes you would like a student to give a simple answer that can automatically assess, but you would also like the student to show their work or reasoning. Perhaps there is a particular method that you want to see the student use to find the answer. So you have a regular answer blank and also an essay blank. For practical reasons, you may wish to use the same problem on your server, but omit the essay part. For example, if you want to use that problem but leave out the manual grading. For this, has the explanation_box tool, demonstrated here.

    $answer = Formula('2x'); $showwork = '[@ explanation_box(message => "Show your work.") @]*';

    Use the definition of the derivative to find \frac{d}{dx}x^2.

    Math Content

    This section helps with testing aspects of math content.

    Math Elements and Alignment

    In this exercise we demonstrate the allowed math elements: m and md. The latter may have attribute alignment with options gather, align, or alignat.

    If a=5 and b=12, then a^2+b^2=13^2.

    Here, we solve an equation. 2x+1 \amp= 3 2x \amp= 2 x \amp= 1 Here we have a three-way inequality to solve. 1 \lt 2x+1 \lt 3 0 \lt 2x \lt 2 0 \lt x \lt 1 And here, we see a system of equations. 2x + 2y \amp {}+{} \amp z \amp {}={} \amp 10 y \amp {}-{} \amp 4z \amp {}={} \amp 9 \amp\amp 3z \amp {}={} \amp -6

    Intertext

    With an md you might have intertext among the rows.

    Here, we solve an equation. 2x+1 \amp= 3 Now subtract 1 from each side. 2x \amp= 2 Now divide by 2 on each side. x \amp= 1

    We should also test when the md is within a list.

    1. Start a list.

    2. 2x+1 \amp= 3 Now subtract 1 from each side. 2x \amp= 2 Now divide by 2 on each side. x \amp= 1

    3. Still in the list?

    Multiple Choice

    While free-response questions are generally preferred, sometimes the nature of a question lends itself to multiple choice.

    Drop-down/Popup

    Note also that the solution to this problem uses an external link.

    $rational = PopUp( ["?","is","is not",], "is not", );

    The number \sqrt{2} rational.

    If \sqrt{2} were rational, then \sqrt{2}=\frac{p}{q}, with p and q coprime. But then 2q^2=p^2. By the Fundamental Theorem of Arithmetic, the power of 2 dividing the left side is odd, while the power of 2 dividing the right side is even. This is a contradiction, so \sqrt{2} rational.

    Choose one $theorem = RadioButtons( ["The Quadratic Formula","The Fundamental Theorem of Calculus","The Fundamental Theorem of Arithmetic","None of these"], 1, # index of correct answer; could also just be the correct answer );

    Which of the following suggest that differentiation and integration are inverse processes?

    The correct answer is .

    Choose a Subset of Options $checks = CheckboxList( [ [ "${BM}e^{x^2} e^{1/x}${EM}", "${BM}e^{x^2} e^{x^{-1}}${EM}", "${BM}e^{ (x^3+1) / x}${EM}", "${BM}\dfrac{ e^{x^2} }{ e^x }${EM}", "${BM}e^{x^2} + e^{1/x}${EM}" ], "None of the above" ], [0, 1, 2] );

    Select all expressions that are equivalent to e^{x^2 + 1/x}. There may be more than one correct answer.

    The correct answer is .

    Choose a Subset of Options with Automated Labeling $checks = CheckboxList( [ [ "${BM}e^{x^2} e^{1/x}${EM}", "${BM}e^{x^2} e^{x^{-1}}${EM}", "${BM}e^{ (x^3+1) / x}${EM}", "${BM}\dfrac{ e^{x^2} }{ e^x }${EM}", "${BM}e^{x^2} + e^{1/x}${EM}" ], "None of the above" ], [0, 1, 2], labels => "ABC", # "abc", "123", "roman", "Roman" );

    Select all expressions that are equivalent to e^{x^2 + 1/x}. There may be more than one correct answer.

    The correct answer is .

    Choose a Subset of Options with Explicit Labeling $checks = CheckboxList( [ [ {TACO => "${BM}e^{x^2} e^{1/x}${EM}"}, {PIZZA => "${BM}e^{x^2} e^{x^{-1}}${EM}"}, {SUSHI => "${BM}e^{ (x^3+1) / x}${EM}"}, {BURGER => "${BM}\dfrac{ e^{x^2} }{ e^x }${EM}"}, {BURRITO => "${BM}e^{x^2} + e^{1/x}${EM}"} ], {HUNGRY => "None of the above"} ], [0, 1, 2], displayLabels => 1 );

    Select all expressions that are equivalent to e^{x^2 + 1/x}. There may be more than one correct answer.

    The correct answer is .

    Tables

    Although a problem written in source can't have a table (which would be captioned and cause trouble with free-standing PG output), they can have a tabular. Tabulars can be made using the existing syntax and options that PTX offers for table-making, with some exceptions. As of summer 2017, the exceptions are that individual cells cannot have bottom border attributes and individual columns cannot have top border attributes. Also, while PTX table borders are generally minor, medium, or major, when these borders are used in a problem that is rendered as a hard copy problem from within , the only thickness option corresponds to minor. Several more features (like rules in general) do not carry through to static output (print or HTML-preview). However we hope this is only temporary.

    Complete this Table @a = (random(2,9,1),random(2,9,1)); @b = (random(2,9,1),random(2,9,1)); for my$i(0..3){$p[$i]=$a[int($i/2)]*$b[$i % 2]};

    Complete this multiplication table.

    \times
    \times
    Graphics in Exercises

    It is natural for exercises to have graphics. For example, an exercise might produce a graph of some kind, and ask the reader to extract some information from that graph.

    If your server is version 2.16 or later, problems can process latex-image code. Here is an example.

    A static <tag>latex-image</tag> graph Context("IntegerFunctions"); Context()->variables->are(n=>'Real'); $answer = OneOf(Formula("C(n+1,2)"),Formula("(n+1)n/2"));

    This image is a visual proof that \sum_{k=1}^{n}k equals what?

    21 blue balls are arranged in a triangular formation, with one at the top, then a row of two, a row of three, and so on until a row of six; there is a seventh row with seven orange balls; one blue ball is highlighted, and two lines extend downward from that ball, one to the left and one to the right, parallel to the sides of the triangle, until they intersect two orange balls; the effect is that each of the 1+2+3+4+5+6 blue balls corresponds to one pair from the 7 orange balls \begin{tikzpicture} \draw[dashed] (0.5-0.5*6.5,-0.866025*6.5) -- (7-0.5*6.5,-0.866025*6.5); \draw[very thick] (2-0.5*7,-0.866025*7) -- (2-0.5*4,-0.866025*4) -- (5-0.5*7,-0.866025*7); \foreach \x in {1,...,6} \foreach \y in {1,...,\x} \shade[ball color=blue!30] (\y-0.5*\x,-0.866025*\x) circle (0.2cm); \foreach \y in {1,...,7} \shade[ball color=orange!40] (\y-0.5*7,-0.866025*7) circle (0.2cm); \node at (2.5,-0.5) [anchor=north west]{\(\color{blue}\sum\limits_{k=1}^nk\color{black}\)}; \shade[ball color=blue] (2-0.5*4,-0.866025*4) circle (0.2cm); \shade[ball color=orange] (2-0.5*7,-0.866025*7) circle (0.2cm); \shade[ball color=orange] (5-0.5*7,-0.866025*7) circle (0.2cm); \end{tikzpicture} You may enter the answer using C(n,k) notation.

    A randomized <tag>latex-image</tag> graph

    These images may depend on the random seed. In this problem, the height and width of the rectangle are randomized.

    $a = random(4,6,1); $b = $a + random(2,4,1); $area = NumberWithUnits($a*$b, 'cm^2');

    Find the area of the rectangle.

    a rectangle whose width is labeled cm and height is labeled cm \begin{tikzpicture} \draw[fill=blue!20] (0,0) --++ (6,0) node[pos=0.5,below] {\($b\)\,cm} --++ (0,4) node[pos=0.5,right] {\($a\)\,cm} --++ (-6,0) -- cycle; \end{tikzpicture}

    A <tag>latex-image</tag> graph affected by <tag>latex-image-preamble</tag>

    This sample chapter's docinfo has a latex-image-preamble. This exercise has graph styling that is affected by that.

    @roots = (-3..3)[NchooseK(7,3)]; @roots = num_sort(@roots); $answer = List(@roots); $xmin = min(-1,@roots)-1; $xmax = max(1,@roots)+1;

    What are the roots of this polynomial?

    the graph of a polynomial that crosses the x-axis at , , and . \begin{tikzpicture} \begin{axis} \addplot[domain=$xmin:$xmax,smooth] {(x-$roots[0])*(x-$roots[1])*(x-$roots[2])}; \end{axis} \end{tikzpicture}

    Special characters

    This exercise is to test that special characters behave.

    The code below has a printed dollar sign, a printed percent sign, a printed at sign, and a percent sign used as a comment marker.

    this image has pictures of text with special characters like $, %, and @ \begin{tikzpicture} \node at (0,0) {I need about \$3.50.}; \node at (0,1) {You gotta give 110\%.}; %This is a comment. \node at (0,2) {Send email user@domain.com.}; \end{tikzpicture}

    An older mechanism for creating images is supported and demonstrated here.

    Solve using a graph $a = random(1,3,1); $gr = init_graph(-1,-1,4,4, axes=>[0,0], grid=>[5,5], size=>[300,180] ); add_functions($gr, "x^3/$a^3 for x in <-1,4> using color:blue and weight:2"); $second_x = Real($a*2**(1/3)); $solgr = init_graph(-1,-1,4,4, axes=>[0,0], grid=>[5,5], size=>[300,180] ); add_functions($solgr, "x^3/$a^3 for x in <-1,4> using color:blue and weight:2"); $solgr->moveTo(0,1); $solgr->lineTo($a,1,'black',3); $solgr->arrowTo($a,0,'black',3); Context("FiniteSolutionSets"); $answer = Formula("{$a}");

    The graph below is a graph of y=f(x). Use the graph to solve the equation f(x)=1.

    a plot of a curve on a cartesian set of axes; the x axis ranges from -1 to 4, and the y-axis ranges from -1 to 4; the curve enters from the left, below the x-axis, and curves upward and to the right until it reaches the point (0,0); from here it continues predominantly rightward for a bit, bending slightly upward more and more as it progresses; it passes through the points (,1) and (,2) before leaving the graph moving more and more upward and to the right.

    The graph reveals that the solution set to f(x)=1 is .

    a plot of a curve on a cartesian set of axes; the x axis ranges from -1 to 4, and the y-axis ranges from -1 to 4; the curve enters from the left, below the x-axis, and curves upward and to the right until it reaches the point (0,0); from here it continues predominantly rightward for a bit, bending slightly upward more and more as it progresses; it passes through the points (,1) and (,2) before leaving the graph moving more and more upward and to the right; a horizontal line segment moves rightward from y=1 on the y-axis until it reaches a point on the curve; a vertical line segment moves down from this point to x= on the x-axis.

    This exercisegroup has a latex-image image in its introduction. In standalone versions of the exercise, this image should be repeated.

    \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(L\)} --++ (0,3) node[right,pos=0.5] {\(W\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(D\)} --++ (0,3) --++ (4,0); \end{tikzpicture}

    Find D when L=4 and W=3.

    \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(4\)} --++ (0,3) node[right,pos=0.5] {\(3\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(5\)} --++ (0,3) --++ (4,0); \end{tikzpicture}

    Find D when L=12 and W=5.

    \begin{tikzpicture} \draw (0,0) --++ (4,0) node[below,pos=0.5] {\(12\)} --++ (0,3) node[right,pos=0.5] {\(5\)} --++ (-4,-3) node[above,sloped,pos=0.5] {\(13\)} --++ (0,3) --++ (4,0); \end{tikzpicture}
    Technical Examples
    PGML Formatting and Verbatim Calisthenics

    This section is designed to test various PGML formatting rules and verbatim content returned in answer hashes. Consult the source to see how the special characters and formatting are realized.

    PGML Formatting

    Smart double quotes: Life is about making an impact, not making an income.

    Smart single quotes: Whatever the mind of man can conceive and believe, it can achieve.

    Regular apostrophes: My siblings' mother's daughter isn't my daughter's siblings' mother.

    Emphasis: very important

    Alert: do not do it

    Braces: {text that looks like a set}

                                    Some pre-formatted text
                                                with an indented line
                                and an out-dented line
                                This should not be altered *a problem*
                                And this [$NDASH]* should not be an en-dash
                                

    Here is some inline code with special characters & < > " ' # $ % ^ _ { } ~ \ * [ ], and here is some single-line display code with special characters & < > " ' # $ % ^ _ { } ~ \ * [ ] and here is some multi-line display code with special characters & < > " ' # $ % ^ _ { } ~ \ * [ ]

    Some raw characters, XML/HTML: & < > " '

    Some raw characters, : # $ % ^ & _ { } ~ \

    Some raw characters, PGML: \ * # { } [ ]

    Some characters that need special handling for PGML conversion to HTML or :

    A nonbreaking space (invisble where a hyphen should be)

    An ndashright here.

    An mdashright here.

    Some constructions in normal text, which need to be manipulated, lest they get interpreted as PGML markup:

    >> This should not be a centered line <<

    >> Nor a right-justified line, either

    We should not get _a phrase in italics_ in the midst of this sentence.

    Brackets, unpaired; ] with content between [

    Brackets, paired, in PGML constructions; [$NDASH]*, [___]{$answer}

    ### This should not be a level 3 heading

    === Not a horizontal rule from three equal signs

    == Not a horizontal rule from two equal signs

    ===== Not a horizontal rule from five equal signs

    --- Not a horizontal rule from three hyphens

    -- Not a horizontal rule from two hyphens

    ----- Not a horizontal rule from five hyphens

    + Not an unordered list item

    - Not an unordered list item

    Here we make MathObject String answers to see how they turn out in answer elements.

    $xmlchars = q(<>&'";); $latex0 = '#%&<>\^_`|~'; $latex1 = '${}'; $alphanumeric = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $otherchars = '!()*+,-./:=?@[]'; Context()->strings->add($xmlchars=>{}); Context()->strings->add($latex0=>{}); Context()->strings->add($latex1=>{}); Context()->strings->add($alphanumeric=>{}); Context()->strings->add($otherchars=>{}); $xmlcharsMO = String($xmlchars); $latex0MO = String($latex0); $latex1MO = String($latex1); $alphanumericMO = String($alphanumeric); $othercharsMO = String($otherchars);

    1. Special characters used by XML, character escaping:

      Now as a MathObject:

    2. Special characters used by LaTeX, where LaTeX \text and MathJax \text disagree:

      Now as a MathObject:

    3. Special characters used by LaTeX, where LaTeX \text and MathJax \text can agree:

      Now as a MathObject:

    4. Alphanumeric characters:

      Now as a MathObject:

    5. Other characters:

      Now as a MathObject:

    In answers, because of and MathJax divergence, the first two should come out in verbatim. (And so should any string containing even one of those characters.) The latter three should come out in regular text.

    Occasionally (and probably very rarely) your PG code will include a string variable where the content is PGML syntax. If this is put into the exercise statement, it will be inserted after PGML processing is done, and therefore it won't render as you might expect. To insert this content and also have it processed as PGML, use data="pgml". (This is not in the schema as of 3/26/2020, and is subject to change.)

    $statement = 'some PGML math: [`\frac{1}{2}+\frac{3}{2}=2`]; and some *bold text*';

    makes:

    Subject Area Templates

    This section samples the subject area template problems found on the wiki at .

    Answer is a number or a function $a = non_zero_random(-9,9,1); do { $b = random(2,9,1); } until ( $b != $a ); $answer1 = Compute("$a"); $answer2 = Compute("($a x^($b) + $b)/x")->reduce();

    1. Suppose the correct answer is .

    2. Suppose the correct answer is \displaystyle .

    Solution explanation goes here.

    Answer is a function with domain issues $a = random(2,5,1); $answer1 = Compute("sqrt(x-$a)"); $answer1->{limits} = [$a+1,$a+4]; $answer2 = Compute("ln(abs( x / (x-$a) ))"); $answer2->{test_points} = [[-5],[-4],[1],[$a-1],[7],[8]]; $answer2evaluator = $answer2 -> cmp() -> withPostFilter( AnswerHints( [Compute("ln(abs((x-$a)/x))"),] => "This is the opposite of correct...",));

    1. Suppose the correct answer is \displaystyle .

    2. Suppose the correct answer is \displaystyle .

    Solution explanation goes here.

    Multiple Choice by Popup, Radio Buttons, or Checkboxes $color1 = PopUp(["?","Red","Blue","Green"], 2); $color2 = RadioButtons(["Red","Blue","Green","None of these"], 1); $color3 = CheckboxList(["Red","Blue","Green","None of these"], [1]);

    My favorite color is .

    My favorite color is

    My favorite color is

    The correct answer is .

    The correct answer is .

    The correct answer is .

    $expressions = RadioButtons(['\(x\)','\(x^2\)','\(2^x\)'], 2);

    There is math in each option for this question. Which expression is not a polynomial?

    The answer is .

    Tables $x = Real(5);

    A table with minimal XML source.

    A B C D E F G H I

    Finish this table.

    1 two \lfloor\pi\rfloor \text{I}+\text{I}{}+\text{I}+\text{I} six 2^3-1 VIII

    The missing number is .

    Answer Arrays Context("Point"); $p = Point(0,0); Context("Vector"); $v = Vector(1,2); $c = ColumnVector(3,4); Context("Matrix"); $m = Matrix([[1,2],[3,4]]);

    These answer blanks are all expecting some sort of answer in an array format.

    = {}

    = {}

    = {}

    = {}

    Stress Tests PTX problem source with server-generated images for my $i(0..7){$gr[$i] = init_graph(-1,-1,4,4,axes=>[0,0],grid=>[5,5],size=>[150,150]);}; add_functions($gr[0], "1 for x in <-1,4> using color:blue and weight:2"); add_functions($gr[1], "x for x in <-1,4> using color:blue and weight:2"); add_functions($gr[2], "x^2 for x in <-1,4> using color:blue and weight:2"); add_functions($gr[3], "x^3 for x in <-1,4> using color:blue and weight:2"); add_functions($gr[4], "e^x for x in <-1,4> using color:blue and weight:2"); add_functions($gr[5], "sin(x) for x in <-1,4> using color:blue and weight:2"); add_functions($gr[6], "cos(x) for x in <-1,4> using color:blue and weight:2"); add_functions($gr[7], "exp(-x^2) for x in <-1,4> using color:blue and weight:2"); Checking Proper Indentation In Lists

    One long exercise, where ordered sublists test the specification of their labels.

    1. Simple item
    2. Simple item
    3. Simple item

    1. Simple item
    2. Simple item
    3. Simple item

    Text before.

    1. Simple item
    2. Simple item
    3. Simple item
    And after.

    1. Structured item

    2. Structured item

    3. Structured item

    Text before.

    1. Structured item

    2. Structured item

    3. Structured item

    And after.

    1. Structured item

      1. Sublist Item

      2. Sublist Item

      3. Sublist Item

    2. Structured item

    Text before.

    1. Structured item

    2. Text before.

      1. Sublist Item

      2. Sublist Item

      3. Sublist Item

      And after.

    3. Structured item

    And after.

    1. Structured item

      Second paragraph

      1. Sublist Item

        Second paragraph

      2. Sublist Item

        Second paragraph

      3. Sublist Item

        Second paragraph

    2. Structured item

      Second paragraph

    Text before.

    1. Structured item

      Second paragraph

    2. Text before.

      1. Sublist Item

        Second paragraph

      2. Sublist Item

        Second paragraph

      3. Sublist Item

        Second paragraph

      And after.

    3. Structured item

      Second paragraph

    And after.

    1. 1+1=2Structured item

      Second1+1=2 paragraph

      1. Sublist1+1=2 Item

        Second paragraph1+1=2

      2. 1+1=2Sublist Item

        Second1+1=2 paragraph

      3. Sublist Item1+1=2

        1+1=2Second paragraph

    2. Structured1+1=2 item

      Second paragraph1+1=2

    Text before.

    1. Structured1+1=2 item

      Second paragraph1+1=2

    2. 1+1=2Text before.

      1. Sublist1+1=2 Item

        Second paragraph1+1=2

      2. 1+1=2Sublist Item

        Second1+1=2 paragraph

      3. Sublist Item1+1=2

        1+1=2Second paragraph

      And1+1=2 after.

    3. Structured item1+1=2

      1+1=2Second paragraph

    And after.

    Text before.

    1. Structured 1+1\amp=2 2\amp=2 item

      Second paragraph 1+1\amp=2 2\amp=2

    2. 1+1\amp=2 2\amp=2 Text before.

      1. Sublist 1+1\amp=2 2\amp=2 Item

        Second paragraph 1+1\amp=2 2\amp=2

      2. 1+1\amp=2 2\amp=2 Sublist Item

        Second 1+1\amp=2 2\amp=2 paragraph

      3. Sublist Item 1+1\amp=2 2\amp=2

        1+1\amp=2 2\amp=2 Second paragraph

      And 1+1\amp=2 2\amp=2 after.

    3. Structured item 1+1\amp=2 2\amp=2

      1+1\amp=2 2\amp=2 Second paragraph

    And after.

    Checking Proper Indentation In Lists with Images and Tables $g=init_graph(-1,-1,1,1,axes=>[0,0]);

    1. Structured item

    2. Structured item

    3. Structured item

    4. Structured item

    1. Structured item

      a b c d
    2. 1 two \lfloor\pi\rfloor \text{I}+\text{I}{}+\text{I}+\text{I} 5 six 2^3-1 VIII

      Structured item

    3. Structured item

      a b c d

      Second paragraph

    4. Structured item

    Deep-nested lists

    Ordered list.

    1. Level 1, first.

    2. Level 1, second.

      1. Level 2, first.

      2. Level 2, second.

        1. Level 3, first.

        2. Level 3, second.

          1. Level 4, first.

          2. Level 4, second.

          3. Level 4, third.

        3. Level 3, third.

      3. Level 2, third.

    3. Level 1, third.

    Unordered list.

    • Level 1, first.

    • Level 1, second.

      • Level 2, first.

      • Level 2, second.

        • Level 3, first.

        • Level 3, second.

          • Level 4, first.

          • Level 4, second.

          • Level 4, third.

        • Level 3, third.

      • Level 2, third.

    • Level 1, third.

    This exercise has no content in its statement. It should throw a PTX warning during the representations build.

    This exercise has a single quote in it. A single quote is the first option for a delimiter for perl's q function which is used by extract-pg.xsl in table cells. So if working, it should move on to the next delimiter option.

    What's up, Doc?
    Layout Configuration Testing

    This section is to provide a single page demonstrating all of the combinations that may factor into a problem's layout.

    Inline Exercises

    Some inline exercises, as distinguished from the divisional exercises below.

    1+1=2

    Has a Title

    1+1=2

    Has an introduction.

    1+1=2

    Has a Title

    Has an introduction.

    1+1=2

    1+1=2

    Has a conclusion.

    Has a Title

    1+1=2

    Has a conclusion.

    Has an introduction.

    1+1=2

    Has a conclusion.

    Has a Title

    Has an introduction.

    1+1=2

    Has a conclusion.

    Divisional Exercises

    1+1=2

    Has a Title

    1+1=2

    Has an introduction.

    1+1=2

    Has a Title

    Has an introduction.

    1+1=2

    1+1=2

    Has a conclusion.

    Has a Title

    1+1=2

    Has a conclusion.

    Has an introduction.

    1+1=2

    Has a conclusion.

    Has a Title

    Has an introduction.

    1+1=2

    Has a conclusion.

    These are inside an exercisegroup.

    1+1=2

    Has a Title

    1+1=2

    Has an introduction.

    1+1=2

    Has a Title

    Has an introduction.

    1+1=2

    1+1=2

    Has a conclusion.

    Has a Title

    1+1=2

    Has a conclusion.

    Has an introduction.

    1+1=2

    Has a conclusion.

    Has a Title

    Has an introduction.

    1+1=2

    Has a conclusion.

    Runestone Assignment Testing

    This section is specifically for testing when exercises are migrated to a Runestone Assignment page.

    This introduction should appear ahead of the exercise when it shows up in the Assignment page.

    (0,0) (0,1) (1,0) (1,1) \begin{tikzpicture} \draw[fill=blue!20] (0,0) -| (1,1) -| cycle; \end{tikzpicture} a blue square

    It has a table and an image too to check it all comes through.

    What is 1+1?

    >

    Deprecations

    This section is for testing if deprecated features are still supported. No such tests are being performed now.

    Hints, Answers, and Solutions
    ================================================ FILE: examples/workbook/README.md ================================================ ## Sample Workbooks As of 2024-11-22 these are first attempts at coherent collections of worksheets, thus known as workbooks. They are not complete, correct, nor authoritative. There present purpose is to support development work. ================================================ FILE: examples/workbook/workbook-article-publication.xml ================================================ ================================================ FILE: examples/workbook/workbook-article.xml ================================================ \newcommand{\definiteintegral}[4]{\int_{#1}^{#2}\,#3\,d#4} % this comment will be stripped \newcommand{\myequation}[2]{#1\amp =#2} % testing alignment override % comments anywhere get stripped, with or without faux % comment \% characters \newcommand{\indefiniteintegral}[2]{\int#1\,d#2} \newcommand{\testingescapedpercent}{ \% } % just testing \newcommand{\bvec}{{\mathbf b}} \newcommand{\vvec}{{\mathbf v}} \usepackage{pgfplots} % loads tikz package \usepackage{smartdiagram} % for a circular diagram \pgfplotsset{axis x line = middle, axis y line = middle} \usetikzlibrary{backgrounds} \usetikzlibrary{arrows,matrix} \usetikzlibrary{positioning} % for Dave R's worksheet \usepackage{circuitikz} % for Virgil P's worksheet \usepackage{nicematrix} % for multi-run latex-image (label="latex-three-pass") SWA pretext-SWA
    Derivatives and Integrals An Annotated Discourse Robert Beezer Department of Mathematics and Computer Science University of Puget Sound Tacoma, Washington, USA beezer@pugetsound.edu

    This is a sample of many of the things you can do with . Sometimes the math makes sense, sometimes it seems to be written in the first person, sort of like this Abstract.

    ================================================ FILE: examples/workbook/workbook-book-publication.xml ================================================ ================================================ FILE: examples/workbook/workbook-book.xml ================================================ \newcommand{\definiteintegral}[4]{\int_{#1}^{#2}\,#3\,d#4} % this comment will be stripped \newcommand{\myequation}[2]{#1\amp =#2} % testing alignment override % comments anywhere get stripped, with or without faux % comment \% characters \newcommand{\indefiniteintegral}[2]{\int#1\,d#2} \newcommand{\testingescapedpercent}{ \% } % just testing \newcommand{\bvec}{{\mathbf b}} \newcommand{\vvec}{{\mathbf v}} \usepackage{pgfplots} % loads tikz package \usepackage{smartdiagram} % for a circular diagram \pgfplotsset{axis x line = middle, axis y line = middle} \usetikzlibrary{backgrounds} \usetikzlibrary{arrows,matrix} \usetikzlibrary{positioning} % for Dave R's worksheet \usepackage{circuitikz} % for Virgil P's worksheet \usepackage{nicematrix} % for multi-run latex-image (label="latex-three-pass") SWB pretext-SWB <pretext/> Workbook In Book Format Robert Beezer Department of Mathematics and Computer Science University of Puget Sound Tacoma, Washington, USA beezer@pugetsound.edu Four Worksheets Two Worksheet Chapter ================================================ FILE: examples/workbook/ws-activity-with-task.xml ================================================

    This is going to be an activity with tasks.

    Here is the first task.

    Here is the second task.

    Here is the third task.

    This is a conclusion that comes after the last task.

    ================================================ FILE: examples/workbook/ws-dot-products.xml ================================================ Dot products and projection

    Let {\vec v}_1 = (-4,1), {\vec v}_2 = (2,2), {\vec v}_3 = (1,2,3), {\vec v}_4 = (-2,1,0). Find the values of the following expressions:

    {\vec v}_1 \cdot {\vec v}_2 =

    {\vec v}_3 \cdot {\vec v}_4 =

    \lVert{\vec v}_1\rVert =

    \lVert{\vec v}_4\rVert =

    Are any of these vectors perpendicular to each other?

    The vectors \vec a = (3,9) and \vec u = (4,2) are pictured below. Derive the formula for projection on a line and use it to find the projection of \vec a on the line spanned by \vec u. Also compute the length of the residual vector.

    two vectors in a Cartesian plane

    Consider the vector equation m \begin{bmatrix}2 \\ 5\end{bmatrix} = \begin{bmatrix}3 \\ 7\end{bmatrix} .

    Check that there is no solution m that makes the equation true.

    Use projection to find the best approximation \hat m.

    Compute \hat m \begin{bmatrix}2 \\ 5\end{bmatrix} .

    Compute the residual vector.

    Compute the length of the residual vector and explain what it means.

    Consider the system of equations 3t \amp =5 2t \amp = 9 .

    Write the system in vector form.

    Find the best estimate, \hat t, of t using projection.

    Compute the length of the residual vector.

    ================================================ FILE: examples/workbook/ws-exercisegroup.xml ================================================

    This is a mock worksheet for testing the use of workspace for exercise within an exercisegroup.

    Do things to the following.

    Apple

    Banana

    Cherry

    Durian

    Elderberry (with workspace override)

    Fig

    Guava

    Habanero

    I can't think of an I fruit.

    Jackfruit

    Now with one column, do things to the following.

    Apple

    Banana

    Cherry

    Durian

    Elderberry (with workspace override)

    Fig

    Guava

    Habanero

    I can't think of an I fruit.

    Jackfruit

    ================================================ FILE: examples/workbook/ws-geometric-prelude.xml ================================================ A Geometric Prelude
    • Practice visualizing vector addition
    • Use vectors without explicit coordinates

    This two-page worksheet was generously donated to the sample article by Dave Rosoff at a CuratedCourses workshop in August2018. It has the default (skinny) margins.

    It was known to Euclid, and probably earlier, that the midpoints of the sides of any quadrilateral all lie in the same plane (even if the vertices of the quadrilateral do not). In fact, these midpoints are the vertices of a parallelogram, as pictured in .

    The midpoints of the sides of a quadrilateral are the vertices of a parallelogram. \begin{tikzpicture}[xscale=0.8, yscale=0.8] \draw[style={black, ultra thick}] (0,0) -- (5,0) -- (4,4) -- (2,5) -- (0,0); \draw[style={black, dashed, very thick}] (2.5, 0) -- (4.5, 2) -- (3, 4.5) -- (1, 2.5) -- (2.5, 0); \end{tikzpicture}
    The sides of a triangle presented as vectors. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); % \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node % {} -- (1.5,0) node[below right=0mm and 3mm] {$\vec{A}$}; %\draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node % {} -- (2,1) node[above left=5mm and 1mm] {$\vec{B}$}; %\draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node % {} -- (0.5,1) node[below left=1mm and 3mm] {$\vec{C}$}; %\node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; %\node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; % \node {$P$} (1.3333,0.6667); \end{tikzpicture}
    The medians of the triangle are \vec{M}_1, \vec{M}_2, and \vec{M}_3. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node {$\vec{M}_{1}$} -- (1.5,0);% node[below right=0mm and 3mm] {$\vec{A}$}; \draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node {$\vec{M}_{2}$} -- (2,1);% node[above left=5mm and 1mm] {$\vec{B}$}; \draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node {$\vec{M}_{3}$} -- (0.5,1);% node[below left=1mm and 3mm] {$\vec{C}$}; \node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; \node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; % \node {$P$} (1.3333,0.6667); \end{tikzpicture}

    In this exercise, we'll use vectors to show that the medians of any triangle () intersect at a point. Recall that medians are the lines connecting the vertices of the triangle to the midpoints of their opposite edges, as in the figure. We'll do this in a few steps.

    What is the value of \vec{A} + \vec{B} + \vec{C}?

    from the previous page is reproduced for your convenience.

    The medians of the triangle are \vec{M}_1, \vec{M}_2, and \vec{M}_3. \begin{tikzpicture}[xscale=1.5, yscale=1.5] \draw[->,>=latex, style={black, thick}] (0,0) -- (2.30 , 0) node [below] {$\vec{A}$} -- (3,0); \draw[->,>=latex, style={black, thick}] (3,0) -- (1.47, 1.53) node [above right =1mm] {$\vec{B}$} -- (1,2); \draw[->,>=latex, style={black, thick}] (1,2) -- (0.23 , 0.46) node [above left=1mm] {$\vec{C}$} -- (0,0); \draw[->,>=latex, style={black,semithick,dashed}] (1,2) -- (7/6, 4/3) node {$\vec{M}_{1}$} -- (1.5,0);% node[below right=0mm and 3mm] {$\vec{A}$}; \draw[->,>=latex, style={black,semithick,dashed}] (0,0) -- (2/3, 1/3) node {$\vec{M}_{2}$} -- (2,1);% node[above left=5mm and 1mm] {$\vec{B}$}; \draw[->,>=latex, style={black,semithick,dashed}] (3,0) -- (13/6,1/3) node {$\vec{M}_{3}$} -- (0.5,1);% node[below left=1mm and 3mm] {$\vec{C}$}; \node[draw,shape=circle,fill=black,name=P,scale=0.5] at (4/3,2/3) {}; \node[above right=1.2mm and -0.5mm of P] at (4/3,2/3) {$P$}; % \node {$P$} (1.3333,0.6667); \end{tikzpicture}

    Show that \vec{M}_{1} + \vec{M}_{2} + \vec{M}_{3} = 0.

    Use .

    To show that the point P exists (as the common intersection of the \vec{M}_{i}), show that \vec{A} + \frac{2}{3} \vec{M}_{3} = \frac{2}{3} \vec{M}_{2} = .

    If you have time, try to devise a vector proof of Euclid's result presented at the beginning of the workshop. Recall that a parallelogram is a four-sided polygon whose opposite sides are parallel.

    Wrap-up

    It's possible to do interesting things with vector arithmetic in a coordinate-free way: we didn't specify an origin, or any entries of any vectors in the examples.

    ================================================ FILE: examples/workbook/ws-networks.xml ================================================ Networks Worksheet Basic laws for electrical circuits

    This two-page worksheet was generously donated to the sample article by Virgil Pierce at a CuratedCourses workshop in August2018. It has default (skinny) left and right margins, but we have specified longer top and bottom margins, with the top being the larger of the two.

    Ohms Law

    The current through a resistor is proportional to the ratio of the Voltage to the Resistance I = \frac{V}{R} Or for our purposes I R = V

    Kirchoffs Current Law

    The sum of the currents in a network meeting at a point is zero. \sum_{k=1}^n I_k = 0

    Kirchoff's Current Law

    For the circuit below I_1 + I_2 = I_3 .

    \begin{circuitikz} \draw (0,0) to[R, i=$I_1$, *-o](2,2); \draw (0,0) to[R, i=$I_2$, *-o](2,-2); \draw (-3, 0) to[R, i=$I_3$, o-*](0,0); \end{circuitikz}
    Kirchoffs Voltage Law

    The sum of the voltages around any closed circuit (or subcircuit) is zero. \sum_{k=1}^n V_k = 0

    Kirchoffs Current Law and Kirkoffs Voltage Law combined with Ohms Law gives for any circuit of resistors and sources a linear system that may (or may not) determine the currents.

    For the simple network pictured, calculuate the amperage in each part of the network by setting up a system of linear equations for the amperages.

    \begin{circuitikz} \draw (0,0) to[V, v=$11\quad \mbox{volt}$](0, 3) to[short](2,3) to[R, R=$4\quad \mbox{ohm}$] (3, 3) to[short](4,3) to[R, R=$3\quad \mbox{ohm}$](4,0) to[short](3,0) to[R, R=$3\quad \mbox{ohm}$](2,0) to[short](0,0); \end{circuitikz}

    Compare it with a parallel circuit network. Calculate the amperage in each part of the network by setting up a system of linear equations for the amperages.

    \begin{circuitikz} \draw(0,0) to[V, v=$11\quad \mbox{volt}$](0, 3) to[short](5,3) to[R, R=$4\quad \mbox{ohm}$](6,3) to[short](7,3) to[R, R=$3\quad \mbox{ohm}$](7,0) to[short](6,0) to[R, R=$3\quad \mbox{ohm}$](5,0) to[short](0,0); \draw(4,0) to[R, R=$3\quad \mbox{ohm}$](4,3); \end{circuitikz}

    Now for a more complicated network. Calculate the amperage in each part of the network by setting up a system of linear equations for the amperages.

    \begin{circuitikz} \draw(0,0) to[V, v=$11 \quad \mbox{volt}$](0, 3) to[short](5,3) to[R, R=$4 \quad \mbox{ohm}$](6,3) to[short](9,3) to[R, R=$4 \quad \mbox{ohm}$](10,3) to[short](11,3) to[R, R=$3 \quad \mbox{ohm}$](11, 0) to[short](10,0) to[R, R=$2\quad \mbox{ohm}$](9,0) to[short](6,0) to[R, R=$2\quad \mbox{ohm}$](5,0) to[short](0,0); \draw(4,0) to[R, R=$3\quad \mbox{ohm}$](4,3); \draw(8,0) to[R, R=$1\quad \mbox{ohm}$](8,3); \end{circuitikz}

    Now generalize these ideas to a context outside of electrical circuits. Consider the network of streets given in the diagram (with one-way directions as indicated).

    =stealth] \draw[->, very thick] (0,0) -- (10, 0) node[midway, below]{East Bound Winooski Ave}; \draw[<-, very thick] (0, 1) -- (10, 1) node[midway, above]{West Bound Winooski Ave}; \draw[<-, very thick] (0, 4) -- (10, 4) node[midway, above]{Shelburne St}; \draw[<-, very thick] (1, -1) -- (1, 5) node[midway, above, sloped]{Willow}; \draw[->, very thick] (9, -1) -- (9, 5) node[midway, above, sloped]{Jay}; \end{tikzpicture} ]]>

    A traffic engineer counts the hourly flow of cars into and out of this network at the entrances. They get (EB = East Bound; WB = West Bound):

    Estimated hourly traffic flow for the road network EB Winooski WB Winooski Shelburne St Willow Jay into 50 400 0 10 50 out of 55 390 20 15 30

    Use a variable for each segment inside of the network and set up a system of linear equations restricting the flow. Solve the system. Note that you should not get a unique solution as traffic should be able to flow through the network in various ways.

    ================================================ FILE: examples/workbook/ws-testing.xml ================================================

    This is a mock one-page worksheet for testing purposes. We have specified an overall margin just slightly less than the default.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    A two-line paragraph interspersed to check on spacing, breaks and all that.

    A full-width exercise

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    Another two-line paragraph interspersed to check on spacing, breaks and all that.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    A Mock Activity

    The problem, as we see it.

    A worksheet could have hints, no? But no spacing. Note row below has widths set to balance the heights.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    Integer sagittis dictum turpis vel aliquet. Fusce ut suscipit dolor, nec tristique nisl. Aenean luctus, leo et ornare fermentum, nibh dui vulputate leo, nec tincidunt augue ipsum sed odio. Nunc non erat sollicitudin, iaculis eros consequat, dapibus eros.

    Praesent rutrum scelerisque felis sit amet adipiscing. Phasellus in mollis velit. Nunc malesuada felis sit amet massa cursus, eget elementum neque viverra.

    ================================================ FILE: journals/README.md ================================================ # Journals supported by PreTeXt This folder contains a single `journals.xml` file which holds all relevant data about the journals currently supported by PreTeXt. This file is the one source of truth for data about these journals. It is used in the following ways: - By running the `build.sh` file, the `journals.xml` file will be transformed into a pretext table (via the `journals-to-table.xsl` file) that is placed in the correct location for when the pretext guide is built. - The pretext script parses `journals.xml` to find the correct latex-style to apply based on the journal code provided in the authors publication file. ================================================ FILE: journals/build.sh ================================================ #!/bin/bash # When journals.xml is updated, run this script from the journals directory to create a pretext table in the guide's appendices folder which "journals.xml" will import. # Build the journals-table for the documentation xsltproc journals-to-table.xsl journals.xml > ../doc/guide/appendices/journals-table.xml ================================================ FILE: journals/journals-to-table.xsl ================================================ Journals supported by PreTeXt Full Journal NameCode
    ================================================ FILE: journals/journals.xml ================================================ ams AMS journals American Mathematical Society elsevier Elsevier journals Elsevier springer-nature Springer Nature journals Springer Nature taylor-francis Taylor Francis journals Taylor & Francis ann-pure-appl-logic Annals of Pure and Applied Logic Elsevier bull-amer-math-soc Bulletin (New Series) of the American Mathematical Society American Mathematical Society conform-geom-dyn Conformal Geometry and Dynamics American Mathematical Society electron-j-combin Electronic Journal of Combinatorics Electronic Journal of Combinatorics exp-math Experimental Mathematics Taylor & Francis j-algebraic-geom Journal of Algebraic Geometry American Mathematical Society j-amer-math-soc Journal of the American Mathematical Society American Mathematical Society math-comp Mathematics of Computation American Mathematical Society quart-appl-math Quarterly of Applied Mathematics American Mathematical Society proc-amer-math-soc Proceedings of the American Mathematical Society American Mathematical Society represent-theory Representation Theory American Mathematical Society theory-probab-math-statist Theory of Probability and Mathematical Statistics American Mathematical Society trans-ams Transactions of the American Mathematical Society American Mathematical Society ================================================ FILE: journals/texstyles/ams.xml ================================================ ams AMS journals American Mathematical Society spbasic Oscar Levin 2025-03-12 <opt><ptx-short-title/></opt> <arg><ptx-title/></arg> ================================================ FILE: journals/texstyles/dependents/bull-amer-math-soc.xml ================================================ bull-amer-math-soc Bulletin (New Series) of the American Mathematical Society American Mathematical Society ams Oscar Levin 2025-04-01 ================================================ FILE: journals/texstyles/dependents/conform-geom-dyn.xml ================================================ conform-geom-dyn Conformal Geometry and Dynamics American Mathematical Society ams Oscar Levin 2025-04-01 ================================================ FILE: journals/texstyles/dependents/j-algebraic-geom.xml ================================================ j-algebraic-geom Journal of Algebraic Geometry American Mathematical Society ams Oscar Levin 2025-04-01 ================================================ FILE: journals/texstyles/dependents/j-amer-math-soc.xml ================================================ j-amer-math-soc Journal of the American Mathematical Society American Mathematical Society ams Oscar Levin 2025-04-01 ================================================ FILE: journals/texstyles/dependents/math-comp.xml ================================================ math-comp Mathematics of Computation American Mathematical Society ams Oscar Levin 2025-04-01 ================================================ FILE: journals/texstyles/dependents/proc-amer-math-soc.xml ================================================ proc-amer-math-soc Proceedings of the American Mathematical Society American Mathematical Society ams Oscar Levin 2025-04-01 ================================================ FILE: journals/texstyles/dependents/quart-appl-math.xml ================================================ quart-appl-math Quarterly of Applied Mathematics American Mathematical Society ams Oscar Levin 2025-04-01 ================================================ FILE: journals/texstyles/dependents/represent-theory.xml ================================================ represent-theory Representation Theory American Mathematical Society ams Oscar Levin 2025-04-01 ================================================ FILE: journals/texstyles/dependents/theory-probab-math-statist.xml ================================================ theory-probab-math-statist Theory of Probability and Mathematical Statistics American Mathematical Society ams Oscar Levin 2025-03-12 ================================================ FILE: journals/texstyles/dependents/trans-ams.xml ================================================ trans-ams Transactions of the American Mathematical Society American Mathematical Society ams Oscar Levin 2025-03-12 ================================================ FILE: journals/texstyles/electron-j-combin.xml ================================================ electron-j-combin Electronic Journal of Combinatorics Electronic Journal of Combinatorics Oscar Levin 2025-03-23 \usepackage[amsmath]{e-jc} TBD TBD The author. <arg><ptx-title/></arg> ================================================ FILE: journals/texstyles/elsevier.xml ================================================ elsevier Eslevier journals Elsevier Oscar Levin 2025-03-21 <arg><ptx-title/></arg> ================================================ FILE: journals/texstyles/springer-nature.xml ================================================ springer-nature Springer Nature journals Springer Nature spbasic Oscar Levin 2025-04-01 \usepackage{multirow}% \usepackage{amsfonts}% \usepackage{mathrsfs}% \usepackage[title]{appendix}% \usepackage{textcomp}% \usepackage{manyfoot}% \usepackage{booktabs}% \usepackage{listings}% % Redefine some commands that are usually in the table preamble chunk % Note that this no longer distinguishes between these rule widths. \renewcommand{\crulethin}{\cmidrule} \renewcommand{\crulemedium}{\cmidrule} \renewcommand{\crulethick}{\cmidrule} <opt><ptx-short-title/></opt> <arg><ptx-title/></arg> ================================================ FILE: journals/texstyles/taylor-francis.xml ================================================ taylor-francis Taylor Francis General - All other Taylor-Francis journals Taylor-Francis spbasic Oscar Levin 2025-03-17 <arg> <ptx-title/> <support cmd="support"> <arg><ptx-bibinfo-support/></arg> </support> </arg> ================================================ FILE: js/diagcess/diagcess.js ================================================ /** * Skipped minification because the original files appears to be already minified. * Original file: /npm/diagcess@1.3.3/dist/diagcess.js * * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files */ !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.diagcess=e():t.diagcess=e()}(this,()=>(()=>{"use strict";var t={38:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.CustomEvent=e.EventType=e.KeyCodes=void 0,function(t){t[t.RETURN=13]="RETURN",t[t.ENTER=13]="ENTER",t[t.ESC=27]="ESC",t[t.SPACE=32]="SPACE",t[t.LEFT=37]="LEFT",t[t.UP=38]="UP",t[t.RIGHT=39]="RIGHT",t[t.DOWN=40]="DOWN",t[t.A=65]="A",t[t.B=66]="B",t[t.C=67]="C",t[t.D=68]="D",t[t.E=69]="E",t[t.F=70]="F",t[t.G=71]="G",t[t.H=72]="H",t[t.I=73]="I",t[t.J=74]="J",t[t.K=75]="K",t[t.L=76]="L",t[t.M=77]="M",t[t.N=78]="N",t[t.O=79]="O",t[t.P=80]="P",t[t.Q=81]="Q",t[t.R=82]="R",t[t.S=83]="S",t[t.T=84]="T",t[t.U=85]="U",t[t.V=86]="V",t[t.W=87]="W",t[t.X=88]="X",t[t.Y=89]="Y",t[t.Z=90]="Z",t[t.COMMA=188]="COMMA",t[t.PERIOD=190]="PERIOD"}(e.KeyCodes||(e.KeyCodes={})),function(t){t.CLICK="click",t.DBLCLICK="dblclick",t.MOUSEDOWN="mousedown",t.MOUSEUP="mouseup",t.MOUSEOVER="mouseover",t.MOUSEOUT="mouseout",t.MOUSEMOVE="mousemove",t.SELECTSTART="selectstart",t.KEYPRESS="keypress",t.KEYDOWN="keydown",t.KEYUP="keyup",t.TOUCHSTART="touchstart",t.TOUCHMOVE="touchmove",t.TOUCHEND="touchend",t.TOUCHCANCEL="touchcancel"}(e.EventType||(e.EventType={}));var n=function(){function t(t,e,n){this.src=t,this.type=e,this.callback=n,this.src=t,this.type=e,this.callback=n}return t.prototype.add=function(){this.src.addEventListener(this.type,this.callback)},t.prototype.remove=function(){this.src.removeEventListener(this.type,this.callback)},t}();e.CustomEvent=n},108:function(t,e,n){var o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],o=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.ChemObj=void 0;var r=n(502),i=["circular"],c=function(){function t(t,e){var n,c;this.annotation_=t,this.diagram_=e,this.drawnElements=null,this.attributes=new Map,this.up=null,this.down=[],this.link=!1,this.drawn_=null,this.id_=this.getId_(),this.parent_=this.getParent_(),this.position=this.getPosition_();try{for(var a=o(i),s=a.next();!s.done;s=a.next()){var l=s.value,u=r.getAttribute(t,l);u&&this.attributes.set(l,u)}}catch(t){n={error:t}}finally{try{s&&!s.done&&(c=a.return)&&c.call(a)}finally{if(n)throw n.error}}}return t.prototype.getAnnotation=function(){return this.annotation_},t.prototype.getDiagram=function(){return this.diagram_},t.prototype.getId=function(){return this.id_},t.prototype.setDrawnElement=function(t){this.drawn_=t},t.prototype.getDrawnElement=function(){return this.drawn_},t.prototype.getDrawnElements=function(){return this.drawnElements||(this.drawnElements=[],this.drawn_&&this.drawnElements.push(this.drawn_)),this.drawnElements},t.prototype.complete=function(){if(this.down.length&&this.down.sort(function(t,e){return!t.position&&e.position?1:t.position-e.position}),this.parent_){var t=this.getDiagram().get(this.parent_);this.up=t,t.down.push(this)}},t.prototype.getParent=function(){return this.parent_},t.prototype.getKey=function(){return this.id_+this.parent_},t.prototype.getUp=function(){return this.up?[this.up]:[]},t.prototype.getDown=function(){return this.down},t.prototype.getRight=function(){if(!this.up)return[];var t=this.up.getDown(),e=t.indexOf(this);if(t.length>e+1){var n=t[e+1];return n.position?[n]:[]}return this.up.attributes.get("circular")?[t[0]]:[]},t.prototype.getLeft=function(){if(!this.up)return[];var t=this.up.getDown(),e=t.indexOf(this);if(e>0){var n=t[e-1];return n.position?[n]:[]}return this.up.attributes.get("circular")?[t[t.length-1]]:[]},t.prototype.getId_=function(){var t=this.getAnnotation().firstElementChild;return t?t.textContent:""},t.prototype.getParent_=function(){var t=this.getAnnotation().querySelector("parents > *");return t?r.getTextContent(t):""},t.prototype.getPosition_=function(){return parseInt(r.getTextContent(this.getAnnotation().querySelector("position")),10)},t}();e.ChemObj=c},187:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.Diagram=void 0;var n=function(){function t(t){this.languages=t,this.diagram_={}}return t.prototype.set=function(t,e){this.diagram_[t]=e},t.prototype.get=function(t){return this.diagram_[t]},t.prototype.forEach=function(t){for(var e in this.diagram_)t.call(this,this.diagram_[e])},t.prototype.find=function(t){for(var e in this.diagram_){var n=this.diagram_[e];if(t.call(this,n))return n}return null},t.prototype.translate=function(t){return this.languages?this.languages.translate(t):t},t.prototype.nextLanguage=function(){return this.languages?(this.languages.nextLanguage(),this.languages.active):null},t}();e.Diagram=n},196:(t,e,n)=>{var o;Object.defineProperty(e,"__esModule",{value:!0}),e.rewriteUseElements=e.rewriteTransformations=e.SelectedElements=e.SelectedTypes=void 0;var r,i=n(502),c=["text","polyline","line","rect","polygon","use","circle","path"],a=["stroke","stroke-width","color","fill","background-color","transform"];function s(t){var e=t,n=[];do{var o=e.getAttribute("transform");o&&n.unshift(o),e=e.parentNode}while("svg"!==e.tagName);return t.setAttribute("transform",n.join(" ")),t}function l(t){var e=document.createElementNS("http://www.w3.org/2000/svg","g"),n=t.getAttribute("id");return n&&(e.setAttribute("id",n),t.removeAttribute("id")),t.parentNode.replaceChild(e,t),e.appendChild(t),e}function u(t){var e=t;do{(e=e.parentNode).removeAttribute("transform")}while("svg"!==e.tagName)}!function(t){t.DEFS="defs",t.SUB_DEFS="subDefs",t.SUB_SVG="subSvg"}(r=e.SelectedTypes||(e.SelectedTypes={})),e.SelectedElements=((o={})[r.DEFS]=[],o[r.SUB_DEFS]=[],o[r.SUB_SVG]=[],o),e.rewriteTransformations=function(t){var n=i.toArray(t.querySelectorAll(c.join(",")));e.SelectedElements.SUB_SVG=i.toArray(t.querySelectorAll("svg svg"));var o=i.toArray(t.querySelectorAll(c.map(function(t){return"svg svg "+t}).join(",")));e.SelectedElements.SUB_DEFS=i.toArray(t.querySelectorAll(c.map(function(t){return"svg defs "+t}).join(",")));var r=n.filter(function(t){return!o.includes(t)&&!e.SelectedElements.SUB_DEFS.includes(t)});return function(t,e){e.forEach(s),t.forEach(s),e.forEach(u),t.forEach(u),e.forEach(function(t){var e=l(t),n=t.getAttribute("transform");n&&(e.setAttribute("transform",n),t.removeAttribute("transform"))}),t.filter(function(t){return t.hasAttribute("id")}).forEach(l)}(r,e.SelectedElements.SUB_SVG),r},e.rewriteUseElements=function(t){var n=a.map(function(t){return"".concat(t,":inherit;")}).join(" ");e.SelectedElements.SUB_DEFS.forEach(function(t){var o,r=null===(o=t.parentElement)||void 0===o?void 0:o.parentElement;r&&e.SelectedElements.SUB_SVG.includes(r)||t.setAttribute("style",n)})}},216:function(t,e,n){var o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],o=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.ControllerFactory=void 0;var r=n(225),i=n(226),c=n(778),a=n(853),s=n(881),l=n(234),u=n(875);!function(t){var e,n=((e={})[r.magnifiers.SIMPLE]=function(t){return new a.SimpleMagnifier(t)},e[r.magnifiers.STEP]=function(t){return new a.StepMagnifier(t)},e[r.magnifiers.DUMMY]=function(t){return new a.DummyMagnifier(t)},e[r.colors.MONOCHROME]=function(t){return new i.Monochrome(t)},e[r.colors.CONTRAST]=function(t){return new i.Contrast(t)},e[r.speech.DETAIL]=function(t){return new u.Detail(t)},e[r.speech.EXPERT]=function(t){return new u.Expert(t)},e[r.speech.LANGUAGE]=function(t){return new u.Language(t)},e[r.regions.SPEECH]=function(t){return new s.Speech(t)},e[r.regions.SUBTITLE]=function(t){return new s.Subtitle(t)},e[r.explorers.KEY]=function(t){return new c.KeyExplorer(t)},e[r.explorers.MENU]=function(t){return new c.MenuExplorer(t)},e[r.sound.OSCILLATOR]=function(t){return new l.Oscillator(t)},e[r.sound.VOICING]=function(t){return new l.Voicing(t)},e);t.get=function(t){var e,i,c=[],a=[].concat(r.options.magnifiers,r.options.regions,r.options.colors,r.options.speech,r.options.sound,r.options.explorers);try{for(var s=o(a),l=s.next();!l.done;l=s.next()){var u=l.value,p=n[u];if(p){var h=p(t);c.push(h)}}}catch(t){e={error:t}}finally{try{l&&!l.done&&(i=s.return)&&i.call(s)}finally{if(e)throw e.error}}return c}}(e.ControllerFactory||(e.ControllerFactory={}))},221:function(t,e,n){var o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],o=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractController=void 0;var r=n(38),i=function(){function t(t){this.container=t,this._active=!1,this.internalEvents_=[],this.customEvents()}return Object.defineProperty(t.prototype,"active",{get:function(){return this._active},set:function(t){this._active=t},enumerable:!1,configurable:!0}),t.prototype.activate=function(){this.active=!0,this.addEvents()},t.prototype.deactivate=function(){this.removeEvents(),this.active=!1},t.prototype.registerEvent=function(t,e,n){this.internalEvents_.push(new r.CustomEvent(t,e,n))},t.prototype.addEvents=function(){var t,e;try{for(var n=o(this.internalEvents_),r=n.next();!r.done;r=n.next()){r.value.add()}}catch(e){t={error:e}}finally{try{r&&!r.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},t.prototype.removeEvents=function(){var t,e;try{for(var n=o(this.internalEvents_),r=n.next();!r.done;r=n.next()){r.value.remove()}}catch(e){t={error:e}}finally{try{r&&!r.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},t}();e.AbstractController=i},225:(t,e)=>{var n,o,r,i,c,a;Object.defineProperty(e,"__esModule",{value:!0}),e.config=e.options=e.sound=e.speech=e.colors=e.regions=e.magnifiers=e.explorers=e.version=void 0,e.version="1.3.3",function(t){t.KEY="key",t.MENU="menu"}(n=e.explorers||(e.explorers={})),function(t){t.DUMMY="dummy",t.STEP="step",t.SIMPLE="simple"}(o=e.magnifiers||(e.magnifiers={})),function(t){t.SUBTITLE="subtitle",t.SPEECH="speech"}(r=e.regions||(e.regions={})),function(t){t.MONOCHROME="monochrome",t.CONTRAST="contrast"}(i=e.colors||(e.colors={})),function(t){t.LANGUAGE="language",t.EXPERT="expert",t.DETAIL="detail"}(c=e.speech||(e.speech={})),function(t){t.OSCILLATOR="oscillator",t.VOICING="voicing"}(a=e.sound||(e.sound={})),e.options={explorers:[n.KEY,n.MENU],magnifiers:[o.STEP,o.SIMPLE,o.DUMMY],regions:[r.SUBTITLE,r.SPEECH],colors:[i.MONOCHROME,i.CONTRAST],speech:[c.LANGUAGE,c.EXPERT,c.DETAIL],sound:[a.OSCILLATOR,a.VOICING]},e.config={MSG_VISIBLE:!0,MAG_ACTIVE:o.STEP,SONIFY:!1,VOICING:!0,VOICE_LANG:"en",ACTIVE_LANG:"en",SUB_VISIBLE:!1,SUBTITLE:null,POLYLINE:!1}},226:function(t,e,n){var o,r=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.Contrast=e.Monochrome=e.AbstractColor=void 0;var i=n(854),c=n(38),a=n(225),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.prototype.update=function(){},e}(n(221).AbstractController);e.AbstractColor=s;var l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=a.colors.MONOCHROME,e}return r(e,t),e.prototype.customEvents=function(){var t=this;this.registerEvent(this.container.molecule.node,c.EventType.KEYDOWN,function(e){return e.keyCode===c.KeyCodes.T&&i.toggleMonochrome(t.container.molecule.svg),e.stopPropagation(),!1})},e}(s);e.Monochrome=l;var u=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=a.colors.CONTRAST,e.scheme=0,e}return r(e,t),e.prototype.customEvents=function(){var t=this;this.registerEvent(this.container.molecule.node,c.EventType.KEYDOWN,function(e){return e.keyCode===c.KeyCodes.C&&t.container.replaceStyles(i.pickScheme(t.container.molecule,++t.scheme)),e.stopPropagation(),!1})},e}(s);e.Contrast=u},234:function(t,e,n){var o,r=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.Voicing=e.Oscillator=e.AbstractSoundController=void 0;var i=n(502),c=n(38),a=n(225),s=n(221),l=n(899),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.prototype.activate=function(){t.prototype.activate.call(this),this.active=this.on()},e.prototype.deactivate=function(){this.stop(),t.prototype.deactivate.call(this)},e.prototype.update=function(){this.stop()},e.prototype.getStopKey=function(){return c.KeyCodes.K},e.prototype.customEvents=function(){var t=this;this.registerEvent(this.container.molecule.node,c.EventType.KEYDOWN,function(e){return e.keyCode===t.getActivationKey()&&(t.active=!t.active,t.toggle(t.active),t.active?t.update():t.stop()),e.keyCode===t.getRepeatKey()&&t.update(),e.keyCode===t.getStopKey()&&t.stop(),e.stopPropagation(),!1})},e}(s.AbstractController);e.AbstractSoundController=u;var p=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=a.sound.OSCILLATOR,e.currentOscillators=[],e}return r(e,t),e.prototype.update=function(){t.prototype.update.call(this),this.currentOscillators=l.Sonify.sonify(this.container.activeElement)},e.prototype.on=function(){return a.config.SONIFY},e.prototype.toggle=function(t){a.config.SONIFY=t},e.prototype.stop=function(){this.currentOscillators.forEach(function(t){return t.stop()})},e.prototype.getActivationKey=function(){return c.KeyCodes.O},e.prototype.getRepeatKey=function(){return c.KeyCodes.P},e}(u);e.Oscillator=p;var h=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=a.sound.VOICING,e.languages=null,e}return r(e,t),e.prototype.update=function(){t.prototype.update.call(this);var e=new SpeechSynthesisUtterance(this.container.activeElement.getSpeech());e.lang=this.languages?this.languages.active:a.config.VOICE_LANG,speechSynthesis.speak(e)},e.prototype.activate=function(){i.hasSpeech()&&(this.languages=this.container.molecule.cmlStructure.getRootElement().getDiagram().languages,this.languages&&this.languages.updateActive(),t.prototype.activate.call(this))},e.prototype.getActivationKey=function(){return c.KeyCodes.Y},e.prototype.getRepeatKey=function(){return c.KeyCodes.U},e.prototype.on=function(){return a.config.VOICING},e.prototype.toggle=function(t){a.config.VOICING=t},e.prototype.stop=function(){i.hasSpeech()&&speechSynthesis.cancel()},e}(u);e.Voicing=h},270:function(t,e,n){var o,r=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],o=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AtomSet=void 0;var c=n(502),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.prototype.getDrawnElements=function(){var t,e,n=this;if(this.drawnElements)return this.drawnElements;this.drawnElements=[];var o={},r=function(t){o[t.id]||(o[t.id]=!0,n.drawnElements.push(t))},a=this.getDrawnElement();a&&r(a);try{for(var s=i(this.getDown()),l=s.next();!l.done;l=s.next()){(h=l.value).getDrawnElements().forEach(r),(a=h.getDrawnElement())&&r(a)}}catch(e){t={error:e}}finally{try{l&&!l.done&&(e=s.return)&&e.call(s)}finally{if(t)throw t.error}}for(var u=this.getAnnotation().querySelectorAll("component bond,passive"),p=0;p atom,active"),e=0,n=void 0;n=t[e];e++){var o=this.getDiagram().get((0,i.getTextContent)(n));o&&this.ends.push(o)}},e}(n(736).NeighbourHood);e.Bond=c},285:function(t,e,n){var o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],o=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.Languages=void 0;var r=n(225),i=n(406),c=function(){function t(t){this.cmlDocument=t,this.languages={},this.insertLanguages(),this.active=this.defaultActive()}return t.createLanguages=function(e){return 0===Array.from(e.querySelectorAll("messages")).filter(function(t){return t.childNodes.length}).length?null:new t(e)},t.prototype.insertLanguages=function(){var t,e,n=this.cmlDocument.querySelectorAll("messages");try{for(var r=o(Array.from(n)),c=r.next();!c.done;c=r.next()){var a=c.value,s=a.querySelector("language");s&&(this.languages[s.textContent]=new i.Language(a))}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}},t.prototype.updateActive=function(){this.active=this.languages[r.config.ACTIVE_LANG]?r.config.ACTIVE_LANG:this.defaultActive()},t.prototype.defaultActive=function(){return this.languages[r.config.VOICE_LANG]?r.config.VOICE_LANG:Object.keys(this.languages)[0]},t.prototype.translate=function(t){return this.languages[this.active].translate(t)},t.prototype.nextLanguage=function(){var t=Object.keys(this.languages),e=t.indexOf(this.active)+1;this.active=t.length>e?t[e]:t[0],r.config.ACTIVE_LANG=this.active},t}();e.Languages=c},297:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.Via=void 0;var o=n(502),r=function(){function t(t,e){this.neighbour_=t,this.annotation_=e,this.type_=o.getAttribute(this.annotation_,o.attr.TYPE);var n=o.children(this.annotation_);this.connectedBy_=this.getConnectedBy_(n[0]),"Connecting bond"===this.type_&&"external"===this.neighbour_.location&&(this.neighbour_.from().link=!0),void 0!==this.connectedBy_&&(this.connectedBy_.link=!0),this.position_=parseInt(o.getTextContent(n[1]),10)}return t.prototype.getDrawnElements=function(){return this.connectedBy_.getDrawnElements()||[]},t.prototype.getType=function(){return this.type_||""},t.prototype.getPosition=function(){return this.position_},t.prototype.getConnectedBy_=function(t){var e=this.neighbour_.from().getDiagram(),n=o.getTextContent(t),r=e.get(n);return r||e.get(n+this.neighbour_.from().getId())},t}();e.Via=r},343:function(t,e){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],o=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.Bbox=void 0;var o=function(){function t(t,e,n,o){this.x=t,this.y=e,this.width=n,this.height=o}return t.fromSvgRect=function(e){return new t(e.x,e.y,e.width,e.height)},t.fromSvgViewBox=function(e){return new t(e.baseVal.x,e.baseVal.y,e.baseVal.width,e.baseVal.height)},t.getClipBox=function(t,e){var n=t.getBBox();if(0!==n.x||0!==n.y||0!==n.width||0!==n.height)return n;var o=t.cloneNode(!0);return e.appendChild(o),n=o.getBBox(),e.removeChild(o),n},t.combineClips=function(e,n){var o=e.map(function(e){return t.fromSvgRect(t.getClipBox(e,n))});if(1===o.length)return o[0];var r=o[0];return o.slice(1).reduce(function(t,e){return t.combine(e)},r)},t.getBboxStandard=function(t){var e,n,o,r,i,c=t.getBBox();if(0===c.x&&0===c.y&&0===c.width&&0===c.height&&t.childNodes&&(null===(e=t.childNodes[0])||void 0===e?void 0:e.transform)){var a=t.childNodes[0],s=void 0,l=void 0,u=void 0,p=void 0;if(a.x&&a.y&&a.width&&a.height)s=a.x.baseVal.value,l=a.y.baseVal.value,u=a.width.baseVal.value,p=a.height.baseVal.value;else{var h=a.getBBox();s=(null===(n=h.baseVal)||void 0===n?void 0:n.x)||h.x,l=(null===(o=h.baseVal)||void 0===o?void 0:o.y)||h.y,u=(null===(r=h.baseVal)||void 0===r?void 0:r.width)||h.width,p=(null===(i=h.baseVal)||void 0===i?void 0:i.height)||h.height}var f=t.ownerSVGElement.createSVGPoint(),v=a.transform.baseVal;f.x=s,f.y=l;for(var d=v.length-1;d>=0;d--)f=f.matrixTransform(v.getItem(d).matrix);c.x=f.x,c.y=f.y,c.width=u,c.height=p}return c},t.combineBboxes=function(e){var n=new Set,o=function(e){var o=t.getBboxStandard(e);return e.querySelectorAll("*[clip-path]").forEach(function(t){return n.add(t)}),o},r=t.fromSvgRect(o(e[0]));if(1===e.length)return r=t.performClipping(r,n);var i=e.slice(1).reduce(function(t,e){return t.combine(o(e))},r);return i=t.performClipping(i,n)},t.performClipping=function(e,o){var r,i;if(!o.size)return e;var c=o.values().next().value.ownerSVGElement,a=function(t){var e=new Map;return t.querySelectorAll("defs").forEach(function(t){t.childNodes.forEach(function(t){t instanceof SVGElement&&e.set(t.id,t)})}),e}(c),s=new Set;try{for(var l=n(o),u=l.next();!u.done;u=l.next()){var p=u.value.getAttribute("clip-path").match(/^url\(#(.*)\)/),h=p&&a.get(p[1]);h&&s.add(h)}}catch(t){r={error:t}}finally{try{u&&!u.done&&(i=l.return)&&i.call(l)}finally{if(r)throw r.error}}return s.forEach(function(n){var o=Array.from(n.childNodes).filter(function(t){return t.getBBox}),r=t.combineClips(o,c);e=e.intersect(r)}),e},t.prototype.add=function(e){return new t(this.x+e.x,this.y+e.y,this.width+e.width,this.height+e.height)},t.prototype.difference=function(t,e,n){var o=this.add(t.scale(-1));return e&&(o.x=o.x-e/2,o.width=o.width+e),n&&(o.y=o.y-n/2,o.height=o.height+n),o},t.prototype.scale=function(e){return new t(this.x*e,this.y*e,this.width*e,this.height*e)},t.prototype.combine=function(e){var n=Math.min(this.x,e.x),o=Math.min(this.y,e.y);return new t(n,o,Math.max(this.x+this.width,e.x+e.width)-n,Math.max(this.y+this.height,e.y+e.height)-o)},t.prototype.intersect=function(e){var n=Math.max(this.x,e.x),o=Math.max(this.y,e.y);return new t(n,o,Math.min(this.x+this.width,e.x+e.width)-n,Math.min(this.y+this.height,e.y+e.height)-o)},t.prototype.viewBoxValue=function(){return this.x+" "+this.y+" "+this.width+" "+this.height},t}();e.Bbox=o},406:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.Language=void 0;var o=n(502),r=function(){function t(t){this.cmlDocument=t,this.messages={},this.language=this.getLanguage(),this.insertMessages()}return t.prototype.getLanguage=function(){var t=this.cmlDocument.querySelector("language");return t?t.textContent:""},t.prototype.insertMessages=function(){for(var t=this.cmlDocument.querySelectorAll("message"),e=0,n=void 0;n=t[e];e++)this.messages[(0,o.getAttribute)(n,"msg")]=n.textContent},t.prototype.translate=function(t){return this.messages[t]},t}();e.Language=r},428:function(t,e,n){var o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],o=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},r=this&&this.__read||function(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var o,r,i=n.call(t),c=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)c.push(o.value)}catch(t){r={error:t}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return c};Object.defineProperty(e,"__esModule",{value:!0}),e.ViewBox=e.ZoomOptions=void 0;var i=n(502),c=n(343),a=function(){};e.ZoomOptions=a;var s=function(){function t(t){this.svg=t,this.focusgroups=new Map,this.defaultZoomOptions={xPad:this.svg.width.baseVal.value/15,yPad:this.svg.height.baseVal.value/15,duration:100,delay:10,wait:0,callback:function(){}},this.reset()}return t.prototype.reset=function(){var t=c.Bbox.fromSvgRect(this.svg.getBBox()),e=new Set(Array.from(this.svg.querySelectorAll("svg *[clip-path]")));c.Bbox.performClipping(t,e)},t.prototype.setClass=function(t,e){for(var n=0;n=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CML=void 0;var r=n(187),i=n(285),c=n(528),a=n(270),s=n(280),l=function(){function t(t){this.cmlDocument=t,this.root=null,this.map=new r.Diagram(i.Languages.createLanguages(t)),this.initMap_()}return t.prototype.getMap=function(){return this.map},t.prototype.getRootElement=function(){return this.root||(this.root=this.map.find(function(t){return!(t instanceof s.Bond||t.up)})),this.root},t.prototype.initMap_=function(){var t,e,n=Array.from(this.cmlDocument.querySelectorAll("annotations > annotation"));try{for(var r=o(n),i=r.next();!i.done;i=r.next()){var l=i.value,u=l.firstElementChild;if(u){var p=void 0;switch(u.localName.toLowerCase()){case"atom":case"active":p=new c.Atom(l,this.map),this.map.set(p.getKey(),p);break;case"bond":case"passive":p=new s.Bond(l,this.map),this.map.set(p.getId(),p);break;case"atomset":case"grouped":p=new a.AtomSet(l,this.map),this.map.set(p.getId(),p)}}}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}this.map.forEach(function(t){return t.complete()})},t}();e.CML=l},502:(t,e)=>{function n(t){return e.prefix_+"-"+t}Object.defineProperty(e,"__esModule",{value:!0}),e.noMove=e.attr=e.hasSpeech=e.getDocument=e.children=e.classList=e.getAttribute=e.getTextContent=e.toggleExpertMode=e.EXPERT_MODE=e.toArray=e.getId=e.idCounter_=e.addPrefix=e.prefix_=void 0,e.prefix_="cacc",e.addPrefix=n,e.idCounter_=0,e.getId=function(){return n("Id-"+e.idCounter_++)},e.toArray=function(t){for(var e=[],n=0;n=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},r=this&&this.__read||function(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var o,r,i=n.call(t),c=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)c.push(o.value)}catch(t){r={error:t}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return c};Object.defineProperty(e,"__esModule",{value:!0}),e.Base=void 0;var i=n(765),c=n(502),a=n(854),s=n(225),l=n(626);!function(t){t.molMap={},t.init=function(e){var n,u,p,h;void 0===e&&(e=!1);var f=l.forDocument();if(Object.keys(f).length>0&&(a.documentCmlStyle(),s.config.SUBTITLE=function(){var t=c.getDocument(),e=t.createElement("p");e.classList.add("explorer"),e.classList.add("cacc-message");var n=a.getScheme_(1);e.style.cssText+="position:fixed;left:0;bottom:0;"+"background-color: ".concat(n.bkd,"; color: ").concat(n.frgd),a.regionStyle_(t.body),s.config.SUB_VISIBLE||e.classList.add("cacc-text-invisible");return e}()),e){try{for(var v=o(Object.values(t.molMap)),d=v.next();!d.done;d=v.next()){d.value.removeEvents()}}catch(t){n={error:t}}finally{try{d&&!d.done&&(u=v.return)&&u.call(v)}finally{if(n)throw n.error}}t.molMap={}}try{for(var g=o(Object.entries(f)),y=g.next();!y.done;y=g.next()){var m=r(y.value,2),E=m[0],b=m[1];t.molMap[E]||(t.molMap[E]=new i.Container(E,b))}}catch(t){p={error:t}}finally{try{y&&!y.done&&(h=g.return)&&h.call(g)}finally{if(p)throw p.error}}}}(e.Base||(e.Base={}))},528:function(t,e,n){var o,r=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],o=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.Atom=void 0;var c=n(502),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.speech="",e.links=!1,e}return r(e,t),e.prototype.getSpeech=function(){if(this.link&&this.links)return this.speakLinks();var t=[];this.neighbourhood.forEach(function(e){"external"!==e.location&&t.push(e.getSpeech())});var e=this.getMessage();return this.speech=this.getDiagram().translate(e)+" "+t.join(" "),this.speech},e.prototype.getDrawnElements=function(){if(this.drawnElements)return this.drawnElements;this.drawnElements=[];var t=this.getDrawnElement();t&&this.drawnElements.push(t);for(var e=this.getAnnotation().querySelectorAll("component *"),n=0;n=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.fromUri_=e.getUrlParameters_=e.getParam_=e.getData_=e.getMol_=e.forDocument=void 0;var r=n(196),i=0;function c(t){if(t.querySelector("div.svg")){t.setAttribute("has-svg","true");var e=t.querySelector("div.svg > svg");r.rewriteTransformations(e),r.rewriteUseElements(e)}else a(t,"svg","data-src",".svg");t.querySelector("div.cml")?t.setAttribute("has-cml","true"):a(t,"cml","data-cml",".xml")}function a(t,e,n,o){var i=t.getAttribute(n)||s(t,n,o);i?u(i,function(n){if(n){t.setAttribute("has-"+e,"true");var o=document.createElement("div");o.classList.add(e),"svg"===e&&(r.rewriteTransformations(n),r.rewriteUseElements(n)),o.appendChild(n.documentElement),t.appendChild(o)}else t.setAttribute("has-"+e,"false")}):t.setAttribute("has-"+e,"false")}function s(t,e,n){if(!t.id)return null;var o=l()[t.id];return o?(o+=n,t.setAttribute(e,o),o):null}function l(){for(var t,e={},n=window.location.href.slice(window.location.href.indexOf("?")+1).split("&"),o=0;o0&&r[r.length-1])||6!==a[0]&&2!==a[0])){c=0;continue}if(3===a[0]&&(!r||a[1]>r[0]&&a[1]=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var o,r,i=n.call(t),c=[];try{for(;(void 0===e||e-- >0)&&!(o=i.next()).done;)c.push(o.value)}catch(t){r={error:t}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return c};Object.defineProperty(e,"__esModule",{value:!0}),e.Container=void 0;var l=n(854),u=n(38),p=n(225),h=n(221),f=n(216),v=n(981),d=n(428),g=function(t){function e(e,n){var o=t.call(this,null)||this;return o.key=e,o.mol=n,o.name="Container",o.controllers=[],o.initElement().then(function(){o.viewBox=new d.ViewBox(o.molecule.svg),o.controllers=o.controllers.concat(f.ControllerFactory.get(o)),o.styles=l.moleculeStyle(o.molecule),o.activeElement=o.molecule.cmlStructure.getRootElement(),o.customEvents(),o.getDefaultExplorer()}).catch(function(){console.error("Failed to initialize element ".concat(e))}),o}return r(e,t),e.loadElement=function(t){return i(this,void 0,void 0,function(){var e;return c(this,function(n){return e=0,[2,new Promise(function(n,o){var r=function(){t.hasAttribute("has-svg")&&t.hasAttribute("has-cml")?n():e>5?o(t):(e++,setTimeout(r,100))};r()}).catch(function(t){"true"!==t.getAttribute("has-svg")&&console.error("Failed to load SVG diagram."),"true"!==t.getAttribute("has-cml")&&console.error("Failed to load XML annotation.")})]})})},e.prototype.initElement=function(){return i(this,void 0,void 0,function(){var t=this;return c(this,function(n){return[2,e.loadElement(this.mol).then(function(){if("true"!==t.mol.getAttribute("has-svg")||"true"!==t.mol.getAttribute("has-cml"))return Promise.reject("Loading of components failed.");var e=t.mol.querySelector("div.svg").children[0],n=t.mol.querySelector("div.cml").children[0];return e&&n?(t.mol.setAttribute("tabindex","0"),t.mol.setAttribute("role","application"),e.setAttribute("aria-hidden","true"),n.setAttribute("aria-hidden","true"),t.mol.hasAttribute("aria-label")||t.mol.setAttribute("aria-label","Navigatable ".concat(n.tagName)),t.molecule=new v.Molecule(t.mol,e,n),Promise.resolve()):Promise.reject("Empty Diagram elements.")}).catch(function(t){console.error("Molecule Structure initialisation failed with:",t)})]})})},e.prototype.update=function(t){t&&(this.activeElement=t),this.controllers.forEach(function(t){t.active&&t.update()})},e.prototype.activate=function(){this.molecule.svg.parentElement&&(t.prototype.activate.call(this),this.addStyles(),this.controllers.forEach(function(t){return t.activate()}))},e.prototype.deactivate=function(){this.update(this.molecule.cmlStructure.getRootElement()),this.controllers.forEach(function(t){return t.deactivate()}),this.removeStyles(),t.prototype.deactivate.call(this)},e.prototype.replaceStyles=function(t){var e,n;this.removeStyles();try{for(var o=a(t),r=o.next();!r.done;r=o.next()){var i=r.value;this.styles.set(i.className,i)}}catch(t){e={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(e)throw e.error}}this.addStyles()},e.prototype.customEvents=function(){var t,e=this;(null===(t=this.molecule)||void 0===t?void 0:t.node)&&(this.registerEvent(this.molecule.node,u.EventType.KEYDOWN,function(t){return t.keyCode===u.KeyCodes.SPACE&&(e.update(),t.preventDefault(),t.stopPropagation()),!1}),new u.CustomEvent(this.molecule.node,u.EventType.KEYDOWN,function(t){return e.defaultExplorer&&!e.active&&t.keyCode===u.KeyCodes.ENTER&&(e.defaultExplorer.active=!0,e.activate(),t.preventDefault(),t.stopPropagation()),!1}).add(),new u.CustomEvent(this.molecule.node,u.EventType.CLICK,function(t){return e.defaultExplorer&&!e.active&&(e.defaultExplorer.active=!0,e.activate(),t.stopPropagation()),!1}).add())},e.prototype.getDefaultExplorer=function(){this.defaultExplorer=this.controllers.find(function(t){return t.name===p.explorers.KEY}),this.defaultExplorer||(this.defaultExplorer=this.controllers.find(function(t){return t.name===p.explorers.MENU}))},e.prototype.addStyles=function(){var t,e;try{for(var n=a(this.styles),o=n.next();!o.done;o=n.next()){var r=s(o.value,2)[1];this.molecule.node.appendChild(r)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.removeStyles=function(){var t,e;try{for(var n=a(this.styles),o=n.next();!o.done;o=n.next()){var r=s(o.value,2)[1];try{this.molecule.node.removeChild(r)}catch(t){}}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e}(h.AbstractController);e.Container=g},778:function(t,e,n){var o,r=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.MenuExplorer=e.KeyExplorer=e.AbstractExplorer=void 0;var i=n(502),c=n(38),a=n(225),s=function(t){function e(e){var n=t.call(this,e)||this;return n.container=e,n.setupControls(),n}return r(e,t),e.prototype.activate=function(){this.active&&(this.container.update(),this.addControls(),t.prototype.activate.call(this))},e.prototype.deactivate=function(){this.active&&(t.prototype.deactivate.call(this),this.removeControls())},e.prototype.addEvents=function(){this.active&&t.prototype.addEvents.call(this)},e.prototype.setupControls=function(){},e.prototype.addControls=function(){},e.prototype.removeControls=function(){},e.prototype.update=function(){},e.prototype.customEvents=function(){var t=this,e=this.container.molecule.node;new c.CustomEvent(e,c.EventType.KEYDOWN,function(e){return t.active&&e.keyCode===c.KeyCodes.ESC&&t.container.deactivate(),t.container.active||e.keyCode===t.getActivationKey()&&(t.active=!0,t.container.activate(),e.preventDefault()),e.stopPropagation(),!1}).add()},e}(n(221).AbstractController);e.AbstractExplorer=s;var l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=a.explorers.KEY,e}return r(e,t),e.prototype.setupControls=function(){var t=this,e=function(e,n){var o=n();o.length>0?t.container.update(o[0]):(0,i.noMove)(),e.preventDefault()};this.registerEvent(this.container.molecule.node,c.EventType.KEYDOWN,function(n){switch(n.keyCode){case c.KeyCodes.DOWN:case c.KeyCodes.D:e(n,function(){return t.container.activeElement.getDown()});break;case c.KeyCodes.UP:case c.KeyCodes.E:e(n,function(){return t.container.activeElement.getUp()});break;case c.KeyCodes.RIGHT:case c.KeyCodes.F:e(n,function(){return t.container.activeElement.getRight()});break;case c.KeyCodes.LEFT:case c.KeyCodes.S:e(n,function(){return t.container.activeElement.getLeft()})}return n.stopPropagation(),!1})},e.prototype.getActivationKey=function(){return c.KeyCodes.A},e}(s);e.KeyExplorer=l;var u=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=a.explorers.MENU,e}return r(e,t),e.prototype.setupControls=function(){var t=this,e=this.container.molecule.createElement("ul");e.classList.add("cacc-controls"),e.setAttribute("role","navigation"),this.control_=e;var n=function(e,n){var o=n();o.length>0?t.container.update(o[0]):(0,i.noMove)()},o=function(e,o){t.registerEvent(e,c.EventType.KEYDOWN,function(t){return t.keyCode!==c.KeyCodes.ENTER&&t.keyCode!==c.KeyCodes.SPACE||(n(0,o),t.preventDefault(),t.stopPropagation()),!1}),t.registerEvent(e,c.EventType.CLICK,function(t){return n(0,o),t.stopPropagation(),!1})};o(this.makeButton_("Down",e),function(){return t.container.activeElement.getDown()}),o(this.makeButton_("Up",e),function(){return t.container.activeElement.getUp()}),o(this.makeButton_("Next",e),function(){return t.container.activeElement.getRight()}),o(this.makeButton_("Previous",e),function(){return t.container.activeElement.getLeft()})},e.prototype.addControls=function(){var t=this.container.molecule.node,e=t.querySelector(".cacc-message");e?t.insertBefore(this.control_,e):t.appendChild(this.control_)},e.prototype.removeControls=function(){this.control_.parentNode.removeChild(this.control_)},e.prototype.getActivationKey=function(){return c.KeyCodes.B},e.prototype.makeButton_=function(t,e){var n=this.container.molecule.createElement("li");return n.setAttribute("role","button"),n.setAttribute("aria-controls",this.container.molecule.node.getAttribute("id")),n.classList.add("cacc-button"),n.setAttribute("tabindex","0"),n.setAttribute("title",t),n.appendChild(document.createTextNode(t)),e.appendChild(n),n},e}(s);e.MenuExplorer=u},853:function(t,e,n){var o,r=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.StepMagnifier=e.SimpleMagnifier=e.DummyMagnifier=e.AbstractMagnifier=void 0;var i=n(38),c=n(225),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),Object.defineProperty(e.prototype,"active",{get:function(){return this._active&&c.config.MAG_ACTIVE===this.name},set:function(t){this._active=t},enumerable:!1,configurable:!0}),e.prototype.update=function(){this.container.viewBox.select(this.container.activeElement.getDrawnElements())},e.prototype.deactivate=function(){this.active&&(this.container.viewBox.clearActive(),this.container.viewBox.reset(),t.prototype.deactivate.call(this))},e.prototype.customEvents=function(){var t=this;this.registerEvent(this.container.molecule.node,i.EventType.KEYDOWN,function(e){return e.keyCode===t.getActivationKey()&&c.config.MAG_ACTIVE!==t.name&&(c.config.MAG_ACTIVE=t.name,t.update()),e.stopPropagation(),!1})},e}(n(221).AbstractController);e.AbstractMagnifier=a;var s=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=c.magnifiers.DUMMY,e}return r(e,t),e.prototype.getActivationKey=function(){return i.KeyCodes.N},e.prototype.update=function(){this.container.viewBox.reset(),t.prototype.update.call(this)},e}(a);e.DummyMagnifier=s;var l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=c.magnifiers.SIMPLE,e}return r(e,t),e.prototype.update=function(){this.container.viewBox.select(this.container.activeElement.getDrawnElements()),this.container.viewBox.zoom("cacc-active")},e.prototype.getActivationKey=function(){return i.KeyCodes.COMMA},e}(a);e.SimpleMagnifier=l;var u=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=c.magnifiers.STEP,e.lastActive=null,e}return r(e,t),e.prototype.update=function(){var t=this.container.activeElement,e=this.container.viewBox,n=this.lastActive?this.lastActive.getDrawnElements():[];this.container.viewBox.select(t.getDrawnElements(),"cacc-almost"),e.select(t.getDrawnElements().concat(n),"cacc-dummy"),this.lastActive=t,e.zoom("cacc-dummy",{duration:250,delay:25,wait:300,callback:function(){e.select([],"cacc-almost"),e.select(t.getDrawnElements(),"cacc-active"),e.zoom("cacc-active",{duration:250,delay:25,wait:300})}})},e.prototype.getActivationKey=function(){return i.KeyCodes.M},e}(a);e.StepMagnifier=u},854:function(t,e,n){var o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],o=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.addStyle=e.replaceStyle_=e.removeStyle_=e.svgForegroundStyle_=e.svgBackgroundStyle_=e.svgHighlightStyle_=e.regionStyle_=e.svgBaseStyle_=e.nodeBackgroundStyle_=e.pickScheme=e.moleculeStyle=e.getScheme_=e.colorSchemes_=e.toggleMonochrome=e.toggleTextVisibility=e.documentCmlStyle=void 0;var r=n(502),i=n(225);function c(t){return e.colorSchemes_[t%e.colorSchemes_.length]}function a(t,e){var n=c(e);return[p(t,n.bkd),s(t,n.bkd),h(t,n.frgd),u(t,n.active,n.almost)]}function s(t,e){var n="";return f(n+="div.".concat(t.node.id," { background-color: ").concat(e,"; }"),"cacc-general-background")}function l(t){var e="svg."+t.id,n="";return n+="".concat(e," { overflow: hidden; }"),n+="".concat(e," text tspan[baseline-shift] { font-weight: 200; font-size: 13px; }"),n+="".concat(e," line, svg rect { stroke-width: 1.0; stroke-linecap: round; }"),n+="".concat(e," line.").concat("cacc-active",", svg g.").concat("cacc-active"," line { stroke-width: 3.0; }"),n+="".concat(e," line.").concat("cacc-almost",", svg g.").concat("cacc-almost"," line { stroke-width: 2.0; }"),n+="".concat(e," g.").concat("cacc-active"," text { font-weight: bold; }"),n+="".concat(e," g#gridSVG g.").concat("cacc-active"," text { font-weight: bold; }"),n+="ul.".concat("cacc-controls"," { list-style-type: none; }"),n+="".concat(e," polyline.").concat("cacc-active",", svg g.").concat("cacc-active"," polyline { stroke-width: 3.0; }"),n+="".concat(e," polyline.").concat("cacc-almost",", svg g.").concat("cacc-almost"," polyline { stroke-width: 2.0; }"),n+="".concat(e," polygon.").concat("cacc-active",", svg g.").concat("cacc-active"," polygon { stroke-width: 3.0; }"),n+="".concat(e," polygon.").concat("cacc-almost",", svg g.").concat("cacc-almost"," polygon { stroke-width: 2.0; }"),n+="".concat(e," path.").concat("cacc-active",", svg g.").concat("cacc-active"," path { stroke-width: 3.0; }"),n+="".concat(e," path.").concat("cacc-almost",", svg g.").concat("cacc-almost"," path { stroke-width: 2.0; }"),n+="".concat(e," rect.").concat("cacc-active",", svg g.").concat("cacc-active"," rect { stroke-width: 3.0; }"),n+="".concat(e," rect.").concat("cacc-almost",", svg g.").concat("cacc-almost"," rect { stroke-width: 2.0; }"),n+="".concat(e," circle.").concat("cacc-active",", svg g.").concat("cacc-active"," circle { stroke-width: 3.0; }"),n+="".concat(e," circle.").concat("cacc-almost",", svg g.").concat("cacc-almost"," circle { stroke-width: 2.0; }"),n+="".concat(e," ellipse.").concat("cacc-active",", svg g.").concat("cacc-active"," ellipse { stroke-width: 3.0; }"),n+="".concat(e," ellipse.").concat("cacc-almost",", svg g.").concat("cacc-almost"," ellipse { stroke-width: 2.0; }"),n+="".concat(e," use.").concat("cacc-active",", svg g.").concat("cacc-active"," use { stroke-width: 3.0; }"),f(n+="".concat(e," use.").concat("cacc-almost",", svg g.").concat("cacc-almost"," use { stroke-width: 2.0; }"),"cacc-base")}function u(t,e,n){var o="svg."+t.id,r="";return r+="".concat(o," line.").concat("cacc-active",", g.").concat("cacc-active"," line { stroke: ").concat(e,"; }"),r+="".concat(o," line.").concat("cacc-almost",", g.").concat("cacc-almost"," line { stroke: ").concat(n,"; }"),r+="".concat(o," g.").concat("cacc-active"," text { fill: ").concat(e,"; }"),r+="".concat(o," g.").concat("cacc-almost"," text { fill: ").concat(n,"; }"),r+="".concat(o," g#gridSVG g.").concat("cacc-active"," text { fill: ").concat(e,"; }"),r+="".concat(o," g#gridSVG g.").concat("cacc-almost"," text { fill: ").concat(n,"; }"),r+="".concat(o," polyline.").concat("cacc-active",", g.").concat("cacc-active"," polyline { stroke: ").concat(e,"; }"),r+="".concat(o," polyline.").concat("cacc-almost",", g.").concat("cacc-almost"," polyline { stroke: ").concat(n,"; }"),r+="".concat(o," polygon.").concat("cacc-active",", g.").concat("cacc-active"," polygon { stroke: ").concat(e,"; }"),r+="".concat(o," polygon.").concat("cacc-almost",", g.").concat("cacc-almost"," polygon { stroke: ").concat(n,"; }"),r+="".concat(o," path.").concat("cacc-active",", g.").concat("cacc-active"," path { stroke: ").concat(e,"; }"),r+="".concat(o," path.").concat("cacc-almost",", g.").concat("cacc-almost"," path { stroke: ").concat(n,"; }"),r+="".concat(o," rect.").concat("cacc-active",", g.").concat("cacc-active"," rect { stroke: ").concat(e,"; }"),r+="".concat(o," rect.").concat("cacc-almost",", g.").concat("cacc-almost"," rect { stroke: ").concat(n,"; }"),r+="".concat(o," circle.").concat("cacc-active",", g.").concat("cacc-active"," circle { stroke: ").concat(e,"; }"),r+="".concat(o," circle.").concat("cacc-almost",", g.").concat("cacc-almost"," circle { stroke: ").concat(n,"; }"),r+="".concat(o," ellipse.").concat("cacc-active",", g.").concat("cacc-active"," ellipse { stroke: ").concat(e,"; }"),r+="".concat(o," ellipse.").concat("cacc-almost",", g.").concat("cacc-almost"," ellipse { stroke: ").concat(n,"; }"),r+="".concat(o," use.").concat("cacc-active",", g.").concat("cacc-active"," use { stroke: ").concat(e,"; }"),f(r+="".concat(o," use.").concat("cacc-almost",", g.").concat("cacc-almost"," use { stroke: ").concat(n,"; }"),"cacc-color-highlight")}function p(t,e){var n="svg."+t.id,o="";return o+="".concat(n," { background-color: ").concat(e,"; }"),o+="".concat(n," g.atom rect { stroke: ").concat(e,"; fill: ").concat(e,"; }"),o+="div.container { background-color: ".concat(e,"; }"),o+="p.".concat(t.id,".").concat("cacc-message"," { background-color: ").concat(e,"; }"),f(o+="p.".concat(t.id,".").concat("cacc-message",".").concat("cacc-text-invisible"," { color: ").concat(e,"; }"),"cacc-color-background")}function h(t,e){var n="svg."+t.id,o="";return o+="".concat(n," line { stroke: ").concat(e,"; fill: ").concat(e,"; }"),o+="".concat(n,".").concat("cacc-text-monochrome"," text"),o+=" { stroke: ".concat(e,"; fill: ").concat(e,"; }"),o+="".concat(n," g#gridSVG text { stroke: ").concat(e,"; fill: ").concat(e,"; }"),o+="div.container { color: ".concat(e,"; }"),o+="p.".concat(t.id,".").concat("cacc-message"," { color: ").concat(e,"; }"),o+="ul.".concat(t.id,".").concat("cacc-controls"," { color: ").concat(e,"; }"),i.config.POLYLINE&&(o+="".concat(n," polyline { stroke: ").concat(e,"; fill: ").concat(e,"; }")),o+="".concat(n," polygon { stroke: ").concat(e,"; fill: ").concat(e,"; }"),o+="".concat(n," path { stroke: ").concat(e,"; }"),o+="".concat(n," rect { stroke: ").concat(e,"; }"),o+="".concat(n," circle { stroke: ").concat(e,"; }"),o+="".concat(n," ellipse { stroke: ").concat(e,"; }"),f(o+="".concat(n," use { stroke: ").concat(e,"; }"),"cacc-color-elements")}function f(t,e){var n=document.createElement("style");return n.setAttribute("class",e),n.innerHTML=t,n}function v(t,e){var n=t.querySelector("style."+e);return!!n&&(t.removeChild(n),!0)}function d(t,e){t.appendChild(e)}e.documentCmlStyle=function(){document.body&&d(document.body,f("div.cml { display:none; }","cacc-cml"))},e.toggleTextVisibility=function(t){r.classList.toggle(t,"cacc-text-invisible")},e.toggleMonochrome=function(t){r.classList.toggle(t,"cacc-text-monochrome")},e.colorSchemes_=[{frgd:"#000",bkd:"#fff",active:"#fd6",almost:"#6df"},{frgd:"#fff",bkd:"#000",active:"#fd6",almost:"#6df"},{frgd:"#3C3",bkd:"#000",active:"#fd6",almost:"#6df"},{frgd:"#ee0",bkd:"#00e",active:"#4f4",almost:"#e3e"}],e.getScheme_=c,e.moleculeStyle=function(t){var e,n,r=new Map,i=l(t);r.set(i.className,i);try{for(var c=o(a(t,0)),s=c.next();!s.done;s=c.next()){var u=s.value;r.set(u.className,u)}}catch(t){e={error:t}}finally{try{s&&!s.done&&(n=c.return)&&n.call(c)}finally{if(e)throw e.error}}return r},e.pickScheme=a,e.nodeBackgroundStyle_=s,e.svgBaseStyle_=l,e.regionStyle_=function(t){d(t,f("p.".concat("cacc-message",".").concat("cacc-text-invisible"," { font-size: 0px; }"),"cacc-region"))},e.svgHighlightStyle_=u,e.svgBackgroundStyle_=p,e.svgForegroundStyle_=h,e.removeStyle_=v,e.replaceStyle_=function(t,e,n){v(t,n),d(t,f(e,n))},e.addStyle=d},875:function(t,e,n){var o,r=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.Language=e.Expert=e.Detail=e.AbstractSpeech=void 0;var i=n(502),c=n(38),a=n(225),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.prototype.update=function(){},e}(n(221).AbstractController);e.AbstractSpeech=s;var l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=a.speech.DETAIL,e}return r(e,t),e.prototype.customEvents=function(){var t=this;this.registerEvent(this.container.molecule.node,c.EventType.KEYDOWN,function(e){return e.keyCode===c.KeyCodes.W&&(t.container.activeElement.link?(t.container.activeElement.links=!0,t.container.update(),t.container.activeElement.links=!1):((0,i.toggleExpertMode)(),t.container.update(),(0,i.toggleExpertMode)())),e.stopPropagation(),!1})},e}(s);e.Detail=l;var u=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=a.speech.EXPERT,e}return r(e,t),e.prototype.customEvents=function(){var t=this;this.registerEvent(this.container.molecule.node,c.EventType.KEYDOWN,function(e){return e.keyCode===c.KeyCodes.X&&((0,i.toggleExpertMode)(),t.container.update()),e.stopPropagation(),!1})},e}(s);e.Expert=u;var p=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=a.speech.LANGUAGE,e}return r(e,t),e.prototype.customEvents=function(){var t=this;this.registerEvent(this.container.molecule.node,c.EventType.KEYDOWN,function(e){e.keyCode===c.KeyCodes.L&&(t.container.molecule.cmlStructure.getMap().nextLanguage()&&t.container.active&&t.container.update());return e.stopPropagation(),!1})},e}(s);e.Language=p},881:function(t,e,n){var o,r=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.Speech=e.Subtitle=e.LiveRegion=void 0;var i=n(502),c=n(854),a=n(38),s=n(225),l=function(t){function e(e){var n=t.call(this,e)||this;return n.container=e,n.setupMessage(),n}return r(e,t),e.prototype.setupMessage=function(){var t=this.container.molecule.createElement("p");t.classList.add("explorer"),t.setAttribute("aria-live","assertive"),i.hasSpeech()&&(speechSynthesis.onvoiceschanged=function(){speechSynthesis.getVoices().length&&t.removeAttribute("aria-live")}),t.setAttribute("tabindex","-1"),t.classList.add("cacc-message"),this.message=t},e.prototype.activate=function(){this.active||(this.addMessage(),t.prototype.activate.call(this))},e.prototype.deactivate=function(){this.active&&(t.prototype.deactivate.call(this),this.removeMessage())},e.prototype.removeMessage=function(){var t;null===(t=this.message.parentNode)||void 0===t||t.removeChild(this.message)},e.prototype.update=function(){this.message.textContent=this.container.activeElement.getSpeech()},e.prototype.customEvents=function(){var t=this;this.registerEvent(this.container.molecule.node,a.EventType.KEYDOWN,function(e){return e.keyCode===a.KeyCodes.Z&&(t.toggleMessageVisibility(),s.config.MSG_VISIBLE=!s.config.MSG_VISIBLE),e.stopPropagation(),!1})},e.prototype.toggleMessageVisibility=function(){c.toggleTextVisibility(this.message)},e}(n(221).AbstractController);e.LiveRegion=l;var u=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=s.regions.SUBTITLE,e}return r(e,t),e.prototype.addMessage=function(){this.container.molecule.node.parentNode.appendChild(this.message),s.config.MSG_VISIBLE||this.message.classList.add("cacc-text-invisible")},e}(l);e.Subtitle=u;var p=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name=s.regions.SPEECH,e}return r(e,t),e.prototype.setupMessage=function(){this.message=s.config.SUBTITLE},e.prototype.addMessage=function(){this.message.parentNode||i.getDocument().body.appendChild(this.message)},e.prototype.customEvents=function(){var t=this;this.registerEvent(this.container.molecule.node,a.EventType.KEYDOWN,function(e){return e.keyCode===a.KeyCodes.V&&(t.toggleMessageVisibility(),s.config.SUB_VISIBLE=!s.config.SUB_VISIBLE),e.stopPropagation(),!1})},e}(l);e.Speech=p},899:function(t,e,n){var o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],o=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&o>=t.length&&(t=void 0),{value:t&&t[o++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.Sonify=void 0;var r=n(502),i=function(){function t(t){this.path=[],this.points=[],this.context=new AudioContext,this.prepare(t),this.sonifiable=this.path.length}return t.sonify=function(e){var n=e.getAnnotation().querySelectorAll("sonification > *"),o=[];n.length&&(o=Array.from(n).map(function(t){var n=(0,r.getTextContent)(t),o=t.tagName.toLowerCase(),i=n+("active"!==o&&"sre:active"!==o?"":n===e.getId()?e.getParent():e.getId());return e.getDiagram().get(i)}));var i=new t(o);return i.sonifiable?i.sonify():[]},t.prototype.prepare=function(t){var e,n;try{for(var r=o(t),i=r.next();!i.done;i=r.next()){var c=i.value;if(c.getDrawnElement()){for(var a=c.getDrawnElement().querySelectorAll("polyline"),s=0;s20?(r=n/10+.01,i=n/10+.1):(r=n/2+.01,i=n/2+.5),o.start(this.context.currentTime+r),o.stop(this.context.currentTime+i)}return e},t.prototype.sonify=function(){var e,n,o=[],r=this.context.createOscillator();o.push(r),r.type="sine",r.connect(this.context.destination);for(var i=0;i20?(e=i/10+.01,n=i/10):(e=i/2+.01,n=i/2+.5),console.log(e),i?r.frequency.setValueAtTime(this.points[i][1]?t.BASE_FREQUENCY-this.points[i][1]:0,this.context.currentTime+n):(r.frequency.setValueAtTime(t.BASE_FREQUENCY-this.points[i][1],this.context.currentTime),r.start(this.context.currentTime));return r.stop(this.context.currentTime+n),o},t.prototype.smooth=function(){if(this.points.length){for(var e=[this.points[0]],n=0;n{Object.defineProperty(e,"__esModule",{value:!0}),e.Neighbour=void 0;var o=n(502),r=n(297),i=function(){function t(t,e){var n=this;this.from_=t,this.annotation_=e,this.speech=null,this.speech2=null;var i=o.children(this.annotation_);this.to_=this.from_.getDiagram().get(o.getTextContent(i[0])),this.location=o.getAttribute(this.annotation_,o.attr.LOCATION),this.via_=i.slice(1).map(function(t){return new r.Via(n,t)})}return t.prototype.from=function(){return this.from_},t.prototype.to=function(){return this.to_},t.prototype.via=function(){return this.via_},t.prototype.getSpeech=function(){return this.from_.getDiagram().translate(this.getMessage())},t.prototype.getMessage=function(){if(o.EXPERT_MODE){if(this.speech2)return this.speech2;if(this.speech2=o.getAttribute(this.annotation_,o.attr.EXPERT_SPEECH),this.speech2)return this.speech2}return this.speech||(this.speech=o.getAttribute(this.annotation_,o.attr.SIMPLE_SPEECH)),this.speech},t}();e.Neighbour=i},981:(t,e,n)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.Molecule=void 0;var o=n(502),r=n(441),i=function(){function t(t,e,n){this.node=t,this.svg=e,this.cml=n,this.id=o.getId(),o.classList.add(this.svg,this.id),o.classList.add(this.cml,this.id),this.cmlStructure=new r.CML(this.cml),this.topLevelDescription=this.cmlStructure.getRootElement().getSpeech(),this.combine_()}return t.prototype.createElement=function(t){var e=document.createElement(t);return e.classList.add(this.id),e},t.prototype.combine_=function(){var t=this;this.cmlStructure.getMap().forEach(function(e){var n=t.svg.getElementById(e.getId());n&&e.setDrawnElement(n)})},t}();e.Molecule=i}},e={};function n(o){var r=e[o];if(void 0!==r)return r.exports;var i=e[o]={exports:{}};return t[o].call(i.exports,i,i.exports,n),i.exports}var o={};return(()=>{var t=o;Object.defineProperty(t,"__esModule",{value:!0}),t.version=t.Config=t.Base=void 0;var e=n(225),r=n(516);t.Base=r.Base,t.Config=e.config,t.version=e.version})(),o})()); ================================================ FILE: js/knowl.js ================================================ // Code controlling behavior of xref knowls and born hidden knowls // Assumes this file is loaded as part of initial page window.addEventListener("load", (event) => { addKnowls(document); }); function addKnowls(target) { const xrefs = target.querySelectorAll("[data-knowl]"); for (const xref of xrefs) { LinkKnowl.initializeXrefKnowl(xref); } const bornHiddens = target.querySelectorAll(".born-hidden-knowl"); for (const bhk of bornHiddens) { const summary = bhk.querySelector(":scope > summary"); const contents = bhk.querySelector(":scope > summary + *"); new SlideRevealer(summary, contents, bhk); } } // Used to animate both types of knowls class SlideRevealer { static STATE = Object.freeze({ INACTIVE: 0, CLOSING: 1, EXPANDING: 2 }); // triggerElement is the element clicked to open/close // contentElement is the element that will hide/reveal // animatedElement is the element that will grow/shrink as contentElement is modified // may be the same as contentElement or a parent of it constructor(triggerElement, contentElement, animatedElement) { this.triggerElement = triggerElement; this.contentElement = contentElement; this.animatedElement = animatedElement; // mid animation state tracking this.animation = null; this.animationState = SlideRevealer.STATE.INACTIVE; this.animatedElementInlineStyle = null; this.triggerElement.addEventListener('click', (e) => this.onClick(e)); } isBusy() { return this.animationState !== SlideRevealer.STATE.INACTIVE || this.animatedElementInlineStyle !== null; } storeAnimatedElementInlineStyle() { if (this.animatedElementInlineStyle !== null) return; this.animatedElementInlineStyle = { overflow: this.animatedElement.style.overflow, height: this.animatedElement.style.height, paddingTop: this.animatedElement.style.paddingTop, paddingBottom: this.animatedElement.style.paddingBottom }; } restoreAnimatedElementInlineStyle() { if (this.animatedElementInlineStyle === null) return; this.animatedElement.style.overflow = this.animatedElementInlineStyle.overflow; this.animatedElement.style.height = this.animatedElementInlineStyle.height; this.animatedElement.style.paddingTop = this.animatedElementInlineStyle.paddingTop; this.animatedElement.style.paddingBottom = this.animatedElementInlineStyle.paddingBottom; this.animatedElementInlineStyle = null; } onClick(e) { // Stop default behavior from the browser if (e) e.preventDefault(); if (this.isBusy()) return; // Add an overflow on the
    to avoid content overflowing this.storeAnimatedElementInlineStyle(); this.animatedElement.style.overflow = 'hidden'; // Check if the element is being closed or is already closed if (this.animationState === SlideRevealer.STATE.CLOSING || !this.animatedElement.hasAttribute("open")) { // Force the [open] attributes - allow for similar targetting of xref and born-hidden knowls this.animatedElement.setAttribute("open",""); this.triggerElement.setAttribute("open",""); this.contentElement.style.display = ''; this.contentElement.style.visibility = 'hidden'; let closedHeight = 0; if (this.animatedElement.contains(this.triggerElement)) closedHeight = this.triggerElement.offsetHeight; const naturalStyle = window.getComputedStyle(this.animatedElement); const naturalPaddingTop = naturalStyle.paddingTop; const naturalPaddingBottom = naturalStyle.paddingBottom; this.animatedElement.style.height = `${closedHeight}px`; this.animatedElement.style.paddingTop = '0px'; this.animatedElement.style.paddingBottom = '0px'; // Trigger the animation to expand or collapse the knowl // We assume content is already rendered and size is accurate. // If not, there may be a jump at the end of the animation when styles are cleared const expandingMeasurements = { fullHeight: this.contentElement === this.animatedElement ? this.contentElement.scrollHeight : closedHeight + this.contentElement.offsetHeight, paddingTop: naturalPaddingTop, paddingBottom: naturalPaddingBottom }; this.contentElement.style.visibility = ''; this.toggle(true, expandingMeasurements); } else if (this.animationState === SlideRevealer.STATE.EXPANDING || this.animatedElement.hasAttribute("open")) { this.toggle(false); } } toggle(expanding, expandingMeasurements = null) { let closedHeight = 0; if (this.animatedElement.contains(this.triggerElement)) closedHeight = this.triggerElement.offsetHeight; const computedStyle = window.getComputedStyle(this.animatedElement); const fullHeight = expandingMeasurements?.fullHeight ?? closedHeight + this.contentElement.offsetHeight; const startHeight = `${expanding ? closedHeight : this.animatedElement.offsetHeight}px`; const endHeight = `${expanding ? fullHeight : closedHeight}px`; const currentPaddingTop = computedStyle.paddingTop; const currentPaddingBottom = computedStyle.paddingBottom; const endPaddingTop = expandingMeasurements?.paddingTop ?? currentPaddingTop; const endPaddingBottom = expandingMeasurements?.paddingBottom ?? currentPaddingBottom; const startPadTop = expanding ? '0px' : currentPaddingTop; const endPadTop = expanding ? endPaddingTop : '0px'; const startPadBottom = expanding ? '0px' : currentPaddingBottom; const endPadBottom = expanding ? endPaddingBottom : '0px'; // Cancel any existing animation if (this.animation) { this.animation.cancel(); } // Animate ~400 pixels per second with max of 0.75 second and min of 0.25 const animDuration = Math.max( Math.min( (Math.abs(closedHeight - fullHeight) / 400 * 1000), 750), 250); // Start animation this.animationState = expanding ? SlideRevealer.STATE.EXPANDING : SlideRevealer.STATE.CLOSING; this.animation = this.animatedElement.animate({ height: [startHeight, endHeight], paddingTop: [startPadTop, endPadTop], paddingBottom: [startPadBottom, endPadBottom] }, { duration: animDuration, easing: 'ease-out' }); this.animation.onfinish = () => { this.onAnimationFinish(expanding); }; this.animation.oncancel = () => { this.animationState = SlideRevealer.STATE.INACTIVE; this.restoreAnimatedElementInlineStyle(); }; } onAnimationFinish(isOpen) { // Clear animation state this.animation = null; this.animationState = SlideRevealer.STATE.INACTIVE; // Make sure animated element has open (needed for details) if(!isOpen) { this.animatedElement.removeAttribute("open"); this.triggerElement.removeAttribute("open"); } // Clear styles used in animation this.restoreAnimatedElementInlineStyle(); if (!isOpen) this.contentElement.style.display = 'none'; this.contentElement.style.visibility = ''; if (isOpen) { let hasCallback = this.contentElement.querySelectorAll("[data-knowl-callback]"); hasCallback.forEach((el) => { window[el.getAttribute("data-knowl-callback")](el, open); }); } } } // A LinkKnowl manages a single link based knowl class LinkKnowl { // Used to uniquely identify XrefKnowls static xrefCount = 0; // Factory to create an XrefKnowl from a knowl link // Will avoid duplicate initialization // This should be used by outside code to create XrefKnowls static initializeXrefKnowl(knowlLinkElement) { if (knowlLinkElement.getAttribute("data-knowl-uid") === null) { return new LinkKnowl(knowlLinkElement); } } // "Private" constructor - should only be called by initializeXrefKnowl constructor(knowlLinkElement) { this.linkElement = knowlLinkElement; this.outputElement = null; this.slideHandler = null; this.uid = LinkKnowl.xrefCount++; knowlLinkElement.setAttribute("data-knowl-uid", this.uid); // Xref's behavior is that of a button knowlLinkElement.setAttribute("role", "button"); // Stash a copy of the original title for use in aria-label // If no title, use textContent knowlLinkElement.setAttribute("data-base-title", knowlLinkElement.getAttribute("title") || this.linkElement.textContent); knowlLinkElement.classList.add("knowl__link"); this.updateLabels(false); // Bind required to force "this" of event handler to be this object knowlLinkElement.addEventListener("click", this.handleLinkClick.bind(this)); } // Set aria-label and title based on visibility of knowl updateLabels(isVisible) { const verb = isVisible ? this.linkElement.getAttribute("data-close-label") || "Close" : this.linkElement.getAttribute("data-reveal-label") || "Reveal"; const targetDescript = this.linkElement.getAttribute("data-base-title"); const helpText = verb + " " + targetDescript; this.linkElement.setAttribute("aria-label", helpText); this.linkElement.setAttribute("title", helpText); } // Toggle the state of the knowl link and output elements // Assumes output is already created toggle() { this.linkElement.classList.toggle("active"); const isActive = this.linkElement.classList.contains("active"); this.updateLabels(isActive); // Scroll to reveal if needed if (isActive) { const h = this.outputElement.getBoundingClientRect().height; if (h > window.innerHeight) { // knowl is taller than window, scroll to top of knowl this.outputElement.scrollIntoView(true); } else { // reveal full knowl if (this.outputElement.getBoundingClientRect().bottom > window.innerHeight) this.outputElement.scrollIntoView(false); } } } // Returns element the knowl output should be inserted after findOutputLocation() { const invalidParents = "table, mjx-container, div.tabular-box, .runestone > .parsons"; // Start with the link's parent, move up as long as there are invalid parents let el = this.linkElement.parentElement; let problemAncestor = el.closest(invalidParents); while (problemAncestor && problemAncestor !== el) { el = problemAncestor; problemAncestor = el.closest(invalidParents); } return el; } // Create the knowl output element createOutputElement() { const outputId = "knowl-uid-" + this.uid; const outputContentsId = "knowl-output-" + this.uid; const linkTarget = this.linkElement.getAttribute("data-knowl"); const placeholderText = ``; const temp = document.createElement("template"); temp.innerHTML = placeholderText; this.outputElement = temp.content.children[0]; const insertLoc = this.findOutputLocation(this.linkElement); insertLoc.after(this.outputElement); } // Get content for knowl as dom element. Returns promise that resolves to knowl content async getContent() { const contentURL = this.linkElement.getAttribute("data-knowl"); const knowlContent = await fetch(contentURL) .then((response) => response.text()) .then((data) => { // knowls are full HTML pages, need to just extract body let knowlDoc = (new DOMParser()).parseFromString(data, "text/html"); let tempContainer = knowlDoc.body; // grab any scripts from head of knowl doc and add them to the output let scripts = knowlDoc.querySelectorAll("head script"); tempContainer.append(...scripts); return tempContainer; }) .catch((error) => { const destination = this.linkElement.getAttribute("href"); const text = this.linkElement.textContent; const err_message = `
    ` + `
    Error fetching content. (${error})
    ` + `` + `
    If you are viewing this book from your local filesystem, this is expected behavior. To view the book with all features, you must serve the book from a web server. See the PreTeXt FAQ for more information.
    ` + `
    `; return err_message; }); return knowlContent; } // Handle a click on the knowl link handleLinkClick(event) { // prevent navigation event.preventDefault(); if (this.slideHandler?.isBusy()) { return; } if (this.outputElement !== null) { // output already created, toggle visibility this.toggle(); } else { this.createOutputElement(); this.slideHandler = new SlideRevealer(this.linkElement, this.outputElement, this.outputElement); //slideHandler is now responsible for handling clicks to this element this.linkElement.addEventListener('click', this.slideHandler); // Wait up to a half second in hopes of avoiding double content change // then render to show loading message let loadingTimeout = setTimeout(() => { loadingTimeout = null; this.slideHandler.onClick(); //fake initial click this.toggle(); }, 500); const content = this.getContent(); // Content is a promise at this point, insert when resolved content .then((tempContainer) => { // if timeout still active, cancel it and render if (loadingTimeout !== null) { clearTimeout(loadingTimeout); } // Now give code that follows .1 seconds to render before making visible setTimeout(() => { this.slideHandler.onClick(); //fake initial click this.toggle(); }, 100); // check embedded runestone interactives by loading content into a temp container // we want to not render any that already are on page. Dupe IDs probably bad const runestoneElements = tempContainer.querySelectorAll(".ptx-runestone-container"); [...runestoneElements].forEach((e) => { const rsId = e.querySelector("[data-component]")?.id; const onPage = document.getElementById(rsId); if (onPage) { e.innerHTML = `
    The interactive that belongs here is already on the page and cannot appear multiple times. Scroll to interactive.`; } else { // let runestone start rendering it window.runestoneComponents.renderOneComponent(e); } }); // now move all contents to the real output element const children = [...tempContainer.children]; this.outputElement.innerHTML = ""; this.outputElement.append(...children); // render any knowls and mathjax in the knowl addKnowls(this.outputElement); MathJax.typesetPromise([this.outputElement]); // try prism highlighting Prism.highlightAllUnder(this.outputElement); // force any scripts (e.g. sagecell) to execute by evaling them [...this.outputElement.getElementsByTagName("script")].forEach((s) => { if ( s.getAttribute("type") === null || s.getAttribute("type") === "text/javascript" ) { eval(s.innerHTML); } }); }) .catch((data) => { console.log("Error fetching knowl content: " + data); }); } } } ================================================ FILE: js/lti_iframe_resizer.js ================================================ // SPLICE resize handling - https://cssplice.org/ // Expected message format: // { // subject: lti.frameResize', // message_id: (a unique string ID), // optional - not used // height: ..., // width: ... // } window.addEventListener('message', function (event) { let edata = event.data; //MoM sends event.data as a string instead of JSON if (typeof event.data == 'string' && event.data.match(/lti\.frameResize/)) { edata = JSON.parse(event.data); } if (edata.subject === "lti.frameResize") { if ("frame_id" in edata) { // MoM may send frame_id let el = document.getElementById(edata['frame_id']); document.getElementById(edata['frame_id']).style.height = edata.height + 'px'; if (edata.wrapheight && document.getElementById(edata['frame_id'] + 'wrap')) { document.getElementById(edata['frame_id'] + 'wrap').style.height = edata.wrapheight + 'px'; } } else if ("iframe_resize_id" in edata) { // MoM may send iframe_resize_id document.getElementById(edata['iframe_resize_id']).style.height = edata.height + 'px'; } else { // No target element specified, so resize the iframe that sent the message // event.source.frameElement is only accessible if the iframe is on the same domain // so loop through iframes to find the one that sent the message const iFrames = document.getElementsByTagName('iframe'); for(const iFrame of iFrames) { if(iFrame.contentWindow === event.source) { if (edata.height) { iFrame.height = edata.height; iFrame.style.height = edata.height + 'px'; } if (edata.width) { iFrame.width = edata.width; iFrame.style.width = edata.width + 'px'; } break; } } } } }); // Currently only used by My Open Math to request a resize after knowls open function sendResizeRequest(el) { el.contentWindow.postMessage("requestResize", "*"); } ================================================ FILE: js/mathjax_startup.js ================================================ /*************************************************************** * Implements startup of MathJax v4 ***************************************************************/ // Base config options. Will be supplemented by optional parts later let mathJaxOpts = { "tex": { "inlineMath": [ [ "\\(", "\\)" ] ], "tags": "none", "tagSide": "right", "tagIndent": ".8em", "packages": { "[+]": [ "amscd", "color", "knowl" ] } }, "options": { "ignoreHtmlClass": "tex2jax_ignore|ignore-math", "processHtmlClass": "process-math", }, "chtml": { "scale": 0.98, "mtextInheritFont": true }, "loader": { "load": [ "input/asciimath", "[tex]/amscd", "[tex]/color", ] } }; export function startMathJax(opts) { if(opts.hasWebworkReps || opts.hasSage) { mathJaxOpts['renderActions'] = { "findScript": [ 10, function (doc) { document.querySelectorAll('script[type^="math/tex"]').forEach(function (node) { var display = !!node.type.match(/; *mode=display/); var math = new doc.options.MathItem(node.textContent, doc.inputJax[0], display); var text = document.createTextNode(''); node.parentNode.replaceChild(text, node); math.start = { node: text, delim: '', n: 0 }; math.end = { node: text, delim: '', n: 0 }; doc.math.push(math); }); }, "" ] } } if(opts.isReact) { mathJaxOpts['startup'] = { typeset: false, } } else { mathJaxOpts['startup'] = { ready() { const { Configuration } = MathJax._.input.tex.Configuration; const configuration = Configuration.create("knowl", { handler: { macro: ["knowl"] } }); const NodeUtil = MathJax._.input.tex.NodeUtil.default; function GetArgumentMML(parser, name) { const arg = parser.ParseArg(name); if (!NodeUtil.isInferred(arg)) { return arg; } const children = NodeUtil.getChildren(arg); if (children.length === 1) { return children[0]; } const mrow = parser.create("node", "mrow"); NodeUtil.copyChildren(arg, mrow); NodeUtil.copyAttributes(arg, mrow); return mrow; }; const CommandMap = MathJax._.input.tex.TokenMap.CommandMap; new CommandMap( "knowl", { knowl(parser, name) { const url = parser.GetArgument(name); const arg = GetArgumentMML(parser, name); const mrow = parser.create("node", "mrow", [arg], { tabindex: '0', "data-knowl": url }); parser.Push(mrow); } } ); MathJax.startup.defaultReady(); }, pageReady() { return MathJax.startup.defaultPageReady().then(rsMathReady); }, } } if(opts.htmlPresentation) { mathJaxOpts['options']['menuOptions'] = { "settings": { "zoom": "Click", "zscale": "300%" } } } // Apply the options window.MathJax = mathJaxOpts; // Lets Runestone know that MathJax is ready const runestoneMathReady = new Promise((resolve) => window.rsMathReady = resolve); window.runestoneMathReady = runestoneMathReady; } ================================================ FILE: js/pretext-stack/stackapicalls.js ================================================ const timeOutHandler = new Object(); const inputPrefix = 'stackapi_input_'; const feedbackPrefix = 'stackapi_fb_'; const validationPrefix = 'stackapi_val_'; // const stack_api_url = // This is pulled from the publication file const stackstring = { "teacheranswershow_mcq":"A correct answer is: {$a->display}", "api_which_typed":"which can be typed as follows", "api_valid_all_parts":"Please enter valid answers for all parts of the question.", "api_out_of":"out of", "api_marks_sub":"Marks for this submission", "api_submit":"Submit Answers", "generalfeedback":"General feedback", "score":"Score", "api_response":"Response summary", "api_correct":"Correct answers" }; function wrap_math(content) { // Wrap instances of \[ ... \] and \( ... \) into the tags configured to be processed by MathJax // Here we make sure that the backslashes are not escaped like \\[ content = content.replace(/(?$1"); return content.replace(/(?$1"); } // Create data for call to API. async function collectData(qfile, qname, qprefix) { let res = ""; await getQuestionFile(qfile, qname).then((response)=>{ if (response.questionxml != "\nnull\n") { res = { questionDefinition: response.questionxml, answers: collectAnswer(qprefix), seed: response.seed, renderInputs: qprefix + inputPrefix, readOnly: false, }; }; }); // } return res; } // Get the different input elements by tag and return object with values. function collectAnswer(qprefix) { const inputs = document.getElementsByTagName('input'); const textareas = document.getElementsByTagName('textarea'); const selects = document.getElementsByTagName('select'); let res = {}; res = processNodes(res, inputs, qprefix); res = processNodes(res, textareas, qprefix); res = processNodes(res, selects, qprefix); return res; } // Return object of values of valid entries in an HTMLCollection. function processNodes(res, nodes, qprefix) { for (let i = 0; i < nodes.length; i++) { const element = nodes[i]; if (element.name.indexOf(qprefix+inputPrefix) === 0 && element.name.indexOf('_val') === -1) { if (element.type === 'checkbox' || element.type === 'radio') { if (element.checked) { res[element.name.slice((qprefix+inputPrefix).length)] = element.value; } } else { res[element.name.slice((qprefix+inputPrefix).length)] = element.value; } } } return res; } // Display rendered question and solution. function send(qfile, qname, qprefix) { const http = new XMLHttpRequest(); const url = stack_api_url + '/render'; http.open("POST", url, true); http.setRequestHeader('Content-Type', 'application/json'); http.onreadystatechange = function() { if(http.readyState == 4) { try { const json = JSON.parse(http.responseText); if (json.message) { console.log(json); document.getElementById(`${qprefix+"errors"}`).innerText = json.message; return; } else { document.getElementById(`${qprefix+"errors"}`).innerText = ''; } renameIframeHolders(); let question = json.questionrender; const inputs = json.questioninputs; const seed = json.questionseed; let correctAnswers = ''; // Show correct answers. for (const [name, input] of Object.entries(inputs)) { question = question.replace(`[[input:${name}]]`, input.render); // question = question.replaceAll(`${inputPrefix}`,`${qprefix+inputPrefix}`); question = question.replace(`[[validation:${name}]]`, ``); // This is a bit of a hack. The question render returns an calling the download function with // two arguments. We add the additional arguments that we need for context (question definition) here. question = question.replace(/javascript:download\(([^,]+?),([^,]+?)\)/, `javascript:download($1,$2, '${qfile}', '${qname}', '${qprefix}', ${seed})`); question = wrap_math(question); if (input.samplesolutionrender && name !== 'remember') { // Display render of answer and matching user input to produce the answer. correctAnswers += `

    ${stackstring['teacheranswershow_mcq']} \\[{${input.samplesolutionrender}}\\], ${stackstring['api_which_typed']}: `; for (const [name, solution] of Object.entries(input.samplesolution)) { if (name.indexOf('_val') === -1) { correctAnswers += `${wrap_math(solution)}`; } } correctAnswers += '.

    '; } else if (name !== 'remember') { // For dropdowns, radio buttons, etc, only the correct option is displayed. for (const solution of Object.values(input.samplesolution)) { if (input.configuration.options) { correctAnswers += `

    ${input.configuration.options[solution]}

    `; } } } } // Convert Moodle plot filenames to API filenames. for (const [name, file] of Object.entries(json.questionassets)) { const plotUrl = getPlotUrl(file); question = question.replace(name, plotUrl); json.questionsamplesolutiontext = json.questionsamplesolutiontext.replace(name, plotUrl); correctAnswers = correctAnswers.replace(name, plotUrl); } question = replaceFeedbackTags(question,qprefix); qoutput = document.getElementById(`${qprefix+'output'}`); qoutput.innerHTML = question; // Only display results sections once question retrieved. document.getElementById(`${qprefix+'stackapi_qtext'}`).style.display = 'block'; document.getElementById(`${qprefix+'stackapi_correct'}`).style.display = 'block'; // Setup a validation call on inputs. Timeout length is reset if the input is updated // before the validation call is made. for (const inputName of Object.keys(inputs)) { const inputElements = document.querySelectorAll(`[name^=${qprefix+inputPrefix + inputName}]`); for (const inputElement of Object.values(inputElements)) { inputElement.oninput = (event) => { const currentTimeout = timeOutHandler[event.target.id]; if (currentTimeout) { window.clearTimeout(currentTimeout); } timeOutHandler[event.target.id] = window.setTimeout(validate.bind(null, event.target, qfile, qname, qprefix), 1000); }; } } let sampleText = json.questionsamplesolutiontext; if (sampleText) { sampleText = replaceFeedbackTags(sampleText,qprefix); document.getElementById(`${qprefix+'generalfeedback'}`).innerHTML = wrap_math(sampleText); document.getElementById(`${qprefix+'stackapi_generalfeedback'}`).style.display = 'block'; } else { // If the question is updated, there may no longer be general feedback. document.getElementById(`${qprefix+'stackapi_generalfeedback'}`).style.display = 'none'; } document.getElementById(`${qprefix+'stackapi_score'}`).style.display = 'none'; document.getElementById(`${qprefix+'stackapi_validity'}`).innerText = ''; const innerFeedback = document.getElementById(`${qprefix+'specificfeedback'}`); innerFeedback.innerHTML = ''; innerFeedback.classList.remove('feedback'); document.getElementById(`${qprefix+'formatcorrectresponse'}`).innerHTML = correctAnswers; // Hide General feedback and correct answers for now document.getElementById(`${qprefix+'stackapi_generalfeedback'}`).style.display = 'none'; document.getElementById(`${qprefix+'stackapi_correct'}`).style.display = 'none'; createIframes(json.iframes); MathJax.typeset(); } catch(e) { console.log(e); document.getElementById(`${qprefix+'errors'}`).innerText = http.responseText; return; } } }; collectData(qfile, qname, qprefix).then((data)=>{ let submitbutton = document.getElementById(`${qprefix + 'stackapi_qtext'}`).querySelector('input[type="button"]'); submitbutton.addEventListener('click', function() {answer(qfile, qname, qprefix, data.seed)}); http.send(JSON.stringify(data)); let questioncontainer = document.getElementById(`${qprefix+'stack'}`).parentElement; if (questioncontainer.getBoundingClientRect().top<0){ questioncontainer.scrollIntoView({ behavior: 'smooth', block: 'start' }); }; }); } // Validate an input. Called a set amount of time after an input is last updated. function validate(element, qfile, qname, qprefix) { const http = new XMLHttpRequest(); const url = stack_api_url + '/validate'; http.open("POST", url, true); // Remove API prefix and subanswer id. const answerNamePrefixTrim = (qprefix+inputPrefix).length; const answerName = element.name.slice(answerNamePrefixTrim).split('_', 1)[0]; http.setRequestHeader('Content-Type', 'application/json'); http.onreadystatechange = function() { if(http.readyState == 4) { try { const json = JSON.parse(http.responseText); if (json.message) { document.getElementById(`${qprefix+'errors'}`).innerText = json.message; return; } else { document.getElementById(`${qprefix+'errors'}`).innerText = ''; } renameIframeHolders(); const validationHTML = json.validation; const element = document.getElementsByName(`${qprefix+validationPrefix + answerName}`)[0]; element.innerHTML = wrap_math(validationHTML); if (validationHTML) { element.classList.add('validation'); } else { element.classList.remove('validation'); } createIframes(json.iframes); MathJax.typeset(); } catch(e) { document.getElementById(`${qprefix+'errors'}`).innerText = http.responseText; return; } } }; collectData(qfile, qname, qprefix).then((data)=>{ data.inputName = answerName; http.send(JSON.stringify(data)); }); } // Submit answers. function answer(qfile, qname, qprefix, seed) { const http = new XMLHttpRequest(); const url = stack_api_url + '/grade'; http.open("POST", url, true); if (!document.getElementById(`${qprefix+'output'}`).innerText) { return; } http.setRequestHeader('Content-Type', 'application/json'); http.onreadystatechange = function() { if(http.readyState == 4) { try { const json = JSON.parse(http.responseText); if (json.message) { document.getElementById(`${qprefix+'errors'}`).innerText = json.message; return; } else { document.getElementById(`${qprefix+'errors'}`).innerText = ''; } if (!json.isgradable) { document.getElementById(`${qprefix+'stackapi_validity'}`).innerText = ' ' + stackstring["api_valid_all_parts"]; return; } renameIframeHolders(); document.getElementById(`${qprefix+'score'}`).innerText = (json.score * json.scoreweights.total).toFixed(2) + ' ' + stackstring["api_out_of"] + ' ' + json.scoreweights.total; document.getElementById(`${qprefix+'stackapi_score'}`).style.display = 'block'; document.getElementById(`${qprefix+'response_summary'}`).innerText = json.responsesummary; // Show General feedback and correct answers, hide summary document.getElementById(`${qprefix+'stackapi_generalfeedback'}`).style.display = 'block'; document.getElementById(`${qprefix+'stackapi_summary'}`).style.display = 'none'; const feedback = json.prts; const specificFeedbackElement = document.getElementById(`${qprefix+'specificfeedback'}`); // Replace tags and plots in specific feedback and then display. if (json.specificfeedback) { for (const [name, file] of Object.entries(json.gradingassets)) { json.specificfeedback = json.specificfeedback.replace(name, getPlotUrl(file)); } json.specificfeedback = replaceFeedbackTags(json.specificfeedback,qprefix); specificFeedbackElement.innerHTML = wrap_math(json.specificfeedback); specificFeedbackElement.classList.add('feedback'); } else { specificFeedbackElement.classList.remove('feedback'); } // Replace plots in tagged feedback and then display. for (let [name, fb] of Object.entries(feedback)) { for (const [name, file] of Object.entries(json.gradingassets)) { fb = fb.replace(name, getPlotUrl(file)); } const elements = document.getElementsByName(`${qprefix+feedbackPrefix + name}`); if (elements.length > 0) { const element = elements[0]; if (json.scores[name] !== undefined) { fb = fb + `
    ${stackstring['api_marks_sub']}: ${(json.scores[name] * json.scoreweights[name] * json.scoreweights.total).toFixed(2)} / ${(json.scoreweights[name] * json.scoreweights.total).toFixed(2)}.
    `; } element.innerHTML = wrap_math(fb); // if (fb) { // element.classList.add('feedback'); // } else { // element.classList.remove('feedback'); // } } } createIframes(json.iframes); MathJax.typeset(); } catch(e) { console.log(e); document.getElementById(`${qprefix+'errors'}`).innerText = http.responseText; return; } } }; // Clear previous answers and score. const specificFeedbackElement = document.getElementById(`${qprefix+'specificfeedback'}`); specificFeedbackElement.innerHTML = ""; specificFeedbackElement.classList.remove('feedback'); document.getElementById(`${qprefix+'response_summary'}`).innerText = ""; document.getElementById(`${qprefix+'stackapi_summary'}`).style.display = 'none'; const inputElements = document.querySelectorAll(`[name^=${qprefix+feedbackPrefix}]`); for (const inputElement of Object.values(inputElements)) { inputElement.innerHTML = ""; inputElement.classList.remove('feedback'); } document.getElementById(`${qprefix+'stackapi_score'}`).style.display = 'none'; document.getElementById(`${qprefix+'stackapi_validity'}`).innerText = ''; collectData(qfile, qname, qprefix).then((data) => { data.seed = seed; http.send(JSON.stringify(data)); }); } function download(filename, fileid, qfile, qname, qprefix, seed) { const http = new XMLHttpRequest(); const url = stack_api_url + '/download'; http.open("POST", url, true); http.setRequestHeader('Content-Type', 'application/json'); // Something funky going on with closures and callbacks. This seems // to be the easiest way to pass through the file details. http.filename = filename; http.fileid = fileid; http.onreadystatechange = function() { if(http.readyState == 4) { try { // Only download the file once. Replace call to download controller with link // to downloaded file. const blob = new Blob([http.responseText], {type: 'application/octet-binary', endings: 'native'}); // We're matching the three additional arguments that are added in the send function here. const selector = CSS.escape(`javascript\:download\(\'${http.filename}\'\, ${http.fileid}\, \'${qfile}\'\, \'${qname}\'\, \'${qprefix}\'\, ${seed}\)`); const linkElements = document.querySelectorAll(`a[href^=${selector}]`); const link = linkElements[0]; link.setAttribute('href', URL.createObjectURL(blob)); link.setAttribute('download', filename); link.click(); } catch(e) { document.getElementById('errors').innerText = http.responseText; return; } } }; collectData(qfile, qname, qprefix).then((data)=>{ data.filename = filename; data.fileid = fileid; data.seed = seed; http.send(JSON.stringify(data)); }); } // Save contents of question editor locally. function saveState(key, value) { if (typeof(Storage) !== "undefined") { localStorage.setItem(key, value); } } // Load locally stored question on page refresh. function loadState(key) { if (typeof(Storage) !== "undefined") { return localStorage.getItem(key) || ''; } return ''; } function renameIframeHolders() { // Each call to STACK restarts numbering of iframe holders so we need to rename // any old ones to make sure new iframes end up in the correct place. for (const iframe of document.querySelectorAll(`[id^=stack-iframe-holder]:not([id$=old]`)) { iframe.id = iframe.id + '_old'; } } function createIframes (iframes) { const corsFragment = "/cors.php?name="; for (const iframe of iframes) { create_iframe( iframe[0], iframe[1].replaceAll(corsFragment, stack_api_url + corsFragment), ...iframe.slice(2) ); } } // Replace feedback tags in some text with an approproately named HTML div. function replaceFeedbackTags(text, qprefix) { let result = text; const feedbackTags = text.match(/\[\[feedback:.*?\]\]/g); if (feedbackTags) { for (const tag of feedbackTags) { // Part name is between '[[feedback:' and ']]'. result = result.replace(tag, `
    `); } } return result; } async function getQuestionFile(questionURL, questionName) { let res = ""; if (questionURL) { await fetch(questionURL) .then(result => result.text()) .then((result) => { res = loadQuestionFromFile(result, questionName); }); } return res; } function loadQuestionFromFile(fileContents, questionName) { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(fileContents, "text/xml"); let thequestion = null; let randSeed = ""; for (const question of xmlDoc.getElementsByTagName("question")) { if (question.getAttribute('type').toLowerCase() === 'stack' && (!questionName || question.querySelectorAll("name text")[0].textContent === questionName)) { thequestion = question.outerHTML; let seeds = question.querySelectorAll('deployedseed'); if (seeds.length) { randSeed = parseInt(seeds[Math.floor(Math.random()*seeds.length)].textContent); } break; } } return {questionxml:setQuestion(thequestion),seed:randSeed}; } function setQuestion(question) { return '\n' + question + '\n'; } function createQuestionBlocks() { questionBlocks = document.getElementsByClassName("que stack"); let i=0; for (questionblock of questionBlocks){ i++; let questionPrefix = "q" + i.toString() + "_"; var qfile = questionblock.dataset.qfile; var qname = questionblock.dataset.qname || ""; questionblock.innerHTML = `
    `; } } function addCollapsibles(){ var collapsibles = document.querySelectorAll(".level2>h2, .stack>h2"); for (let i=0; i collapseFunc(this)); } } function collapseFunc(e){ e.classList.toggle("collapsed"); } function stackSetup(){ createQuestionBlocks(); addCollapsibles(); } function getPlotUrl(file) { return `${stack_api_url}/plots/${file}`; } ================================================ FILE: js/pretext-stack/stackjsvle.js ================================================ /** * A javascript module to handle separation of author sourced scripts into * IFRAMES. All such scripts will have limited access to the actual document * on the VLE side and this script represents the VLE side endpoint for * message handling needed to give that access. When porting STACK onto VLEs * one needs to map this script to do the following: * * 1. Ensure that searches for target elements/inputs are limited to questions * and do not return any elements outside them. * * 2. Map any identifiers needed to identify inputs by name. * * 3. Any change handling related to input value modifications through this * logic gets connected to any such handling on the VLE side. * * * This script is intenttionally ordered so that the VLE specific bits should * be at the top. * * * This script assumes the following: * * 1. Each relevant IFRAME has an `id`-attribute that will be told to this * script. * * 2. Each such IFRAME exists within the question itself, so that one can * traverse up the DOM tree from that IFRAME to find the border of * the question. * * @module qtype_stack/stackjsvle * @copyright 2023 Aalto University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ 'use strict'; // Note the VLE specific include of logic. /* All the IFRAMES have unique identifiers that they give in their * messages. But we only work with those that have been created by * our logic and are found from this map. */ let IFRAMES = {}; /* For event handling, lists of IFRAMES listening particular inputs. */ let INPUTS = {}; /* For event handling, lists of IFRAMES listening particular inputs * and their input events. By default we only listen to changes. * We report input events as changes to the other side. */ let INPUTS_INPUT_EVENT = {}; /* A flag to disable certain things. */ let DISABLE_CHANGES = false; /** * Returns an element with a given id, if an only if that element exists * inside a portion of DOM that represents a question. * * If not found or exists outside the restricted area then returns `null`. * * @param {String} id the identifier of the element we want. */ function vle_get_element(id) { /* In the case of Moodle we are happy as long as the element is inside something with the `formulation`-class. */ let candidate = document.getElementById(id); let iter = candidate; while (iter && !iter.classList.contains('formulation')) { iter = iter.parentElement; } if (iter && iter.classList.contains('formulation')) { return candidate; } return null; } /** * Returns an input element with a given name, if and only if that element * exists inside a portion of DOM that represents a question. * * Note that, the input element may have a name that multiple questions * use and to pick the preferred element one needs to pick the one * within the same question as the IFRAME. * * Note that the input can also be a select. In the case of radio buttons * returning one of the possible buttons is enough. * * If not found or exists outside the restricted area then returns `null`. * * @param {String} name the name of the input we want * @param {String} srciframe the identifier of the iframe wanting it */ function vle_get_input_element(name, srciframe) { /* In the case of Moodle we are happy as long as the element is inside something with the `formulation`-class. */ let initialcandidate = document.getElementById(srciframe); let iter = initialcandidate; while (iter && !iter.classList.contains('formulation')) { iter = iter.parentElement; } if (iter && iter.classList.contains('formulation')) { // iter now represents the borders of the question containing // this IFRAME. let possible = iter.querySelector('input[id$="_' + name + '"]'); if (possible !== null) { return possible; } // Radios have interesting ids, but the name makes sense possible = iter.querySelector('input[id$="_' + name + '_1"][type=radio]'); if (possible !== null) { return possible; } possible = iter.querySelector('select[id$="_' + name + '"]'); if (possible !== null) { return possible; } } // If none found within the question itself, search everywhere. let possible = document.querySelector('.formulation input[id$="_' + name + '"]'); if (possible !== null) { return possible; } // Radios have interesting ids, but the name makes sense possible = document.querySelector('.formulation input[id$="_' + name + '_1"][type=radio]'); if (possible !== null) { return possible; } possible = document.querySelector('.formulation select[id$="_' + name + '"]'); return possible; } /** * Triggers any VLE specific scripting related to updates of the given * input element. * * @param {HTMLElement} inputelement the input element that has changed */ function vle_update_input(inputelement) { // Triggering a change event may be necessary. const c = new Event('change'); inputelement.dispatchEvent(c); // Also there are those that listen to input events. const i = new Event('input'); inputelement.dispatchEvent(i); } /** * Triggers any VLE specific scripting related to DOM updates. * * @param {HTMLElement} modifiedsubtreerootelement element under which changes may have happened. */ function vle_update_dom(modifiedsubtreerootelement) { CustomEvents.notifyFilterContentUpdated(modifiedsubtreerootelement); } /** * Does HTML-string cleaning, i.e., removes any script payload. Returns * a DOM version of the given input string. * * This is used when receiving replacement content for a div. * * @param {String} src a raw string to sanitise */ function vle_html_sanitize(src) { // This can be implemented with many libraries or by custom code // however as this is typically a thing that a VLE might already have // tools for we have it at this level so that the VLE can use its own // tools that do things that the VLE developpers consider safe. // As Moodle does not currently seem to have such a sanitizer in // the core libraries, here is one implementation that shows what we // are looking for. // TO-DO: look into replacing this with DOMPurify or some such. let parser = new DOMParser(); let doc = parser.parseFromString(src, "text/html"); // First remove all ' + `` + '' + '' + '' + '' + ''; // Determine javascript and css dependencies const extra_css_files = []; const extra_js_files = []; //if (data.rh_result.flags.extra_js_files) { // for (const jsFile of data.rh_result.flags.extra_js_files) { // if (jsFile.file == "js/apps/GraphTool/graphtool.min.js" || jsFile.file == "js/apps/Scaffold/scaffold.js") { // extra_css_files.push({ file: 'js/vendor/bootstrap/css/bootstrap.css', external: '0' }); // extra_css_files.push({ file: 'themes/math4/math4.css', external: '0' }); // extra_js_files.push({ file: 'js/vendor/bootstrap/js/bootstrap.js', external: '0' }); // } // } //} if (data.rh_result.flags.extra_css_files) data.rh_result.flags.extra_css_files.unshift(...extra_css_files); else data.rh_result.flags.extra_css_files = extra_css_files; for (const cssFile of data.rh_result.flags.extra_css_files) { iframeContents += ''; } if (data.rh_result.flags.extra_js_files) data.rh_result.flags.extra_js_files.unshift(...extra_js_files); else data.rh_result.flags.extra_js_files = extra_js_files; for (const jsFile of data.rh_result.flags.extra_js_files) { iframeContents += ''; } iframeContents += '' + '' + '' + `` + '
    ' + form.outerHTML + '
    ' + ''; let iframe; // If there is no action this is the initialization call. if (!action) { // Create the iframe. iframe = document.createElement('iframe'); iframe.style.width = '1px'; iframe.style.minWidth = '100%'; iframe.classList.add('problem-iframe'); // Hide the static problem ww_container.querySelector('.problem-contents').classList.add('hidden-content'); if (activate_button != null) { // Make sure the iframe follows the activate button in the DOM activate_button.after(iframe); } else { ww_container.prepend(iframe); } iFrameResize({ checkOrigin: false, scrolling: 'omit', heightCalculationMethod: 'min' }, iframe); iframe.addEventListener('load', () => { // Set up form submission from inside the iframe. const iframeForm = iframe.contentDocument.getElementById(ww_id + '-form'); iframeForm.addEventListener('submit', (e) => { handleWW(ww_id, "check"); e.preventDefault(); }); iframe.contentDocument.querySelectorAll('.collapse.in').forEach(collapse => collapse.classList.add('expanded')); iframe.contentWindow.jQuery('.collapse').on('shown', function(e) { if (e.target != this) return; this.classList.add('expanded'); }); iframe.contentWindow.jQuery('.collapse').on('hide', function(e) { if (e.target != this) return; this.classList.remove('expanded'); }); iframe.contentDocument.querySelectorAll("button.ww-feedback[data-content]").forEach(button => { iframe.contentWindow.jQuery(button).popover("show"); const content = iframe.contentDocument.getElementById(button.id.replace("-feedback-button", "-content")); const popover = content.parentNode.parentNode; popover.id = button.id.replace("-feedback-button", "-feedback") button.setAttribute('aria-describedby', popover.id); if (button.previousElementSibling) button.previousElementSibling.setAttribute('aria-describedby', popover.id); popover.querySelector('.arrow').remove(); const title = popover.querySelector('.popover-title'); if (button.dataset.emptyContent) { title.style.borderBottomWidth = 0; content.parentNode.remove(); } if (title.textContent == localize_correct + '!') title.classList.add('correct'); }); iframe.contentWindow.MathJax.startup.promise.then(() => iframe.contentWindow.MathJax.typesetPromise(['.popover', '.popover-content'])); }); } else { iframe = ww_container.querySelector('.problem-iframe'); } iframe.srcdoc = iframeContents; iframe.addEventListener('load', () => { // Remove the loader overlay loader.remove(); }, { once: true }) // Place focus on the problem. ww_container.focus() }); } function WWshowCorrect(ww_id, answers) { const ww_container = document.getElementById(ww_id); const iframe = ww_container.querySelector('.problem-iframe'); const body = iframe.contentDocument.getElementById(ww_id + '-body') $("body").trigger("runestone_show_correct", { "ww_id": ww_id, "answers": answers }); let inputs = body.querySelectorAll("input:not([type=hidden])"); for (const input of inputs) { const name = input.name; const span_id = `${ww_id}-${name}-correct`; if (input.type == 'text' && answers[name] && !(iframe.contentDocument.getElementById(span_id))) { const feedbackButton = iframe.contentDocument.getElementById(`${ww_id}-${name}-feedback-button`); if (feedbackButton) { feedbackButton.remove(); iframe.contentWindow.jQuery(feedbackButton).popover("hide"); } label = iframe.contentDocument.getElementById(`${span_id}-label`); if (label) { label.parentElement.insertBefore(input, label); label.remove(); } input.type = "hidden"; // we need to convert things like < in answers to < const correct_ans_text = iframe.contentDocument.createElement('div'); correct_ans_text.innerHTML = answers[name].correct_ans; input.value = correct_ans_text.textContent; const show_span = iframe.contentDocument.createElement('span'); show_span.id = span_id; show_span.appendChild(answers[name].correct_ans_latex_string ? iframe.contentDocument.createTextNode('\\(' + answers[name].correct_ans_latex_string + '\\)') : iframe.contentDocument.createTextNode(answers[name].correct_ans)); input.parentElement.insertBefore(show_span, input); } if (input.type == 'radio' && answers[name]) { const feedbackButton = iframe.contentDocument.getElementById(`${ww_id}-${name}-feedback-button`); if (feedbackButton) { feedbackButton.remove(); iframe.contentWindow.jQuery(feedbackButton).popover("hide"); } correct_value = answers[name].correct_choice; if (input.value == correct_value) input.checked = true; } } const hiddenInputs = body.querySelectorAll("input[type=hidden]"); for (const input of hiddenInputs) { const name = input.name; if (!input.nextElementSibling) continue; const graphtoolContainer = input.nextElementSibling.nextElementSibling; if (graphtoolContainer && answers[name] && graphtoolContainer.classList.contains('graphtool-container')) { const feedbackButton = iframe.contentDocument.getElementById(`${ww_id}-${name}-feedback-button`); if (feedbackButton) { feedbackButton.remove(); iframe.contentWindow.jQuery(feedbackButton).popover("hide"); } const correct_ans_div = iframe.contentDocument.createElement('div'); input.parentElement.insertBefore(correct_ans_div, graphtoolContainer); graphtoolContainer.style.display = 'none'; input.value = answers[name].correct_ans; iframe.contentWindow.jQuery(correct_ans_div).html(answers[name].correct_ans_latex_string); const script = iframe.contentDocument.createElement('script'); script.textContent = correct_ans_div.querySelector('script').textContent .replace('\nwindow.addEventListener("DOMContentLoaded",', '(') .replace(/;\n$/, '();'); iframe.contentDocument.body.appendChild(script); } } let selects = body.querySelectorAll("select:not([type=hidden])"); for (const select of selects) { const name = select.name; const span_id = `${ww_id}-${name}-correct`; if (answers[name] && !iframe.contentDocument.getElementById(span_id)) { const feedbackButton = iframe.contentDocument.getElementById(`${ww_id}-${name}-feedback-button`); if (feedbackButton) { feedbackButton.remove(); iframe.contentWindow.jQuery(feedbackButton).popover("hide"); } select.style.display = "none"; select.value = answers[name].correct_ans; const show_span = iframe.contentDocument.createElement('span'); show_span.id = span_id; show_span.appendChild(answers[name].correct_ans_latex_string ? iframe.contentDocument.createTextNode('\\(' + answers[name].correct_ans_latex_string + '\\)') : iframe.contentDocument.createTextNode(answers[name].correct_ans)); select.parentElement.insertBefore(show_span, select); } } // run MathJax on our new rendering // FIXME: We only need to typeset the added elements, not the entire body. const mathjaxTypesetScript = iframe.contentDocument.createElement('script'); mathjaxTypesetScript.textContent = 'MathJax.startup.promise.then(() => MathJax.typesetPromise([document.body]));'; iframe.contentDocument.body.appendChild(mathjaxTypesetScript); } function resetWW(ww_id) { const ww_container = document.getElementById(ww_id); const activate_button = document.getElementById(ww_id + '-button'); ww_container.dataset.current_seed = ww_container.dataset.seed; iframe = ww_container.querySelector('.problem-iframe'); iframe.remove(); ww_container.querySelector('.problem-contents').classList.remove('hidden-content'); ww_container.querySelector('.problem-buttons.webwork').remove(); ww_container.querySelector('.problem-buttons').classList.remove('hidden-content'); // if the newer activate button is there (but hidden) bring it back too if (activate_button != null) {activate_button.classList.remove('hidden-content');}; } function adjustSrcHrefs(container,ww_domain) { container.querySelectorAll('[href]').forEach((node) => { const href = node.attributes.href.value; if (href !== '#' && !href.match(/^[a-z]+:\/\//i)) node.href = ww_domain + '/' + href; }); container.querySelectorAll('[src]').forEach((node) => { node.src = ww_domain + '/' + node.attributes.src.value; }); } function translateHintSol(ww_id, body_div, ww_domain, b_ptx_has_hint, b_ptx_has_solution, hint_label_text, solution_label_text) { // the problem text may come with "hint"s and "solution"s // each one is an "a" with content "Hint" or "Solution", and an attribute with base64-encoded HTML content // the WeBWorK knowl js would normally handle this, but we want PreTeXt knowl js to handle it // so we replace the "a" with the content that should be there for PTX knowl js // also if hint/sol were missing from the static version, we want these removed here const ww_container = document.getElementById(ww_id); const hintsolnodes = document.evaluate("//p[a/b]", body_div, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); if (hintsolnodes) { let solutionlikewrapper; for (let i = 0; i < hintsolnodes.snapshotLength; i++) { const hintsolp = hintsolnodes.snapshotItem(i); if (!hintsolp) continue; const hintSolType = hintsolp.textContent.trim().toLowerCase().replace(':', ''); if (hintsolp.previousElementSibling.textContent.trim() != 'Hint:' && hintsolp.previousElementSibling.textContent.trim() != 'Solution:') { solutionlikewrapper = document.createElement('div'); solutionlikewrapper.classList.add('webwork', 'solutions'); hintsolp.parentNode.insertBefore(solutionlikewrapper, hintsolp); } if ((hintSolType == 'solution' && !b_ptx_has_solution) || (hintSolType == 'hint' && !b_ptx_has_hint)) continue; const knowlDetails = document.createElement('details'); knowlDetails.classList.add(hintSolType); knowlDetails.classList.add('solution-like'); knowlDetails.classList.add('born-hidden-knowl'); const knowlSummary = document.createElement('summary'); const summaryLabel = document.createElement('span'); summaryLabel.classList.add('type'); summaryLabel.innerHTML = hintSolType == 'hint' ? hint_label_text : solution_label_text; knowlSummary.appendChild(summaryLabel); knowlDetails.appendChild(knowlSummary); const knowlContents = document.createElement('div'); knowlContents.classList.add(hintSolType); knowlContents.classList.add('solution-like'); knowlContents.innerHTML = hintsolp.firstElementChild.dataset.knowlContents; knowlDetails.appendChild(knowlContents); adjustSrcHrefs(knowlContents, ww_domain) solutionlikewrapper.appendChild(knowlDetails); } } for (let i = 0; i < hintsolnodes.snapshotLength; i++) { hintsolnodes.snapshotItem(i).remove(); } } function cloneAttributes(target, source) { [...source.attributes].forEach( attr => { target.setAttribute(attr.nodeName ,attr.nodeValue) }); } function createFeedbackButton(id, title, content) { const feedbackButton = document.createElement('button'); feedbackButton.dataset.title = title; feedbackButton.dataset.content = `
    ${content || ''}
    `; if (!content) feedbackButton.dataset.emptyContent = '1'; const contentSpan = document.createElement('span'); contentSpan.style.fontWeight = 1000; contentSpan.textContent = '\uD83D\uDDE9' feedbackButton.appendChild(contentSpan); feedbackButton.type = 'button'; feedbackButton.classList.add('ww-feedback'); feedbackButton.style.borderRadius = 0; feedbackButton.id = `${id}-feedback-button`; feedbackButton.dataset.html = true; feedbackButton.dataset.placement = 'bottom'; feedbackButton.dataset.trigger = 'click'; return feedbackButton; } ================================================ FILE: js/pretext-webwork/2.17/pretext-webwork.js ================================================ //Critical: // TODO: Think about what should be done for an essay question. //Accessibility: //Enhancement: // TODO: In a scaffold problem, adjust the green bar for when one part is correct. // TODO: Have randomize check that new seed is actually producing new HTML. // TODO: Don't offer randomize or button unless we know a new version can be produced after trying a few seeds. // TODO: In a staged problem, Make Interactive button is adjacent to solution knowls; move it. // TODO: MathQuill // TODO: Image pop up. // TODO: Deal with singleResult MultiAnswer problems. //Styling: // TODO: Review all styling in all scenarios (staged/not, correct/partly-correct/incorrect/blank, single/multiple) // TODO: Sean: I think I'd like to see a slightly larger font size on the buttons function handleWW(ww_id, action) { const ww_container = document.getElementById(ww_id); const ww_domain = ww_container.dataset.domain; const ww_problemSource = ww_container.dataset.problemsource; const ww_sourceFilePath = ww_container.dataset.sourcefilepath; const ww_course_id = ww_container.dataset.courseid; const ww_user_id = ww_container.dataset.userid; const ww_course_password = ww_container.dataset.coursepassword || ww_container.dataset.passwd; const localize_correct = ww_container.dataset.localizeCorrect || "Correct"; const localize_incorrect = ww_container.dataset.localizeIncorrect || "Incorrect"; const localize_blank = ww_container.dataset.localizeBlank || "Blank"; const localize_submit = ww_container.dataset.localizeSubmit || "Submit"; const localize_check_responses = ww_container.dataset.localizeCheckResponses || "Check Responses"; const localize_reveal = ww_container.dataset.localizeReveal || "Reveal"; const localize_randomize = ww_container.dataset.localizeRandomize || "Randomize"; const localize_reset = ww_container.dataset.localizeReset || "Reset"; const runestone_logged_in = (typeof eBookConfig !== 'undefined' && eBookConfig.username !== ''); // will be null on pages generated prior to late December 2022 const activate_button = document.getElementById(ww_id + '-button') // Set the current seed if (!action) { ww_container.dataset.current_seed = ww_container.dataset.seed; if (runestone_logged_in) { ww_container.dataset.current_seed = webworkSeedHash(eBookConfig.username + ww_container.dataset.current_seed); } } else if (action == 'randomize') ww_container.dataset.current_seed = Number(ww_container.dataset.current_seed) + 100; let loader = document.createElement('div'); loader.style.position = 'absolute'; loader.style.left = 0; loader.style.top = 0; loader.style.backgroundColor = 'rgba(0.2, 0.2, 0.2, 0.4)'; loader.style.color = 'white'; loader.style.width = '100%'; loader.style.height = '100%'; loader.style.display = 'flex'; loader.style.alignItems = 'center'; loader.style.justifyContent = 'center'; loader.style.marginTop = '0'; loader.tabIndex = -1; const loaderText = document.createElement('span'); loaderText.textContent = 'Loading'; loaderText.style.fontSize = '2rem'; loader.appendChild(loaderText); ww_container.appendChild(loader); loader.focus(); if (!action) { // Determine if static version shows hints, solutions, or answers and save that information in the container dataset for later runs. ww_container.dataset.hasHint = ww_container.getElementsByClassName('hint').length > 0; ww_container.dataset.hasSolution = ww_container.getElementsByClassName('solution').length > 0; ww_container.dataset.hasAnswer = ww_container.getElementsByClassName('answer').length > 0; // Get (possibly localized) label text for hints and solutions. ww_container.dataset.hintLabelText = ww_container.dataset.hasHint == 'true' ? ww_container.querySelectorAll('.hint-knowl span.type, details.hint span.type')[0].textContent : 'Hint'; ww_container.dataset.solutionLabelText = ww_container.dataset.hasSolution == 'true' ? ww_container.querySelectorAll('.solution-knowl span.type, details.solution span.type')[0].textContent : 'Solution'; ww_container.tabIndex = -1; } let url; if (action == 'check') { const iframe = ww_container.querySelector('.problem-iframe'); const formData = new FormData(iframe.contentDocument.getElementById(ww_id + "-form")); const params = new URLSearchParams(formData); url = new URL(ww_domain + '/webwork2/html2xml?' + params.toString()) url.searchParams.append("answersSubmitted", '1'); url.searchParams.append('WWsubmit', "1"); } else { url = new URL(ww_domain + '/webwork2/html2xml'); url.searchParams.append("problemSeed", ww_container.dataset.current_seed); if (ww_problemSource) url.searchParams.append("problemSource", ww_problemSource); else if (ww_sourceFilePath) url.searchParams.append("sourceFilePath", ww_sourceFilePath); url.searchParams.append("answersSubmitted", '0'); url.searchParams.append("displayMode", "MathJax"); url.searchParams.append("courseID", ww_course_id); url.searchParams.append("userID", ww_user_id); url.searchParams.append("course_password", ww_course_password); url.searchParams.append("outputformat", "raw"); // note ww_container.dataset.hasSolution is a string, possibly 'false' which is true url.searchParams.append("showSolutions", ww_container.dataset.hasSolution == 'true' ? '1' : '0'); url.searchParams.append("showHints", ww_container.dataset.hasHint == 'true' ? '1' : '0'); url.searchParams.append("problemUUID",ww_id); } // get the json and do stuff with what we get $.getJSON(url.toString(), (data) => { // Create the form that will contain the text and input fields of the interactive problem. const form = document.createElement("form"); form.id = ww_id + "-form"; // Create a div for the problem text. const body_div = document.createElement("div"); body_div.id = ww_id + "-body"; body_div.classList.add("exercise", "exercise-like"); body_div.lang = data.lang; body_div.dir = data.dir; // Dump the problem text, answer blanks, etc. body_div.innerHTML = data.rh_result.text; // Replace all hn headings with h6 headings. for (const tag_name of ['h6', 'h5', 'h4', 'h3', 'h2', 'h1']) { const headings = body_div.getElementsByTagName(tag_name); for (heading of headings) { const new_heading = document.createElement("h6"); new_heading.innerHTML = heading.innerHTML; cloneAttributes(new_heading, heading); new_heading.classList.add('webwork-part'); heading.replaceWith(new_heading); } } adjustSrcHrefs(body_div, ww_domain); translateHintSol(ww_id, body_div, ww_domain, ww_container.dataset.hasHint == 'true', ww_container.dataset.hasSolution == 'true', ww_container.dataset.hintLabelText, ww_container.dataset.solutionLabelText) // insert previous answers if (runestone_logged_in) { const answersObject = (wwList[ww_id.replace(/-ww-rs$/,'')].answers ? wwList[ww_id.replace(/-ww-rs$/,'')].answers : {'answers' : [], 'mqAnswers' : []}); const mqAnswers = answersObject.mqAnswers; for (const mqAnswer in mqAnswers) { const mqInput = body_div.querySelector('input[id=' + mqAnswer + ']'); if (mqInput && mqInput.value == '') { mqInput.setAttribute('value', mqAnswers[mqAnswer]); } } const answers = answersObject.answers; for (const answer in answers) { const input = body_div.querySelector('input[id=' + answer + ']'); if (input && input.value == '') { input.setAttribute('value', answers[answer]); } if (input && input.type.toUpperCase() == 'RADIO') { const buttons = body_div.querySelectorAll('input[name=' + answer + ']'); for (const button of buttons) { if (button.value == answers[answer]) { button.setAttribute('checked', 'checked'); } } } if (input && input.type.toUpperCase() == 'CHECKBOX') { const checkboxes = body_div.querySelectorAll('input[name=' + answer + ']'); for (const checkbox of checkboxes) { // This is not a bulletproof approach if the problem used input values that are weird // For example, with commas in them // However, we are stuck with WW providing answers[answer] as a string like `[value0, value1]` // and note that it is not `["value0", "value1"]`, so we cannot cleanly parse it into an array let checkbox_regex = new RegExp('(\\[|, )' + checkbox.value + '(, |\\])'); if (answers[answer].match(checkbox_regex)) { checkbox.setAttribute('checked', 'checked'); } } } var select = body_div.querySelector('select[id=' + answer + ']'); if (select && answers[answer]) { // answers[answer] may be wrapped in \text{...} that we want to remove, since value does not have this. let this_answer = answers[answer]; if (/^\\text\{.*\}$/.test(this_answer)) {this_answer = this_answer.match(/^\\text\{(.*)\}$/)[1]}; let quote_escaped_answer = this_answer.replace(/"/g, '\\"'); const option = body_div.querySelector(`select[id="${answer}"] option[value="${quote_escaped_answer}"]`); if (option) {option.setAttribute('selected', 'selected')}; } } } // insert our cleaned up problem text form.appendChild(body_div); // Set up hidden input fields that the form uses const wwInputs = { problemSeed: data.inputs_ref.problemSeed, problemUUID: data.inputs_ref.problemUUID, psvn: data.inputs_ref.psvn, courseName: ww_course_id, courseID: ww_course_id, userID: ww_user_id, course_password: ww_course_password, displayMode: "MathJax", session_key: data.rh_result.session_key, outputformat: "raw", language: data.formLanguage, showSummary: data.showSummary, // note ww_container.dataset.hasSolution is a string, possibly 'false' which is true showSolutions: ww_container.dataset.hasSolution == 'true' ? '1' : '0', showHints: ww_container.dataset.hasHint == 'true' ? '1' : '0', forcePortNumber: data.forcePortNumber }; if (ww_sourceFilePath) wwInputs.sourceFilePath = ww_sourceFilePath; else if (ww_problemSource) wwInputs.problemSource = ww_problemSource; for (const wwInputName of Object.keys(wwInputs)) { const input = document.createElement('input'); input.type = 'hidden'; input.name = wwInputName; input.value = wwInputs[wwInputName]; form.appendChild(input); } // Prepare answers object const answers = {}; // id the answers even if we won't populate them Object.keys(data.rh_result.answers).forEach(function(id) { answers[id] = {}; }, data.rh_result.answers); if (ww_container.dataset.hasAnswer == 'true') { // Update answer data Object.keys(data.rh_result.answers).forEach(function(id) { answers[id] = { correct_ans: this[id].correct_ans, correct_ans_latex_string: this[id].correct_ans_latex_string, correct_choice: this[id].correct_choice, correct_choices: this[id].correct_choices, }; }, data.rh_result.answers); } let buttonContainer = ww_container.querySelector('.problem-buttons.webwork'); // Create the submission buttons if they have not yet been created. if (!buttonContainer) { // Hide the original div that contains the old make active button. ww_container.querySelector('.problem-buttons').classList.add('hidden-content'); // And the newer activate button if it is there if (activate_button != null) {activate_button.classList.add('hidden-content');}; // Create a new div for the webwork buttons. buttonContainer = document.createElement('div'); buttonContainer.classList.add('problem-buttons', 'webwork'); if (activate_button != null) { // Make sure the button container follows the activate button in the DOM activate_button.after(buttonContainer); } else { ww_container.prepend(buttonContainer); } // Check button const check = document.createElement("button"); check.type = "button"; check.id = ww_id + '-check'; check.style.marginRight = "0.25rem"; check.classList.add('webwork-button'); // Adjust if more than one answer to check const answerCount = body_div.querySelectorAll("input:not([type=hidden])").length + body_div.querySelectorAll("select:not([type=hidden])").length; check.textContent = runestone_logged_in ? localize_submit : localize_check_responses; check.addEventListener('click', () => handleWW(ww_id, "check")); buttonContainer.appendChild(check); // Show correct answers button if original PTX has answer knowl. if (ww_container.dataset.hasAnswer == 'true') { const correct = document.createElement("button"); correct.classList.add("show-correct", 'webwork-button'); correct.type = "button"; correct.style.marginRight = "0.25rem"; correct.textContent = localize_reveal; correct.addEventListener('click', () => WWshowCorrect(ww_id, answers)); buttonContainer.appendChild(correct); } // randomize button const randomize = document.createElement("button") randomize.type = "button"; randomize.classList.add('webwork-button'); randomize.style.marginRight = "0.25rem"; randomize.textContent = localize_randomize; randomize.addEventListener('click', () => handleWW(ww_id, 'randomize')); buttonContainer.appendChild(randomize) // reset button const reset = document.createElement("button") reset.type = "button" reset.classList.add('webwork-button'); reset.textContent = localize_reset; reset.addEventListener('click', () => resetWW(ww_id)); buttonContainer.appendChild(reset) } else { // Update the click handler for the show correct button. if (ww_container.dataset.hasAnswer == 'true') { const correct = buttonContainer.querySelector('.show-correct'); const correctNew = correct.cloneNode(true); correctNew.addEventListener('click', () => WWshowCorrect(ww_id, answers)); correct.replaceWith(correctNew); } } if (action == 'check') { // Runestone trigger // TODO: condition on platform=Runestone $("body").trigger('runestone_ww_check', data) const inputs = body_div.querySelectorAll("input:not([type=hidden])"); for (const input of inputs) { const name = input.name; if (input.type == 'text' && answers[name]) { const score = data.rh_result.answers[name].score; let headline = ''; let correctClass = ''; if (score >= 1) { headline = localize_correct + '!'; correctClass = 'correct'; } else if (score > 0 && score < 1) { headline = `${Math.round(score * 100)}% ${localize_correct}.`; correctClass = 'partly-correct'; } else if (data.rh_result.answers[name].student_ans == '') { headline = localize_blank + '.'; correctClass = 'blank'; } else if (score <= 0) { headline = localize_incorrect + '.'; correctClass = 'incorrect'; } let title = `${headline}`; let message = (data.rh_result.answers[name].ans_message ? data.rh_result.answers[name].ans_message : ''); input.classList.add(correctClass); // make a span that contains feedback feedbackSpan = document.createElement('span'); feedbackSpan.id = `${ww_id}-${name}-feedback`; feedbackHeadline = document.createElement('span'); feedbackHeadline.id = `${ww_id}-${name}-headline`; feedbackHeadline.textContent = headline; feedbackSpan.appendChild(feedbackHeadline); feedbackMessage = document.createElement('span'); feedbackMessage.id = `${ww_id}-${name}-message`; feedbackMessage.textContent = message; feedbackSpan.appendChild(feedbackMessage); // make a non breaking span to surround input, sr span, and feedback button let nbSpan = document.createElement('span'); nbSpan.classList.add("nobreak"); input.parentNode.insertBefore(nbSpan, input); nbSpan.appendChild(input); // put a visibly hidden (screen-reader only) span with feedback let srSpan = document.createElement('span'); srSpan.classList.add("visually-hidden"); srSpan.appendChild(feedbackSpan); nbSpan.appendChild(srSpan); // give the feedback to sr users immediately input.setAttribute('aria-describedby',`${ww_id}-${name}-feedback`); // make the feedback button srSpan.after(createFeedbackButton(`${ww_id}-${name}`, title, message)); } if (input.type.toUpperCase() == 'RADIO' && answers[name]) { const score = data.rh_result.answers[name].score; const student_ans = data.rh_result.answers[name].student_value || data.rh_result.answers[name].student_ans; const correct_ans = data.rh_result.answers[name].correct_choice || data.rh_result.answers[name].correct_ans; if (input.value == student_ans) { if (score == 1) { input.parentNode.classList.add('correct'); } else { input.parentNode.classList.add('incorrect'); } const feedbackButton = createFeedbackButton(`${ww_id}-${name}`, (student_ans == correct_ans) ? `${localize_correct}` : `${localize_incorrect}.`) feedbackButton.style.marginRight = '0.25rem'; input.after(feedbackButton); } } if (input.type.toUpperCase() == 'CHECKBOX' && answers[name]) { const score = data.rh_result.answers[name].score; const student_ans = data.rh_result.answers[name].student_ans; const correct_ans = data.rh_result.answers[name].correct_ans; if (input.value == data.rh_result.answers[name].firstElement) { const checkbox_div = input.parentNode.parentNode; if (score == 1) { checkbox_div.classList.add('correct'); } else { checkbox_div.classList.add('incorrect'); } const feedbackButton = createFeedbackButton(`${ww_id}-${name}`, (student_ans == correct_ans) ? `${localize_correct}` : `${localize_incorrect}.`) checkbox_div.insertBefore(feedbackButton, checkbox_div.firstChild); } } } const hiddenInputs = body_div.querySelectorAll("input[type=hidden]"); for (const input of hiddenInputs) { const name = input.name; if (!input.nextElementSibling) continue; const graphtoolContainer = input.nextElementSibling.nextElementSibling; if (graphtoolContainer && answers[name] && graphtoolContainer.classList.contains('graphtool-container')) { graphtoolContainer.style.position = 'relative'; const score = data.rh_result.answers[name].score; let title = ''; if (score == 1) { title = `${localize_correct}`; } else if (score > 0 && score < 1) { title = `${Math.round(score * 100)}% ${localize_correct}.`; } else if (data.rh_result.answers[name].student_ans == '') { // do nothing if the submitted answer is blank and the problem has not already been scored as correct continue; } else if (score == 0) { title = `${localize_incorrect}.`; } const feedbackButton = createFeedbackButton(`${ww_id}-${name}`, title, data.rh_result.answers[name].ans_message); feedbackButton.style.position = 'absolute'; feedbackButton.style.left = '100%'; feedbackButton.style.top = 0; feedbackButton.style.marginLeft = '0.5rem'; feedbackButton.dataset.bsContainer = 'body'; graphtoolContainer.appendChild(feedbackButton); if (score == 1) { graphtoolContainer.classList.add('correct'); } else { graphtoolContainer.classList.add('incorrect'); } } } const selects = body_div.querySelectorAll("select:not([type=hidden])"); for (const select of selects) { const name = select.name; const score = data.rh_result.answers[name].score; let title = ''; if (score == 1) { headline = localize_correct + '!'; correctClass = 'correct'; } else { headline = localize_incorrect + '.'; correctClass = 'incorrect'; } select.classList.add(correctClass); title = `${headline}`; // make a span that contains feedback feedbackSpan = document.createElement('span'); feedbackSpan.id = `${ww_id}-${name}-feedback`; feedbackHeadline = document.createElement('span'); feedbackHeadline.id = `${ww_id}-${name}-headline`; feedbackHeadline.textContent = headline; feedbackSpan.appendChild(feedbackHeadline); // make a non breaking span to surround select, sr span, and feedback button let nbSpan = document.createElement('span'); nbSpan.classList.add("nobreak"); select.parentNode.insertBefore(nbSpan, select); nbSpan.appendChild(select); // put a span around select since select does not support ::after pseudo elements let psSpan = document.createElement('span'); psSpan.classList.add("select-wrapper", correctClass); select.parentNode.insertBefore(psSpan, select); psSpan.appendChild(select); // put a visibly hidden (screen-reader only) span with feedback let srSpan = document.createElement('span'); srSpan.classList.add("visually-hidden"); srSpan.appendChild(feedbackSpan); nbSpan.appendChild(srSpan); // give the feedback to sr users immediately select.setAttribute('aria-describedby',`${ww_id}-${name}-feedback`); // make the feedback button srSpan.after(createFeedbackButton(`${ww_id}-${name}`, title)); } } let iframeContents = '' + '' + `` + '' + '' + '' + ''; // Determine javascript and css dependencies const extra_css_files = []; const extra_js_files = []; //if (data.rh_result.flags.extra_js_files) { // for (const jsFile of data.rh_result.flags.extra_js_files) { // if (jsFile.file == "js/apps/GraphTool/graphtool.min.js" || jsFile.file == "js/apps/Scaffold/scaffold.js") { // extra_css_files.push({ file: 'js/vendor/bootstrap/css/bootstrap.css', external: '0' }); // extra_css_files.push({ file: 'themes/math4/math4.css', external: '0' }); // extra_js_files.push({ file: 'js/vendor/bootstrap/js/bootstrap.js', external: '0' }); // } // } //} if (data.extra_css_files) data.extra_css_files.unshift(...extra_css_files); else data.extra_css_files = extra_css_files; for (const cssFile of data.extra_css_files) { if (/knowl/.test(cssFile.file)) continue; iframeContents += ''; } if (data.extra_js_files) data.extra_js_files.unshift(...extra_js_files); else data.extra_js_files = extra_js_files; for (const jsFile of data.extra_js_files) { if (/knowl/.test(jsFile.file)) continue; iframeContents += ''; } iframeContents += '' + '' + '' + `` + '
    ' + form.outerHTML + '
    ' + ''; let iframe; // If there is no action this is the initialization call. if (!action) { // Create the iframe. iframe = document.createElement('iframe'); iframe.style.width = '1px'; iframe.style.minWidth = '100%'; iframe.classList.add('problem-iframe'); // Hide the static problem ww_container.querySelector('.problem-contents').classList.add('hidden-content'); if (activate_button != null) { // Make sure the iframe follows the activate button in the DOM activate_button.after(iframe); } else { ww_container.prepend(iframe); } iFrameResize({ checkOrigin: false, scrolling: 'omit', heightCalculationMethod: 'min' }, iframe); iframe.addEventListener('load', () => { // Set up form submission from inside the iframe. const iframeForm = iframe.contentDocument.getElementById(ww_id + '-form'); iframeForm.addEventListener('submit', (e) => { handleWW(ww_id, "check"); e.preventDefault(); }); iframe.contentDocument.querySelectorAll('.collapse.in').forEach(collapse => collapse.classList.add('expanded')); iframe.contentWindow.jQuery('.collapse').on('shown', function(e) { if (e.target != this) return; this.classList.add('expanded'); }); iframe.contentWindow.jQuery('.collapse').on('hide', function(e) { if (e.target != this) return; this.classList.remove('expanded'); }); iframe.contentDocument.querySelectorAll("button.ww-feedback[data-bs-content]").forEach(button => { const bsPopover = new iframe.contentWindow.bootstrap.Popover(button, { html: true, placement: 'bottom', fallbackPlacements: [], trigger: 'click', customClass: 'result-popover' + (button.dataset.emptyContent ? ' nocontent' : '') }); bsPopover.show(); const content = iframe.contentDocument.getElementById(button.id.replace("-feedback-button", "-content")); const popover = content.parentNode.parentNode; bsPopover.hide(); /*button.addEventListener('shown.bs.popover', () => { // Note that the button itself has the aria-describedby attribute set by bootstrap automatically. button.previousElementSibling?.setAttribute('aria-describedby', popover.id); });*/ button.addEventListener('click', () => bsPopover.show(), { once: true }); popover.querySelector('.popover-arrow').remove(); const title = popover.querySelector('.popover-header'); if (button.dataset.emptyContent) content.parentNode.remove(); if (title.textContent == localize_correct + '!') title.classList.add('correct'); }); iframe.contentWindow.MathJax.startup.promise.then(() => iframe.contentWindow.MathJax.typesetPromise(['.popover', '.popover-content'])); }); } else { iframe = ww_container.querySelector('.problem-iframe'); } iframe.srcdoc = iframeContents; iframe.addEventListener('load', () => { // Remove the loader overlay loader.remove(); }, { once: true }) // Place focus on the problem. ww_container.focus() }); } function WWshowCorrect(ww_id, answers) { const ww_container = document.getElementById(ww_id); const iframe = ww_container.querySelector('.problem-iframe'); const body = iframe.contentDocument.getElementById(ww_id + '-body') $("body").trigger("runestone_show_correct", { "ww_id": ww_id, "answers": answers }); let inputs = body.querySelectorAll("input:not([type=hidden])"); for (const input of inputs) { const name = input.name; const span_id = `${ww_id}-${name}-correct`; if (input.type == 'text' && answers[name] && !(iframe.contentDocument.getElementById(span_id))) { const input_id = input.id; const mq_span = iframe.contentDocument.getElementById(`mq-answer-${input_id}`); if (mq_span) { mq_span.style.display = 'none'; } const feedbackButton = iframe.contentDocument.getElementById(`${ww_id}-${name}-feedback-button`); if (feedbackButton) { iframe.contentWindow.bootstrap.Popover.getInstance(feedbackButton)?.hide(); feedbackButton.remove(); } label = iframe.contentDocument.getElementById(`${span_id}-label`); if (label) { label.parentElement.insertBefore(input, label); label.remove(); } input.type = "hidden"; // we need to convert things like < in answers to < const correct_ans_text = iframe.contentDocument.createElement('div'); correct_ans_text.innerHTML = answers[name].correct_ans; input.value = correct_ans_text.textContent; const show_span = iframe.contentDocument.createElement('span'); show_span.id = span_id; show_span.appendChild(answers[name].correct_ans_latex_string ? iframe.contentDocument.createTextNode('\\(' + answers[name].correct_ans_latex_string + '\\)') : iframe.contentDocument.createTextNode(answers[name].correct_ans)); input.parentElement.insertBefore(show_span, input); } if (input.type.toUpperCase() == 'RADIO' && answers[name]) { const feedbackButton = iframe.contentDocument.getElementById(`${ww_id}-${name}-feedback-button`); if (feedbackButton) { iframe.contentWindow.bootstrap.Popover.getInstance(feedbackButton)?.hide(); feedbackButton.remove(); } const correct_ans = answers[name].correct_choice || answers[name].correct_ans; if (input.value == correct_ans) { input.checked = true; //input.setAttribute('checked', 'checked'); } else { input.checked = false; } } if (input.type.toUpperCase() == 'CHECKBOX' && answers[name]) { const correct_choices = answers[name].correct_choices; if (correct_choices.includes(input.value)) { input.checked = true; // input.setAttribute('checked', 'checked'); } else { input.checked = false; // input.setAttribute('checked', false); } } } const hiddenInputs = body.querySelectorAll("input[type=hidden]"); for (const input of hiddenInputs) { const name = input.name; if (!input.nextElementSibling) continue; const graphtoolContainer = input.nextElementSibling.nextElementSibling; if (graphtoolContainer && answers[name] && graphtoolContainer.classList.contains('graphtool-container')) { const feedbackButton = iframe.contentDocument.getElementById(`${ww_id}-${name}-feedback-button`); if (feedbackButton) { iframe.contentWindow.bootstrap.Popover.getInstance(feedbackButton)?.hide(); feedbackButton.remove(); } const correct_ans_div = iframe.contentDocument.createElement('div'); input.parentElement.insertBefore(correct_ans_div, graphtoolContainer); graphtoolContainer.style.display = 'none'; input.value = answers[name].correct_ans; iframe.contentWindow.jQuery(correct_ans_div).html(answers[name].correct_ans_latex_string); const script = iframe.contentDocument.createElement('script'); script.textContent = correct_ans_div.querySelector('script').textContent .replace('\nwindow.addEventListener("DOMContentLoaded",', '(') .replace(/;\n$/, '();'); iframe.contentDocument.body.appendChild(script); } } let selects = body.querySelectorAll("select:not([type=hidden])"); for (const select of selects) { const name = select.name; const span_id = `${ww_id}-${name}-correct`; if (answers[name] && !iframe.contentDocument.getElementById(span_id)) { const feedbackButton = iframe.contentDocument.getElementById(`${ww_id}-${name}-feedback-button`); if (feedbackButton) { iframe.contentWindow.bootstrap.Popover.getInstance(feedbackButton)?.hide(); feedbackButton.remove(); } select.style.display = "none"; select.value = answers[name].correct_ans; const show_span = iframe.contentDocument.createElement('span'); show_span.id = span_id; show_span.appendChild(answers[name].correct_ans_latex_string ? iframe.contentDocument.createTextNode('\\(' + answers[name].correct_ans_latex_string + '\\)') : iframe.contentDocument.createTextNode(answers[name].correct_ans)); select.parentElement.insertBefore(show_span, select); } } // run MathJax on our new rendering // FIXME: We only need to typeset the added elements, not the entire body. const mathjaxTypesetScript = iframe.contentDocument.createElement('script'); mathjaxTypesetScript.textContent = 'MathJax.startup.promise.then(() => MathJax.typesetPromise([document.body]));'; iframe.contentDocument.body.appendChild(mathjaxTypesetScript); } function resetWW(ww_id) { const ww_container = document.getElementById(ww_id); const activate_button = document.getElementById(ww_id + '-button'); ww_container.dataset.current_seed = ww_container.dataset.seed; iframe = ww_container.querySelector('.problem-iframe'); iframe.remove(); ww_container.querySelector('.problem-contents').classList.remove('hidden-content'); ww_container.querySelector('.problem-buttons.webwork').remove(); ww_container.querySelector('.problem-buttons').classList.remove('hidden-content'); // if the newer activate button is there (but hidden) bring it back too if (activate_button != null) {activate_button.classList.remove('hidden-content');}; } function adjustSrcHrefs(container,ww_domain) { container.querySelectorAll('[href]').forEach((node) => { const href = node.attributes.href.value; if (href !== '#' && !href.match(/^[a-z]+:\/\//i)) node.href = ww_domain + '/' + href; }); container.querySelectorAll('[src]').forEach((node) => { node.src = new URL(node.attributes.src.value, ww_domain).href; }); } function translateHintSol(ww_id, body_div, ww_domain, b_ptx_has_hint, b_ptx_has_solution, hint_label_text, solution_label_text) { // the problem text may come with "hint"s and "solution"s // Each one is an "a" with the class ".knowl" and the data-type attribute of either "hint" or "solution". // the WeBWorK knowl js would normally handle this, but we want PreTeXt knowl js to handle it // so we replace the "a" with the content that should be there for PTX knowl js // also if hint/sol were missing from the static version, we want these removed here const hintSols = body_div.querySelectorAll('.knowl[data-type="hint"],.knowl[data-type="solution"]'); let solutionlikewrapper; for (const hintSol of hintSols) { const hintsolp = hintSol.parentNode; if (!hintsolp) continue; const hintsolpp = hintsolp.parentNode; //the div that contains each p with a knowl anchor const hintSolType = hintSol.dataset.type; if (hintsolpp.querySelectorAll(".webwork.solutions").length == 0) { solutionlikewrapper = document.createElement('div'); solutionlikewrapper.classList.add('webwork', 'solutions'); hintsolpp.insertBefore(solutionlikewrapper, hintsolp); } if ((hintSolType == 'solution' && !b_ptx_has_solution) || (hintSolType == 'hint' && !b_ptx_has_hint)) continue; const knowlDetails = document.createElement('details'); knowlDetails.classList.add(hintSolType); knowlDetails.classList.add('solution-like'); knowlDetails.classList.add('born-hidden-knowl'); const knowlSummary = document.createElement('summary'); const summaryLabel = document.createElement('span'); summaryLabel.classList.add('type'); summaryLabel.innerHTML = hintSolType == 'hint' ? hint_label_text : solution_label_text; knowlSummary.appendChild(summaryLabel); knowlDetails.appendChild(knowlSummary); const knowlContents = document.createElement('div'); knowlContents.classList.add(hintSolType); knowlContents.classList.add('solution-like'); knowlContents.innerHTML = hintsolp.firstElementChild.dataset.knowlContents; knowlDetails.appendChild(knowlContents); adjustSrcHrefs(knowlContents, ww_domain) solutionlikewrapper.appendChild(knowlDetails); } for (const hintSol of hintSols) { hintSol.parentNode?.remove(); } } function cloneAttributes(target, source) { [...source.attributes].forEach( attr => { target.setAttribute(attr.nodeName ,attr.nodeValue) }); } function createFeedbackButton(id, title, content) { const feedbackButton = document.createElement('button'); feedbackButton.dataset.bsTitle = title; feedbackButton.dataset.bsContent = `
    ${content || ''}
    `; if (!content) feedbackButton.dataset.emptyContent = '1'; const contentSpan = document.createElement('span'); contentSpan.innerHTML = ``; feedbackButton.appendChild(contentSpan); feedbackButton.type = 'button'; feedbackButton.classList.add('ww-feedback'); feedbackButton.id = `${id}-feedback-button`; feedbackButton.dataset.bsToggle = 'popover'; return feedbackButton; } function webworkSeedHash(string) { var hash = 0, i, chr; if (string.length === 0) return hash; for (i = 0; i < string.length; i++) { chr = string.charCodeAt(i); hash = ((hash << 5) - hash) + chr; hash |= 0; //Convert to 32bit integer } return Math.abs(hash); }; ================================================ FILE: js/pretext-webwork/2.18/pretext-webwork.js ================================================ //Critical: // TODO: Think about what should be done for an essay question. //Accessibility: //Enhancement: // TODO: In a scaffold problem, adjust the green bar for when one part is correct. // TODO: Have randomize check that new seed is actually producing new HTML. // TODO: Don't offer randomize or button unless we know a new version can be produced after trying a few seeds. // TODO: In a staged problem, Make Interactive button is adjacent to solution knowls; move it. // TODO: MathQuill // TODO: Image pop up. // TODO: Deal with singleResult MultiAnswer problems. //Styling: // TODO: Review all styling in all scenarios (staged/not, correct/partly-correct/incorrect/blank, single/multiple) // TODO: Sean: I think I'd like to see a slightly larger font size on the buttons function handleWW(ww_id, action) { const ww_container = document.getElementById(ww_id); const ww_domain = ww_container.dataset.domain; const ww_problemSource = ww_container.dataset.problemsource; const ww_sourceFilePath = ww_container.dataset.sourcefilepath; const ww_course_id = ww_container.dataset.courseid; const ww_user_id = ww_container.dataset.userid; const ww_course_password = ww_container.dataset.coursepassword; const localize_correct = ww_container.dataset.localizeCorrect || "Correct"; const localize_incorrect = ww_container.dataset.localizeIncorrect || "Incorrect"; const localize_blank = ww_container.dataset.localizeBlank || "Blank"; const localize_submit = ww_container.dataset.localizeSubmit || "Submit"; const localize_check_responses = ww_container.dataset.localizeCheckResponses || "Check Responses"; const localize_reveal = ww_container.dataset.localizeReveal || "Reveal"; const localize_randomize = ww_container.dataset.localizeRandomize || "Randomize"; const localize_reset = ww_container.dataset.localizeReset || "Reset"; const runestone_logged_in = (typeof eBookConfig !== 'undefined' && eBookConfig.username !== ''); // will be null on pages generated prior to late December 2022 const activate_button = document.getElementById(ww_id + '-button') // Set the current seed if (!action) { ww_container.dataset.current_seed = ww_container.dataset.seed; if (runestone_logged_in) { ww_container.dataset.current_seed = webworkSeedHash(eBookConfig.username + ww_container.dataset.current_seed); } } else if (action == 'randomize') ww_container.dataset.current_seed = Number(ww_container.dataset.current_seed) + 100; let loader = document.createElement('div'); loader.style.position = 'absolute'; loader.style.left = 0; loader.style.top = 0; loader.style.backgroundColor = 'rgba(0.2, 0.2, 0.2, 0.4)'; loader.style.color = 'white'; loader.style.width = '100%'; loader.style.height = '100%'; loader.style.display = 'flex'; loader.style.alignItems = 'center'; loader.style.justifyContent = 'center'; loader.style.marginTop = '0'; loader.tabIndex = -1; const loaderText = document.createElement('span'); loaderText.textContent = 'Loading'; loaderText.style.fontSize = '2rem'; loader.appendChild(loaderText); ww_container.appendChild(loader); loader.focus(); if (!action) { // Determine if static version shows hints, solutions, or answers and save that information in the container dataset for later runs. ww_container.dataset.hasHint = ww_container.getElementsByClassName('hint').length > 0; ww_container.dataset.hasSolution = ww_container.getElementsByClassName('solution').length > 0; ww_container.dataset.hasAnswer = ww_container.getElementsByClassName('answer').length > 0; // Get (possibly localized) label text for hints and solutions. ww_container.dataset.hintLabelText = ww_container.dataset.hasHint == 'true' ? ww_container.querySelectorAll('.hint-knowl span.type, details.hint span.type')[0].textContent : 'Hint'; ww_container.dataset.solutionLabelText = ww_container.dataset.hasSolution == 'true' ? ww_container.querySelectorAll('.solution-knowl span.type, details.solution span.type')[0].textContent : 'Solution'; ww_container.tabIndex = -1; } let url; if (action == 'check') { const iframe = ww_container.querySelector('.problem-iframe'); const formData = new FormData(iframe.contentDocument.getElementById(ww_id + "-form")); const params = new URLSearchParams(formData); url = new URL(ww_domain + '/webwork2/html2xml?' + params.toString()) url.searchParams.append("answersSubmitted", '1'); url.searchParams.append('WWsubmit', "1"); } else { url = new URL(ww_domain + '/webwork2/html2xml'); url.searchParams.append("problemSeed", ww_container.dataset.current_seed); if (ww_problemSource) url.searchParams.append("problemSource", ww_problemSource); else if (ww_sourceFilePath) url.searchParams.append("sourceFilePath", ww_sourceFilePath); url.searchParams.append("answersSubmitted", '0'); url.searchParams.append("displayMode", "MathJax"); url.searchParams.append("courseID", ww_course_id); url.searchParams.append("userID", ww_user_id); url.searchParams.append("course_password", ww_course_password); url.searchParams.append("outputformat", "raw"); // note ww_container.dataset.hasSolution is a string, possibly 'false' which is true url.searchParams.append("showSolutions", ww_container.dataset.hasSolution == 'true' ? '1' : '0'); url.searchParams.append("showHints", ww_container.dataset.hasHint == 'true' ? '1' : '0'); url.searchParams.append("problemUUID",ww_id); } // get the json and do stuff with what we get $.getJSON(url.toString(), (data) => { // Create the form that will contain the text and input fields of the interactive problem. const form = document.createElement("form"); form.id = ww_id + "-form"; // Create a div for the problem text. const body_div = document.createElement("div"); body_div.id = ww_id + "-body"; body_div.classList.add("exercise", "exercise-like"); body_div.lang = data.lang; body_div.dir = data.dir; // Dump the problem text, answer blanks, etc. body_div.innerHTML = data.rh_result.text; // Replace all hn headings with h6 headings. for (const tag_name of ['h6', 'h5', 'h4', 'h3', 'h2', 'h1']) { const headings = body_div.getElementsByTagName(tag_name); for (heading of headings) { const new_heading = document.createElement("h6"); new_heading.innerHTML = heading.innerHTML; cloneAttributes(new_heading, heading); new_heading.classList.add('webwork-part'); heading.replaceWith(new_heading); } } adjustSrcHrefs(body_div, ww_domain); translateHintSol(ww_id, body_div, ww_domain, ww_container.dataset.hasHint == 'true', ww_container.dataset.hasSolution == 'true', ww_container.dataset.hintLabelText, ww_container.dataset.solutionLabelText) // insert previous answers if (runestone_logged_in) { const answersObject = (wwList[ww_id.replace(/-ww-rs$/,'')].answers ? wwList[ww_id.replace(/-ww-rs$/,'')].answers : {'answers' : [], 'mqAnswers' : []}); const mqAnswers = answersObject.mqAnswers; for (const mqAnswer in mqAnswers) { const mqInput = body_div.querySelector('input[id=' + mqAnswer + ']'); if (mqInput && mqInput.value == '') { mqInput.setAttribute('value', mqAnswers[mqAnswer]); } } const answers = answersObject.answers; for (const answer in answers) { const input = body_div.querySelector('input[id=' + answer + ']'); if (input && input.value == '') { input.setAttribute('value', answers[answer]); } if (input && input.type.toUpperCase() == 'RADIO') { const buttons = body_div.querySelectorAll('input[name=' + answer + ']'); for (const button of buttons) { if (button.value == answers[answer]) { button.setAttribute('checked', 'checked'); } } } if (input && input.type.toUpperCase() == 'CHECKBOX') { const checkboxes = body_div.querySelectorAll('input[name=' + answer + ']'); for (const checkbox of checkboxes) { // This is not a bulletproof approach if the problem used input values that are weird // For example, with commas in them // However, we are stuck with WW providing answers[answer] as a string like `[value0, value1]` // and note that it is not `["value0", "value1"]`, so we cannot cleanly parse it into an array let checkbox_regex = new RegExp('(\\[|, )' + checkbox.value + '(, |\\])'); if (answers[answer].match(checkbox_regex)) { checkbox.setAttribute('checked', 'checked'); } } } var select = body_div.querySelector('select[id=' + answer + ']'); if (select && answers[answer]) { // answers[answer] may be wrapped in \text{...} that we want to remove, since value does not have this. let this_answer = answers[answer]; if (/^\\text\{.*\}$/.test(this_answer)) {this_answer = this_answer.match(/^\\text\{(.*)\}$/)[1]}; let quote_escaped_answer = this_answer.replace(/"/g, '\\"'); const option = body_div.querySelector(`select[id="${answer}"] option[value="${quote_escaped_answer}"]`); if (option) {option.setAttribute('selected', 'selected')}; } } } // insert our cleaned up problem text form.appendChild(body_div); // Set up hidden input fields that the form uses const wwInputs = { problemSeed: data.inputs_ref.problemSeed, problemUUID: data.inputs_ref.problemUUID, psvn: data.inputs_ref.psvn, courseName: ww_course_id, courseID: ww_course_id, userID: ww_user_id, course_password: ww_course_password, displayMode: "MathJax", session_key: data.rh_result.session_key, outputformat: "raw", language: data.formLanguage, showSummary: data.showSummary, // note ww_container.dataset.hasSolution is a string, possibly 'false' which is true showSolutions: ww_container.dataset.hasSolution == 'true' ? '1' : '0', showHints: ww_container.dataset.hasHint == 'true' ? '1' : '0', forcePortNumber: data.forcePortNumber }; if (ww_sourceFilePath) wwInputs.sourceFilePath = ww_sourceFilePath; else if (ww_problemSource) wwInputs.problemSource = ww_problemSource; for (const wwInputName of Object.keys(wwInputs)) { const input = document.createElement('input'); input.type = 'hidden'; input.name = wwInputName; input.value = wwInputs[wwInputName]; form.appendChild(input); } // Prepare answers object const answers = {}; // id the answers even if we won't populate them Object.keys(data.rh_result.answers).forEach(function(id) { answers[id] = {}; }, data.rh_result.answers); if (ww_container.dataset.hasAnswer == 'true') { // Update answer data Object.keys(data.rh_result.answers).forEach(function(id) { answers[id] = { correct_ans: this[id].correct_ans, correct_ans_latex_string: this[id].correct_ans_latex_string, correct_choice: this[id].correct_choice, correct_choices: this[id].correct_choices, }; }, data.rh_result.answers); } let buttonContainer = ww_container.querySelector('.problem-buttons.webwork'); // Create the submission buttons if they have not yet been created. if (!buttonContainer) { // Hide the original div that contains the old make active button. ww_container.querySelector('.problem-buttons').classList.add('hidden-content'); // And the newer activate button if it is there if (activate_button != null) {activate_button.classList.add('hidden-content');}; // Create a new div for the webwork buttons. buttonContainer = document.createElement('div'); buttonContainer.classList.add('problem-buttons', 'webwork'); if (activate_button != null) { // Make sure the button container follows the activate button in the DOM activate_button.after(buttonContainer); } else { ww_container.prepend(buttonContainer); } // Check button const check = document.createElement("button"); check.type = "button"; check.id = ww_id + '-check'; check.style.marginRight = "0.25rem"; check.classList.add('webwork-button'); // Adjust if more than one answer to check const answerCount = body_div.querySelectorAll("input:not([type=hidden])").length + body_div.querySelectorAll("select:not([type=hidden])").length; check.textContent = runestone_logged_in ? localize_submit : localize_check_responses; check.addEventListener('click', () => handleWW(ww_id, "check")); buttonContainer.appendChild(check); // Show correct answers button if original PTX has answer knowl. if (ww_container.dataset.hasAnswer == 'true') { const correct = document.createElement("button"); correct.classList.add("show-correct", 'webwork-button'); correct.type = "button"; correct.style.marginRight = "0.25rem"; correct.textContent = localize_reveal; correct.addEventListener('click', () => WWshowCorrect(ww_id, answers)); buttonContainer.appendChild(correct); } // randomize button const randomize = document.createElement("button") randomize.type = "button"; randomize.classList.add('webwork-button'); randomize.style.marginRight = "0.25rem"; randomize.textContent = localize_randomize; randomize.addEventListener('click', () => handleWW(ww_id, 'randomize')); buttonContainer.appendChild(randomize) // reset button const reset = document.createElement("button") reset.type = "button" reset.classList.add('webwork-button'); reset.textContent = localize_reset; reset.addEventListener('click', () => resetWW(ww_id)); buttonContainer.appendChild(reset) } else { // Update the click handler for the show correct button. if (ww_container.dataset.hasAnswer == 'true') { const correct = buttonContainer.querySelector('.show-correct'); const correctNew = correct.cloneNode(true); correctNew.addEventListener('click', () => WWshowCorrect(ww_id, answers)); correct.replaceWith(correctNew); } } if (action == 'check') { // Runestone trigger // TODO: condition on platform=Runestone $("body").trigger('runestone_ww_check', data) const inputs = body_div.querySelectorAll("input:not([type=hidden])"); for (const input of inputs) { const name = input.name; if (input.type == 'text' && answers[name]) { const score = data.rh_result.answers[name].score; let headline = ''; let correctClass = ''; if (score >= 1) { headline = localize_correct + '!'; correctClass = 'correct'; } else if (score > 0 && score < 1) { headline = `${Math.round(score * 100)}% ${localize_correct}.`; correctClass = 'partly-correct'; } else if (data.rh_result.answers[name].student_ans == '') { headline = localize_blank + '.'; correctClass = 'blank'; } else if (score <= 0) { headline = localize_incorrect + '.'; correctClass = 'incorrect'; } let title = `${headline}`; let message = (data.rh_result.answers[name].ans_message ? data.rh_result.answers[name].ans_message : ''); input.classList.add(correctClass); // make a span that contains feedback feedbackSpan = document.createElement('span'); feedbackSpan.id = `${ww_id}-${name}-feedback`; feedbackHeadline = document.createElement('span'); feedbackHeadline.id = `${ww_id}-${name}-headline`; feedbackHeadline.textContent = headline; feedbackSpan.appendChild(feedbackHeadline); feedbackMessage = document.createElement('span'); feedbackMessage.id = `${ww_id}-${name}-message`; feedbackMessage.textContent = message; feedbackSpan.appendChild(feedbackMessage); // make a non breaking span to surround input, sr span, and feedback button let nbSpan = document.createElement('span'); nbSpan.classList.add("nobreak"); input.parentNode.insertBefore(nbSpan, input); nbSpan.appendChild(input); // put a visibly hidden (screen-reader only) span with feedback let srSpan = document.createElement('span'); srSpan.classList.add("visually-hidden"); srSpan.appendChild(feedbackSpan); nbSpan.appendChild(srSpan); // give the feedback to sr users immediately input.setAttribute('aria-describedby',`${ww_id}-${name}-feedback`); // make the feedback button srSpan.after(createFeedbackButton(`${ww_id}-${name}`, title, message)); } if (input.type.toUpperCase() == 'RADIO' && answers[name]) { const score = data.rh_result.answers[name].score; const student_ans = data.rh_result.answers[name].student_value || data.rh_result.answers[name].student_ans; const correct_ans = data.rh_result.answers[name].correct_choice || data.rh_result.answers[name].correct_ans; if (input.value == student_ans) { if (score == 1) { input.parentNode.classList.add('correct'); } else { input.parentNode.classList.add('incorrect'); } const feedbackButton = createFeedbackButton(`${ww_id}-${name}`, (student_ans == correct_ans) ? `${localize_correct}` : `${localize_incorrect}.`) feedbackButton.style.marginRight = '0.25rem'; input.after(feedbackButton); } } if (input.type.toUpperCase() == 'CHECKBOX' && answers[name]) { const score = data.rh_result.answers[name].score; const student_ans = data.rh_result.answers[name].student_ans; const correct_ans = data.rh_result.answers[name].correct_ans; if (input.value == data.rh_result.answers[name].firstElement) { const checkbox_div = input.parentNode.parentNode; if (score == 1) { checkbox_div.classList.add('correct'); } else { checkbox_div.classList.add('incorrect'); } const feedbackButton = createFeedbackButton(`${ww_id}-${name}`, (student_ans == correct_ans) ? `${localize_correct}` : `${localize_incorrect}.`) checkbox_div.insertBefore(feedbackButton, checkbox_div.firstChild); } } } const hiddenInputs = body_div.querySelectorAll("input[type=hidden]"); for (const input of hiddenInputs) { const name = input.name; if (!input.nextElementSibling) continue; const graphtoolContainer = input.nextElementSibling.nextElementSibling; if (graphtoolContainer && answers[name] && graphtoolContainer.classList.contains('graphtool-container')) { graphtoolContainer.style.position = 'relative'; const score = data.rh_result.answers[name].score; let title = ''; if (score == 1) { title = `${localize_correct}`; } else if (score > 0 && score < 1) { title = `${Math.round(score * 100)}% ${localize_correct}.`; } else if (data.rh_result.answers[name].student_ans == '') { // do nothing if the submitted answer is blank and the problem has not already been scored as correct continue; } else if (score == 0) { title = `${localize_incorrect}.`; } const feedbackButton = createFeedbackButton(`${ww_id}-${name}`, title, data.rh_result.answers[name].ans_message); feedbackButton.style.position = 'absolute'; feedbackButton.style.left = '100%'; feedbackButton.style.top = 0; feedbackButton.style.marginLeft = '0.5rem'; feedbackButton.dataset.bsContainer = 'body'; graphtoolContainer.appendChild(feedbackButton); if (score == 1) { graphtoolContainer.classList.add('correct'); } else { graphtoolContainer.classList.add('incorrect'); } } } const selects = body_div.querySelectorAll("select:not([type=hidden])"); for (const select of selects) { const name = select.name; const score = data.rh_result.answers[name].score; let title = ''; if (score == 1) { headline = localize_correct + '!'; correctClass = 'correct'; } else { headline = localize_incorrect + '.'; correctClass = 'incorrect'; } select.classList.add(correctClass); title = `${headline}`; // make a span that contains feedback feedbackSpan = document.createElement('span'); feedbackSpan.id = `${ww_id}-${name}-feedback`; feedbackHeadline = document.createElement('span'); feedbackHeadline.id = `${ww_id}-${name}-headline`; feedbackHeadline.textContent = headline; feedbackSpan.appendChild(feedbackHeadline); // make a non breaking span to surround select, sr span, and feedback button let nbSpan = document.createElement('span'); nbSpan.classList.add("nobreak"); select.parentNode.insertBefore(nbSpan, select); nbSpan.appendChild(select); // put a span around select since select does not support ::after pseudo elements let psSpan = document.createElement('span'); psSpan.classList.add("select-wrapper", correctClass); select.parentNode.insertBefore(psSpan, select); psSpan.appendChild(select); // put a visibly hidden (screen-reader only) span with feedback let srSpan = document.createElement('span'); srSpan.classList.add("visually-hidden"); srSpan.appendChild(feedbackSpan); nbSpan.appendChild(srSpan); // give the feedback to sr users immediately select.setAttribute('aria-describedby',`${ww_id}-${name}-feedback`); // make the feedback button srSpan.after(createFeedbackButton(`${ww_id}-${name}`, title)); } } let iframeContents = '' + '' + `` + '' + '' + '' + ''; // Determine javascript and css dependencies const extra_css_files = []; const extra_js_files = []; //if (data.rh_result.flags.extra_js_files) { // for (const jsFile of data.rh_result.flags.extra_js_files) { // if (jsFile.file == "js/apps/GraphTool/graphtool.min.js" || jsFile.file == "js/apps/Scaffold/scaffold.js") { // extra_css_files.push({ file: 'js/vendor/bootstrap/css/bootstrap.css', external: '0' }); // extra_css_files.push({ file: 'themes/math4/math4.css', external: '0' }); // extra_js_files.push({ file: 'js/vendor/bootstrap/js/bootstrap.js', external: '0' }); // } // } //} if (data.extra_css_files) data.extra_css_files.unshift(...extra_css_files); else data.extra_css_files = extra_css_files; for (const cssFile of data.extra_css_files) { if (/knowl/.test(cssFile.file)) continue; iframeContents += ''; } if (data.extra_js_files) data.extra_js_files.unshift(...extra_js_files); else data.extra_js_files = extra_js_files; for (const jsFile of data.extra_js_files) { if (/knowl/.test(jsFile.file)) continue; iframeContents += ''; } iframeContents += '' + '' + '' + `` + '
    ' + form.outerHTML + '
    ' + ''; let iframe; // If there is no action this is the initialization call. if (!action) { // Create the iframe. iframe = document.createElement('iframe'); iframe.style.width = '1px'; iframe.style.minWidth = '100%'; iframe.classList.add('problem-iframe'); // Hide the static problem ww_container.querySelector('.problem-contents').classList.add('hidden-content'); if (activate_button != null) { // Make sure the iframe follows the activate button in the DOM activate_button.after(iframe); } else { ww_container.prepend(iframe); } iFrameResize({ checkOrigin: false, scrolling: 'omit', heightCalculationMethod: 'min' }, iframe); iframe.addEventListener('load', () => { // Set up form submission from inside the iframe. const iframeForm = iframe.contentDocument.getElementById(ww_id + '-form'); iframeForm.addEventListener('submit', (e) => { handleWW(ww_id, "check"); e.preventDefault(); }); iframe.contentDocument.querySelectorAll('.collapse.in').forEach(collapse => collapse.classList.add('expanded')); iframe.contentWindow.jQuery('.collapse').on('shown', function(e) { if (e.target != this) return; this.classList.add('expanded'); }); iframe.contentWindow.jQuery('.collapse').on('hide', function(e) { if (e.target != this) return; this.classList.remove('expanded'); }); iframe.contentDocument.querySelectorAll("button.ww-feedback[data-bs-content]").forEach(button => { const bsPopover = new iframe.contentWindow.bootstrap.Popover(button, { html: true, placement: 'bottom', fallbackPlacements: [], trigger: 'click', customClass: 'result-popover' + (button.dataset.emptyContent ? ' nocontent' : '') }); bsPopover.show(); const content = iframe.contentDocument.getElementById(button.id.replace("-feedback-button", "-content")); const popover = content.parentNode.parentNode; bsPopover.hide(); /*button.addEventListener('shown.bs.popover', () => { // Note that the button itself has the aria-describedby attribute set by bootstrap automatically. button.previousElementSibling?.setAttribute('aria-describedby', popover.id); });*/ button.addEventListener('click', () => bsPopover.show(), { once: true }); popover.querySelector('.popover-arrow').remove(); const title = popover.querySelector('.popover-header'); if (button.dataset.emptyContent) content.parentNode.remove(); if (title.textContent == localize_correct + '!') title.classList.add('correct'); }); iframe.contentWindow.MathJax.startup.promise.then(() => iframe.contentWindow.MathJax.typesetPromise(['.popover', '.popover-content'])); }); } else { iframe = ww_container.querySelector('.problem-iframe'); } iframe.srcdoc = iframeContents; iframe.addEventListener('load', () => { // Remove the loader overlay loader.remove(); }, { once: true }) // Place focus on the problem. ww_container.focus() }); } function WWshowCorrect(ww_id, answers) { const ww_container = document.getElementById(ww_id); const iframe = ww_container.querySelector('.problem-iframe'); const body = iframe.contentDocument.getElementById(ww_id + '-body') $("body").trigger("runestone_show_correct", { "ww_id": ww_id, "answers": answers }); let inputs = body.querySelectorAll("input:not([type=hidden])"); for (const input of inputs) { const name = input.name; const span_id = `${ww_id}-${name}-correct`; if (input.type == 'text' && answers[name] && !(iframe.contentDocument.getElementById(span_id))) { const input_id = input.id; const mq_span = iframe.contentDocument.getElementById(`mq-answer-${input_id}`); if (mq_span) { mq_span.style.display = 'none'; } const feedbackButton = iframe.contentDocument.getElementById(`${ww_id}-${name}-feedback-button`); if (feedbackButton) { iframe.contentWindow.bootstrap.Popover.getInstance(feedbackButton)?.hide(); feedbackButton.remove(); } label = iframe.contentDocument.getElementById(`${span_id}-label`); if (label) { label.parentElement.insertBefore(input, label); label.remove(); } input.type = "hidden"; // we need to convert things like < in answers to < const correct_ans_text = iframe.contentDocument.createElement('div'); correct_ans_text.innerHTML = answers[name].correct_ans; input.value = correct_ans_text.textContent; const show_span = iframe.contentDocument.createElement('span'); show_span.id = span_id; show_span.appendChild(answers[name].correct_ans_latex_string ? iframe.contentDocument.createTextNode('\\(' + answers[name].correct_ans_latex_string + '\\)') : iframe.contentDocument.createTextNode(answers[name].correct_ans)); input.parentElement.insertBefore(show_span, input); } if (input.type.toUpperCase() == 'RADIO' && answers[name]) { const feedbackButton = iframe.contentDocument.getElementById(`${ww_id}-${name}-feedback-button`); if (feedbackButton) { iframe.contentWindow.bootstrap.Popover.getInstance(feedbackButton)?.hide(); feedbackButton.remove(); } const correct_ans = answers[name].correct_choice || answers[name].correct_ans; if (input.value == correct_ans) { input.checked = true; //input.setAttribute('checked', 'checked'); } else { input.checked = false; } } if (input.type.toUpperCase() == 'CHECKBOX' && answers[name]) { const correct_choices = answers[name].correct_choices; if (correct_choices.includes(input.value)) { input.checked = true; // input.setAttribute('checked', 'checked'); } else { input.checked = false; // input.setAttribute('checked', false); } } } const hiddenInputs = body.querySelectorAll("input[type=hidden]"); for (const input of hiddenInputs) { const name = input.name; if (!input.nextElementSibling) continue; const graphtoolContainer = input.nextElementSibling.nextElementSibling; if (graphtoolContainer && answers[name] && graphtoolContainer.classList.contains('graphtool-container')) { const feedbackButton = iframe.contentDocument.getElementById(`${ww_id}-${name}-feedback-button`); if (feedbackButton) { iframe.contentWindow.bootstrap.Popover.getInstance(feedbackButton)?.hide(); feedbackButton.remove(); } const correct_ans_div = iframe.contentDocument.createElement('div'); input.parentElement.insertBefore(correct_ans_div, graphtoolContainer); graphtoolContainer.style.display = 'none'; input.value = answers[name].correct_ans; iframe.contentWindow.jQuery(correct_ans_div).html(answers[name].correct_ans_latex_string); const script = iframe.contentDocument.createElement('script'); script.textContent = correct_ans_div.querySelector('script').textContent .replace('\nwindow.addEventListener("DOMContentLoaded",', '(') .replace(/;\n$/, '();'); iframe.contentDocument.body.appendChild(script); } } let selects = body.querySelectorAll("select:not([type=hidden])"); for (const select of selects) { const name = select.name; const span_id = `${ww_id}-${name}-correct`; if (answers[name] && !iframe.contentDocument.getElementById(span_id)) { const feedbackButton = iframe.contentDocument.getElementById(`${ww_id}-${name}-feedback-button`); if (feedbackButton) { iframe.contentWindow.bootstrap.Popover.getInstance(feedbackButton)?.hide(); feedbackButton.remove(); } select.style.display = "none"; select.value = answers[name].correct_ans; const show_span = iframe.contentDocument.createElement('span'); show_span.id = span_id; show_span.appendChild(answers[name].correct_ans_latex_string ? iframe.contentDocument.createTextNode('\\(' + answers[name].correct_ans_latex_string + '\\)') : iframe.contentDocument.createTextNode(answers[name].correct_ans)); select.parentElement.insertBefore(show_span, select); } } // run MathJax on our new rendering // FIXME: We only need to typeset the added elements, not the entire body. const mathjaxTypesetScript = iframe.contentDocument.createElement('script'); mathjaxTypesetScript.textContent = 'MathJax.startup.promise.then(() => MathJax.typesetPromise([document.body]));'; iframe.contentDocument.body.appendChild(mathjaxTypesetScript); } function resetWW(ww_id) { const ww_container = document.getElementById(ww_id); const activate_button = document.getElementById(ww_id + '-button'); ww_container.dataset.current_seed = ww_container.dataset.seed; iframe = ww_container.querySelector('.problem-iframe'); iframe.remove(); ww_container.querySelector('.problem-contents').classList.remove('hidden-content'); ww_container.querySelector('.problem-buttons.webwork').remove(); ww_container.querySelector('.problem-buttons').classList.remove('hidden-content'); // if the newer activate button is there (but hidden) bring it back too if (activate_button != null) {activate_button.classList.remove('hidden-content');}; } function adjustSrcHrefs(container,ww_domain) { container.querySelectorAll('[href]').forEach((node) => { const href = node.attributes.href.value; if (href !== '#' && !href.match(/^[a-z]+:\/\//i)) node.href = ww_domain + '/' + href; }); container.querySelectorAll('[src]').forEach((node) => { node.src = new URL(node.attributes.src.value, ww_domain).href; }); } function translateHintSol(ww_id, body_div, ww_domain, b_ptx_has_hint, b_ptx_has_solution, hint_label_text, solution_label_text) { // the problem text may come with "hint"s and "solution"s // Each one is an "a" with the class ".knowl" and the data-type attribute of either "hint" or "solution". // the WeBWorK knowl js would normally handle this, but we want PreTeXt knowl js to handle it // so we replace the "a" with the content that should be there for PTX knowl js // also if hint/sol were missing from the static version, we want these removed here const hintSols = body_div.querySelectorAll('.knowl[data-type="hint"],.knowl[data-type="solution"]'); let solutionlikewrapper; for (const hintSol of hintSols) { const hintsolp = hintSol.parentNode; if (!hintsolp) continue; const hintsolpp = hintsolp.parentNode; //the div that contains each p with a knowl anchor const hintSolType = hintSol.dataset.type; if (hintsolpp.querySelectorAll(".webwork.solutions").length == 0) { solutionlikewrapper = document.createElement('div'); solutionlikewrapper.classList.add('webwork', 'solutions'); hintsolpp.insertBefore(solutionlikewrapper, hintsolp); } if ((hintSolType == 'solution' && !b_ptx_has_solution) || (hintSolType == 'hint' && !b_ptx_has_hint)) continue; const knowlDetails = document.createElement('details'); knowlDetails.classList.add(hintSolType); knowlDetails.classList.add('solution-like'); knowlDetails.classList.add('born-hidden-knowl'); const knowlSummary = document.createElement('summary'); const summaryLabel = document.createElement('span'); summaryLabel.classList.add('type'); summaryLabel.innerHTML = hintSolType == 'hint' ? hint_label_text : solution_label_text; knowlSummary.appendChild(summaryLabel); knowlDetails.appendChild(knowlSummary); const knowlContents = document.createElement('div'); knowlContents.classList.add(hintSolType); knowlContents.classList.add('solution-like'); knowlContents.innerHTML = hintsolp.firstElementChild.dataset.knowlContents; knowlDetails.appendChild(knowlContents); adjustSrcHrefs(knowlContents, ww_domain) solutionlikewrapper.appendChild(knowlDetails); } for (const hintSol of hintSols) { hintSol.parentNode?.remove(); } } function cloneAttributes(target, source) { [...source.attributes].forEach( attr => { target.setAttribute(attr.nodeName ,attr.nodeValue) }); } function createFeedbackButton(id, title, content) { const feedbackButton = document.createElement('button'); feedbackButton.dataset.bsTitle = title; feedbackButton.dataset.bsContent = `
    ${content || ''}
    `; if (!content) feedbackButton.dataset.emptyContent = '1'; const contentSpan = document.createElement('span'); contentSpan.innerHTML = ``; feedbackButton.appendChild(contentSpan); feedbackButton.type = 'button'; feedbackButton.classList.add('ww-feedback'); feedbackButton.id = `${id}-feedback-button`; feedbackButton.dataset.bsToggle = 'popover'; return feedbackButton; } function webworkSeedHash(string) { var hash = 0, i, chr; if (string.length === 0) return hash; for (i = 0; i < string.length; i++) { chr = string.charCodeAt(i); hash = ((hash << 5) - hash) + chr; hash |= 0; //Convert to 32bit integer } return Math.abs(hash); }; ================================================ FILE: js/pretext-webwork/2.19/pretext-webwork.js ================================================ //Critical: // TODO: Think about what should be done for an essay question. //Accessibility: //Enhancement: // TODO: Have randomize check that new seed is actually producing new HTML. // TODO: Don't offer randomize button unless we know a new version can be produced after trying a few seeds. //Styling: // TODO: Review all styling in all scenarios (staged/not, correct/partly-correct/incorrect/blank, single/multiple) async function handleWW(ww_id, action) { const ww_container = document.getElementById(ww_id); const ww_domain = ww_container.dataset.domain; const ww_processing = 'webwork2'; const ww_origin = ww_container.dataset.origin; const ww_problemSource = ww_container.dataset.problemsource; const ww_sourceFilePath = ww_container.dataset.sourcefilepath; const ww_course_id = ww_container.dataset.courseid; const ww_user_id = ww_container.dataset.userid; const ww_passwd = ww_container.dataset.coursepassword; const localize_submit = ww_container.dataset.localizeSubmit || "Submit"; const localize_check_responses = ww_container.dataset.localizeCheckResponses || "Check Responses"; const localize_reveal = ww_container.dataset.localizeReveal || "Reveal"; const localize_randomize = ww_container.dataset.localizeRandomize || "Randomize"; const localize_reset = ww_container.dataset.localizeReset || "Reset"; const runestone_logged_in = (typeof eBookConfig !== 'undefined' && eBookConfig.username !== ''); // will be null on pages generated prior to late December 2022 const activate_button = document.getElementById(ww_id + '-button') // Set the current seed if (!action) { ww_container.dataset.current_seed = ww_container.dataset.seed; if (runestone_logged_in) { ww_container.dataset.current_seed = webworkSeedHash(eBookConfig.username + ww_container.dataset.current_seed); } } else if (action == 'randomize') ww_container.dataset.current_seed = Number(ww_container.dataset.current_seed) + 100; let loader = document.createElement('div'); loader.style.position = 'absolute'; loader.style.left = 0; loader.style.top = 0; loader.style.backgroundColor = 'rgba(0.2, 0.2, 0.2, 0.4)'; loader.style.color = 'white'; loader.style.width = '100%'; loader.style.height = '100%'; loader.style.display = 'flex'; loader.style.alignItems = 'center'; loader.style.justifyContent = 'center'; loader.style.marginTop = '0'; loader.tabIndex = -1; const loaderText = document.createElement('span'); loaderText.textContent = 'Loading'; loaderText.style.fontSize = '2rem'; loader.appendChild(loaderText); ww_container.appendChild(loader); loader.focus(); if (!action) { // Determine if static version shows hints, solutions, or answers and save that information in the container dataset for later runs. ww_container.dataset.hasHint = ww_container.getElementsByClassName('hint').length > 0; ww_container.dataset.hasSolution = ww_container.getElementsByClassName('solution').length > 0; ww_container.dataset.hasAnswer = ww_container.getElementsByClassName('answer').length > 0; // Get (possibly localized) label text for hints and solutions. ww_container.dataset.hintLabelText = ww_container.dataset.hasHint == 'true' ? ww_container.querySelectorAll('.hint-knowl span.type, details.hint span.type')[0].textContent : 'Hint'; ww_container.dataset.solutionLabelText = ww_container.dataset.hasSolution == 'true' ? ww_container.querySelectorAll('.solution-knowl span.type, details.solution span.type')[0].textContent : 'Solution'; ww_container.tabIndex = -1; } let url; if (ww_processing == 'webwork2') { url = new URL(ww_domain + '/webwork2/render_rpc'); } let formData = new FormData(); let generatedPG = 'generated/webwork/pg/'; if (runestone_logged_in) { generatedPG = `/ns/books/published/${eBookConfig.basecourse}/${generatedPG}`; } if (action == 'check' || action =='reveal') { const iframe = ww_container.querySelector('.problem-iframe'); formData = new FormData(iframe.contentDocument.getElementById(ww_id + "-form")); formData.set("answersSubmitted", '1'); formData.set('WWsubmit', "1"); if (action == 'reveal' && ww_container.dataset.hasAnswer == 'true') { formData.set('WWcorrectAnsOnly', "1"); } if (ww_origin == 'generated') { const rawProblemSource = await fetch(generatedPG + ww_problemSource).then((r) => r.text()); formData.set("rawProblemSource", rawProblemSource); } else if (ww_origin == 'webwork2') formData.set("sourceFilePath", ww_sourceFilePath); } else { formData.set("problemSeed", ww_container.dataset.current_seed); if (ww_origin == 'generated') { const rawProblemSource = await fetch(generatedPG + ww_problemSource).then((r) => r.text()); formData.set("rawProblemSource", rawProblemSource); } else if (ww_origin == 'webwork2') formData.set("sourceFilePath", ww_sourceFilePath); formData.set("answersSubmitted", '0'); formData.set("displayMode", "MathJax"); formData.set("courseID", ww_course_id); formData.set("user", ww_user_id); formData.set("userID", ww_user_id); formData.set("passwd", ww_passwd); formData.set("disableCookies", '1'); formData.set("outputformat", "raw"); // note ww_container.dataset.hasSolution is a string, possibly 'false' which is true formData.set("showSolutions", ww_container.dataset.hasSolution == 'true' ? '1' : '0'); formData.set("showHints", ww_container.dataset.hasHint == 'true' ? '1' : '0'); formData.set("problemUUID",ww_id); } // If in Runestone, check if there are previous answer submissions and get them now to use in the form. let checkboxesString = ''; if (runestone_logged_in && !action) { const answersObject = (wwList[ww_id.replace(/-ww-rs$/,'')].answers ? wwList[ww_id.replace(/-ww-rs$/,'')].answers : {'answers' : [], 'mqAnswers' : []}); const previousAnswers = answersObject.answers; if (previousAnswers !== null) { formData.set('WWsubmit', 1); } for (const answer in previousAnswers) { if (previousAnswers[answer].constructor === Array) { for (const k in previousAnswers[answer]) { checkboxesString += '&'; checkboxesString += answer; checkboxesString += '='; checkboxesString += previousAnswers[answer][k]; } } else { formData.set(answer, previousAnswers[answer]); } } } // Need to get form data as a string, including possible repeated checkbox names // Do not pass post data as an object, or checkbox names will overwrite one another const formString = new URLSearchParams(formData).toString(); $.post(url, formString + checkboxesString, (data) => { // Create the form that will contain the text and input fields of the interactive problem. const form = document.createElement("form"); form.id = ww_id + "-form"; form.dataset.iframeHeight = 1; // Create a div for the problem text. const body_div = document.createElement("div"); body_div.id = ww_id + "-body"; body_div.classList.add("exercise", "exercise-like"); body_div.lang = data.lang; body_div.dir = data.dir; // Dump the problem text, answer blanks, etc. body_div.innerHTML = data.rh_result.text; // If showPartialCorrectAnswers = 0, alter the feedback buttons according to whether or not the score is 100%. if ('showPartialCorrectAnswers' in data.rh_result.flags && data.rh_result.flags.showPartialCorrectAnswers == 0) { if ('score' in data.rh_result.problem_result && data.rh_result.problem_result.score >= 1) { body_div.querySelectorAll('button.ww-feedback-btn').forEach( function(button) { button.classList.remove('btn-info'); button.classList.add('btn-success'); button.setAttribute('aria-label', 'Correct'); button.dataset.bsCustomClass = button.dataset.bsCustomClass + ' correct'; button.dataset.bsTitle = button.dataset.bsTitle.replace('Answer Preview', 'Correct'); button.firstChild.classList.add('correct') } ); } else { body_div.querySelectorAll('button.ww-feedback-btn').forEach( function(button) { button.setAttribute('aria-label', 'One or more answers incorrect'); button.dataset.bsTitle = button.dataset.bsTitle.replace('Answer Preview', 'One or more answers incorrect'); } ); } } // Replace all hn headings with h6 headings. for (const tag_name of ['h6', 'h5', 'h4', 'h3', 'h2', 'h1']) { const headings = body_div.getElementsByTagName(tag_name); for (heading of headings) { const new_heading = document.createElement("h6"); new_heading.innerHTML = heading.innerHTML; cloneAttributes(new_heading, heading); new_heading.classList.add('webwork-part'); heading.replaceWith(new_heading); } } // Hide textarea input and hide associated buttons var textareas = body_div.getElementsByTagName("textarea"); for(var i = 0, max = textareas.length; i < max; i++) { textareas[i].style.display = "none"; textareas[i].className = ''; } var textareabuttons = body_div.querySelectorAll(".latexentry-preview"); for(var i = 0, max = textareabuttons.length; i < max; i++) { textareabuttons[i].remove(); } adjustSrcHrefs(body_div, ww_domain); translateHintSol(ww_id, body_div, ww_domain, ww_container.dataset.hasHint == 'true', ww_container.dataset.hasSolution == 'true', ww_container.dataset.hintLabelText, ww_container.dataset.solutionLabelText) // insert previous answers if (runestone_logged_in) { const answersObject = (wwList[ww_id.replace(/-ww-rs$/,'')].answers ? wwList[ww_id.replace(/-ww-rs$/,'')].answers : {'answers' : [], 'mqAnswers' : []}); const mqAnswers = answersObject.mqAnswers; for (const mqAnswer in mqAnswers) { const mqInput = body_div.querySelector('input[id=' + mqAnswer + ']'); if (mqInput && mqInput.value == '') { mqInput.setAttribute('value', mqAnswers[mqAnswer]); } } const answers = answersObject.answers; for (const answer in answers) { const input = body_div.querySelector('input[id=' + answer + ']'); if (input && input.value == '') { input.setAttribute('value', answers[answer]); } } } // insert our cleaned up problem text form.appendChild(body_div); // Set up hidden input fields that the form uses const wwInputs = { problemSeed: data.inputs_ref.problemSeed, problemUUID: data.inputs_ref.problemUUID, psvn: data.inputs_ref.psvn, courseName: ww_course_id, courseID: ww_course_id, user: ww_user_id, passwd: ww_passwd, displayMode: "MathJax", session_key: data.rh_result.session_key, outputformat: "raw", language: data.formLanguage, showSummary: data.showSummary, disableCookies: '1', // note ww_container.dataset.hasSolution is a string, possibly 'false' which is true showSolutions: ww_container.dataset.hasSolution == 'true' ? '1' : '0', showHints: ww_container.dataset.hasHint == 'true' ? '1' : '0', forcePortNumber: data.forcePortNumber }; if (ww_sourceFilePath) wwInputs.sourceFilePath = ww_sourceFilePath; else if (ww_problemSource && ww_origin == 'webwork2') wwInputs.problemSource = ww_problemSource; for (const wwInputName of Object.keys(wwInputs)) { const input = document.createElement('input'); input.type = 'hidden'; input.name = wwInputName; input.value = wwInputs[wwInputName]; form.appendChild(input); } let buttonContainer = ww_container.querySelector('.problem-buttons.webwork'); // Create the submission buttons if they have not yet been created. if (!buttonContainer) { // Hide the original div that contains the Activate. ww_container.querySelector('.problem-buttons').classList.add('hidden-content', 'hidden'); // Create a new div for the webwork buttons. buttonContainer = document.createElement('div'); buttonContainer.classList.add('problem-buttons', 'webwork'); if (activate_button != null) { // Make sure the button container follows the activate button in the DOM activate_button.after(buttonContainer); } else { ww_container.prepend(buttonContainer); } // Check button const check = document.createElement("button"); check.type = "button"; check.id = ww_id + '-check'; check.style.marginRight = "0.25rem"; check.classList.add('webwork-button'); check.textContent = runestone_logged_in ? localize_submit : localize_check_responses; check.addEventListener('click', () => handleWW(ww_id, "check")); buttonContainer.appendChild(check); // Show correct answers button if original PTX has answer knowl. if (ww_container.dataset.hasAnswer == 'true') { const correct = document.createElement("button"); correct.classList.add("show-correct", 'webwork-button'); correct.type = "button"; correct.style.marginRight = "0.25rem"; correct.textContent = localize_reveal; correct.addEventListener('click', () => handleWW(ww_id, 'reveal')); buttonContainer.appendChild(correct); } // randomize button const randomize = document.createElement("button") randomize.type = "button"; randomize.classList.add('webwork-button'); randomize.style.marginRight = "0.25rem"; randomize.textContent = localize_randomize; randomize.addEventListener('click', () => handleWW(ww_id, 'randomize')); buttonContainer.appendChild(randomize) // reset button const reset = document.createElement("button") reset.type = "button" reset.classList.add('webwork-button'); reset.textContent = localize_reset; reset.addEventListener('click', () => resetWW(ww_id)); buttonContainer.appendChild(reset) } if (runestone_logged_in && action == 'check') { // Runestone trigger $("body").trigger('runestone_ww_check', data) } let courseUrlBase = ''; if (runestone_logged_in){ courseUrlBase = '/ns/books/published/' + eBookConfig.basecourse + '/'; } let iframeContents = '' + '' + `` + '' + `` + '' + ''; // Determine javascript and css dependencies const extra_css_files = []; const extra_js_files = []; if (data.extra_css_files) data.extra_css_files.unshift(...extra_css_files); else data.extra_css_files = extra_css_files; for (const cssFile of data.extra_css_files) { iframeContents += ''; } if (data.extra_js_files) data.extra_js_files.unshift(...extra_js_files); else data.extra_js_files = extra_js_files; for (const jsFile of data.extra_js_files) { iframeContents += ''; } iframeContents += `` + '' + `` + '' + '
    ' + form.outerHTML + '
    ' + ''; let iframe; // If there is no action this is the initialization call. if (!action) { // Create the iframe. iframe = document.createElement('iframe'); iframe.style.width = '1px'; iframe.style.minWidth = '100%'; iframe.classList.add('problem-iframe'); // Hide the static problem ww_container.querySelector('.problem-contents').classList.add('hidden-content', 'hidden'); if (activate_button != null) { // Make sure the iframe follows the activate button in the DOM activate_button.after(iframe); } else { ww_container.prepend(iframe); } iFrameResize({ checkOrigin: false, scrolling: 'omit', heightCalculationMethod: 'taggedElement' }, iframe); iframe.addEventListener('load', () => { // Set up form submission from inside the iframe. const iframeForm = iframe.contentDocument.getElementById(ww_id + '-form'); iframeForm.addEventListener('submit', (e) => { handleWW(ww_id, "check"); e.preventDefault(); }); iframe.contentDocument.querySelectorAll('.collapse.in').forEach(collapse => collapse.classList.add('expanded')); iframe.contentWindow.jQuery('.collapse').on('shown', function(e) { if (e.target != this) return; this.classList.add('expanded'); }); iframe.contentWindow.jQuery('.collapse').on('hide', function(e) { if (e.target != this) return; this.classList.remove('expanded'); }); iframe.contentWindow.MathJax.startup.promise.then(() => iframe.contentWindow.MathJax.typesetPromise(['.popover', '.popover-content'])); }); } else { iframe = ww_container.querySelector('.problem-iframe'); } iframe.srcdoc = iframeContents; iframe.addEventListener('load', () => { // Remove the loader overlay loader.remove(); }, { once: true }) // Place focus on the problem. ww_container.focus() }, "json"); } function WWshowCorrect(ww_id, answers) { const ww_container = document.getElementById(ww_id); const iframe = ww_container.querySelector('.problem-iframe'); const body = iframe.contentDocument.getElementById(ww_id + '-body') $("body").trigger("runestone_show_correct", { "ww_id": ww_id, "answers": answers }); let inputs = body.querySelectorAll("input:not([type=hidden])"); for (const input of inputs) { const name = input.name; const span_id = `${ww_id}-${name}-correct`; if (input.type == 'text' && answers[name] && !(iframe.contentDocument.getElementById(span_id))) { const input_id = input.id; const mq_span = iframe.contentDocument.getElementById(`mq-answer-${input_id}`); if (mq_span) { mq_span.style.display = 'none'; } label = iframe.contentDocument.getElementById(`${span_id}-label`); if (label) { label.parentElement.insertBefore(input, label); label.remove(); } input.type = "hidden"; // we need to convert things like < in answers to < const correct_ans_text = iframe.contentDocument.createElement('div'); correct_ans_text.innerHTML = answers[name].correct_ans; input.value = correct_ans_text.textContent; const show_span = iframe.contentDocument.createElement('span'); show_span.id = span_id; show_span.appendChild(answers[name].correct_ans_latex_string ? iframe.contentDocument.createTextNode('\\(' + answers[name].correct_ans_latex_string + '\\)') : iframe.contentDocument.createTextNode(answers[name].correct_ans)); input.parentElement.insertBefore(show_span, input); } if (input.type.toUpperCase() == 'RADIO' && answers[name]) { const correct_ans = answers[name].correct_choice || answers[name].correct_ans; if (input.value == correct_ans) { input.checked = true; } else { input.checked = false; } } if (input.type.toUpperCase() == 'CHECKBOX' && answers[name]) { const correct_choices = answers[name].correct_choices; if (correct_choices.includes(input.value)) { input.checked = true; } else { input.checked = false; } } } const hiddenInputs = body.querySelectorAll("input[type=hidden]"); for (const input of hiddenInputs) { const name = input.name; if (!input.nextElementSibling) continue; const graphtoolContainer = input.nextElementSibling.nextElementSibling; if (graphtoolContainer && answers[name] && graphtoolContainer.classList.contains('graphtool-container')) { const correct_ans_div = iframe.contentDocument.createElement('div'); input.parentElement.insertBefore(correct_ans_div, graphtoolContainer); graphtoolContainer.style.display = 'none'; input.value = answers[name].correct_ans; iframe.contentWindow.jQuery(correct_ans_div).html(answers[name].correct_ans_latex_string); const script = iframe.contentDocument.createElement('script'); script.textContent = correct_ans_div.querySelector('script').textContent .replace('\nwindow.addEventListener("DOMContentLoaded",', '(') .replace(/;\n$/, '();'); iframe.contentDocument.body.appendChild(script); } } let selects = body.querySelectorAll("select:not([type=hidden])"); for (const select of selects) { const name = select.name; const span_id = `${ww_id}-${name}-correct`; if (answers[name] && !iframe.contentDocument.getElementById(span_id)) { select.style.display = "none"; select.value = answers[name].correct_ans; const show_span = iframe.contentDocument.createElement('span'); show_span.id = span_id; show_span.appendChild(answers[name].correct_ans_latex_string ? iframe.contentDocument.createTextNode('\\(' + answers[name].correct_ans_latex_string + '\\)') : iframe.contentDocument.createTextNode(answers[name].correct_ans)); select.parentElement.insertBefore(show_span, select); } } // run MathJax on our new rendering // FIXME: We only need to typeset the added elements, not the entire body. const mathjaxTypesetScript = iframe.contentDocument.createElement('script'); mathjaxTypesetScript.textContent = 'MathJax.startup.promise.then(() => MathJax.typesetPromise([document.body]));'; iframe.contentDocument.body.appendChild(mathjaxTypesetScript); } function resetWW(ww_id) { const ww_container = document.getElementById(ww_id); const activate_button = document.getElementById(ww_id + '-button'); ww_container.dataset.current_seed = ww_container.dataset.seed; iframe = ww_container.querySelector('.problem-iframe'); iframe.remove(); ww_container.querySelector('.problem-contents').classList.remove('hidden-content', 'hidden'); ww_container.querySelector('.problem-buttons.webwork').remove(); ww_container.querySelector('.problem-buttons').classList.remove('hidden-content', 'hidden'); // if the newer activate button is there (but hidden) bring it back too if (activate_button != null) {activate_button.classList.remove('hidden-content', 'hidden');}; } function adjustSrcHrefs(container,ww_domain) { container.querySelectorAll('[href]').forEach((node) => { const href = node.attributes.href.value; if (href !== '#' && !href.match(/^[a-z]+:\/\//i)) node.href = ww_domain + '/' + href; }); container.querySelectorAll('[data-knowl-url]').forEach((node) => { const dku = node.dataset.knowlUrl; if (dku !== '#' && !dku.match(/^[a-z]+:\/\//i)) node.dataset.knowlUrl = ww_domain + dku; }); container.querySelectorAll('[src]').forEach((node) => { node.src = new URL(node.attributes.src.value, ww_domain).href; }); } function translateHintSol(ww_id, body_div, ww_domain, b_ptx_has_hint, b_ptx_has_solution, hint_label_text, solution_label_text) { // The problem text may come with "hint"s and "solution"s // Each one is a div.accordion > details.accordion-item > summary.accordion-button // Styling is not the PTX way, so we change it to one div.solutions // with (potentially multiple) details.born-hidden-knowl > summary.knowl__link // Also if hint/sol were missing from the static version, we want these removed here const hintSols = body_div.querySelectorAll('.accordion.hint,.accordion.solution'); if (hintSols.length == 0) {return}; for (const hintSol of hintSols) { const parent = hintSol.parentNode; solutionlikewrapper = document.createElement('div'); solutionlikewrapper.classList.add('solutions'); parent.insertBefore(solutionlikewrapper, hintSol); const hintSolType = hintSol.classList.contains('hint') ? 'hint' : 'solution'; if ((hintSolType == 'solution' && !b_ptx_has_solution) || (hintSolType == 'hint' && !b_ptx_has_hint)) continue; const knowlDetails = hintSol.getElementsByTagName('details')[0]; knowlDetails.className = ''; knowlDetails.classList.add(hintSolType, 'solution-like', 'born-hidden-knowl'); solutionlikewrapper.appendChild(knowlDetails); const knowlSummary = knowlDetails.getElementsByTagName('summary')[0]; knowlSummary.className = ''; knowlSummary.classList.add('knowl__link'); const summaryLabel = knowlSummary.children[0]; summaryLabel.remove(); const newLabelSpan = document.createElement('span'); newLabelSpan.innerHTML = hintSolType == 'hint' ? hint_label_text : solution_label_text; knowlSummary.appendChild(newLabelSpan); const newLabelPeriod = document.createElement('span'); newLabelPeriod.innerHTML = '.'; knowlSummary.appendChild(newLabelPeriod); adjustSrcHrefs(knowlDetails, ww_domain); hintSol.remove(); const originalDetailsContent = knowlDetails.getElementsByTagName('div')[0]; const newDetailsContent = originalDetailsContent.getElementsByTagName('div')[0]; newDetailsContent.className = ''; newDetailsContent.classList.add(hintSolType, 'solution-like', 'knowl__content'); knowlDetails.appendChild(newDetailsContent); originalDetailsContent.remove(); } } function cloneAttributes(target, source) { [...source.attributes].forEach( attr => { target.setAttribute(attr.nodeName ,attr.nodeValue) }); } function webworkSeedHash(string) { var hash = 0, i, chr; if (string.length === 0) return hash; for (i = 0; i < string.length; i++) { chr = string.charCodeAt(i); hash = ((hash << 5) - hash) + chr; hash |= 0; //Convert to 32bit integer } return Math.abs(hash); }; ================================================ FILE: js/pretext-webwork/2.20/pretext-webwork.js ================================================ //Critical: // TODO: Think about what should be done for an essay question. //Accessibility: //Enhancement: // TODO: Have randomize check that new seed is actually producing new HTML. // TODO: Don't offer randomize button unless we know a new version can be produced after trying a few seeds. //Styling: // TODO: Review all styling in all scenarios (staged/not, correct/partly-correct/incorrect/blank, single/multiple) async function handleWW(ww_id, action) { const ww_container = document.getElementById(ww_id); const ww_domain = ww_container.dataset.domain; const ww_processing = 'webwork2'; const ww_origin = ww_container.dataset.origin; const ww_problemSource = ww_container.dataset.problemsource; let ww_baseCourse = ww_container.dataset.documentid; const ww_sourceFilePath = ww_container.dataset.sourcefilepath; const ww_course_id = ww_container.dataset.courseid; const ww_user_id = ww_container.dataset.userid; const ww_passwd = ww_container.dataset.coursepassword; const localize_submit = ww_container.dataset.localizeSubmit || "Submit"; const localize_check_responses = ww_container.dataset.localizeCheckResponses || "Check Responses"; const localize_reveal = ww_container.dataset.localizeReveal || "Reveal"; const localize_randomize = ww_container.dataset.localizeRandomize || "Randomize"; const localize_reset = ww_container.dataset.localizeReset || "Reset"; const runestone_logged_in = (typeof eBookConfig !== 'undefined' && eBookConfig.username !== ''); // will be null on pages generated prior to late December 2022 const activate_button = document.getElementById(ww_id + '-button') // Set the current seed if (!action) { ww_container.dataset.current_seed = ww_container.dataset.seed; if (runestone_logged_in) { ww_container.dataset.current_seed = webworkSeedHash(eBookConfig.username + ww_container.dataset.current_seed); } } else if (action == 'randomize') ww_container.dataset.current_seed = Number(ww_container.dataset.current_seed) + 100; let loader = document.createElement('div'); loader.style.position = 'absolute'; loader.style.left = 0; loader.style.top = 0; loader.style.backgroundColor = 'rgba(0.2, 0.2, 0.2, 0.4)'; loader.style.color = 'white'; loader.style.width = '100%'; loader.style.height = '100%'; loader.style.display = 'flex'; loader.style.alignItems = 'center'; loader.style.justifyContent = 'center'; loader.style.marginTop = '0'; loader.tabIndex = -1; const loaderText = document.createElement('span'); loaderText.textContent = 'Loading'; loaderText.style.fontSize = '2rem'; loader.appendChild(loaderText); ww_container.appendChild(loader); loader.focus(); if (!action) { // Determine if static version shows hints, solutions, or answers and save that information in the container dataset for later runs. ww_container.dataset.hasHint = ww_container.getElementsByClassName('hint').length > 0; ww_container.dataset.hasSolution = ww_container.getElementsByClassName('solution').length > 0; ww_container.dataset.hasAnswer = ww_container.getElementsByClassName('answer').length > 0; // Get (possibly localized) label text for hints and solutions. ww_container.dataset.hintLabelText = ww_container.dataset.hasHint == 'true' ? ww_container.querySelectorAll('.hint-knowl span.type, details.hint span.type')[0].textContent : 'Hint'; ww_container.dataset.solutionLabelText = ww_container.dataset.hasSolution == 'true' ? ww_container.querySelectorAll('.solution-knowl span.type, details.solution span.type')[0].textContent : 'Solution'; ww_container.tabIndex = -1; } let url; if (ww_processing == 'webwork2') { url = new URL(ww_domain + '/webwork2/render_rpc'); } let formData = new FormData(); let generatedPG = 'generated/webwork/pg/'; // For Runestone, we specify where to find the generated problems. if (runestone_logged_in) { if (ww_problemSource && !ww_baseCourse) { // WeBWorK authored in source, generated after 2025/10/15-ish, should have a baseCourse specified. We fall back to parsing the baseCourse from ww_id, which *should* always start with the base course prior to the first underscore (although this is not guaranteed). If no underscore is found, we fall back to eBookConfig.basecourse. // This is only needed for webwork problems authored in source, not OPL problems, so we only check when ww_problemSource is set. const parts = ww_id.split('_'); ww_baseCourse = parts.length > 1 ? parts[0] : eBookConfig.basecourse; console.log("using the base course " + ww_baseCourse); } generatedPG = `/ns/books/published/${ww_baseCourse}/${generatedPG}`; } if (action == 'check' || action =='reveal') { const iframe = ww_container.querySelector('.problem-iframe'); formData = new FormData(iframe.contentDocument.getElementById(ww_id + "-form")); formData.set("answersSubmitted", '1'); formData.set('WWsubmit', "1"); if (action == 'reveal' && ww_container.dataset.hasAnswer == 'true') { formData.set('WWcorrectAnsOnly', "1"); } if (ww_origin == 'generated') { const rawProblemSource = await fetch(generatedPG + ww_problemSource).then((r) => r.text()); formData.set("rawProblemSource", rawProblemSource); } else if (ww_origin == 'webwork2') formData.set("sourceFilePath", ww_sourceFilePath); } else { formData.set("problemSeed", ww_container.dataset.current_seed); if (ww_origin == 'generated') { const rawProblemSource = await fetch(generatedPG + ww_problemSource).then((r) => r.text()); formData.set("rawProblemSource", rawProblemSource); } else if (ww_origin == 'webwork2') formData.set("sourceFilePath", ww_sourceFilePath); formData.set("answersSubmitted", '0'); formData.set("displayMode", "MathJax"); formData.set("courseID", ww_course_id); formData.set("user", ww_user_id); formData.set("userID", ww_user_id); formData.set("passwd", ww_passwd); formData.set("disableCookies", '1'); formData.set("outputformat", "raw"); // note ww_container.dataset.hasSolution is a string, possibly 'false' which is true formData.set("showSolutions", ww_container.dataset.hasSolution == 'true' ? '1' : '0'); formData.set("showHints", ww_container.dataset.hasHint == 'true' ? '1' : '0'); formData.set("problemUUID",ww_id); } // If in Runestone, check if there are previous answer submissions and get them now to use in the form. let checkboxesString = ''; if (runestone_logged_in && !action) { const answersObject = (wwList[ww_id.replace(/-ww-rs$/,'')].answers ? wwList[ww_id.replace(/-ww-rs$/,'')].answers : {'answers' : [], 'mqAnswers' : []}); const previousAnswers = answersObject.answers; if (previousAnswers !== null) { formData.set('WWsubmit', 1); } for (const answer in previousAnswers) { if (previousAnswers[answer].constructor === Array) { for (const k in previousAnswers[answer]) { checkboxesString += '&'; checkboxesString += answer; checkboxesString += '='; checkboxesString += previousAnswers[answer][k]; } } else { formData.set(answer, previousAnswers[answer]); } } } // Need to get form data as a string, including possible repeated checkbox names // Do not pass post data as an object, or checkbox names will overwrite one another const formString = new URLSearchParams(formData).toString(); $.post(url, formString + checkboxesString, (data) => { // Create the form that will contain the text and input fields of the interactive problem. const form = document.createElement("form"); form.id = ww_id + "-form"; form.dataset.iframeHeight = 1; // Create a div for the problem text. const body_div = document.createElement("div"); body_div.id = ww_id + "-body"; body_div.classList.add("exercise", "exercise-like"); body_div.lang = data.lang; body_div.dir = data.dir; // Dump the problem text, answer blanks, etc. body_div.innerHTML = data.rh_result.text; // If showPartialCorrectAnswers = 0, alter the feedback buttons according to whether or not the score is 100%. if ('showPartialCorrectAnswers' in data.rh_result.flags && data.rh_result.flags.showPartialCorrectAnswers == 0) { if ('score' in data.rh_result.problem_result && data.rh_result.problem_result.score >= 1) { body_div.querySelectorAll('button.ww-feedback-btn').forEach( function(button) { button.classList.remove('btn-info'); button.classList.add('btn-success'); button.setAttribute('aria-label', 'Correct'); button.dataset.bsCustomClass = button.dataset.bsCustomClass + ' correct'; button.dataset.bsTitle = button.dataset.bsTitle.replace('Answer Preview', 'Correct'); button.firstChild.classList.add('correct') } ); } else { body_div.querySelectorAll('button.ww-feedback-btn').forEach( function(button) { button.setAttribute('aria-label', 'One or more answers incorrect'); button.dataset.bsTitle = button.dataset.bsTitle.replace('Answer Preview', 'One or more answers incorrect'); } ); } } // Replace all hn headings with h6 headings. for (const tag_name of ['h6', 'h5', 'h4', 'h3', 'h2', 'h1']) { const headings = body_div.getElementsByTagName(tag_name); for (heading of headings) { const new_heading = document.createElement("h6"); new_heading.innerHTML = heading.innerHTML; cloneAttributes(new_heading, heading); new_heading.classList.add('webwork-part'); heading.replaceWith(new_heading); } } // Hide textarea input and hide associated buttons var textareas = body_div.getElementsByTagName("textarea"); for(var i = 0, max = textareas.length; i < max; i++) { textareas[i].style.display = "none"; textareas[i].className = ''; } var textareabuttons = body_div.querySelectorAll(".latexentry-preview"); for(var i = 0, max = textareabuttons.length; i < max; i++) { textareabuttons[i].remove(); } adjustSrcHrefs(body_div, ww_domain); translateHintSol(ww_id, body_div, ww_domain, ww_container.dataset.hasHint == 'true', ww_container.dataset.hasSolution == 'true', ww_container.dataset.hintLabelText, ww_container.dataset.solutionLabelText) // insert previous answers if (runestone_logged_in) { const answersObject = (wwList[ww_id.replace(/-ww-rs$/,'')].answers ? wwList[ww_id.replace(/-ww-rs$/,'')].answers : {'answers' : [], 'mqAnswers' : []}); const mqAnswers = answersObject.mqAnswers; for (const mqAnswer in mqAnswers) { const mqInput = body_div.querySelector('input[id=' + mqAnswer + ']'); if (mqInput && mqInput.value == '') { mqInput.setAttribute('value', mqAnswers[mqAnswer]); } } const answers = answersObject.answers; for (const answer in answers) { const input = body_div.querySelector('input[id=' + answer + ']'); if (input && input.value == '') { input.setAttribute('value', answers[answer]); } } } // insert our cleaned up problem text form.appendChild(body_div); // Set up hidden input fields that the form uses const wwInputs = { problemSeed: data.inputs_ref.problemSeed, problemUUID: data.inputs_ref.problemUUID, psvn: data.inputs_ref.psvn, courseName: ww_course_id, courseID: ww_course_id, user: ww_user_id, passwd: ww_passwd, displayMode: "MathJax", session_key: data.rh_result.session_key, outputformat: "raw", language: data.formLanguage, showSummary: data.showSummary, disableCookies: '1', // note ww_container.dataset.hasSolution is a string, possibly 'false' which is true showSolutions: ww_container.dataset.hasSolution == 'true' ? '1' : '0', showHints: ww_container.dataset.hasHint == 'true' ? '1' : '0', forcePortNumber: data.forcePortNumber }; if (ww_sourceFilePath) wwInputs.sourceFilePath = ww_sourceFilePath; else if (ww_problemSource && ww_origin == 'webwork2') wwInputs.problemSource = ww_problemSource; for (const wwInputName of Object.keys(wwInputs)) { const input = document.createElement('input'); input.type = 'hidden'; input.name = wwInputName; input.value = wwInputs[wwInputName]; form.appendChild(input); } let buttonContainer = ww_container.querySelector('.problem-buttons.webwork'); // Create the submission buttons if they have not yet been created. if (!buttonContainer) { // Hide the original div that contains the Activate. ww_container.querySelector('.problem-buttons').classList.add('hidden-content', 'hidden'); // Create a new div for the webwork buttons. buttonContainer = document.createElement('div'); buttonContainer.classList.add('problem-buttons', 'webwork'); if (activate_button != null) { // Make sure the button container follows the activate button in the DOM activate_button.after(buttonContainer); } else { ww_container.prepend(buttonContainer); } // Check button const check = document.createElement("button"); check.type = "button"; check.id = ww_id + '-check'; check.style.marginRight = "0.25rem"; check.classList.add('webwork-button'); check.textContent = runestone_logged_in ? localize_submit : localize_check_responses; check.addEventListener('click', () => handleWW(ww_id, "check")); buttonContainer.appendChild(check); // Show correct answers button if original PTX has answer knowl. if (ww_container.dataset.hasAnswer == 'true') { const correct = document.createElement("button"); correct.classList.add("show-correct", 'webwork-button'); correct.type = "button"; correct.style.marginRight = "0.25rem"; correct.textContent = localize_reveal; correct.addEventListener('click', () => handleWW(ww_id, 'reveal')); buttonContainer.appendChild(correct); } // randomize button const randomize = document.createElement("button") randomize.type = "button"; randomize.classList.add('webwork-button'); randomize.style.marginRight = "0.25rem"; randomize.textContent = localize_randomize; randomize.addEventListener('click', () => handleWW(ww_id, 'randomize')); buttonContainer.appendChild(randomize) // reset button const reset = document.createElement("button") reset.type = "button" reset.classList.add('webwork-button'); reset.textContent = localize_reset; reset.addEventListener('click', () => resetWW(ww_id)); buttonContainer.appendChild(reset) } if (runestone_logged_in && action == 'check') { // Runestone trigger $("body").trigger('runestone_ww_check', data) } let courseUrlBase = ''; if (runestone_logged_in){ courseUrlBase = '/ns/books/published/' + eBookConfig.basecourse + '/'; } let iframeContents = '' + '' + `` + '' + `` + '' + ''; // Determine javascript and css dependencies const extra_css_files = []; const extra_js_files = []; if (data.extra_css_files) data.extra_css_files.unshift(...extra_css_files); else data.extra_css_files = extra_css_files; for (const cssFile of data.extra_css_files) { iframeContents += ''; } if (data.extra_js_files) data.extra_js_files.unshift(...extra_js_files); else data.extra_js_files = extra_js_files; for (const jsFile of data.extra_js_files) { iframeContents += ''; } iframeContents += `` + '' + `` + '' + '
    ' + form.outerHTML + '
    ' + ''; let iframe; // If there is no action this is the initialization call. if (!action) { // Create the iframe. iframe = document.createElement('iframe'); iframe.style.width = '1px'; iframe.style.minWidth = '100%'; iframe.classList.add('problem-iframe'); // Hide the static problem ww_container.querySelector('.problem-contents').classList.add('hidden-content', 'hidden'); if (activate_button != null) { // Make sure the iframe follows the activate button in the DOM activate_button.after(iframe); } else { ww_container.prepend(iframe); } iFrameResize({ checkOrigin: false, scrolling: 'omit', heightCalculationMethod: 'taggedElement' }, iframe); iframe.addEventListener('load', () => { // Set up form submission from inside the iframe. const iframeForm = iframe.contentDocument.getElementById(ww_id + '-form'); iframeForm.addEventListener('submit', (e) => { handleWW(ww_id, "check"); e.preventDefault(); }); iframe.contentDocument.querySelectorAll('.collapse.in').forEach(collapse => collapse.classList.add('expanded')); iframe.contentWindow.jQuery('.collapse').on('shown', function(e) { if (e.target != this) return; this.classList.add('expanded'); }); iframe.contentWindow.jQuery('.collapse').on('hide', function(e) { if (e.target != this) return; this.classList.remove('expanded'); }); iframe.contentWindow.MathJax.startup.promise.then(() => iframe.contentWindow.MathJax.typesetPromise(['.popover', '.popover-content'])); }); } else { iframe = ww_container.querySelector('.problem-iframe'); } iframe.srcdoc = iframeContents; iframe.addEventListener('load', () => { // Remove the loader overlay loader.remove(); }, { once: true }) // Place focus on the problem. ww_container.focus() }, "json"); } function WWshowCorrect(ww_id, answers) { const ww_container = document.getElementById(ww_id); const iframe = ww_container.querySelector('.problem-iframe'); const body = iframe.contentDocument.getElementById(ww_id + '-body') $("body").trigger("runestone_show_correct", { "ww_id": ww_id, "answers": answers }); let inputs = body.querySelectorAll("input:not([type=hidden])"); for (const input of inputs) { const name = input.name; const span_id = `${ww_id}-${name}-correct`; if (input.type == 'text' && answers[name] && !(iframe.contentDocument.getElementById(span_id))) { const input_id = input.id; const mq_span = iframe.contentDocument.getElementById(`mq-answer-${input_id}`); if (mq_span) { mq_span.style.display = 'none'; } label = iframe.contentDocument.getElementById(`${span_id}-label`); if (label) { label.parentElement.insertBefore(input, label); label.remove(); } input.type = "hidden"; // we need to convert things like < in answers to < const correct_ans_text = iframe.contentDocument.createElement('div'); correct_ans_text.innerHTML = answers[name].correct_ans; input.value = correct_ans_text.textContent; const show_span = iframe.contentDocument.createElement('span'); show_span.id = span_id; show_span.appendChild(answers[name].correct_ans_latex_string ? iframe.contentDocument.createTextNode('\\(' + answers[name].correct_ans_latex_string + '\\)') : iframe.contentDocument.createTextNode(answers[name].correct_ans)); input.parentElement.insertBefore(show_span, input); } if (input.type.toUpperCase() == 'RADIO' && answers[name]) { const correct_ans = answers[name].correct_choice || answers[name].correct_ans; if (input.value == correct_ans) { input.checked = true; } else { input.checked = false; } } if (input.type.toUpperCase() == 'CHECKBOX' && answers[name]) { const correct_choices = answers[name].correct_choices; if (correct_choices.includes(input.value)) { input.checked = true; } else { input.checked = false; } } } const hiddenInputs = body.querySelectorAll("input[type=hidden]"); for (const input of hiddenInputs) { const name = input.name; if (!input.nextElementSibling) continue; const graphtoolContainer = input.nextElementSibling.nextElementSibling; if (graphtoolContainer && answers[name] && graphtoolContainer.classList.contains('graphtool-container')) { const correct_ans_div = iframe.contentDocument.createElement('div'); input.parentElement.insertBefore(correct_ans_div, graphtoolContainer); graphtoolContainer.style.display = 'none'; input.value = answers[name].correct_ans; iframe.contentWindow.jQuery(correct_ans_div).html(answers[name].correct_ans_latex_string); const script = iframe.contentDocument.createElement('script'); script.textContent = correct_ans_div.querySelector('script').textContent .replace('\nwindow.addEventListener("DOMContentLoaded",', '(') .replace(/;\n$/, '();'); iframe.contentDocument.body.appendChild(script); } } let selects = body.querySelectorAll("select:not([type=hidden])"); for (const select of selects) { const name = select.name; const span_id = `${ww_id}-${name}-correct`; if (answers[name] && !iframe.contentDocument.getElementById(span_id)) { select.style.display = "none"; select.value = answers[name].correct_ans; const show_span = iframe.contentDocument.createElement('span'); show_span.id = span_id; show_span.appendChild(answers[name].correct_ans_latex_string ? iframe.contentDocument.createTextNode('\\(' + answers[name].correct_ans_latex_string + '\\)') : iframe.contentDocument.createTextNode(answers[name].correct_ans)); select.parentElement.insertBefore(show_span, select); } } // run MathJax on our new rendering // FIXME: We only need to typeset the added elements, not the entire body. const mathjaxTypesetScript = iframe.contentDocument.createElement('script'); mathjaxTypesetScript.textContent = 'MathJax.startup.promise.then(() => MathJax.typesetPromise([document.body]));'; iframe.contentDocument.body.appendChild(mathjaxTypesetScript); } function resetWW(ww_id) { const ww_container = document.getElementById(ww_id); const activate_button = document.getElementById(ww_id + '-button'); ww_container.dataset.current_seed = ww_container.dataset.seed; iframe = ww_container.querySelector('.problem-iframe'); iframe.remove(); ww_container.querySelector('.problem-contents').classList.remove('hidden-content', 'hidden'); ww_container.querySelector('.problem-buttons.webwork').remove(); ww_container.querySelector('.problem-buttons').classList.remove('hidden-content', 'hidden'); // if the newer activate button is there (but hidden) bring it back too if (activate_button != null) {activate_button.classList.remove('hidden-content', 'hidden');}; } function adjustSrcHrefs(container,ww_domain) { container.querySelectorAll('[href]').forEach((node) => { const href = node.attributes.href.value; if (href !== '#' && !href.match(/^[a-z]+:\/\//i)) node.href = ww_domain + '/' + href; }); container.querySelectorAll('[data-knowl-url]').forEach((node) => { const dku = node.dataset.knowlUrl; if (dku !== '#' && !dku.match(/^[a-z]+:\/\//i)) node.dataset.knowlUrl = ww_domain + dku; }); container.querySelectorAll('[src]').forEach((node) => { node.src = new URL(node.attributes.src.value, ww_domain).href; }); } function translateHintSol(ww_id, body_div, ww_domain, b_ptx_has_hint, b_ptx_has_solution, hint_label_text, solution_label_text) { // The problem text may come with "hint"s and "solution"s // Each one is a div.accordion > details.accordion-item > summary.accordion-button // Styling is not the PTX way, so we change it to one div.solutions // with (potentially multiple) details.born-hidden-knowl > summary.knowl__link // Also if hint/sol were missing from the static version, we want these removed here const hintSols = body_div.querySelectorAll('.accordion.hint,.accordion.solution'); if (hintSols.length == 0) {return}; for (const hintSol of hintSols) { const parent = hintSol.parentNode; solutionlikewrapper = document.createElement('div'); solutionlikewrapper.classList.add('solutions'); parent.insertBefore(solutionlikewrapper, hintSol); const hintSolType = hintSol.classList.contains('hint') ? 'hint' : 'solution'; if ((hintSolType == 'solution' && !b_ptx_has_solution) || (hintSolType == 'hint' && !b_ptx_has_hint)) continue; const knowlDetails = hintSol.getElementsByTagName('details')[0]; knowlDetails.className = ''; knowlDetails.classList.add(hintSolType, 'solution-like', 'born-hidden-knowl'); solutionlikewrapper.appendChild(knowlDetails); const knowlSummary = knowlDetails.getElementsByTagName('summary')[0]; knowlSummary.className = ''; knowlSummary.classList.add('knowl__link'); const summaryLabel = knowlSummary.children[0]; summaryLabel.remove(); const newLabelSpan = document.createElement('span'); newLabelSpan.innerHTML = hintSolType == 'hint' ? hint_label_text : solution_label_text; knowlSummary.appendChild(newLabelSpan); const newLabelPeriod = document.createElement('span'); newLabelPeriod.innerHTML = '.'; knowlSummary.appendChild(newLabelPeriod); adjustSrcHrefs(knowlDetails, ww_domain); hintSol.remove(); const originalDetailsContent = knowlDetails.getElementsByTagName('div')[0]; const newDetailsContent = originalDetailsContent.getElementsByTagName('div')[0]; newDetailsContent.className = ''; newDetailsContent.classList.add(hintSolType, 'solution-like', 'knowl__content'); knowlDetails.appendChild(newDetailsContent); originalDetailsContent.remove(); } } function cloneAttributes(target, source) { [...source.attributes].forEach( attr => { target.setAttribute(attr.nodeName ,attr.nodeValue) }); } function webworkSeedHash(string) { var hash = 0, i, chr; if (string.length === 0) return hash; for (i = 0; i < string.length; i++) { chr = string.charCodeAt(i); hash = ((hash << 5) - hash) + chr; hash |= 0; //Convert to 32bit integer } return Math.abs(hash); }; ================================================ FILE: js/pretext.js ================================================ /******************************************************************************* * pretext.js ******************************************************************************* * The main front-end controller for PreTeXt documents. * * Homepage: pretextbook.org * Repository: https://github.com/PreTeXtBook/JS_core * * Authors: David Farmer, Rob Beezer * ******************************************************************************* */ // from https://stackoverflow.com/questions/34422189/get-item-offset-from-the-top-of-page function getOffsetTop(e) { // recursively walk up the DOM via offsetParent, accumulating offsetTop as we go if (!e) return 0; return getOffsetTop(e.offsetParent) + e.offsetTop; }; function scrollTocToActive() { //Try to figure out current TocItem from URL let fileNameWHash = window.location.href.split("/").pop(); let fileName = fileNameWHash.split("#")[0]; //Find just the filename in ToC let tocEntry = document.querySelector('#ptx-toc a[href="' + fileName + '"]'); if (!tocEntry) { return; //complete failure, get out } let tocEntryTop = 0; //See if we can also match fileName#hash (assuming there is a fragment) if (fileNameWHash.includes('#')) { let tocEntryWHash = document.querySelector( '#ptx-toc a[href="' + fileNameWHash + '"]' ); if (tocEntryWHash) { //Matched something below a subsection - activate the list item that contains it tocEntry.closest("li").querySelectorAll("li").forEach(li => { li.classList.remove("active"); }); tocEntryWHash.closest("li").classList.add("active"); tocEntryTop = getOffsetTop(tocEntryWHash); } } if (!tocEntryTop) { tocEntryTop = getOffsetTop(tocEntry); } //Now activate ToC item for fileName and scroll to it // Don't use scrollIntoView because it changes users tab position in Chrome // and messes up keyboard navigation tocEntry.closest("li").classList.add("active"); // Scroll only if the tocEntry is below the bottom half of the window, // scrolling to that position. let toc = document.querySelector("#ptx-toc"); let tocTop = getOffsetTop(toc); toc.scrollTop = tocEntryTop - tocTop - 0.4 * self.innerHeight; } function toggletoc() { thesidebar = document.getElementById("ptx-sidebar"); if (thesidebar.classList.contains("hidden") || thesidebar.classList.contains("visible")) { thesidebar.classList.toggle("hidden"); thesidebar.classList.toggle("visible"); } else if (thesidebar.offsetParent === null) { /* not currently visible */ thesidebar.classList.toggle("visible"); } else { thesidebar.classList.toggle("hidden"); } scrollTocToActive(); } function samePageLink(a) { if (!(a instanceof HTMLAnchorElement)) return false; try { const linkUrl = new URL(a.href, document.baseURI); const currentUrl = new URL(window.location.href); const sameDocument = linkUrl.origin === currentUrl.origin && linkUrl.pathname === currentUrl.pathname && linkUrl.search === currentUrl.search; return sameDocument && !!linkUrl.hash; } catch (e) { // Invalid URL return false; } } window.addEventListener("DOMContentLoaded",function(event) { thetocbutton = document.getElementsByClassName("toc-toggle")[0]; thetocbutton.addEventListener("click", (e) => { toggletoc(); e.stopPropagation(); // keep global click handler from immediately toggling it back }); // For themes that want it, install click handlers to auto close the toc // when the reader clicks anywhere outside it or selects a subsection. // (Selecting other sections or chapters navigates away from the page so // effectively closes the TOC.) if (getComputedStyle(document.documentElement).getPropertyValue('--auto-collapse-toc') == "yes") { const sidebar = document.getElementById("ptx-sidebar"); // Handle all clicks outside the sidebar window.addEventListener("click", function(event) { if (sidebar.classList.contains("visible")) { if (!event.composedPath().includes(sidebar)) { toggletoc(); } } }); // Handle clicks inside the sidebar but on link within a subsection. sidebar.addEventListener("click", function (event) { if (samePageLink(event.target.closest('a'))) { toggletoc(); } }); // Handle persistent sidebar if the page is restored from cache on back/forward buttons. window.addEventListener('pageshow', (e) => { if (e.persisted) { sidebar.classList.remove('visible'); sidebar.classList.add('hidden'); } }); } }); //----------------------------------------------------------------------------- // Dynamic TOC logic //----------------------------------------------------------------------------- //item is assumed to be expander in toc-item function toggleTOCItem(expander) { let listItem = expander.closest(".toc-item"); listItem.classList.toggle("expanded"); let expanded = listItem.classList.contains("expanded"); let itemType = getTOCItemType(listItem); if(expanded) { expander.title = "Close" + (itemType !== "" ? " " + itemType : ""); } else { expander.title = "Expand" + (itemType !== "" ? " " + itemType : ""); } //should be one of each... for/of for safety and built in null avoidance for (const childUL of listItem.querySelectorAll(":scope > ul.toc-item-list")) { for (const childItem of childUL.querySelectorAll(":scope > li.toc-item")) { if(expanded) { childItem.classList.add("visible"); childItem.classList.remove("hidden"); } else { childItem.classList.remove("visible"); childItem.classList.add("hidden"); } } } } //finds item type from classes or empty string on failure function getTOCItemType(item) { //Type should be class that looks like toc-X where X is not item. Find it and return X for(let className of item.classList) { if(className !== "toc-item" && className.length > 3 && className.slice(0,4) === "toc-") return className.slice(4); } return ""; } //finds depth of toc-item as defined by number .toc-item-lists it is in function getTOCItemDepth(item) { let depth = 0; let curParent = item.closest(".toc-item-list"); while(curParent !== null) { depth++; curParent = curParent.parentElement.closest(".toc-item-list"); } return depth; } window.addEventListener("DOMContentLoaded", function(event) { if(document.querySelector(".ptx-toc.focused") === null) return; //only in focused mode let maxDepth = 1000; //how deep TOC goes //check toc for depth class and get value from there for(let className of document.querySelector(".ptx-toc").classList) if(className.length > 5 && className.slice(0,5) === "depth") maxDepth = Number(className.slice(5)); let preexpandedLevels = 1; //how many levels to preexpand let tocDataSet = document.querySelector(".ptx-toc").dataset; if(typeof tocDataSet.preexpandedLevels !== 'undefined') preexpandedLevels = Number(tocDataSet.preexpandedLevels); let tocItems = document.querySelectorAll(".ptx-toc ul.structural > .toc-item"); for (const tocItem of tocItems) { let hasChildren = tocItem.querySelector('ul.structural') !== null; let depth = getTOCItemDepth(tocItem); if(hasChildren && depth < maxDepth) { let expander = document.createElement("button"); expander.classList.add('toc-expander'); expander.classList.add('toc-chevron-surround'); expander.title = 'toc-expander'; // content of span is set by CSS :before rule. expander.innerHTML = ''; tocItem.querySelector(".toc-title-box").append(expander); expander.addEventListener('click', () => { toggleTOCItem(expander); }); let isActive = tocItem.classList.contains("contains-active") || tocItem.classList.contains("active"); let preExpanded = isActive || depth < preexpandedLevels; let itemType = getTOCItemType(tocItem); if(preExpanded) { toggleTOCItem(expander); } else { expander.title = "Expand" + (itemType !== "" ? " " + itemType : ""); } } } //Do we have a hash in the URL? If so, we need to identify up to make sure // all parents of that item are expanded if(window.location.hash) { let hash = window.location.hash; // find the link in the TOC that has an href ending in this hash let hashLink = document.querySelector(`.ptx-toc a[href$="${hash}"]`); if(hashLink) { let parentTocItem = hashLink.closest(".toc-item"); while(parentTocItem && !parentTocItem.classList.contains("contains-active")) { parentTocItem.classList.add("contains-active"); let expander = parentTocItem.querySelector(".toc-expander"); if(expander) { //make sure it is expanded if(!parentTocItem.classList.contains("expanded")) { toggleTOCItem(expander); } } parentTocItem = parentTocItem.parentElement.closest(".toc-item"); } } } }); // This needs to be after the TOC's geometry is settled window.addEventListener("DOMContentLoaded",function(event) { scrollTocToActive(); }); window.onhashchange = scrollTocToActive; ================================================ FILE: js/pretext_add_on.js ================================================ /******************************************************************************* * pretext_add_on.js ******************************************************************************* * Javascript for supplementary material in PreTeXt documents. * * Homepage: pretextbook.org * Repository: https://github.com/PreTeXtBook/JS_core * * Authors: David Farmer, Rob Beezer, Alex Jordan * ******************************************************************************* */ /* console.log("thisbrowser.userAgent", window.navigator.userAgent); */ /* scrollbar width from https://stackoverflow.com/questions/13382516/getting-scroll-bar-width-using-javascript */ function getScrollbarWidth() { var outer = document.createElement("div"); outer.style.visibility = "hidden"; outer.style.width = "100px"; outer.style.msOverflowStyle = "scrollbar"; // needed for WinJS apps document.body.appendChild(outer); var widthNoScroll = outer.offsetWidth; // force scrollbars outer.style.overflow = "scroll"; // add innerdiv var inner = document.createElement("div"); inner.style.width = "100%"; outer.appendChild(inner); var widthWithScroll = inner.offsetWidth; // remove divs outer.parentNode.removeChild(outer); return widthNoScroll - widthWithScroll; } /* copy permalink address to clipboard requires browser support, otherwise does nothing */ async function copyPermalink(linkNode) { // structure borrowed from https://flaviocopes.com/clipboard-api/ if (!navigator.clipboard) { // Clipboard API not available console.log("Error: Clipboard API not available"); return } console.log("copying permalink for", linkNode); var elem = linkNode.parentElement if (!linkNode) { console.log("Error: Something went wrong finding permalink URL") return } const this_permalink_url = linkNode.href; const this_permalink_description = elem.getAttribute('data-description'); var link = "
    " + this_permalink_description + ""; var msg_link = "" + this_permalink_description + ""; var text_fallback = this_permalink_description + " \r\n" + this_permalink_url; var copy_success = true; try { // NOTE: this method will only work in Firefox if the user has // dom.events.asyncClipboard.clipboardItem // set to true in their about:config. // Annoyingly, this setting is turned off by default. // If that setting is off, this try block will fail and we'll use the // fallback method lower down instead. await navigator.clipboard.write([ new ClipboardItem({ 'text/html': new Blob([link], { type: 'text/html' }), 'text/plain': new Blob([text_fallback], { type: 'text/plain' }), }) ]); } catch (err) { console.log('Permalink-to-clipboard using ClipboardItem failed, falling back to clipboard.writeText', err); copy_success = false; } if (! copy_success) { try { await navigator.clipboard.writeText(text_fallback); } catch (err) { console.log('Permalink-to-clipboard using clipboard.writeText failed', err); console.error('Failed to copy link to clipboard!'); return } } console.log(`copied '${this_permalink_url}' to clipboard`); // temporary element to alert user that link was copied let copied_msg = document.createElement('p'); copied_msg.setAttribute('role', 'alert'); copied_msg.className = "permalink-alert"; copied_msg.innerHTML = "Link to " + msg_link + " copied to clipboard"; elem.parentElement.insertBefore(copied_msg, elem); // show confirmation for a couple seconds await new Promise((resolve, reject) => setTimeout(resolve, 1500)); copied_msg.remove(); } // Add event listener to add onClick handler for permalinks window.addEventListener("DOMContentLoaded", function() { const permalinks = document.querySelectorAll('.autopermalink > a'); permalinks.forEach(link => { link.addEventListener('click', function(event) { event.preventDefault(); // Prevent default anchor behavior copyPermalink(link); }); }); }); window.addEventListener("load",function(event) { /* click an image to magnify */ $('body').on('click','.image-box > img:not(.draw_on_me):not(.mag_popup), .sbspanel > img:not(.draw_on_me):not(.mag_popup), figure > img:not(.draw_on_me):not(.mag_popup), figure > div > img:not(.draw_on_me):not(.mag_popup)', function(){ var img_big = document.createElement('div'); img_big.setAttribute('style', 'background:#fff;'); img_big.setAttribute('class', 'mag_popup_container'); img_big.innerHTML = ''; // place_to_put_big_img = $(this).parents(".sbsrow, figure, li").last(); place_to_put_big_img = $(this).parents(".image-box, .sbsrow, figure, li, .cols2 article:nth-of-type(2n)").last(); // for .cols2, the even ones have to go inside the previous odd one if (place_to_put_big_img.prop("tagName") == "ARTICLE") { place_to_put_big_img = place_to_put_big_img.prev().children().first(); } $(img_big).insertBefore(place_to_put_big_img); }); /* click the big image to make it go away */ $('body').on('click','img.mag_popup', function(){ this.parentNode.remove(); }); /* add ids to p that have none */ p_no_id = document.querySelectorAll('.main p:not([id])'); for (var n=p_no_id.length - 1; n >= 0; --n) { e = p_no_id[n]; if (e.hasAttribute('id')) { /* console.log(e, "was id'd in a previous round"); */ continue } /* console.log("this is e", e); */ if (e.classList.contains('watermark')) { console.log(e, "skipping the watermark"); continue } /* console.log("\n XXXXXXXXX p with no id", e); */ prev_p = $(e).prevAll("p"); console.log("prev_p", prev_p, "xx"); if(prev_p.length == 0) { console.log(" PPP problem: prev_p has no length:", prev_p); continue } console.log("which has id", prev_p[0].id); var parts_found = 1; var parts_to_id = [e]; for (var i=0; i < prev_p.length; ++i) { this_previous = prev_p[i]; console.log("i", i, "this_previous", this_previous, "id", this_previous.id, "???", this_previous.hasAttribute('id')) if (!this_previous.hasAttribute('id')) { parts_to_id.unshift(this_previous) } else { base_id = this_previous.id; console.log("base_id", base_id); console.log("ready to add id to", parts_to_id); for (var j=0; j < parts_to_id.length; ++j) { ++parts_found; var next_id = base_id + "-part" + parts_found.toString(); console.log("parts_found", parts_found, "next_id", next_id); parts_to_id[j].setAttribute("id", next_id); } break // because we found the id that is the base for the missing ids } } } console.log("adding video popouts"); all_iframes = document.querySelectorAll('body iframeXXXX'); // for now, we just want the iframes that hace youtube in the src for (var i = 0; i < all_iframes.length; i++) { this_item = all_iframes[i]; this_item_src = this_item.src; // console.log("this_item_src", this_item_src); if(this_item_src.includes("youtube")) { this_item_id = this_item.id; this_item_width = this_item.width; this_item_height = this_item.height; if(this_item_height < 150) { continue } console.log("found a youtube video on", this_item_id); var empty_div = document.createElement('div'); var this_videomag_container = document.createElement('div'); parent_tag = this_item.parentElement.tagName; if(parent_tag == "FIGURE") { this_videomag_container.setAttribute("class", "videobig"); } else { this_videomag_container.setAttribute("class", "videobig nofigure"); } /* this_videomag_container.setAttribute('class', 'videobig'); */ this_videomag_container.setAttribute('video-id', this_item_id); this_videomag_container.setAttribute('data-width', this_item_width); this_videomag_container.setAttribute('data-height', this_item_height); this_videomag_container.innerHTML = 'fit width'; /* replace this with a surrounding div, for placement, containing a inline-block so the background looks right */ this_item.insertAdjacentElement("beforebegin", empty_div); // because of hard-coded permalinks being inline-block */ this_item.insertAdjacentElement("beforebegin", this_videomag_container); this_item.insertAdjacentElement("beforebegin", empty_div); // because of hard-coded permalinks being inline-block */ } } /* replace this with a single class fo rthe button, with supplementary classes that say to shrink or grow */ $(".videobig").click(function(){ parent_video_id = this.getAttribute("video-id"); console.log("clicked videobig for", parent_video_id); this_video = document.getElementById(parent_video_id); console.log("make big: ", this_video); original_width = this.getAttribute("data-width"); original_height = this.getAttribute("data-height"); browser_width = $(window).width(); width_ratio = browser_width/original_width; console.log("the browser is wider by a factor of",width_ratio); this_video.setAttribute("width", width_ratio*original_width); this_video.setAttribute("height", width_ratio*original_height); this_video.setAttribute("style", "position:relative; left:-260px; z-index:1000"); this.setAttribute("class", "videosmall"); this.innerHTML = "make small"; $(".videosmall").click(function(){ console.log("clicked videosmall"); parent_video_id = this.getAttribute("video-id"); this_video = document.getElementById(parent_video_id); original_width = this.getAttribute("data-width"); original_height = this.getAttribute("data-height"); this_video.removeAttribute("style"); this_video.setAttribute("width", original_width); this_video.setAttribute("height", original_height); this.setAttribute("class", "videobig"); this.innerHTML = "fit width"; }); }); }, false); /* for the random WW problems */ function updateURLParameter(url, param, paramVal){ var newAdditionalURL = ""; var tempArray = url.split("?"); var baseURL = tempArray[0]; var additionalURL = tempArray[1]; var temp = ""; if (additionalURL) { tempArray = additionalURL.split("&"); for (var i=0; i 0 ) { most_recently_opened = knowl_focus_stack.pop(); knowl_focus_stack_uid.pop(); most_recently_opened.focus(); console.log("moved back one knowl"); } else { console.log("no open knowls being tracked"); break; } break; } }; }, false); // when the anchor is a knowl, open it window.addEventListener("load",function(event) { if (window.location.hash.length) { let id = window.location.hash.substring(1); var the_anchor = document.getElementById(id); console.log("id", id, "the_anchor", the_anchor); if (the_anchor.tagName == "ARTICLE") { var contained_knowl = the_anchor.querySelector("a[data-knowl]"); if (contained_knowl && contained_knowl.parentElement == the_anchor) { console.log("found a knowl", contained_knowl); // knowl_click_handler($(contained_knowl)) contained_knowl.click() } } else if (the_anchor.hasAttribute("data-knowl")) { the_anchor.click() } else { // if it is a hidden knowl, find the knowl and open it var this_hidden_content = the_anchor.closest(".hidden-content"); if (this_hidden_content) { console.log("linked to a hidden knowl with this_hidden_content", this_hidden_content); var the_refid = this_hidden_content.id; var this_knowl = document.querySelector('[data-refid="' + the_refid + '"]'); this_knowl.click() } } } }); // The new method for creating pages and adjusting workspace // // Unwrap section.paragraphs containers so their children flow directly // into the parent, enabling CSS page breaks between the inner elements. function flattenParagraphsSections(printout) { const paragraphsSections = printout.querySelectorAll('section.paragraphs'); paragraphsSections.forEach(section => { const parent = section.parentNode; // Move all children out of the section wrapper and into the parent while (section.firstChild) { parent.insertBefore(section.firstChild, section); } // Remove the now-empty section wrapper parent.removeChild(section); }); } // Wait for all images inside a container to finish loading. // Returns a promise that resolves when every has loaded (or on timeout). function waitForImages(container, timeoutMs = 5000) { const images = container.querySelectorAll('img'); const promises = []; for (const img of images) { if (!img.complete) { promises.push(new Promise(resolve => { img.addEventListener('load', resolve, { once: true }); img.addEventListener('error', resolve, { once: true }); })); } } if (promises.length === 0) return Promise.resolve(); // Race all image loads against a timeout so broken images don't block forever return Promise.race([ Promise.all(promises), new Promise(resolve => setTimeout(resolve, timeoutMs)) ]); } // This is used multiple places to set height of workspace divs to their author-provided heights function setInitialWorkspaceHeights() { const workspaces = document.querySelectorAll('.workspace'); workspaces.forEach(ws => { ws.style.height = ws.getAttribute('data-space') || '0px'; ws.setAttribute("contenteditable", "true"); }); } // If a printout (worksheet or handout) includes authored pages, we only need to put content before the first page and after the last page into the first and last pages, respectively. function adjustPrintoutPages() { console.log("*** Adjusting printout pages."); const printout = document.querySelector('section.worksheet, section.handout'); if (!printout) { console.warn("No printout found, exiting adjustPrintoutPages."); return; } const pages = printout.querySelectorAll('.onepage'); if (pages.length === 0) { console.warn("No pages found in printout, exiting adjustPrintoutPages."); return; } // Find all children before the first .onepage element: const firstPage = pages[0]; const lastPage = pages[pages.length - 1]; // Move all children before the first page into the first page const pageFirstChild = firstPage.firstChild; let currentChild = printout.firstChild; while (currentChild && currentChild !== firstPage) { const nextChild = currentChild.nextSibling; // Save the next sibling before removing firstPage.insertBefore(currentChild, pageFirstChild); // Move to the first page currentChild = nextChild; // Move to the next child } // Now find all children after the last .onepage element: let nextChild = lastPage.nextSibling; while (nextChild) { const tempChild = nextChild; nextChild = nextChild.nextSibling; lastPage.appendChild(tempChild); } console.log("Moved all content before the first page and after the last page into the respective pages."); } // This is the main function we will call then a printout does not come from the XSL with pages already defined (for now, the XSL will keep the behavior as an option). function createPrintoutPages(margins) { console.log("*** Creating printout pages with margins:", margins); // Assumptions: needs to work for both letter (8.5in x 11in) and a4 (210mm x 297mm) paper sizes. We will work in pixels (96/in): those are 816px x 1056px and 794px x 1122.5px respectively (1 inch = 96 px, 1 cm = 37.8 px). We assume that the printing interface of the browser will do the right thing with these. // For purposes of finding page breaks, we will use 794 as our width and 1056 as our height (so A4 width and letter height). Then we will rescale workspace on each page to fit the actual paper size selected. const conservativeContentHeight = 1056 - (margins.top + margins.bottom); // in pixels const conservativeContentWidth = 794 - (margins.left + margins.right); // in pixels const printout = document.querySelector('section.worksheet, section.handout'); if (!printout) { console.warn("No printout found, exiting createPrintoutPages."); return; } printout.style.width = toString(conservativeContentWidth + margins.left + margins.right) + 'px'; // Set the height of each workspace based on its data-space attribute setInitialWorkspaceHeights(printout); // We want to consider each "block" of the printout. Some of these will be direct children of the printout, some will be nested inside these children. So first create a list of the elements that we consider blocks. let rows = []; for (const child of printout.children) { if (child.classList.contains('sidebyside')) { // sidebyside could have tasks, but we don't want to dive further into them. rows.push(child); } else if (child.querySelector('.task')) { // Keep the child as a block, but put each task after the first one as its own row: rows.push(child); const tasks = child.querySelectorAll('.task, .conclusion'); //Determine how many levels of nesting each task has. If parent is an .exercise, leave alone. If parent is a .task, add .subtask class. If grandparent is .task, add .subsubtask to it so it can be indented by css: for (let i = 0; i < tasks.length; i++) { let parent = tasks[i].parentElement; let grandparent = parent.parentElement; if (grandparent.classList.contains('task')) { tasks[i].classList.add('subsubtask'); } else if (parent.classList.contains('task')) { tasks[i].classList.add('subtask'); } } for (let i = tasks.length-1; i > 0; i--) { // Move the task out of the original child and place it directly after it in the printout. We do this in reverse order so when every task is moved, they return to the original order. They will then be added to the rows list as their own blocks. printout.insertBefore(tasks[i], child.nextSibling); } // Skipping separate treatment of exercisegroups for now. } else { rows.push(child); } } // Loop through the blocks and create a list of objects including the block, its height, and its workspace height. Only include blocks that have height (this will remove autopermalinks, as desired). let blockList = []; for (const row of rows) { let blockHeight = getElementTotalHeight(row); if (blockHeight === 0) { console.log("Skipping row with zero height:", row); continue; } let totalWorkspaceHeight = 0; if (row.querySelector('.workspace')) { // Workspace height is not just sum of workspace heights; we need to be careful with sidebyside and columns totalWorkspaceHeight = getElemWorkspaceHeight(row); } blockList.push({elem: row, height: blockHeight, workspaceHeight: totalWorkspaceHeight}); } // Now find pageBreaks so that extra workspace is as uniform as possible. const pageBreaks = findPageBreaks(blockList, conservativeContentHeight); // Create page divs and insert rows into them for (let i = 0; i < pageBreaks.length; i++) { const pageDiv = document.createElement('section'); pageDiv.classList.add('onepage'); if (i === 0) { pageDiv.classList.add('firstpage'); } // A single page will be both first and last if (i === pageBreaks.length - 1) { pageDiv.classList.add('lastpage'); } // The pageBreaks array gives the indices of blocks that should start a page. // So we will want to look for go through the blocks selecting those starting with the previous index (or 0) up to but not including the current index. const start = pageBreaks[i-1] || 0; const end = pageBreaks[i]; for (let j = start; j < end; j++) { const row = blockList[j].elem; pageDiv.appendChild(row); } printout.appendChild(pageDiv); } // remove any old content that is not in a page for (const child of printout.children) { if (!child.classList.contains('onepage')) { console.log("Removing old child not in a page:", child); printout.removeChild(child); } } } // Add headers and footers to all pages in a printout. Start with this set to be hidden by default; a toggle later will show/hide them. function addHeadersAndFootersToPrintout() { const printout = document.querySelector('section.worksheet, section.handout'); if (!printout) { console.warn("No printout found, exiting addHeadersAndFootersToPrintout."); return; } const pages = printout.querySelectorAll('.onepage'); // Loop through pages and add header and footer divs pages.forEach((page, index) => { const isFirstPage = index === 0; // Add header const headerDiv = document.createElement('div'); headerDiv.classList.add(isFirstPage ? 'first-page-header' : 'running-header', 'hidden'); headerDiv.innerHTML = `
    `; page.insertBefore(headerDiv, page.firstChild); // Add footer const footerDiv = document.createElement('div'); footerDiv.classList.add(isFirstPage ? 'first-page-footer' : 'running-footer', 'hidden'); footerDiv.innerHTML = ``; page.appendChild(footerDiv); }); // Add content based on local storage if available, otherwise from data-attributes on the printout const headerFooterKeys = ['header-first-left', 'header-first-center', 'header-first-right', 'footer-first-left', 'footer-first-center', 'footer-first-right', 'header-running-left', 'header-running-center', 'header-running-right', 'footer-running-left', 'footer-running-center', 'footer-running-right']; const headerFooterContent = {}; headerFooterKeys.forEach(key => { headerFooterContent[key] = localStorage.getItem(key) || printout.getAttribute(`data-${key}`) || ''; }); // First page header and footer document.querySelector('.first-page-header').querySelector('.header-left').innerHTML = headerFooterContent['header-first-left']; document.querySelector('.first-page-header').querySelector('.header-center').innerHTML = headerFooterContent['header-first-center']; document.querySelector('.first-page-header').querySelector('.header-right').innerHTML = headerFooterContent['header-first-right']; document.querySelector('.first-page-footer').querySelector('.footer-left').innerHTML = headerFooterContent['footer-first-left']; document.querySelector('.first-page-footer').querySelector('.footer-center').innerHTML = headerFooterContent['footer-first-center']; document.querySelector('.first-page-footer').querySelector('.footer-right').innerHTML = headerFooterContent['footer-first-right']; // Running headers and footers document.querySelectorAll('.running-header').forEach(headerDiv => { headerDiv.querySelector('.header-left').innerHTML = headerFooterContent['header-running-left']; headerDiv.querySelector('.header-center').innerHTML = headerFooterContent['header-running-center']; headerDiv.querySelector('.header-right').innerHTML = headerFooterContent['header-running-right']; }); document.querySelectorAll('.running-footer').forEach(footerDiv => { footerDiv.querySelector('.footer-left').innerHTML = headerFooterContent['footer-running-left']; footerDiv.querySelector('.footer-center').innerHTML = headerFooterContent['footer-running-center']; footerDiv.querySelector('.footer-right').innerHTML = headerFooterContent['footer-running-right']; }); // Add event listeners to update local storage when content is edited headerFooterKeys.forEach(key => { const selectorMap = { 'header-first-left': '.first-page-header .header-left', 'header-first-center': '.first-page-header .header-center', 'header-first-right': '.first-page-header .header-right', 'footer-first-left': '.first-page-footer .footer-left', 'footer-first-center': '.first-page-footer .footer-center', 'footer-first-right': '.first-page-footer .footer-right', 'header-running-left': '.running-header .header-left', 'header-running-center': '.running-header .header-center', 'header-running-right': '.running-header .header-right', 'footer-running-left': '.running-footer .footer-left', 'footer-running-center': '.running-footer .footer-center', 'footer-running-right': '.running-footer .footer-right' }; const elements = document.querySelectorAll(selectorMap[key]); elements.forEach(elem => { elem.addEventListener('input', () => { localStorage.setItem(key, elem.innerHTML); }); }); }); } // We look at each page and adjust the heights of the workspaces to fit it nicely into the page. // The width and height of the page will now depend on the letter or a4 setting. function adjustWorkspaceToFitPage({paperSize, margins}) { console.log("*** Adjusting workspace to fit page size:", paperSize, "with margins:", margins); // Toggle off workspace highlight if it is on, so it doesn't interfere with resizing const highlightWorkspaceCheckbox = document.getElementById("highlight-workspace-checkbox"); const wasHighlighted = highlightWorkspaceCheckbox && highlightWorkspaceCheckbox.checked; if (wasHighlighted) { toggleWorkspaceHighlight(false); } let paperWidth, paperHeight; if (paperSize === 'a4' || document.body.classList.contains('a4')) { console.log("Setting page size to A4"); paperWidth = 794; // 210mm in px paperHeight = 1122.5; // 297mm in px 794px x 1122.5px } else { console.log("Setting page size to Letter"); paperWidth = 816; // 8.5in in px paperHeight = 1056; // 11in in px } const paperContentHeight = paperHeight - (margins.top + margins.bottom); // Reset the heights of workspace divs to their author-provided heights setInitialWorkspaceHeights(); const pages = document.querySelectorAll('.onepage'); pages.forEach(page => { console.log("Adjusting workspace height for page:", page); // Set width to get accurate calculations page.style.width = paperWidth + 'px'; const rows = page.children; let totalContentHeight = 0; let totalWorkspaceHeight = 0; for (const row of rows) { totalContentHeight += getElementTotalHeight(row); totalWorkspaceHeight += getElemWorkspaceHeight(row); } if (totalWorkspaceHeight === 0) { console.log("No workspaces on this page, skipping workspace adjustment."); // Reset the style for the page page.style.width = ""; return; } const extraHeight = paperContentHeight - totalContentHeight; console.log("Extra height to distribute across workspaces:", extraHeight, "px."); // Determine the factor by which to multiply each workspace to make the total height fit the paperContentHeight const workspaceAdjustmentFactor = (totalWorkspaceHeight + extraHeight) / totalWorkspaceHeight; console.log("Workspace adjustment factor for page:", workspaceAdjustmentFactor); // Now adjust each workspace in the page by this factor const pageWorkspaces = page.querySelectorAll('.workspace'); pageWorkspaces.forEach(ws => { const originalHeight = ws.offsetHeight; const newHeight = originalHeight * workspaceAdjustmentFactor; ws.style.height = newHeight + "px"; }); // Reset the style for the page page.style.width = ""; }); console.log("Set page sizes to content area of paper size."); // Reset the highlight workspace checkbox state if (wasHighlighted) { toggleWorkspaceHighlight(true); } } // Helper functions for calculating heights and workspace sizes function getElementTotalHeight(elem) { // Calculate the total height of the element, including padding, border, and top margin. const style = getComputedStyle(elem); const marginTop = parseFloat(style.marginTop); const marginBottom = parseFloat(style.marginBottom); const height = elem.offsetHeight; return height + marginTop + marginBottom; } function getElemWorkspaceHeight(elem) { // Calculate the total height of all workspaces in the element. // This is easy for elements stacked vertically, but we must be careful for side-by-side workspaces. Since we will multiply each workspace by a factor to fit the page, taking the largest workspace height should give us an upper bound for the amount of vertical space that is workspace. // Note that this won't work well if we need to reduce the workspace, since there we would want to take the minimum heights. if (elem.classList.contains('sidebyside')) { const sbspanels = elem.querySelectorAll('.sbspanel'); let max = 0; sbspanels.forEach(panel => { const workspaces = panel.querySelectorAll('.workspace'); let totalHeight = 0; workspaces.forEach(workspace => { const workspaceHeight = workspace.offsetHeight; if (workspaceHeight) { totalHeight += workspaceHeight; } }); if (totalHeight > max) { max = totalHeight; // Take the maximum height of workspaces in sidebyside } }); return max; // Return the maximum height of workspaces in sidebyside } // We can take care of exercisegroups and single colomn regular layout together. let columns = 1; if (elem.classList.contains('exercisegroup')) { // Check for column classes and set columns accordingly for (let i = 2; i <= 6; i++) { if (elem.querySelector(`.cols${i}`)) { columns = i; console.log("Found exercisegroup with columns:", columns); break; } } } const workspaces = elem.querySelectorAll('.workspace'); let totalHeight = 0; workspaces.forEach(ws => { const workspaceHeight = ws.offsetHeight; if (workspaceHeight) { totalHeight += workspaceHeight; } }); return totalHeight / columns; // Divide by columns if sidebyside to get average height per column } // Functions for finding the optimal page breaks function findPageBreaks(rows, pageHeight) { console.log("*** Finding page breaks for", rows.length, "rows with page height:", pageHeight); // An array for the page breaks. The nth element will be the index of the first row on page n+1. let pageBreaks = []; // An array for the minimum cost possible for rows i to the end. let minCost = Array(rows.length + 1).fill(Infinity); minCost[rows.length] = 0; // No cost for no rows // An array to keep track of the next row to start a new page after i in minCost. let nextPageBreak = Array(rows.length).fill(-1); // Now loop through the rows in reverse order to find the optimal page breaks. for (let i = rows.length - 1; i >= 0; i--) { let cumulativeHeight = 0; let cumulativeWorkspaceHeight = 0; // Loop through the rows starting from i to find the best page break for (let j = i; j < rows.length; j++) { cumulativeHeight += rows[j].height; cumulativeWorkspaceHeight += rows[j].workspaceHeight; if (cumulativeHeight > pageHeight) { if (j === i) { // The page height is too big for a single row. We make this row its own page and move on. console.log("Row", i, "exceeds page height by itself, setting as its own page."); minCost[i] = 0; // No cost for a single row nextPageBreak[i] = i + 1; // The next page break is after this row break; // Move to the next row } else { // We have already set minCost and NextPageBreak at an earlier point in the loop. This means we have done the best we can for this row so we stop and move to the next earlier row. break; // Stop if we exceed the page height } } const cost = (pageHeight - cumulativeHeight)**2 + minCost[j+1]; // Cost is how much space is left on the page, plus the cost of the following pages. if (cost < minCost[i]) { minCost[i] = cost; nextPageBreak[i] = j+1; // Set the next page break to be after row j } } } // Backtrack to find the actual page breaks based on nextPageBreak // Note: the nextPage = 1 is not an indexing mistake; we always assume that row 0 is a title and will go on the same page as row 1. let nextPage = 1; while (nextPage < rows.length) { pageBreaks.push(nextPageBreak[nextPage]); nextPage = nextPageBreak[nextPage]; } return pageBreaks; } // Function to set CSS variables and @page rules for page geometry. This will be called whenever the paper size or margins change (in practice, only when page size changes, since margins are fixed for now). function setPageGeometryCSS({paperSize, margins}) { console.log("*** Setting page geometry CSS for paper size:", paperSize, "with margins:", margins); // Remove any existing geometry CSS to avoid duplicates const existingStyle = document.getElementById("page-geometry-css"); if (existingStyle) { existingStyle.remove(); } let wsWidth = paperSize === "letter" ? "816px" : "794px"; // 8.5in for Letter, 210mm for A4 let wsHeight = paperSize === "letter" ? "1056px" : "1123px"; // 11in for Letter, 297mm for A4 // Create a new style element for geometry CSS const style = document.createElement("style"); // Add an identifier to the style element to avoid conflicts style.id = "page-geometry-css"; // NB we need to add the fallback values for the margins in @page because some browsers do not support CSS variables in @page rules. style.textContent = ` :root { --ws-width: ${wsWidth}; --ws-height: ${wsHeight}; --ws-top-margin: ${margins.top}px; --ws-right-margin: ${margins.right}px; --ws-bottom-margin: ${margins.bottom}px; --ws-left-margin: ${margins.left}px; } @page { margin: var(--ws-top-margin, ${margins.top}px) var(--ws-right-margin, ${margins.right}px) var(--ws-bottom-margin, ${margins.bottom}px) var(--ws-left-margin, ${margins.left}px); } `; document.head.appendChild(style); } function toggleWorkspaceHighlight(isChecked) { if (isChecked) { // Toggle the highlight class on the body based on the checkbox state document.body.classList.add("highlight-workspace"); // If we haven't already inserted divs to show the original workspace heights, do that now if (!document.querySelector('.workspace-container')) { console.log("adding original workspace divs"); // Insert divs to show the original workspace document.querySelectorAll('.workspace').forEach(workspace => { // Create a container div to hold the workspace div and the original div const container = document.createElement('div'); container.classList.add('workspace-container'); // Set the container height to the current workspace height container.style.height = window.getComputedStyle(workspace).height; const original = document.createElement('div'); original.classList.add('original-workspace'); const originalHeight = workspace.getAttribute('data-space') || '0px'; original.setAttribute('title', 'Author-specified workspace height (' + originalHeight + ')'); // Use the data-space attribute for height of original workspace original.style.height = originalHeight; // insert original div before the workspace content container.appendChild(original); // Add a warning class if the original height is greater than the current height if (original.offsetHeight > workspace.offsetHeight) { original.classList.add('warning'); } // Move the workspace into the container workspace.parentNode.insertBefore(container, workspace); container.appendChild(workspace); }); } } else { document.body.classList.remove("highlight-workspace"); // Remove the original workspace divs. We don't want to keep these in, as they interfere with changing page sizes and workspace heights. document.querySelectorAll('.workspace-container').forEach(container => { const workspace = container.querySelector('.workspace'); // Move the workspace out of the container container.parentNode.insertBefore(workspace, container); // Remove the container container.remove(); }); } } function getPaperSize() { let paperSize = localStorage.getItem("papersize"); if (paperSize) { return paperSize; } else { // Try to set papersize based on user's geographic region // Default to 'letter' for North and South America, 'a4' elsewhere try { fetch('https://ipapi.co/json/') .then(response => response.json()) .then(data => { let continent = data && data.continent_code ? data.continent_code : ""; paperSize = (continent === "NA" || continent === "SA") ? "letter" : "a4"; const radio = document.querySelector(`input[name="papersize"][value="${paperSize}"]`); if (radio) { radio.checked = true; localStorage.setItem("papersize", paperSize); } document.body.classList.remove("a4", "letter"); document.body.classList.add(paperSize); console.log("Setting papersize to", paperSize); }) .catch((err) => { // rethrow to be caught by the outer catch throw err; }); } catch (e) { // fallback: default to letter const radio = document.querySelector(`input[name="papersize"][value="letter"]`); if (radio) radio.checked = true; } } return paperSize || "letter"; } // Function to load the printout section and switch to print stylesheet. This will run whenever a user clicks on a print preview link (which adds ?printpreview=sectionID to the URL). async function loadPrintout(printableSectionID) { // Switch to print-worksheet.css for print preview const themeStylesheetLink = document.querySelector('link[rel="stylesheet"][href*="theme"]'); // get the href of the theme stylesheet link const themeStylesheetHref = themeStylesheetLink ? themeStylesheetLink.getAttribute('href') : null; if (themeStylesheetHref) { // replace 'theme.css' with 'print-worksheet.css' in the href const printStylesheetHref = themeStylesheetHref.replace(/theme.*\.css/, 'print-worksheet.css'); // update the href of the theme stylesheet link themeStylesheetLink.setAttribute('href', printStylesheetHref); // Wait for the new stylesheet to load. This is important to ensure the styles are applied before the calling function tries to compute workspace sizes. await new Promise((resolve) => { themeStylesheetLink.addEventListener('load', resolve, { once: true }); }); } // Find the section with this ID const printableSection = document.getElementById(printableSectionID); if (!printableSection) { console.error("No section found with ID:", printableSectionID); return; } // Remove any existing sections from .ptx-content and add only the printable section const ptxContent = document.querySelector('.ptx-content'); const existingSections = ptxContent.querySelectorAll(':scope > section'); existingSections.forEach(sec => ptxContent.removeChild(sec)); ptxContent.appendChild(printableSection); } // Function to redo solutions details to divs with summary as title function rewriteSolutions() { var born_hidden_knowls = document.querySelectorAll('.worksheet details, .handout details'); born_hidden_knowls.forEach(function(detail) { const summary = detail.querySelector('summary'); const content = detail.innerHTML.replace(summary.outerHTML, ''); const div = document.createElement('div'); div.classList = detail.classList; if (summary) { const title = document.createElement('h5'); title.innerHTML = summary.innerHTML; div.appendChild(title); } const body = document.createElement('div'); body.innerHTML = content; div.appendChild(body); detail.parentNode.replaceChild(div, detail); }); } // Utility to convert various CSS length units to pixels function toPixels(value) { if (typeof value === "number") return value; if (typeof value !== "string") return 0; value = value.trim(); if (value.endsWith("px")) { return parseFloat(value); } else if (value.endsWith("in")) { return Math.floor(parseFloat(value) * 96); } else if (value.endsWith("cm")) { return Math.floor(parseFloat(value) * 37.8); } else if (value.endsWith("mm")) { return Math.floor(parseFloat(value) * 3.78); } else if (value.endsWith("pt")) { return Math.floor(parseFloat(value) * (96 / 72)); } else { // fallback: try to parse as px return parseFloat(value) || 0; } } // Event listener for page load to handle print preview setup window.addEventListener("DOMContentLoaded", async function(event) { const urlParams = new URLSearchParams(window.location.search); // We condition on the existence of the papersize radio buttons, which only appear in the printout print preview. if (urlParams.has("printpreview")) { const printableSectionID = urlParams.get("printpreview"); await loadPrintout(printableSectionID); // First, get the margins for pages to be passed around as needed. const marginList = document.querySelector('section.worksheet, section.handout').getAttribute('data-margins').split(' '); // Convert margin values to pixels if they are not already numbers const margins = { top: toPixels(marginList[0] || "0.75in"), // Default to 0.75in if not specified right: toPixels(marginList[1] || "0.75in"), bottom: toPixels(marginList[2] || "0.75in"), left: toPixels(marginList[3] || "0.75in") } // Transform all solutions details elements to divs with the summary as a title rewriteSolutions(); // Get the papersize from localStorage or set it based on user's geographic region. This will always return a value (defaulting to 'letter' if all else fails). let paperSize = getPaperSize(); if (paperSize) { const radio = document.querySelector(`input[name="papersize"][value="${paperSize}"]`); if (radio) { radio.checked = true; } // Set the papersize class on body document.body.classList.remove("a4", "letter"); document.body.classList.add(paperSize); setPageGeometryCSS({paperSize: paperSize, margins: margins}); } else { console.warning("Bug: paperSize should always have a value here."); } // Add event listeners to the papersize radio buttons to handle changes const papersizeRadios = document.querySelectorAll('input[name="papersize"]'); papersizeRadios.forEach(radio => { radio.addEventListener('change', function() { if (this.checked) { document.body.classList.remove("a4", "letter"); document.body.classList.add(this.value); localStorage.setItem("papersize", this.value); setPageGeometryCSS({paperSize: this.value, margins: margins}); adjustWorkspaceToFitPage({paperSize: this.value, margins: margins}); } }); }); // Add event listeners to the hide hints/answers/solutions checkboxes for (const solutionType of ["hint", "answer", "solution"]) { const checkbox = document.getElementById(`hide-${solutionType}-checkbox`); if (checkbox) { const storageKey = `hide-${solutionType}`; // by default, hide answer and solution divs if (solutionType === "answer" || solutionType === "solution") { if (!localStorage.getItem(storageKey)) { checkbox.checked = true; localStorage.setItem(storageKey, "true"); } } // Now adjust based on local storage // set visibility based on current checkbox state checkbox.checked = localStorage.getItem(storageKey) === "true"; document.querySelectorAll(`div.${solutionType}`).forEach(elem => { // add hidden to class list if (checkbox.checked) { elem.classList.add("hidden"); } else { elem.classList.remove("hidden"); } }); // Add event listener to toggle visibility checkbox.addEventListener("change", function() { localStorage.setItem(storageKey, this.checked); // toggle visibility of solution divs document.querySelectorAll(`div.${solutionType}`).forEach(elem => { if (checkbox.checked) { elem.classList.add("hidden"); } else { elem.classList.remove("hidden"); } //adjustPrintoutPages(); adjustWorkspaceToFitPage({paperSize: paperSize, margins: margins}); }); }); } } // Finally, with everything set up, we create or adjust the printout pages as needed. // Flatten paragraphs sections so page breaks can occur inside them. const printoutSection = document.querySelector('section.worksheet, section.handout'); if (printoutSection) { flattenParagraphsSections(printoutSection); } // Wait for all images to load so height measurements are accurate. if (printoutSection) { await waitForImages(printoutSection); } // If the printout has authored pages, there will be at least one .onepage element. if (document.querySelector('.onepage')) { adjustPrintoutPages(); } else { createPrintoutPages(margins); } // Add headers and footers to all pages in the printout addHeadersAndFootersToPrintout(); // Add event listeners to the print header/footer checkboxes for (const hf of ["first-page-header", "running-header", "first-page-footer", "running-footer"]) { const checkbox = document.getElementById(`print-${hf}-checkbox`); if (checkbox) { // set visibility based on current checkbox state checkbox.checked = localStorage.getItem(`print-${hf}`) === "true"; document.querySelectorAll(`.${hf}`).forEach(elem => { // add hidden to class list if (checkbox.checked) { elem.classList.remove("hidden"); } else { elem.classList.add("hidden"); } }); // Add event listener to toggle visibility checkbox.addEventListener("change", function() { localStorage.setItem(`print-${hf}`, this.checked); // toggle visibility of header/footer divs document.querySelectorAll(`.${hf}`).forEach(elem => { if (checkbox.checked) { elem.classList.remove("hidden"); } else { elem.classList.add("hidden"); } adjustWorkspaceToFitPage({paperSize: paperSize, margins: margins}); }); }); } } // After pages are set up, we adjust the workspace heights to fit the page (based on the paper size). adjustWorkspaceToFitPage({paperSize: paperSize, margins: margins}); // Get the 'highlight workspace' checkbox state from localStorage or set it to false by default // NB we need to do this after the adjustment of workspace heights so that the additional original workspace divs don't throw off the calculations when the page is reloaded. const highlightWorkspaceCheckbox = document.getElementById("highlight-workspace-checkbox"); if (highlightWorkspaceCheckbox) { highlightWorkspaceCheckbox.checked = localStorage.getItem("highlightWorkspace") === "true"; highlightWorkspaceCheckbox.addEventListener("change", function() { localStorage.setItem("highlightWorkspace", this.checked); toggleWorkspaceHighlight(this.checked); }); // Initial toggle to apply the highlight class if checked toggleWorkspaceHighlight(highlightWorkspaceCheckbox.checked); } console.log("finished adjusting workspace"); } }); //----------------------------------------------------------------- // Dark/Light mode swiching function isDarkMode() { if (document.documentElement.dataset.darkmode === 'disabled') return false; const currentTheme = localStorage.getItem("theme"); if (currentTheme === "dark") return true; else if (currentTheme === "light") return false; return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; } function setDarkMode(isDark) { if(document.documentElement.dataset.darkmode === 'disabled') return; const parentHtml = document.documentElement; const iframes = document.querySelectorAll("iframe[data-dark-mode-enabled]"); // Update the parent document if (isDark) { parentHtml.classList.add("dark-mode"); } else { parentHtml.classList.remove("dark-mode"); } // Sync each iframe's class with the parent for (const iframe of iframes) { try { const iframeHtml = iframe.contentWindow.document.documentElement; if (isDark) { iframeHtml.classList.add("dark-mode") } else { iframeHtml.classList.remove("dark-mode") } } catch (err) { console.warn("Dark mode sync to iframe failed:", err); } } const modeButton = document.getElementById("light-dark-button"); if (modeButton) { modeButton.querySelector('.icon').innerText = isDark ? "light_mode" : "dark_mode"; modeButton.querySelector('.name').innerText = isDark ? "Light Mode" : "Dark Mode"; } } // Run this as soon as possible to avoid flicker setDarkMode(isDarkMode()); // Rest of dark mode setup logic waits until after load window.addEventListener("DOMContentLoaded", function(event) { // Rerun setDarkMode now that it can update buttons const isDark = isDarkMode(); setDarkMode(isDark); const modeButton = document.getElementById("light-dark-button"); modeButton.addEventListener("click", function() { const wasDark = isDarkMode(); setDarkMode(!wasDark); localStorage.setItem("theme", wasDark ? "light" : "dark"); }); }); // Share button and embed in LMS code window.addEventListener("DOMContentLoaded", function(event) { const shareButton = document.getElementById("embed-button"); if (shareButton) { const sharePopup = document.getElementById("embed-popup"); const embedCode = ""; const embedTextbox = document.getElementById("embed-code-textbox"); if (embedTextbox) { embedTextbox.value = embedCode; } shareButton.addEventListener("click", function() { sharePopup.classList.toggle("hidden"); }); const copyButton = document.getElementById("copy-embed-button"); if (copyButton) { copyButton.addEventListener("click", function() { const embedTextbox = document.getElementById("embed-code-textbox"); if (embedTextbox) { navigator.clipboard.writeText(embedCode).then(() => { console.log("Embed code copied to clipboard!"); }).catch(err => { console.error("Failed to copy embed code: ", err); }); //copyButton.innerHTML = "✓✓"; // show confirmation for 2 seconds: copyButton.querySelector('.icon').innerText = "library_add_check"; setTimeout(function() { copyButton.querySelector('.icon').innerText = "content_copy"; sharePopup.classList.add("hidden"); }, 450); } }); } } }); // Hide everything except the content when the URL has "embed" in it window.addEventListener("DOMContentLoaded", function(event) { const urlParams = new URLSearchParams(window.location.search); if (urlParams.has("embed")) { // Set dark mode based on value of param if (urlParams.get("embed") === "dark") { setDarkMode(true); } else { setDarkMode(false); } const elemsToHide = [ "ptx-navbar", "ptx-masthead", "ptx-page-footer", "ptx-sidebar", "ptx-content-footer" ]; for (let id of elemsToHide) { const elem = document.getElementById(id); if (elem) { elem.classList.add("hidden"); } } } }); // START Support for code-copy button functionality document.addEventListener("click", (ev) => { const codeBox = ev.target.closest(".clipboardable"); if (!navigator.clipboard || !codeBox) return; const button = ev.target.closest(".code-copy"); const preContent = codeBox.querySelector("pre").textContent; navigator.clipboard.writeText(preContent); button.classList.toggle("copied") setTimeout(() => button.classList.toggle("copied"), 1000); }); document.addEventListener("DOMContentLoaded", () => { const elements = document.querySelectorAll(".clipboardable"); for (el of elements) { const div = document.createElement("div"); div.classList.add("clipboardable"); el.classList.remove("clipboardable"); el.replaceWith(div); div.insertAdjacentElement("afterbegin", el); div.insertAdjacentHTML("beforeend", ` `.trim()); } }); // END Support for code-copy button functionality ================================================ FILE: js/pretext_search.js ================================================ // next comment is out of date: there are more search options // from lunr-pretext-search-index.js we will have either // var ptx_lunr_search_style = "default"; // or // var ptx_lunr_search_style = "reference"; // since there is only one search box now, this can be simplified function doSearch(searchlocation="A") { // Get the search terms from the input text box var terms; if(searchlocation == "A") { terms = document.getElementById("ptxsearch").value; } else { terms = document.getElementById("ptxsearchB").value; } localStorage.setItem('last-search-terms', JSON.stringify({terms: terms, time: Date.now()})); // Where do we want to put the results? let resultArea = document.getElementById("searchresults") resultArea.innerHTML = ""; // clear out any previous results // assume AND for multiple words var searchterms = terms; if(searchlocation == "B") { document.getElementById("ptxsearch").value = searchterms console.log("ptxsearch value", document.getElementById("ptxsearch").value); } else { searchterms = terms; } searchterms = searchterms.toLowerCase().trim(); let pageResult = []; if(searchterms != "") { pageResult = ptx_lunr_idx.query((q) => { for(let term of searchterms.split(' ')) { q.term(term, { fields: ["title"], boost: 20 }); //exact title match with 20x weight q.term(term, { wildcard: lunr.Query.wildcard.TRAILING, fields: ["title"], boost: 10 }); //inexact title 10x weight q.term(term, { fields: ["body"], boost: 5 }); //exact body 5x weight q.term(term, { wildcard: lunr.Query.wildcard.TRAILING, fields: ["body"] }); //inexact body } }); } // Number the documents from first to last so we can order the results by their // position in the book. snum = 0; for (let doc of ptx_lunr_docs) { doc.snum = snum; snum += 1; } //Limit to a sane number of results - otherwise search like 'e' matches every page const MAX_RESULTS = 100; let numUnshown = (pageResult.length > MAX_RESULTS) ? pageResult.length - MAX_RESULTS : 0; pageResult.slice(0, MAX_RESULTS); // Transfer meta data from the document to the results to make it easy to add // our lists later. augmentResults(pageResult, ptx_lunr_docs); pageResult.sort(comparePosition); addResultToPage(terms, pageResult, ptx_lunr_docs, numUnshown, resultArea); MathJax.typeset(); } // Find the entry for a search result in the original document index function findEntry(resultId, db) { for (const page of db) { if (page.id === resultId) { return page; } } return resultId; } function augmentResults(result, docs) { for (let res of result) { let info = findEntry(res.ref, docs); res.number = info.number; res.type = info.type; res.title = info.title; res.url = info.url; res.level = info.level; res.snum = info.snum; res.score = parseFloat(res.score); //extra score multiplier based on level - prioritize sections over subsections/exercises/etc... const LEVEL_WEIGHTS = [3, 2, 1.5] if( res.level < 2 ) res.score *= LEVEL_WEIGHTS[res.level]; res.body = ''; //Add body snippets and highlights const REVEAL_WINDOW = 30; let titleMarked = false; for (const hit in res.matchData.metadata) { if(res.matchData.metadata[hit].title) { //only show one match in title as locations change after first markup if(!titleMarked) { if(!res.matchData.metadata[hit].title.position) continue; let positionData = res.matchData.metadata[hit].title.position[0]; const startClipInd = positionData[0]; const endClipInd = positionData[0] + positionData[1]; res.title = res.title.substring(0, endClipInd) + '' + res.title.substring(endClipInd); res.title = res.title.substring(0, startClipInd) + '' + res.title.substring(startClipInd); titleMarked = true; } } else if (res.matchData.metadata[hit].body) { if(!res.matchData.metadata[hit].body.position) continue; const bodyContent = info.body; let positionData = res.matchData.metadata[hit].body.position[0]; const startInd = positionData[0] - REVEAL_WINDOW; const endInd = positionData[0] + positionData[1] + REVEAL_WINDOW; const startClipInd = positionData[0]; const endClipInd = positionData[0] + positionData[1]; let resultSnippet = (startInd > 0 ? '...' : '' ) + bodyContent.substring(startInd, startClipInd); resultSnippet += '' + bodyContent.substring(startClipInd, endClipInd) + ''; resultSnippet += bodyContent.substring(endClipInd, endInd) + (endInd < bodyContent.length ? '...' : '' ) + '
    '; res.body += resultSnippet; } } } } function rearrangedArray(arry) { // return a new array which is arry (with depth) sorted according to meas, // again as an array with depth. // "with depth'' means that large children drag along their parents. let newarry = []; let startind = 0; let numtograb = 0; let ct = 1; while (arry.length > 0 && ct < 500) { ++ct; // just in case something goes wrong const locofmax = maxLocation(arry) let segmentstart = locofmax; let segmentlength = 1; while (arry[segmentstart].level == "2") { --segmentstart } while (segmentstart + segmentlength < arry.length && arry[segmentstart + segmentlength].level == "2") { ++segmentlength } // console.log("locofmax", locofmax, "starting", segmentstart, "going", segmentlength, "from", arry.length); newarry.push(...arry.splice(segmentstart,segmentlength)); } // console.log("newarry", newarry); return newarry } function maxLocation(arry) { let maxloc = 0; let maxvalsofar = -1; for (let index = 0; index < arry.length; ++index) { if (arry[index].score > maxvalsofar) { maxloc = index; maxvalsofar = arry[index].score } } return maxloc } function comparePosition(a, b) { if (a.snum < b.snum) { return -1; } if (a.snum > b.snum) { return 1; } return 0; } function compareScoreDesc(a, b) { if (a.score < b.score) { return 1; } if (a.score > b.score) { return -1; } return 0; } function addResultToPage(searchterms, result, docs, numUnshown, resultArea) { /* backward compatibility for old html */ if (document.getElementById("searchempty")) { document.getElementById("searchempty").style.display = "none"; } let len = result.length; console.log("first result", result[0]); if (len == 0) { if (document.getElementById("searchempty")) { document.getElementById("searchempty").style.display = "block"; } else { let noresults = document.createElement("div"); noresults.classList.add("noresults"); search_no_results_string = "No results were found" noresults.innerHTML = search_no_results_string + "."; // console.log("the new variable", search_results_heading_string); resultArea.appendChild(noresults); } document.getElementById("searchresultsplaceholder").style.display = null; return } // console.log("result",result); let allScores = result.map(function (r) { return r.score }); // console.log(typeof allScores[0], "allScores",allScores); allScores.sort((a,b) => (a - b)); allScores.reverse(); // console.log("allScores, sorted",allScores); // let high = result[Math.floor(len*0.25)].score; // let med = result[Math.floor(len*0.5)].score; // let low = result[Math.floor(len*0.75)].score; // sort the results by their position in the book, not their score let high = allScores[Math.floor(len*0.20)]; let med = allScores[Math.floor(len*0.40)]; let low = allScores[Math.floor(len*0.75)]; if (ptx_lunr_search_style == "reference") { result = rearrangedArray(result); } let indent = "1"; let currIndent = indent; let origResult = resultArea; // Create list entries indenting as needed. for (const res of result) { let link = document.createElement("a") // add a class so we can colorize the results based on their rank in terms // of search score. if (res.score >= high) { link.classList.add("high_result") } else if (res.score >= med) { link.classList.add("medium_result") } else if (res.score >= low) { link.classList.add("low_result") } else { link.classList.add("no_result") } currIndent = res.level; if (currIndent > indent) { indent = currIndent; let ilist = document.createElement("ul") ilist.classList.add("detailed_result"); resultArea.appendChild(ilist); resultArea = ilist; } else if (currIndent < indent) { resultArea = origResult; indent = currIndent; } link.href = `${res.url}`; link.innerHTML = `${res.type} ${res.number} ${res.title}`; let clip = document.createElement("div"); clip.classList.add("search-result-clip"); clip.innerHTML = `${res.body}`; let bullet = document.createElement("li"); bullet.classList.add('search-result-bullet'); bullet.appendChild(link); bullet.appendChild(clip); let p = document.createElement("text"); p.classList.add('search-result-score'); p.innerHTML = ` (${res.score.toFixed(2)})`; bullet.appendChild(p); resultArea.appendChild(bullet); } // Auto-close search results when a result is clicked in case result is on // the same page search started from const resultsDiv = document.getElementById('searchresultsplaceholder'); const backDiv = document.querySelector('.searchresultsbackground'); resultArea.querySelectorAll("a").forEach((link) => { link.addEventListener('click', (e) => { backDiv.style.display = 'none'; resultsDiv.style.display = 'none'; }); }); //Could print message about how many results are not shown. No way to localize it though... // if(numUnshown > 0) { // let bullet = document.createElement("li"); // bullet.classList.add('search-results-bullet'); // bullet.classList.add('search-results-unshown-count'); // let p = document.createElement("text"); // p.innerHTML = `${parseInt(numUnshown)} unshown results...`; // bullet.appendChild(p); // resultArea.appendChild(bullet); // } document.getElementById("searchresultsplaceholder").style.display = null; MathJax.typesetPromise(); } window.addEventListener("load", function (event) { const resultsDiv = document.getElementById('searchresultsplaceholder'); //insert a div to be backgroud behind searchresultsplaceholder const backDiv = document.createElement("div"); backDiv.classList.add("searchresultsbackground"); backDiv.style.display = 'none'; resultsDiv.parentNode.appendChild(backDiv); document.getElementById("searchbutton").addEventListener('click', (e) => { resultsDiv.style.display = null; backDiv.style.display = null; let searchInput = document.getElementById("ptxsearch"); searchInput.value = JSON.parse(localStorage.getItem("last-search-terms")).terms; searchInput.select(); doSearch(); }); document.getElementById("ptxsearch").addEventListener('input', (e) => { doSearch(); }); document.getElementById("closesearchresults").addEventListener('click', (e) => { resultsDiv.style.display = 'none'; backDiv.style.display = 'none'; document.getElementById('searchbutton').focus(); }); }); ================================================ FILE: js/ptx_scorm_events.js ================================================ /** * ptx-scorm-events.js — PreTeXt SCORM Tracking Adapter * * PURPOSE * ------- * When a PreTeXt book is exported as a SCORM package (compression="scorm" in * project.ptx), the resulting zip is uploaded to an LMS (Canvas, Moodle, …). * The LMS hosts the content in an iframe and exposes a JavaScript object * called the "SCORM API" on the parent window. This script acts as the * bridge between PreTeXt/Runestone interactive exercises and that SCORM API. * * WHAT IT DOES * ------------ * 1. Discovers the SCORM API exposed by the LMS (supports both SCORM 1.2 and * SCORM 2004). * 2. Initializes a SCORM session the first time the learner answers a question. * 3. Monkey-patches RunestoneBase.prototype.logBookEvent so that every * Runestone exercise submission is intercepted. * 4. For each graded submission, writes a SCORM "interaction" record (type, * learner response, result, timestamp) to the LMS grade book. * 5. Maintains a running score (percentage correct across all answered * questions on all pages visited in this session) and reports it as * cmi.score.scaled (SCORM 2004) or cmi.core.score.raw (SCORM 1.2). * 6. Persists the running totals in cmi.suspend_data so that navigating to * a new page does not reset the accumulated score. * 7. Marks the SCO as "completed" after the first question is answered * (completion means "visited and interacted", not "all correct"). * * SCORING POLICY * -------------- * The score is simply: (sum of per-question percentage scores) / (questions answered) * No pass/fail threshold is applied here. The LMS can apply its own mastery * score to determine pass/fail based on the reported scaled score. * * INCLUDED EXERCISE TYPES * ----------------------- * All standard Runestone interactive types are handled: * - multiplechoice / clickablearea → SCORM interaction type "choice" * - fillintheblank / webwork → "fill-in" * - parsons / hparsons → "sequencing" * - dragndrop / matching → "matching" * - unittest (ActiveCode tests) → "performance" * - shortanswer / journal → "long-fill-in" (no automatic score; * recorded as neutral result) * * HOW TO INCLUDE * -------------- * This file is placed in _static/pretext/js/ by the PreTeXt build system and * injected into every HTML page via a
    width: %; margin-left: %; margin-right: %;
    code-inline tex2jax_ignore language- language-none
                
                
                    program
                    
                    
                    
                         line-numbers
                    
                
                
                
                    
                        
                        
                    
                
                
                    
                    
                    
                    
                        
                            
                        
                    
                    
                    
                    
                        
                            
                                language-
                                
                            
                            
                            
                                language-none
                            
                        
                    
                    
                    
                    
                        
                            
                        
                        
                        
                            
                        
                    
                    
                    
                        
                    
                
            
            
                console
                
            
            
        
    true https://c3d.libretexts.org/CalcPlot3D/index.html https://c3d.libretexts.org/CalcPlot3D/dynamicFigureWCP/index.html https://c3d.libretexts.org/CalcPlot3D/dynamicFigure/index.html http://www.example.com/ PTX:ERROR: @variant="" is not recognized for a CalcPlot3D <interactive>
    aspect-ratio: ;
    https://d3js.org/d3.v 5 .min.js latest https://cdn.jsdelivr.net/npm/@doenet/standalone@ /style.css https://cdn.jsdelivr.net/npm/@doenet/standalone@ /doenet-standalone.js
    aspect-ratio: ;
    jxgbox
          
        
    ggb_ _params _onload _applet -container
    jxgbox text/jessiecode text/javascript function parseJessie(code) { let board = JXG.JSXGraph.initBoard(' ', { boundingbox:[ ], axis: , grid: , keepaspectratio:true}); board.jc = new JXG.JessieCode(); board.jc.use(board); board.suspendUpdate(); board.jc.parse(code); board.unsuspendUpdate(); } fetch(' ').then(function(response) { response.text().then( function(text) { parseJessie(text); }); });
    true

    Waiting on the page to load...

    max-width: ; width: 100%; aspect-ratio: px max-width: ; width: 100%; aspect-ratio: max-width: px; width: 100%; aspect-ratio: ; aspect-ratio: ; width: px; height: px; display: block; jxgbox width: px; height: px; -ww-rs
    ****************************************** * Authored with PreTeXt * * pretextbook.org * * Theme: * Palette: ****************************************** <!-- Leading with initials is useful for small tabs --> <xsl:if test="$docinfo/initialism"> <xsl:apply-templates select="$docinfo/initialism" /> <xsl:text> </xsl:text> </xsl:if> <xsl:apply-templates select="." mode="title-plain" /> docHasLoaded() pretext book pretext article ignore-math
    .html <xsl:apply-templates select="." mode="title-plain" /> , Authored in PreTeXt book article : assistive #ptx-content PTX:ERROR: descending into first node of an intermediate page () that is non-structural; maybe your source has incorrect structure PTX:ERROR: descending into last node of an intermediate page () that is non-structural previous-button button previous-button button disabled index-button button next-button button next-button button disabled up-button button up-button button disabled
    ptx-sidebar hidden
    • structural toc-item-list
  • toc-item toc- contains-active active # Main Matter # <xsl:apply-templates select="." mode="title-short"/> _static/ lunr-pretext-search-index.js var ptx_lunr_search_style = " "; var ptx_lunr_docs = [ ] var ptx_lunr_idx = lunr(function () { this.ref('id') this.field('title') this.field('body') this.metadataWhitelist = ['position'] ptx_lunr_docs.forEach(function (doc) { this.add(doc) }, this) }) { "id": " ", "level": " ", "url": " ", "type": " (with a defined term) ", "number": " ", "title": " ", "body": " " }, latex tex copyright copyleft < / > {% if show_ethical_ad %}
    {% endif %} : // Make *any* div with class ' ' an executable Sage cell // Their results will be linked, only within language type sagecell.makeSagecell( div. true linked- ( ) evalButton ); // Make *any* div with class 'sage-display' a visible, uneditable Sage cell sagecell.makeSagecell( div.sage-display codemirror-readonly evalButton editorToggle language ); // Make *any* div with class 'sagecell-practice' an executable Sage cell // Their results will be linked, only within language type sagecell.makeSagecell( div.sagecell-practice true sagecell.allLanguages ); sage Sage sage Sage gap GAP gap GAP gp GP gp GP html HTML html HTML macaulay2 Macaulay2 macaulay2 Macaulay2 maxima Maxima maxima Maxima octave Octave octave Octave python Python python Python r R r R singular Singular singular Singular